Como hacer una consulta de access que me arroje suma por niveles de cuenta.

Un gusto saludarlos.

Les comento, estoy haciendo un pequeño programa contable para un pequeño negocio que abrí, el asunto es que no se como crear una consulta, que me permita visualizar.

1. La suma por niveles (nivel 1 primer dígito del campo cod_puc, nivel 2 dos primeros dígitos, nivel 3 cuatro primeros dígitos, nivel 4 seis primeros dígitos) de las cuentas contables, tanto del debe como del haber.

2. Que me permita sacar los saldos iniciales y finales según la naturaleza de las cuentas.

Tengo una tabla en access llamada, item_documento_ soporte, y de esa tabla tome los siguientes Campos:

cod_puc, nom_cuenta_puc, dónde cod_puc, es el código de la cuenta y, Nom_cuenta puc, es el nombre de la cuenta, Cod_cliente, Nom_cliente, debe ,haber, Fecha_doc_soporte.

Espero haberme explicado bien, si me pueden echar una mano seria de gran ayuda.

3 Respuestas

Respuesta
1

Aquí te explico cómo estructurarla.

Consulta de Sumas por Niveles de Cuenta
Deberás crear una sola consulta que te calcule las sumas de Debe y Haber y los códigos de los diferentes niveles.

1. Estructura de la Consulta (Vista Diseño o SQL)
En la vista Diseño de Consulta de Access, agrega la tabla item_documento_soporte. Luego, habilita la fila Totales (el botón Σ en la cinta de opciones) para poder agrupar y sumar.

Campo Tabla Total Criterios
Izquierda([cod_puc]; 1) (Calculado) Agrupar por
Izquierda([cod_puc]; 2) (Calculado) Agrupar por
Izquierda([cod_puc]; 4) (Calculado) Agrupar por
Izquierda([cod_puc]; 6) (Calculado) Agrupar por
debe item_documento_soporte Suma
haber item_documento_soporte Suma
Fecha_doc_soporte item_documento_soporte Donde Si necesitas filtrar por fecha

¡Qué gusto saludarte también! Es una excelente iniciativa que desarrolles tu propio sistema contable. Para crear la consulta en Microsoft Access que necesitas, que sume por niveles de cuenta y te permita manejar saldos, deberás usar funciones de texto como Izquierda (Left) y consultas de resumen (agrupación).

Aquí te explico cómo estructurarla.

Consulta de Sumas por Niveles de Cuenta
Deberás crear una sola consulta que te calcule las sumas de Debe y Haber y los códigos de los diferentes niveles.

1. Estructura de la Consulta (Vista Diseño o SQL)
En la vista Diseño de Consulta de Access, agrega la tabla item_documento_soporte. Luego, habilita la fila Totales (el botón Σ en la cinta de opciones) para poder agrupar y sumar.

Campo Tabla Total Criterios
Izquierda([cod_puc]; 1) (Calculado) Agrupar por
Izquierda([cod_puc]; 2) (Calculado) Agrupar por
Izquierda([cod_puc]; 4) (Calculado) Agrupar por
Izquierda([cod_puc]; 6) (Calculado) Agrupar por
debe item_documento_soporte Suma
haber item_documento_soporte Suma
Fecha_doc_soporte item_documento_soporte Donde Si necesitas filtrar por fecha

Exportar a Hojas de cálculo
2. Campos Calculados para Niveles
Para obtener los códigos por nivel, usa la función Izquierda (Left) de Access, que extrae caracteres desde la izquierda de una cadena de texto.

Nivel Nombre del Campo Calculado Expresión
Nivel 1 Nivel_1: Izquierda([cod_puc]; 1) Primer dígito
Nivel 2 Nivel_2: Izquierda([cod_puc]; 2) Dos primeros dígitos
Nivel 3 Nivel_3: Izquierda([cod_puc]; 4) Cuatro primeros dígitos
Nivel 4 Nivel_4: Izquierda([cod_puc]; 6) Seis primeros dígitos

Importante: En la fila Total de estos campos, debes seleccionar Agrupar por.

¡Qué gusto saludarte también! Es una excelente iniciativa que desarrolles tu propio sistema contable. Para crear la consulta en Microsoft Access que necesitas, que sume por niveles de cuenta y te permita manejar saldos, deberás usar funciones de texto como Izquierda (Left) y consultas de resumen (agrupación).

Aquí te explico cómo estructurarla.

Consulta de Sumas por Niveles de Cuenta
Deberás crear una sola consulta que te calcule las sumas de Debe y Haber y los códigos de los diferentes niveles.

