Si notaran el titulo en este articulo voy a regalar el código para que lo descarguen y les sea mas fácil terminar.
Como ya ha demorado mucho este curso voy a montar casi todo lo que falta en este articulo lo descarguen y quede prácticamente listo el software.
Pero primero debemos tener algunas cosas listas:
La base de datos debe tener las siguientes tablas:
Tabla ClaseMovimiento:

Esta tabla tiene los siguientes registros predeterminados:

Tabla Movimientos:

Tabla Tipo Movimientos con sus registros predeterminados:

Tabla Personas Movimiento:

Para el Cierre de Caja se necesita la siguiente Tabla:

Debe dejar todo esto listo para poder pasar al siguiente paso.
Siguiente paso es Pegas las siguientes funciones en el Modulo Consultas Mod_consultas
'---- MOVIMIENTOS
Function Fun_GuardarPersona(Cedula, Nombres, Telefono, Direccion)
Dim RecorsetTemp As New ADODB.RecordSet
Dim sql As String
On Error GoTo error
RecorsetTemp.Open "Select * From PersonaMovimiento Where CedulaPersona = '" & Cedula & "'", ConexionADO, adOpenKeyset, adLockOptimistic
If RecorsetTemp.RecordCount > 0 Then
Fun_GuardarPersona = RecorsetTemp("idPersonaMovimiento")
Exit Function
Else
IdPersona = UltimoIdTabla("PersonaMovimiento", "idPersonaMovimiento")
RecorsetTemp.AddNew
RecorsetTemp!idPersonaMovimiento = IdPersona
RecorsetTemp!CedulaPersona = Cedula
RecorsetTemp!NombresPersona = Nombres
RecorsetTemp!TelefonoPersona = Telefono
RecorsetTemp!DireccionPersona = Direccion
RecorsetTemp.Update
Fun_GuardarPersona = IdPersona
End If
Exit Function
error:
MsgBox "Fun_GuardarPersona - " & Err.Description, vbInformation, "Error - Guardar Nº " & Err.Number
End Function
Sub Fun_GuardarMovimiento(CodigoMov, NMov, Fecha, Tipo, ClaseMov, IdPers, Concepto, Valor)
Dim RecorsetTemp As New ADODB.RecordSet
Dim sql As String
On Error GoTo error
RecorsetTemp.Open "Select * From Movimientos Where idMovimientos = " & CodigoMov, ConexionADO, adOpenKeyset, adLockOptimistic
If RecorsetTemp.RecordCount > 0 Then
Else
RecorsetTemp.AddNew
RecorsetTemp!idMovimientos = UltimoIdTabla("Movimientos", "idMovimientos")
End If
RecorsetTemp!ConceptoMovimeinto = Concepto
RecorsetTemp!Fecha_Movimiento = Fecha
RecorsetTemp!Valor_Movimeinto = CCur(Valor)
RecorsetTemp!idPersonaMovimiento = IdPers
RecorsetTemp!idClaseMovimieno = ClaseMov 'Gatos o Ingreso
RecorsetTemp!idTipoMovimiento = Tipo 'A que cuenta
RecorsetTemp.Update
MsgBox "Movimiento Guardado", vbInformation, "Guardar"
Exit Sub
error:
MsgBox "Fun_GuardarMovimiento - " & Err.Description, vbInformation, "Error - Guardar Nº " & Err.Number
End Sub
Sub Fun_BorrarCampoTablaCodigo(Campo, Codigo, Tabla)
Dim RecorsetTemp As New ADODB.RecordSet
Dim sql As String
If Codigo <> "" Then
sql = "DELETE FROM " & Tabla & " Where " & Campo & " = " & Codigo
RecorsetTemp.Open sql, ConexionADO, adOpenKeyset, adLockOptimistic
End If
End Sub
Sub Fun_GuardarCuenta(Codigo, Nombre)
Dim RecorsetTemp As New ADODB.RecordSet
Dim sql As String
On Error GoTo error
RecorsetTemp.Open "Select * From ClaseMovimiento Where idClaseMovimieno = " & Codigo, ConexionADO, adOpenKeyset, adLockOptimistic
If RecorsetTemp.RecordCount > 0 Then
Else
RecorsetTemp.AddNew
RecorsetTemp!idClaseMovimieno = UltimoIdTabla("ClaseMovimiento", "idClaseMovimieno")
End If
RecorsetTemp!Nombre_Clase = Nombre
RecorsetTemp.Update
Exit Sub
error:
MsgBox "Fun_GuardarCuenta - " & Err.Description, vbInformation, "Error - Guardar Nº " & Err.Number
End Sub
En el Modulo de Conexión:

En Código por si prefiere copiar y pegar:
Global Glo_UsuarioLogin As String Global Glo_NombreUsuario As String Global Glo_IdentificacionUs As String Global Glo_IdUsuario As Integer Global Glo_FormQueAbre As String Global glob_ModificarPro As Boolean Global glob_ModificarCliente As Boolean '---- Variables de Datos de la empresa Global Glo_NombreEmpresa As String Global Glo_NitEmpresa As String Global Glo_PropietarioEmpresa As String Global Glo_TelefonoEmpresa As String Global Glo_DireccionEmpresa As String Global Glo_DescripcionEmpresa As String Global Glo_LogoEmpresa As String Global G_Empresa_Regimen As String Global Path_Archivo_Ini As String '-------------- Variables Configuracion --------------- Global glob_conf_ImpreFacturacion As String Global glob_conf_ImpreInformes As String Global glob_conf_ImpreCierreCaja As String Global glob_conf_ImpresoraTikets As String Global glob_ModificarProveedor As Boolean '----------- variable de impresion ----------------- Global glob_Item_Impresion_mes As String Global glob_Item_Impresion_dia As String Global glob_FormularioSolicBuscarCli As String Global glob_FormularioSolicBuscarPro As String Global Glo_FormularioFacturasCli As Form
En el formulario Buscar Cliente en el botón Factura hay que agregar la siguiente linea:

Private Sub cmdFacturas_Click()
Set Glo_FormularioFacturasCli = Me
IdCliente = msGrid.TextMatrix(msGrid.Row, 1)
If IdCliente <> "" Then
frmFacturasCliente.Show
End If
End Sub
Luego de esto reemplazamos en el formulario frmFacturasCliente en el Sub Procedimiento DatosCliente quedando de la siguiente manera:
Sub DatosCliente()
Fila = Glo_FormularioFacturasCli.msGrid.Row
txtCodigoCli.Text = Glo_FormularioFacturasCli.msGrid.TextMatrix(Fila, 1)
txtNombre_Cli.Text = Glo_FormularioFacturasCli.msGrid.TextMatrix(Fila, 2)
End Sub
Lo unico que se hizo fue cambiar frmBuscarCliente por Glo_FormularioFacturasCli que es la variable que declaramos esto es necesario porque hay 2 maneras de llegar al formulario de frmFacturasCliente y debe tomar ese valor dependiendo el formulario que lo abrio.
Todo listo para agregar los formularios al software.
Descargue de este link los formulario y los informes:
Formularios Y Reportes Finales Software (644 descargas )
Puede descomprimir y luego pegar todos dentro de la carpeta del proyecto en el vídeo explico detallado estos pasos:
Esta es la lista de de formularios:

Para agregar un formulario al proyecto debe dar clic derecho en la ventana del Proyecto y le da clic derecho sobre el nombre del proyecto
Paso 1:

Paso 2:

Seleccionamos el formulario y le damos al botón Abrir
Para agregar un Reporte debemos seleccionar otra opción

Después de agregar los formularios y los reportes hay que agregar los item al Menú del formulario Principal, los que se deben crear de la siguiente manera:

La configuración de cada uno es la siguiente:
Caption: Cartera de Clientes
Name: mnuCarteraClientes
Caption: Movimientos
Name: mnuMovimientos
Caption: Caja
Name: mnuCaja
Caption: Abrir Caja
Name: mnuAbrirCaja
Caption: Cierre Caja
Name: mnuCierreCaja
Caption: –
Name: mnuRaya3
Caption: Egresos – Ingresos
Name: mnuEgresosIngresos
Caption: Lista de Ingresos y Egresos
Name: mnuListaIngrEgre
Caption: Informe de Ventas por dia
Name: mnuInformeVentasDia
En el evento clic de algunos menús va lo siguiente:
Private Sub mnuCarteraClientes_Click()
frmCarteraClientes.Show
End Sub
Private Sub mnuAbrirCaja_Click()
frmAbrirCaja.Show
End Sub
Private Sub mnuCierreCaja_Click()
frmCuadreCaja.Show
End Sub
Private Sub mnuEgresosIngresos_Click()
frmMovimientos.Show
End Sub
Private Sub mnuListaIngrEgre_Click()
frmListaMovimientos.Show
End Sub
Private Sub mnuInformeVentasDia_Click()
glob_Item_Impresion_dia = "VentasDia"
frmInformeDia.Show
End Sub
Con estos cambios ya tienen todo el software listo para trabajar, faltaría el pago de facturas de proveedor pero es lo mismo que clientes solo que para proveedores al igual que la cartera de Proveedores en el vídeo explico en detalle todo el funcionamiento de los formularios.
Pude comprar el Código Listo con el instalador incluido Software de Ventas Cactus 1.0 + Código
Corrección Formulario Ventas Guardado de Saldo de Cliente:
En el formulario de Ventas Puede reemplazar el procedimiento de Finalizar_Guardado_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
'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

