Calcular saldo inicial y final en tabla con cargos y abonos
Tengo una tabla que contiene los siguientes campos: Cuenta, Mes (1-12), cargos, abonos, (cargos-abonos).
Deseo calcular para cada cuenta, por cada mes, lo siguiente:
1.- Saldo inicial: suma de cargos menos abonos hasta el mes anterior al actual
2.- Saldo final: suma de cargos menos abonos, incluyendo el mes actual
Les agradezco su amable respuesta; he tratado varias opciones que hasta ahora no han funcionado
1 Respuesta
Lo puedes hacer de mil formas, convendría saber como lo quieres ver. Por ejemplo, supongamos que tengo una tabla Tabla1( ya que no sé como es la tuya)
Y tengo un formulario con un cuadro combinado donde elijo el mes y la cuenta, y dos cuadros de texto, que me van a presentar el "Saldo" de esa cuenta hasta el mes anterior y el saldo contando ese mes
Elijo Septiembre y Compras
Los cuadros de texto se llaman Mes anterior y MesActual
El código del evento Después de actualizar del combinado ElegirMes es
Private Sub ElegirMes_AfterUpdate() MesAnterior = DSum("nz([cargos])", "tabla1", "mes<" & Me.ElegirMes & " and cuenta='" & Me.ElegirMes.Column(1) & "'") - DSum("nz([abonos])", "tabla1", "mes<" & Me.ElegirMes & " and cuenta='" & Me.ElegirMes.Column(1) & "'") MesActual = DSum("nz([cargos])", "tabla1", "mes<=" & Me.ElegirMes & " and cuenta='" & Me.ElegirMes.Column(1) & "'") - DSum("nz([abonos])", "tabla1", "mes<=" & Me.ElegirMes & " and cuenta='" & Me.ElegirMes.Column(1) & "'") End Sub
Pero como te decía hay mil formas de hacerlo. No te debes conformar con lo que pongo, sino con lo que tu quieres.
Buenos días Julián,
Mil gracias por tu respuesta. Quiero crear lo que en contabilidad se llama balanza de comprobación; te muestro la que llevo en Excel y que quiero replicar en Access:
En Access, uso la tabla "Partidas", que contiene la actividad de la cuenta por cada transacción, y el mes en que ocurrió la transacción. Te envío una muestra: De esta tabla, quiero crear una nueva que contenga para cada cuenta y mes: el saldo inicial, total de cargos, total de abonos y saldo final.
Mil gracias por tu ayuda. Saludos.
Cada vez lo entiendo menos. Si usas una cuenta para un abono y otra para los cargos, en alguna te tendrá que salir un valor negativo, ya que si resto, por ejemplo Cargo-abono en la 101-03 al ser Cargo nulo, es saldo sería -57,04.
Si se llaman Cargo y Abono, ¿de dónde sale lo de Debe y Haber?
Por otro lado, como sigo sin saber como haces los cálculos tengo que suponer todo
Si tengo la tabla Partidas
En la que para no tener que escribir muchos meses, he repetido datos cambiando el mes.
Por otro lado he supuesto que tienes ( por la imagen en gris) una tabla Cuentas con, entre otros, los campos Cuenta y Descripcion
Creo una tabla auxiliar, que he llamado Presentación, con los campos Cuenta, Descripcion, SaldoAnterior y SaldoCurso
Con ésta última creo un formulario, que te pongo el diseño
Donde, por no saber tus cálculos, le pongo un cuadro de texto oculto llamado Mes y un botón de comando. Las etiquetas donde pone Agosto y Septiembre en realidad se llama MesA y Mesc y su "caption" lo cogen al cargar el formulario
Cuando voy a abrir el formulario me pregunta que que mes quiero ver. Escribo por ejemplo 9
Cuando Acepto
Ya me pone lo de Agosto y Septiembre. Y si ahora aprieto el botón
El código del evento Al cargar del formulario es
Private Sub Form_Load() Dim b As Byte b = InputBox("Escriba el número del mes que quiere ver", "Muchas gracias, muy amable") Mes = b DoCmd.RunSQL "insert into presentacion select * from cuentas" Me.Requery MesA.Caption = UCase(MonthName([b] - 1)) MesC.Caption = UCase(MonthName([b])) End Sub
El código del evento Al cerrar es
Private Sub Form_Close() DoCmd.SetWarnings False DoCmd.RunSQL "delete * from presentacion" End Sub
Es decir, que una vez que has comprobado lo que sea y cierras el formulario, te elimina los registros de la tabla auxiliar Presentación, para quedar lista para otra comprobación posterior.
Y el código del botón es
Private Sub Comando17_Click() Dim i As Byte DoCmd.GoToRecord , , acFirst For i = 1 To Me.Recordset.RecordCount SaldoAnterior = DSum("nz([cargos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<" & Me.Mes & "") - DSum("nz([abonos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<" & Me.Mes & "") SaldoCurso = DSum("nz([cargos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<=" & Me.Mes & "") - DSum("nz([abonos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<=" & Me.Mes & "") DoCmd.GoToRecord , , acNext Next End Sub
Es decir, que "va recorriendo " los registros poniéndole su valor, en función de la cuenta.
Si quieres que te los muestre positivos puedes ponerlo como
saldoanterio=Abs(dsum(.....
Por último, te diría que es casi mejor presentar estos resultados en un informe que en un formulario.
Buenas noches Julián,
Te agradezco mucho tu ayuda en este proyecto. En contabilidad, se utilizan claves de cuentas para capturar la actividad de los diferentes rubros; cada cuenta tiene dos campos para registrar los importes asignados a ésta: Debe, en el que se registran los importes de "Débito" o "Cargo"; y Haber, en el que se registran los importes de "Crédito" o "Abono"; no se utilizan cantidades negativas. El saldo de cada mes es resultado de sumar el total de cargos y restarle a éste el total de abonos. Incluso se utilizan Saldo deudor y Saldo acreedor.
Seguí las instrucciones que me diste: cree la tabla Presentacion y con base en ella un formulario. al cargarlo, la tabla se llena adecuadamente con todas las cuentas y nombres y el formulario las muestra:
Al darle click al botón de calcular, se muestra este mensaje de error:
y me resalta el texto que inicia con "SaldoAnterior..."; creo que no encuentra la variable Me.Mes
Private Sub Command13_Click()
Dim i As Byte
DoCmd.GoToRecord , , acFirst
For i = 1 To Me.Recordset.RecordCount
SaldoAnterior = DSum("nz([cargos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<" & Me.Mes & "") - DSum("nz([abonos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<" & Me.Mes & "")
SaldoCurso = DSum("nz([cargos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<=" & Me.Mes & "") - DSum("nz([abonos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<=" & Me.Mes & "")
DoCmd.GoToRecord , , acNext
Next
End Sub
Private Sub Form_Load()
Dim b As Byte
b = InputBox("Que mes desea?")
Mes = b
DoCmd.RunSQL "insert into presentacion select Cuenta,Nomb from Cuen"
Me.Requery
End Sub
La lógica que sigues es correcta. sumar el total de cargos menos abonos hasta el mes anterior al que se desea para obtener el saldo inicial, y hacer la misma operacion hasta el mes actual para obtener el saldo final de cada cuenta.
Abusando de tu amabilidad y confiando en tu habilidad, me gustaría ver si es posible crear una tabla que contenga para cada cuenta de la tabla, lo siguiente: Saldo inicial, total de cargos, total de abonos, y saldo final. te envío un ejemplo que calculé manualmente.
Si esto no es posible, te agredeceré me indiques como corrijo el error del mes.
De nuevo, agradezco mucho tu ayuda. Me compré unos cursos de Access, incluyendo VBA, y he visto varios videos de You Tube, pero hasta hoy, excepto por tu solución, no he encontrado algo que realmente me ayude.
Estoy convencido de que varios de los contadores, como tu servidor, estarán encantados de utilizar tu solución para aplicarla en Access. Saludos
Buenos días,
Podrían por favor indicarme como corrijo el error
Siguiendo las instrucciones de Julián, abro una forma en la cual se cargan todas las cuentas activas y me pide el número del mes para el que calculará los saldos anterior y posterior al mes para cada una de ellas, basados en la tabla "partidas", que contiene la actividad de cargos y abonos. El código de apertura de la forma es:
Private Sub Form_Load()
Dim b As Byte
b = InputBox("Que mes desea?", "Captura del mes")
Mes = b
DoCmd.RunSQL "insert into presentacion select Cuenta,Nomb from Cuen"
Me.Requery
End Sub
El error sucede cuando pulso el boton de comando "Calcular":
For i = 1 To Me.Recordset.RecordCount
SaldoAnterior = DSum("nz([cargos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<" & Me.Mes & "") - DSum("nz([abonos])", "partidas", "cuenta='" & Me.Cuenta & "' and mes<" & Me.Mes & "")
Les agradezco mucho su ayuda. Saludos.
Vamos a hacer una cosa, si quieres, repito, si quieres, mándame un mensaje(solo el mensaje) a [email protected] y te mando un ejemplo, y sobre eso hablamos. Me da la impresión que el error lo tienes en que( supongo) habrás definido el campo Mes como texto.
Te quedaría algo como, ya que no sé tus cálculos.
Si lo haces, en el asunto del mensaje pon tu alias Manuel, ya que si no sé quien me escribe ni los abro.
- Compartir respuesta