1. Estructura de la Consulta (Vista Diseño o SQL)
En la vista Diseño de Consulta de Access, agrega la tabla item_documento_soporte. Luego, habilita la fila Totales (el botón Σ en la cinta de opciones) para poder agrupar y sumar.

Campo Tabla Total Criterios
Izquierda([cod_puc]; 1) (Calculado) Agrupar por
Izquierda([cod_puc]; 2) (Calculado) Agrupar por
Izquierda([cod_puc]; 4) (Calculado) Agrupar por
Izquierda([cod_puc]; 6) (Calculado) Agrupar por
debe item_documento_soporte Suma
haber item_documento_soporte Suma
Fecha_doc_soporte item_documento_soporte Donde Si necesitas filtrar por fecha

Exportar a Hojas de cálculo
2. Campos Calculados para Niveles
Para obtener los códigos por nivel, usa la función Izquierda (Left) de Access, que extrae caracteres desde la izquierda de una cadena de texto.

Nivel Nombre del Campo Calculado Expresión
Nivel 1 Nivel_1: Izquierda([cod_puc]; 1) Primer dígito
Nivel 2 Nivel_2: Izquierda([cod_puc]; 2) Dos primeros dígitos
Nivel 3 Nivel_3: Izquierda([cod_puc]; 4) Cuatro primeros dígitos
Nivel 4 Nivel_4: Izquierda([cod_puc]; 6) Seis primeros dígitos

Exportar a Hojas de cálculo
Importante: En la fila Total de estos campos, debes seleccionar Agrupar por.

¡Qué gusto saludarte también! Es una excelente iniciativa que desarrolles tu propio sistema contable. Para crear la consulta en Microsoft Access que necesitas, que sume por niveles de cuenta y te permita manejar saldos, deberás usar funciones de texto como Izquierda (Left) y consultas de resumen (agrupación).

Aquí te explico cómo estructurarla.

Consulta de Sumas por Niveles de Cuenta
Deberás crear una sola consulta que te calcule las sumas de Debe y Haber y los códigos de los diferentes niveles.

1. Estructura de la Consulta (Vista Diseño o SQL)
En la vista Diseño de Consulta de Access, agrega la tabla item_documento_soporte. Luego, habilita la fila Totales (el botón Σ en la cinta de opciones) para poder agrupar y sumar.

Campo Tabla Total Criterios
Izquierda([cod_puc]; 1) (Calculado) Agrupar por
Izquierda([cod_puc]; 2) (Calculado) Agrupar por
Izquierda([cod_puc]; 4) (Calculado) Agrupar por
Izquierda([cod_puc]; 6) (Calculado) Agrupar por
debe item_documento_soporte Suma
haber item_documento_soporte Suma
Fecha_doc_soporte item_documento_soporte Donde Si necesitas filtrar por fecha

Exportar a Hojas de cálculo
2. Campos Calculados para Niveles
Para obtener los códigos por nivel, usa la función Izquierda (Left) de Access, que extrae caracteres desde la izquierda de una cadena de texto.

Nivel Nombre del Campo Calculado Expresión
Nivel 1 Nivel_1: Izquierda([cod_puc]; 1) Primer dígito
Nivel 2 Nivel_2: Izquierda([cod_puc]; 2) Dos primeros dígitos
Nivel 3 Nivel_3: Izquierda([cod_puc]; 4) Cuatro primeros dígitos
Nivel 4 Nivel_4: Izquierda([cod_puc]; 6) Seis primeros dígitos

Exportar a Hojas de cálculo
Importante: En la fila Total de estos campos, debes seleccionar Agrupar por.

3. Código SQL Resultante (Ejemplo)
El código SQL de tu consulta se vería similar a esto:

SELECT 
    Left([cod_puc], 1) AS Nivel_1,
    Left([cod_puc], 2) AS Nivel_2,
    Left([cod_puc], 4) AS Nivel_3,
    Left([cod_puc], 6) AS Nivel_4,
    Sum(item_documento_soporte.debe) AS SumaDebe,
    Sum(item_documento_soporte.haber) AS SumaHaber
FROM item_documento_soporte
GROUP BY 
    Left([cod_puc], 1), 
    Left([cod_puc], 2), 
    Left([cod_puc], 4), 
    Left([cod_puc], 6)
ORDER BY Left([cod_puc], 1);

Esta consulta te mostrará las sumas del Debe y Haber para cada combinación única de los niveles 1, 2, 3 y 4.

Cálculo de Saldos Iniciales y Finales
Para manejar saldos, necesitas determinar la naturaleza de cada cuenta y una fecha de corte.

1. Determinar la Naturaleza de la Cuenta (Clasificación)

La naturaleza de la cuenta (Débito o Crédito) es esencial para calcular el saldo. Lo ideal es tener una tabla maestra de cuentas (puc) donde se defina la naturaleza (por ejemplo, con un campo llamado Naturaleza).

Naturaleza Débito (Activo, Gasto, Costo): Saldo = Debe - Haber

Naturaleza Crédito (Pasivo, Patrimonio, Ingreso): Saldo = Haber - Debe

Si no tienes una tabla de PUC, puedes inferir la naturaleza a partir del primer dígito del cod_puc (según el plan de cuentas que uses):

Primer Dígito Clase Naturaleza Principal
1 Activo Débito (Saldo = Debe - Haber)
2 Pasivo Crédito (Saldo = Haber - Debe)
3 Patrimonio Crédito (Saldo = Haber - Debe)
4 Ingreso Crédito (Saldo = Haber - Debe)
5 Gastos Débito (Saldo = Debe - Haber)
6 Costos Débito (Saldo = Debe - Haber)

2. Consulta para Saldo Final por Cuenta
Usa la siguiente expresión en tu consulta (o en una nueva basada en la anterior) para calcular el saldo por cuenta, usando la lógica del primer dígito:

Campo Calculado de Saldo:

Saldo: IIf(
    Left([cod_puc], 1) In ("1", "5", "6"),  
    [SumaDebe] - [SumaHaber], 
    [SumaHaber] - [SumaDebe]
)

3. Saldo Inicial y Final (Por Periodo)

Para obtener un Saldo Final y un Saldo Inicial, necesitarás usar dos consultas separadas (o subconsultas), filtradas por la Fecha_doc_soporte:

Consulta de Saldo Inicial: Filtra los registros con Fecha_doc_soporte menor o igual al día anterior a tu fecha de inicio de periodo.

Consulta de Movimiento del Periodo: Filtra los registros con Fecha_doc_soporte entre tu fecha de inicio y fin de periodo.

Saldo Final: El saldo final será: [Saldo Inicial] + [Movimiento del Periodo].

Sugerencia Avanzada:

La forma más eficiente es crear dos consultas de resumen (una para el saldo inicial acumulado hasta la fecha de corte, y otra para el movimiento del periodo) y luego unirlas usando una consulta de combinación (usando JOIN en SQL o la vista diseño de Access para vincularlas por el cod_puc o su nivel).

Aprovecho para invitarlo a que aprenda PostgreSQL donde puedes llegar más lejos sin las limitaciones de Access.

Disculpa que repetí parte del contenido.

Buen día, gracias por responder,  seguí los pasos de la consulta que muy amablemente me brindaste,  pero no resuelve mi problema de que me sume por niveles de cuentas contables. Haciendo prueba y error realicé una consulta llamada consulta1, y además separé el código del puc, en clase_puc, el cual me almacenaría el primer dígito, en grupo_puc, el cual me almacenará los dos primeros dígitos, cuenta_puc y subcuenta_puc, para los primeros cuatro y seis dígitos respectivamente  el código  me suma por los niveles de cuenta, sin embargo el problema es que cuando  ingreso el resto de Campos necesarios (Nom_cuenta,Nom_cliente,cod_cliente,fecha_soporte)para la consulta que necesito, me sale error. A continuación te comparto el código:

SELECT Left([Clase_puc],1) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([Clase_puc],1);

UNION ALL

SELECT Left([Grupo_puc],2) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([Grupo_puc],2);

UNION ALL

SELECT Left([Cuenta_puc],4) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([Cuenta_puc],4);

UNION ALL SELECT Left([Subcuenta_puc],6) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([Subcuenta_puc],6);

Agradezco de antemano la ayuda que me puedas brindar.

Buen día, agradezco tu interés y respuesta en mi dificultad

Seguí los pasos que me proporcionaste en la explicación sin embargo no me hace la sumatoria del dbi haber por niveles de cuentas contables como la necesito.

A prueba y error realiza una consulta llamada consulta1 y además dividí el código puc en clase_puc que me almacena el primer dígito del cod_puc, grupo_puc que me almacena los dos primeros dígitos del cod_puc y cuenta_puc, subcuenta_puc que me almacenaría los 4 primeros dígitos y los 6 primeros dígitos respectivamente, sin embargo cuando deseo agregar el resto de Campos necesarios para la consulta (nom_cuenta,cod_cliente,nom_cliente,fecha_soporte), me genera error. 

