amp-web-push-widget button.amp-subscribe { display: inline-flex; align-items: center; border-radius: 5px; border: 0; box-sizing: border-box; margin: 0; padding: 10px 15px; cursor: pointer; outline: none; font-size: 15px; font-weight: 500; background: #4A90E2; margin-top: 7px; color: white; box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.5); -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .amp-logo amp-img{width:190px} .amp-menu input{display:none;}.amp-menu li.menu-item-has-children ul{display:none;}.amp-menu li{position:relative;display:block;}.amp-menu > li a{display:block;} /* Inline styles */ div.acss138d7{clear:both;}div.acssf5b84{--relposth-columns:3;--relposth-columns_m:2;--relposth-columns_t:2;}div.acssa8a3d{aspect-ratio:1/1;background:transparent no-repeat scroll 0% 0%;height:300px;max-width:300px;}div.acss13836{color:#333333;font-family:Arial;font-size:14px;height:75px;}span.acss47fcd{background:#FFFFFF;color:#000000;}div.acss0f1bf{display:none;}a.acssf23c5{font-size:8pt;}a.acss24ea4{font-size:16.4pt;}a.acss066f0{font-size:22pt;} .ampforwp_wc_shortcode{margin-top: 0;padding:0;display:inline-block;width: 100%;} .ampforwp_wc_shortcode li{position: relative;width:29%; font-size:12px; line-height: 1; float: left;list-style-type: none;margin:2%;} .ampforwp_wc_shortcode .onsale{position: absolute;top: 0;right: 0;background: #ddd;padding: 7px;font-size: 12px;} .single-post .ampforwp_wc_shortcode li amp-img{margin:0} .ampforwp-wc-title{margin: 8px 0px 10px 0px;font-size: 13px;} .ampforwp-wc-price{color:#444} .wc_widgettitle{text-align:center;margin-bottom: 0px;} .ampforwp-wc-price, .ampforwp_wc_star_rating{float:left;margin-right: 10px;} .icon-widgets:before {content: "\e1bd";}.icon-search:before {content: "\e8b6";}.icon-shopping-cart:after {content: "\e8cc";} /******* Paste your Custom CSS in this Editor *******/
En esta sección ya daremos el último paso para guardar la factura, en este caso nos falta guardar en la tabla ventas, luego descontar de inventario los productos y agregar al Kardex el movimiento.
Pero antes vamos a agregar el código que falta al llenar LlenarGridProductos
Impuesto = CCur(msGrid.TextMatrix(Filas, 7)) '
If G_Empresa_Regimen = "Común" And Impuesto > 0 Then '
TotalImpuesto = TotalImpuesto + Impuesto '
End If El Procedimiento completo quedaría de la siguiente manera, dejo marcada las lineas nuevas con la palabra “Nueva”:
Sub LlenarGridProductos()
Dim Sql As String
Dim Columnas As Integer
Columnas = 9
Sql = "SELECT tblDetalle_Venta.Id_detalle, tblDetalle_Venta.IdProducto, tblProductos.CodigoPro, tblProductos.NombrePro, tblDetalle_Venta.Cantidad_dv, tblDetalle_Venta.P_Venta_dv, tblDetalle_Venta.Impuesto_dv, 0 as Subtotal, tblDetalle_Venta.Descuento_dv " _
& " FROM tblProductos INNER JOIN tblDetalle_Venta ON tblProductos.IdProducto = tblDetalle_Venta.IdProducto WHERE tblDetalle_Venta.Num_VentaTemp = " & ConsecutivoTemp
Call LlenarGrid(msGrid, Sql, Columnas)
msGrid.ColWidth(0) = 0
msGrid.ColWidth(1) = 0 'ID
msGrid.ColWidth(2) = 0 'item
msGrid.ColWidth(3) = 900 'codigo
msGrid.ColWidth(4) = 4300 'nombre
msGrid.ColWidth(5) = 800 'cantidad
msGrid.ColWidth(6) = 1300 'preciov
msGrid.ColWidth(7) = 1300 'imp
msGrid.ColWidth(8) = 1300 'subtotal
msGrid.ColWidth(9) = 1300 'Desc
msGrid.TextMatrix(0, 2) = "IdPro"
msGrid.TextMatrix(0, 3) = "Código"
msGrid.TextMatrix(0, 4) = "Nombre Producto"
msGrid.TextMatrix(0, 5) = "Cant"
msGrid.TextMatrix(0, 6) = "Precio V"
msGrid.TextMatrix(0, 7) = "Impuesto"
msGrid.TextMatrix(0, 8) = "Subtotal"
msGrid.TextMatrix(0, 9) = "Descuento"
msGrid.ColAlignment(5) = flexAlignCenterCenter
TotalVenta = 0
TotalDescuento = 0
TotalImpuesto = 0
For Filas = 1 To msGrid.Rows - 1
Cantidad = msGrid.TextMatrix(Filas, 5)
PrecioVp = CCur(msGrid.TextMatrix(Filas, 6))
DescuentoP = CCur(msGrid.TextMatrix(Filas, 9))
SubTotal = (Cantidad * PrecioVp) - DescuentoP
Impuesto = CCur(msGrid.TextMatrix(Filas, 7)) ' Nueva
If G_Empresa_Regimen = "Común" And Impuesto > 0 Then ' Nueva
TotalImpuesto = TotalImpuesto + Impuesto ' Nueva
End If ' Nueva
msGrid.TextMatrix(Filas, 6) = Format(msGrid.TextMatrix(Filas, 6), "currency")
msGrid.TextMatrix(Filas, 7) = Format(msGrid.TextMatrix(Filas, 7), "currency")
msGrid.TextMatrix(Filas, 8) = Format(SubTotal, "currency")
msGrid.TextMatrix(Filas, 9) = Format(msGrid.TextMatrix(Filas, 9), "currency")
TotalVenta = TotalVenta + SubTotal
TotalDescuento = TotalDescuento + DescuentoP
Next Filas
txtSubTotalFact.Text = Format((TotalVenta - TotalImpuesto), "currency") 'Nueva
txtTotalFactura.Text = Format(TotalVenta, "currency")
txtTotalDescuento.Text = Format(TotalDescuento, "currency")
txtImpuestoFact.Text = Format(TotalImpuesto, "currency") ' Nueva
NArticulos.Text = msGrid.Rows - 1
End Sub El Siguiente paso es crear la ventana de cambio que no es mas que un Frame con campos donde pedimos los datos con que el cliente va a pagar quedaría de la siguiente manera:
El Frame se le da la propiedad BorderStyle = 0 – None y se da un color de fondo &H00FFC0C0& para el borde use el control Shape con un BorderWith de 5 y color de borde &H009A620E&
El control cmbTipoPago tiene 3 item en su lista:
Las opciones de Pago tiene el siguiente código:
Sub AbrirVentanaCambio()
'Call DesactivarBotones
framVentanCambio.Top = 4200
framVentanCambio.Visible = True
cmbTipoPago.ListIndex = 0
txtNumReciboTarjeta.Text = 0
txtValorTarjeta.Text = 0
txtVECambio.Text = 0
txtCambio.Text = 0
cmbTipoPago.SetFocus
End Sub
Sub CalcularCambioEfectivo()
If txtCambio.Text <> "" Then
If Me.txtAbonoFact.Text <> "" Then
If CCur(Me.txtAbonoFact.Text) > 0 Then
Valor = CCur(txtAbonoFact.Text)
End If
Else
Valor = CCur(Me.txtTotalFactura.Text)
End If
If Me.cmbTipoPago.ListIndex = 2 Then
Valor = CCur(txtTotalFactura.Text) - Me.txtValorTarjeta
End If
Cambio = txtVECambio - Valor
If Cambio >= 0 Then
txtCambio = Format(Cambio, "currency")
Else
' txtVPCambio.SetFocus
End If
End If
End Sub
Private Sub cmbTipoPago_Click()
If cmbTipoPago.ListIndex = 0 Then 'efectivo
txtNumReciboTarjeta.Visible = False
txtValorTarjeta.Visible = False
lblNumReciboP.Visible = False
lblValorTarjetaP.Visible = False
ElseIf cmbTipoPago.ListIndex = 1 Then 'tarjeta
txtNumReciboTarjeta.Visible = True
lblNumReciboP.Visible = True
txtValorTarjeta.Visible = False
lblValorTarjetaP.Visible = False
Else 'ambos
txtNumReciboTarjeta.Visible = True
txtValorTarjeta.Visible = True
lblNumReciboP.Visible = True
lblValorTarjetaP.Visible = True
End If
End Sub
Private Sub cmbTipoPago_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
If cmbTipoPago.ListIndex = 0 Then
txtVECambio.SetFocus
End If
If cmbTipoPago.ListIndex >= 1 Then
txtNumReciboTarjeta.SetFocus
End If
End If
End Sub
Private Sub txtNumReciboTarjeta_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
If txtNumReciboTarjeta = "" Then
txtNumReciboTarjeta.Text = "0"
End If
If cmbTipoPago.ListIndex = 1 Then
txtVECambio.SetFocus
Else
txtValorTarjeta.SetFocus
End If
End If
End Sub
Private Sub txtValorTarjeta_GotFocus()
txtValorTarjeta.SelStart = 0
txtValorTarjeta.SelLength = Len(txtValorTarjeta.Text)
End Sub
Private Sub txtValorTarjeta_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
txtVECambio.SetFocus
End If
End Sub
Private Sub txtValorTarjeta_LostFocus()
txtValorTarjeta.Text = Format(txtValorTarjeta.Text, "currency")
End Sub
Private Sub txtVECambio_GotFocus()
txtVECambio.Text = CCur(txtVECambio.Text)
txtVECambio.SelStart = 0
txtVECambio.SelLength = Len(txtVECambio.Text)
End Sub
Private Sub txtVECambio_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Call CalcularCambioEfectivo
txtCambio.SetFocus
End If
End Sub
Private Sub txtCambio_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
Call Finalizar_Guardado_Factura
End If
End Sub Al abrir la ventana de cambio necesitamos 2 procedimientos uno para desactivar los botones y los otros campos del formulario y otro para volverlo a activar:
Sub ActivarBotones()
cmdNuevaFact.Enabled = True
cmdIngresarPro.Enabled = True
cmdGuardarFact.Enabled = True
cmdBorrarPro.Enabled = True
cmdFactAbiertas.Enabled = True
cmdSalir.Enabled = True
Frame1.Enabled = True 'clientes
Frame2.Enabled = True 'producto
End Sub
Sub DesactivarBotones()
cmdNuevaFact.Enabled = False
cmdIngresarPro.Enabled = False
cmdGuardarFact.Enabled = False
cmdBorrarPro.Enabled = False
cmdFactAbiertas.Enabled = False
cmdSalir.Enabled = False
Frame1.Enabled = False 'clientes
Frame2.Enabled = False 'producto
End Sub El paso a seguir ya es guardar la factura y para ellos hay que guardar el encabezado de la factura en la tabla tblVentas que lleva la siguiente estructura:
Para guardar la factura necesitamos el últmo numero que se ingreso en la tabla para eso usamos una Función que nos devuelva ese dato:
Function Ultima_Factura_Venta()
Dim RecordSetNumFact As New ADODB.RecordSet
Dim Sql As String
Sql = "SELECT Max(Num_Factura) AS UltimoNumero FROM tblVentas ORDER BY Max(Num_Factura) DESC;"
Set RecordSetNumFact = ConexionADO.Execute(Sql)
If RecordSetNumFact.RecordCount > 0 Then
If IsNull(RecordSetNumFact("UltimoNumero")) = False Then
Ultima_Factura_Venta = RecordSetNumFact("UltimoNumero") + 1
Else
Ultima_Factura_Venta = 1
End If
Else
Ultima_Factura_Venta = 1
End If
End Function
Después de esto si procedemos a terminar de guardar la factura:
Sub Finalizar_Guardado_Factura()
Num_Factura = Ultima_Factura_Venta() 'Ultima venta
FechaHora = txtFechaApro.Text & " " & Time 'fecha y hora
Comentario = "-"
If txtObervacionesPro.Text <> "" Then 'comentario
Comentario = txtObervacionesPro.Text
End If
'Se guarda en la tabla ventas
Sql = "Insert Into tblVentas (Num_Factura, FechaHora, TipoFact, Dias, TotalFactura, EstadoFact, Comentario, Efectivo, Cambio, IdCliente, IdUsuario) " _
& " VALUES (" & Num_Factura & ",'" & FechaHora & "'," & Me.cmdTipoFact.ListIndex & "," & txtDias.Text & ",'" & CCur(txtTotalFactura) & "',1,'" & Comentario & "','" & CCur(txtVECambio.Text) & "','" & CCur(txtCambio.Text) & "'," & CodigoCliente & "," & Glo_IdUsuario & ")"
ConexionADO.Execute Sql
'A los productos del detalle se les asigna el numero de factura
Sql = "Update tblDetalle_Venta set Num_Factura = '" & Num_Factura & "', Num_VentaTemp = '0' where Num_VentaTemp = " & ConsecutivoTemp
ConexionADO.Execute Sql
'*************** Consulta que resta todos los articulos de inventario
Sql = "UPDATE tblProductos as ar INNER JOIN tblDetalle_Venta as d ON ar.IdProducto = d.IdProducto SET ar.ExistPro = (ar.ExistPro - d.Cantidad_dv) where d.Num_Factura = " & Num_Factura
ConexionADO.Execute Sql
'/*//*********************** crear el historial de cada articulo en el kardex
Sql = "INSERT INTO tblKardex (Fecha, IdProducto, Detalle, D_C, Cantidad, Costo,Cant_Saldo) Select '" & FechaHora & "', dt.IdProducto, 'Venta de Mercancia según Fra. N° " & Num_Factura & " '," _
& Num_Factura & ", dt.Cantidad_dv * -1, dt.P_Costo_dv, (Select ExistPro from tblProductos where IdProducto = dt.IdProducto) from tblDetalle_Venta as dt Where dt.Num_Factura = " & Num_Factura
ConexionADO.Execute Sql
ConsecutivoTemp = UltimaVentaTemp
Call LlenarGridProductos
MsgBox "Venta Guardada", vbInformation, "Guardar"
Call LimpiarVenta
End Sub En el código anterior notamos varias consultas que parecen hasta extrañas o complicadas pero es la manera mas eficiente de hacer la actualización de producto y registrar el detalle en el Kardex.
'*************** Consulta que resta todos los articulos de inventario Sql = "UPDATE tblProductos as ar INNER JOIN tblDetalle_Venta as d ON ar.IdProducto = d.IdProducto SET ar.ExistPro = (ar.ExistPro - d.Cantidad_dv) where d.Num_Factura = " & Num_Factura ConexionADO.Execute Sql
La consulta anterior relacionamos la tabla Productos y Detalle_Venta por medio de campo IdProducto y hacemos una actualización donde tomamos la existencia actual del producto en la tabla tblProductos y la Restamos de la Cantidad Vendida de la tabla Detalle_Venta esta sola consulta resta todos los productos que estén en el detalle de venta filtrados por el Num_Factura (Número de Factura) dejando actualizada la tabla tblProductos.
Sql = "INSERT INTO tblKardex (Fecha, IdProducto, Detalle, D_C, Cantidad, Costo,Cant_Saldo) Select '" & FechaHora & "', dt.IdProducto, 'Venta de Mercancia según Fra. N° " & Num_Factura & " '," _
& Num_Factura & ", dt.Cantidad_dv * -1, dt.P_Costo_dv, (Select ExistPro from tblProductos where IdProducto = dt.IdProducto) from tblDetalle_Venta as dt Where dt.Num_Factura = " & Num_Factura
La consulta anterior lo que haces es tomar cada producto del Detalle_Venta filtrados por el numero de factura y agregarlo a la tabla tblKardex para llevar un registro del movimiento del producto.
Cómo es una salida de inventario multiplica el campo Cantidad_dv por -1 para que quede un valor negativo y por ultimo tomo el valor de la existencia actual del producto y tambien lo guardo en el kardex quedando de la siguiente manera.
Después de guardar la Venta Se limpian los campos del formulario y se pone el foco en el código del producto dejando todo listo para la siguiente factura:
Sub LimpiarVenta()
txtTotalFactura.Text = 0
txtImpuestoFact.Text = 0
txtSubTotalFact.Text = 0
txtTotalDescuento.Text = 0
NArticulos.Text = 0
txtObervacionesPro.Text = ""
CodigoCliente = 1
txtAbonoFact.Text = 0
txtDias.Text = 0
cmdTipoFact.ListIndex = 0
End Sub En la próxima lección se trabajara la impresión de la factura usando el control DataReport
Saludos, en este tutorial aprenderás a integrar tu aplicación de Visual Basic 6 con un…
Recientemente, muchos usuarios de Hotmail (ahora Outlook.com) han reportado un error al intentar iniciar sesión…
En este proyecto, vamos a desarrollar una calculadora sencilla usando Visual Basic 6, que permite…
6 de septiembre de 2024 - La demanda de desarrolladores de software sigue en aumento,…
En un movimiento histórico, la Unión Europea ha aprobado la primera ley de inteligencia artificial…
¿Sigues trabajando con Visual Basic 6 y necesitas una forma eficiente de acceder a tus…
Este sitio utiliza cookies desea activarlas
Leave a Comment