En esta lección del Modulo Cartera de Clientes se creara el formulario de listado de pagos.
Colabora y Suscribete a mi canal de 
El formulario de listado de pagos permite ver los pagos de una factura o de todas las facturas de un cliente determinado.
El formulario se llama frmPagosClientes y se ve de la siguiente manera.

Lo primero que se programa es el evento load del formulario y se ve de la siguiente manera:
Private Sub Form_Load()
cmbMeses.ListIndex = 0
txtAnio.Text = Format(Date, "yyyy")
Num_Factura_Sel = frmFacturasCliente.msGrid.TextMatrix(frmFacturasCliente.msGrid.Row, 1)
If Num_Factura_Sel = "" Then
Num_Factura_Sel = 0
End If
Call Listado_PagosCliente
End Sub
Lo siguiente es el Listado_PagosCliente
Sub Listado_PagosCliente()
Dim Sql As String
Dim Filtro As String
Dim Columnas As Integer
Anio = txtAnio.Text
Mes = cmbMeses.ListIndex
If cmbMeses.ListIndex > 0 Then
Filtro = " Month(Fecha) = " & Mes & " and Year(Fecha) = " & Anio
Else
Filtro = " Year(Fecha) = " & Anio
End If
If chkFacturaActual.Value = 1 Then
Filtro = Filtro & " and Num_Factura = " & Num_Factura_Sel
End If
Sql = "Select IdSaldoFactVen, Num_Rec_Pago, Fecha, Num_Factura, ValorPago, Id_FormaPago, EstadoPago From tblPagos_Factura_Venta Where " & Filtro
Columnas = 7
Call LlenarGrid(msGrid, Sql, Columnas)
msGrid.ColWidth(0) = 0
msGrid.ColWidth(1) = 0
msGrid.ColWidth(2) = 1000
msGrid.ColWidth(3) = 1400
msGrid.ColWidth(4) = 1200
msGrid.ColWidth(5) = 1400
msGrid.ColWidth(6) = 1400
msGrid.ColWidth(7) = 1400
msGrid.TextMatrix(0, 2) = "No. Rec"
msGrid.TextMatrix(0, 3) = "Fecha"
msGrid.TextMatrix(0, 4) = "No. Fact"
msGrid.TextMatrix(0, 5) = "Valor"
msGrid.TextMatrix(0, 6) = "Tipo"
msGrid.TextMatrix(0, 7) = "Estado"
For I = 1 To msGrid.Rows - 1
msGrid.Row = I
msGrid.Col = 1
msGrid.CellAlignment = flexAlignCenterCenter
msGrid.Col = 4
msGrid.CellAlignment = flexAlignCenterCenter
msGrid.TextMatrix(I, 3) = Format(msGrid.TextMatrix(I, 3), "dd/mm/yyyy")
msGrid.TextMatrix(I, 5) = Format(msGrid.TextMatrix(I, 5), "currency")
If msGrid.TextMatrix(I, 6) = 0 Then
msGrid.TextMatrix(I, 6) = "Efectivo"
Else
msGrid.TextMatrix(I, 6) = "Tarjeta"
End If
If msGrid.TextMatrix(I, 7) = "V" Then
msGrid.TextMatrix(I, 7) = "Valida"
Else
msGrid.Col = 7
msGrid.Row = I
msGrid.TextMatrix(I, 7) = "Anulada"
msGrid.CellBackColor = &HC0& 'color de fondo
msGrid.CellForeColor = &H80000005 'color de la letra
End If
Next I
End Sub
El botón buscar Pagos llama al listado de pagos:
Private Sub cmdBuscarPagos_Click()
Call Listado_PagosCliente
End Sub
El Botón Salir:
Private Sub cmdSalir_Click()
Unload Me
End Sub
Botón Anular pago:
Private Sub cmdAnular_Click()
Call AnularPago
End Sub
Y este boton llama a un procedimiento AnularPago que es el siguiente:
Sub AnularPago()
Res = MsgBox("¿Esta seguro de anular el pago?", vbYesNo, "Anular Pago")
If Res = vbYes Then
Id_Pago = msGrid.TextMatrix(msGrid.Row, 1)
Num_Factura = msGrid.TextMatrix(msGrid.Row, 4)
If Id_Pago <> "" Then
Sql = "Update tblPagos_Factura_Venta SET EstadoPago = 'A' Where IdSaldoFactVen = " & Id_Pago
ConexionADO.Execute Sql
Call CalcularSaldoFactura(Num_Factura)
Call Listado_PagosCliente
End If
End If
End Sub
Nos faltaría una variable a nivel de formulario que es la primera linea en la parte superior:
Dim Num_Factura_Sel
Que es la que guarda el numero de la factura actual.
Como se van a estar anulando y creando pagos cree un procedimiento que se puede llamar desde cualquier lugar del proyecto por eso lo coloque en el Modulo md_Consultas que se encarga de actualizar el saldo de la factura de venta y el saldo en la tabla Saldos Clientes, entonces cada ves que se haga un cambio se llama a esta función para ahorrar código.
Sub CalcularSaldoFactura(Num_Factura)
Dim RecordSaldoAct As New ADODB.RecordSet
Dim RecordFactura As New ADODB.RecordSet
Dim RecordFacturas As New ADODB.RecordSet
'Sumas los pagos actuales de la factura
Sql = "Select TotalFactura, IdCliente From tblVentas Where Num_Factura = " & Num_Factura & " and EstadoFact = 1"
Set RecordFactura = ConexionADO.Execute(Sql)
TotalFactura = 0
IdCliente = 0
If RecordFactura.RecordCount > 0 Then
TotalFactura = RecordFactura("TotalFactura")
IdCliente = RecordFactura("IdCliente")
Else
MsgBox "No se pudo calcular el saldo total la factura no existe", vbCritical, "Error"
Exit Sub
End If
'Sumas los pagos actuales de la factura
sqlSald = "Select SUM(ValorPago) as Saldo From tblPagos_Factura_Venta Where Num_Factura = " & Num_Factura & " and EstadoPago = 'V'"
Set RecordSaldoAc = ConexionADO.Execute(sqlSald)
SaldoFacturaSel = 0
If RecordSaldoAc.RecordCount > 0 Then
If IsNull(RecordSaldoAc("Saldo")) = False Then
SaldoFacturaSel = CCur(TotalFactura) - RecordSaldoAc("Saldo")
Else
SaldoFacturaSel = CCur(TotalFactura)
End If
End If
sqlUp = "Update tblVentas SET SaldoFactura = " & SaldoFacturaSel & " Where Num_Factura = " & Num_Factura
ConexionADO.Execute sqlUp
'TotalSaldoCliente
Sql = "Select Sum(SaldoFactura) as Saldo From tblVentas Where SaldoFactura > 0 and IdCliente = " & IdCliente & " and EstadoFact = 1 "
Set RecordFacturas = ConexionADO.Execute(Sql)
SaldoTotal = 0
If RecordFacturas.RecordCount > 0 Then
SaldoTotal = RecordFacturas("Saldo")
End If
Sql = "Update tblSaldos_Clientes SET Saldo = " & SaldoTotal & ", FechaMod = now() Where IdCliente = " & IdCliente
ConexionADO.Execute Sql
End Sub
Solo falta abrir el formulario desde el botón Ver Pagos de la ventana de Facturas cliente:
Private Sub cmdVerPagos_Click()
frmPagosClientes.Show
End Sub
Algo que falto en el vídeo es registrar el saldo en la tabla Saldos_cliente cuando se guarda la factura de Venta a Crédito para eso debe modificar el procedimiento Finalizar_Guardado_Factura en frmVentas (Cambio Nuevo)
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
'calcular saldo
SaldoFactura = 0
If cmdTipoFact.ListIndex = 1 Then
If CCur(txtAbonoFact.Text) > 0 Then
SaldoFactura = CCur(txtTotalFactura) - CCur(txtAbonoFact.Text)
Else
SaldoFactura = CCur(txtTotalFactura)
End If
End If
'Se guarda en la tabla ventas
sql = "Insert Into tblVentas (Num_Factura, FechaHora, TipoFact, Dias, ImpuestoTotal, TotalFactura, EstadoFact, Comentario, Efectivo, Cambio, IdCliente, IdUsuario, SaldoFactura) " _
& " VALUES (" & Num_Factura & ",'" & FechaHora & "'," & Me.cmdTipoFact.ListIndex & "," & txtDias.Text & ",'" & CCur(txtImpuestoFact) & "','" & CCur(txtTotalFactura) & "',1,'" & Comentario & "','" & CCur(txtVECambio.Text) & "','" & CCur(txtCambio.Text) & "'," & CodigoCliente & "," & Glo_IdUsuario & ", '" & SaldoFactura & "')"
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
'Registramos el Saldo Total en la Tabla Saldos
IdCliente = CodigoCliente
consulta = "Select IdCliente, Saldo from tblSaldos_Clientes Where IdCliente = " & IdCliente
Set RecordCliente = ConexionADO.Execute(consulta)
If RecordCliente.RecordCount = 0 Then
sqlSaldo = "Insert into tblSaldos_Clientes (IdCliente, Saldo, FechaMod) Values (" & IdCliente & ", '" & SaldoFactura & "', now()) "
Else
'Se toma el saldo guardado en la tabla y se le suma al saldo de la factura actual y se actualiza el saldo en la tabla
Saldo = RecordCliente("Saldo") + SaldoFactura
sqlSaldo = "Update tblSaldos_Clientes SET Saldo = '" & Saldo & "', FechaMod = Now() Where IdCliente = " & IdCliente
End If
ConexionADO.Execute sqlSaldo
If chkImprimirSiNo.Value = 1 Then ' si el checkbox esta chuliado se imprime
If glob_conf_ImpresoraTikets = 0 Then
Call ImprimirFactura_carta(Num_Factura)
Else
Call ImprimirFactura_Ticket(Num_Factura)
End If
End If
ConsecutivoTemp = UltimaVentaTemp
Call LlenarGridProductos
MsgBox "Venta Guardada", vbInformation, "Guardar"
Call LimpiarVenta
End Sub

En el vídeo explico en detalle todo el código anterior.
Puedes el listado de las lecciones del curso en Curso de Creación de Software de Ventas en Visual Basic 6
No te olvides de Compartir