A continuación te comparto el código que utilizo.

SELECT Left([Clase_puc],1) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([Clase_puc],1);

UNION ALL

SELECT Left([Grupo_puc],2) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([Grupo_puc],2);

UNION ALL

SELECT Left([Cuenta_puc],4) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([Cuenta_puc],4);

UNION ALL SELECT Left([Subcuenta_puc],6) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([Subcuenta_puc],6);

Agradezco de antemano la ayuda que me puedas brindar

El error se debe a una restricción fundamental en las consultas que usan el operador UNION y en las consultas con funciones de agregación (SUM, GROUP BY):

Regla de UNION: Todas las consultas combinadas con UNION deben tener el mismo número de columnas y los tipos de datos de las columnas correspondientes deben ser compatibles.

Regla de GROUP BY: Cuando usas una función de agregación (SUM, COUNT, etc.), cualquier campo que no esté agregado debe estar incluido en la cláusula GROUP BY.

Tu consulta actual solo tiene cuatro campos (Nivel, Sumadebe, Sumahaber, Saldo) en cada sección del UNION.

Solución al Problema de Agregación y Detalle

Para incluir los campos de detalle (nom_cuenta, cod_cliente, etc.) junto con los saldos consolidados, debes entender que no pueden ir directamente en la misma consulta UNION con los niveles del PÚC, porque estos campos de detalle no son agregados y varían para cada transacción, mientras que tu consulta principal está agregando los totales.

La forma correcta de manejar esto es:

Asegurarte de que la consulta original (Consulta1) sea la que contenga todos los campos de detalle. (Parece que ya lo tienes).

Realizar la agregación por cada nivel del PÚC (como lo haces ahora) sin los campos de detalle.

Para obtener el detalle por cada nivel, necesitarías una consulta separada o usar una técnica de JOIN o una subconsulta para ligar el nivel agregado con el nombre correspondiente (si es un nombre de cuenta).

2. Código Propuesto para la Estructura PÚC

Asumiendo que Consulta1 es la fuente de datos que contiene todos los campos, el código de tu consulta está bien para obtener solo la estructura de los saldos por nivel.

Consulta Original (Correcta para Saldo Consolidado)

SELECT Left([cod_puc],1) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([cod_puc],1)
UNION ALL
SELECT Left([cod_puc],2) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([cod_puc],2)
UNION ALL
SELECT Left([cod_puc],4) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([cod_puc],4)
UNION ALL
SELECT Left([cod_puc],6) AS Nivel, Sum([Debe]) AS Sumadebe,
Sum([Haber]) AS Sumahaber,
Sum([Debe]-[Haber]) AS Saldo
FROM Consulta1
GROUP BY Left([cod_puc],6);

NOTA IMPORTANTE:

En el código original usas Left([Clase_puc],1), Left([Grupo_puc],2), etc. Si Consulta1 ya contiene los campos Clase_puc, Grupo_puc, Cuenta_puc, y Subcuenta_puc tal cual (por ejemplo, Clase_puc = "1", Grupo_puc = "11", etc.), deberías usar el campo completo cod_puc y la función Left() para garantizar que la agregación sea correcta.

Si insistes en usar tus campos calculados (Clase_puc, etc.), entonces la forma correcta sería simplemente usar el campo sin la función Left() si ya co

SELECT [Clase_puc] AS Nivel, Sum([Debe]) AS Sumadebe, ... GROUP BY [Clase_puc]
UNION ALL
SELECT [Grupo_puc] AS Nivel, Sum([Debe]) AS Sumadebe, ... GROUP BY [Grupo_puc]
-- Etc.

3. Cómo Agregar el Nombre de la Cuenta (nom_cuenta)

Para añadir el nombre de la cuenta, debes hacer un LEFT JOIN de tu consulta unificada (la que calcula los saldos por nivel) con una tabla de cuentas que contenga el código y el nombre.

Asume que tienes una tabla llamada TablaCuentas con los campos cod_puc y nom_cuenta.

Guarda la consulta anterior (la que obtiene los saldos por nivel) como ConsultaSaldosPuc.

Crea una nueva consulta para unir los nombres:ntienen la longitud correcta:

SELECT S.Nivel, T.nom_cuenta, S.Sumadebe, S.Sumahaber, S.Saldo
FROM ConsultaSaldosPuc AS S
LEFT JOIN TablaCuentas AS T
ON S.Nivel = T.cod_puc
ORDER BY S.Nivel;

De esta manera, la consulta ConsultaSaldosPuc te da los saldos consolidados.

El LEFT JOIN busca el nombre (nom_cuenta) correspondiente al Nivel agregado.

Para los niveles intermedios (1, 11, 1105), la TablaCuentas debe contener también sus nombres.

Para los campos de cliente (cod_cliente, nom_cliente, fecha_soporte), estos solo tienen sentido en el nivel de detalle de la transacción (la cuenta de 6 o más dígitos), y no pueden mostrarse en el saldo consolidado de la Clase 1 o Grupo 11. Para eso, solo debes consultar Consulta1 directamente, o filtrar ConsultaSaldosPuc por el nivel más bajo (6 dígitos).

Buen día. Eduardo.

Quisiera manifestarte mi gratitud por tu ayuda, gracias a tu conocimiento puedo seguir avanzando en mi proyecto, muy amable de tu parte sacar el tiempo para explicarme, te quedo muy agradecido.

Me alegro y con gusto desde que tenga algo de tiempo.

Nota:

Lo invito a que migre sus tablas o back end a PostgreSQL con esto gana en seguridad, agilidad y posibilidades de realizar consultas complejas que no son posibles en Access. Igualmente, puede tener un entorno multiusuario y desde Access administrar sus datos en la nube Si le interesa un curso sobre Access con PostgreSQL puede contactarme a [email protected]

Respuesta
1

Si en el generador de consultas se activa la opción de [TOTALES] se podrán crear subconjuntos de datos (por ejemplo los tres primeros caracteres para obtener el tercer nivel), se podrán crear cálculos (nuevos campos calculados) para cada uno de los subconjuntos obtenidos y llevarlos a un formulario u informe.

Analiza si esta opción cumple con las expectativas, en ocasiones se utiliza la alternativa de generar una consulta de agrupación con los campos imprescindibles y utilizarla como filtro para crear una consulta mas completa (añadiendo los datos que imposibilitarían crear la agrupación).

Gracias por tu respuesta, la verdad ya lo intente pero no sale la información que necesito.

Aprecio que te hallas tomado en tiempo para contestar.

Si se simplifica la consulta de totales (utilizando solo los campos mínimos e indispensables) se obtiene una consulta que se puede utilizar a modo de condición sobre el conjunto de 'datos en bruto'.

Solo se precisa una nueva consulta que las asocie a ambas, esto es: se relacionan ambas por los 'datos únicos e indispensables' de la otra (y suele funcionar correctamente).

Intentar resolverlo solo con la consulta de datos agrupados es uno de los típicos problemas que complican, los campos 'no agrupados' generan conflictos que desaparecen al cambiar el método.

Quizás exponiendo un intento infructuoso (con muestras de lo que se desea y lo que se obtiene) pueda permitir aportar soluciones practicas o consejos mas acertados.

Buen día, haciendo el procedimiento así como me sugiere no funciona, porque no da la suma por niveles de cuenta contable

Lo normal es utilizar informes para la presentación de resultados finales, y los informes (en Access) permiten utilizar la funcionalidad de suma continua (de forma mas simple que en los formularios) lo que hace innecesario sumar en la consulta.

Me atrevería a decir que (correctamente planificado) ni tan siquiera seria preciso generar agrupaciones en las consultas, bastará la agrupación en el propio informe para obtener los subconjuntos y las sumas de cada grupo y los subgrupos que este pueda contener.

Te animo a que analices lo que te puede aportar un informe (asumo que será el medio de presentación del resultado) y lo útiles que son herramientas.

Buena noche.

Gracias por contribuir en mi proyecto, le comento el asunto es que en el informe sale bien y sale perfecta la información de la sumatoria por niveles, pero lo que se necesita es poderlo hacer mediante consultas para poderlo exportar en Excel ya que, para realizar ciertos procesos contables es necesario descargar la información y cuando exporto en Excel la información de un informe sale mal.

Suele suceder cuando se mezclan procesos con consultas con los procesos propios del informe, algo que puede plasmarse en la exportación, siempre queda la opción de interactuar con Excel desde Access (no dejan de ser 'familia próxima')

La solución suele estar en que el origen de datos del informe solo sean datos para que los manejen las herramientas del informe (ni tan siquiera es preciso ordenarlos en origen).

Respuesta

“In the field of Tecnología e Internet, if you were an expert, which concept (e.g., artificial intelligence, cybersecurity, blockchain, Internet of Things) ¿Would you choose to explain best to a novice — and where would you start when writing your answer Survival race?”

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas