En esta lección explico algo que nos faltaba poder modificar un producto ingresado en las ventas y como recuperar una factura que se ingreso pero que no se guardo.
Colabora y Suscribete a mi canal de
Para el primer punto que es modificar un producto ingresado debes seguir varios pasos para lograrlo:
1. Cuando de de doble clic sobre el producto en el grid debe ejecutarse la función de modificar.
Private Sub msGrid_DblClick() Call EditarProducto End Sub
La función que se encarga de modificar el producto:
Sub EditarProducto() If msGrid.Row = 0 Then Exit Sub End If V_Editar_Producto = True Filas = msGrid.Row IdProducto = msGrid.TextMatrix(Filas, 1) Codigo = msGrid.TextMatrix(Filas, 3) Nombre = msGrid.TextMatrix(Filas, 4) Cantidad = msGrid.TextMatrix(Filas, 5) PrecioVp = CCur(msGrid.TextMatrix(Filas, 6)) DescuentoP = CCur(msGrid.TextMatrix(Filas, 9)) Subtotal = (Cantidad * PrecioVp) - DescuentoP txtCodigoPro = Codigo Call BuscarProductoCodigo txtCant_Pro = Cantidad txtPrecioV_Pro = PrecioVp txtValorTotalPro = Subtotal txtDesuentoVPro = DescuentoP txtCant_Pro.SetFocus End Sub
En el código anterior notamos que primero verificamos que sea un producto el seleccionado validando que la fila seleccionada no sea cero.
Usamos una variable a nivel de formulario para notificar que se esta modificando un producto para eso declaramos la variable en la parte superior del codigo del formulario:
Dim V_Editar_Producto As Boolean
Con esto todas las variables superiores a nivel de formulario quedarían así:
Dim CodigoCliente As Long Dim IdProducto As Long Dim V_Editar_Producto As Boolean Dim Precio2_Producto As Currency Dim Precio3_Producto As Currency Dim PrecioVentaGlob As Currency Dim PrecioC_Pro As Currency Dim RecordSet_Producto As New ADODB.RecordSet Dim Direccion_Cliente As String Dim ConsecutivoTemp
Siguiendo con el código de EditarProducto obtenemos todos los datos del producto del grid, luego se calcula el subtotal y se hace la consulta usando el procedimiento que ya tenemos BuscarProductoCodigo.
Luego de esto asignamos a los campos del formulario de productos los datos que ya obtuvimos y ponemos el foco en txtCant_Pro.
2. Actualizar los datos modificados del producto en la base de datos para eso modificamos el procedimiento llamado IngresarProducto que quedaría de la siguiente manera:
Sub IngresarProducto() Dim PrecioMinimo As Currency Dim Num_Proc As Double Dim Valor_Impuesto As Currency Dim Imp_TotalPro, precioVpro As Currency If CCur(txtPrecioV_Pro) = 0 Then MsgBox "El precio venta del articulo no puede ser cero", vbExclamation, "Error" Exit Sub End If If txtCant_Pro.Text = 0 Then MsgBox "La cantidad del artículo no puede ser cero", vbExclamation, "Error" Exit Sub End If If CCur(txtValorTotalPro) <= 0 Then MsgBox "El total del producto no puede ser negativo ni igual a cero", vbCritical, "Error" txtCant_Pro = 0 txtCant_Pro.SetFocus End If PrecioMinimo = CCur(txtPrecioMinimoPro.Text) If PrecioMinimo > 0 Then precioVpro = CCur(txtValorTotalPro) / txtCant_Pro.Text If CCur(txtPrecioV_Pro) < PrecioMinimo Then MsgBox "El precio digitado no puede ser menor al precio mínimo establecido", vbExclamation, "Precio mínimo" txtPrecioV_Pro.Text = PrecioVentaGlob txtValorTotalPro = txtCant_Pro * CCur(txtPrecioV_Pro) Exit Sub End If End If 'Calcular Impuestos mp_TotalPro = 0 If G_Empresa_Regimen = "Común" And PorImpuesto_Producto > 0 Then Num_Porc = (PorImpuesto_Producto / 100) + 1 Valor_Impuesto = CCur(txtValorTotalPro) / Num_Porc mp_TotalPro = CCur(txtValorTotalPro) - Valor_Impuesto End If If msGrid.Rows <= 1 Then ConsecutivoTemp = UltimaVentaTemp End If If V_Editar_Producto = False Then Sqlinsert = "Insert Into tblDetalle_Venta (Num_VentaTemp, IdProducto, Cantidad_dv, P_Costo_dv, P_Venta_dv, Impuesto_dv, Descuento_dv) " _ & "VALUES (" & ConsecutivoTemp & ", " & IdProducto & ", '" & txtCant_Pro & "', '" & PrecioC_Pro & "', '" & CCur(txtPrecioV_Pro.Text) & "', '" & mp_TotalPro & "', '" & txtDesuentoVPro & "' ) " ConexionADO.Execute Sqlinsert, , adExecuteNoRecords Else SqlUpdate = "Update tblDetalle_Venta SET Cantidad_dv = '" & txtCant_Pro & "' , P_Venta_dv = '" & CCur(txtPrecioV_Pro.Text) & "', Descuento_dv = '" & txtDesuentoVPro & "' Where IdProducto = " & IdProducto ConexionADO.Execute SqlUpdate, , adExecuteNoRecords End If Call LlenarGridProductos Call LimpiarDatosProducto End Sub
Si notamos en el código se coloco un condicional que determina si se va a agregar un producto nuevo a se va a modificar: If V_Editar_Producto = False Then
Si es true entonces se actualiza el producto usando el código SQL que esta en SqlUpdate .
para terminar debemos poner en false la variable V_Editar_Producto en varias partes del codigo:
Sub Inicial() V_Editar_Producto = False txtFechaApro.Text = Format(Date, "dd/mm/yyyy") cmdTipoFact.ListIndex = 0 txtDias.Text = 0 txtDesuentoVPro.Text = 0 txtPorcDescuentoPro = 0 End Sub
Sub LimpiarDatosProducto() V_Editar_Producto = False txtCodigoPro.Text = "" txtNombrePro.Text = "" txtCant_Pro.Text = 0 txtPrecioV_Pro.Text = 0 txtValorTotalPro.Text = 0 txtPorcDescuentoPro.Text = 0 txtDesuentoVPro.Text = 0 txtPrecioMinimoPro.Text = 0 txtExistPro.Text = 0 txtNombrePro.SetFocus End Sub
Cargar Facturas Temporales
Se crea un formulario Llamado frmFacturaTemp que tiene una Propiedad MDIChild = false porque va a hacer un formulario modal el código del formulario completo es el siguiente:
Sub ListarTemporales() Dim Sql As String Dim Columnas As Integer Sql = "SELECT tblDetalle_Venta.Num_VentaTemp, Sum(tblDetalle_Venta.P_Venta_dv*tblDetalle_Venta.Cantidad_dv) AS Total From tblDetalle_Venta GROUP BY tblDetalle_Venta.Num_VentaTemp ORDER BY Count(tblDetalle_Venta.Id_detalle);" Columnas = 2 Call LlenarGrid(msGrid, Sql, Columnas) msGrid.ColWidth(0) = 0 msGrid.ColWidth(1) = 1300 msGrid.ColWidth(2) = 1700 msGrid.TextMatrix(0, 1) = "No. Factura" msGrid.TextMatrix(0, 2) = "Valor Total" End Sub Private Sub cmdBorrarPro_Click() If msGrid.Row > 0 Then Num_Factura = msGrid.TextMatrix(msGrid.Row, 1) If Num_Factura <> "" Then Res = MsgBox("¿Esta segúro de borrar la factura temporal No. " & Num_Factura & "? ", vbYesNo, "Borrar Producto") If Res = vbYes Then Sql = "Delete from tblDetalle_Venta Where Num_VentaTemp = " & Num_Factura ConexionADO.Execute Sql Call ListarTemporales End If End If End If End Sub Private Sub cmdCerrar_Click() Unload Me End Sub Private Sub cmdSeleccionar_Click() Num_Temp = msGrid.TextMatrix(msGrid.Row, 1) If Num_Temp <> "" Then Call frmVentas.CargarFactTemporal(Num_Temp) Unload Me End If End Sub Private Sub Form_Load() Call ListarTemporales End Sub Private Sub msGrid_DblClick() Call cmdSeleccionar_Click End Sub
Luego en el formulario de Ventas debemos tener una función llamada CargarFactTemporal que recibo el numero de factura temporal.
Sub CargarFactTemporal(Cons_Temp) ConsecutivoTemp = Cons_Temp Call LlenarGridProductos End Sub
En el vídeo explico todo paso a paso: