Error en código para columna de una consulta

Un gusto saludarlos.

Quería solicitar su ayuda, porque necesito crear una columna calculada dentro de una consulta access y para eso uso el siguiente código.

Saldofinal: IIf(([Nivel]=1 Or [Nivel]=5), ([Sumadesaldoinicial]+[Sumadebe]-[Sumahaber]), ([Sumadesaldoinicial]+[Sumahaber]-[Sumadebe]))

Sin embargo, cada vez que agrego un ciclo if o switch me aparece error, si coloco 

saldofinal:([Sumadesaldoinicial]+[Sumadebe]-[Sumahaber])

Ejecuta sin problemas el código, pero al agregarle los ciclos me aparecen errores de sintaxis, no sé que pueda estar haciendo mal.

2 respuestas

Respuesta
1

El problema es el uso de la palabra reservada "Sumadesaldoinicial" (y posiblemente las otras, aunque no siempre dan error) como nombre de un campo. Access interpreta su fórmula IIf(([Nivel]=1 Or [Nivel]=5), ([Sumadesaldoinicial]+[Sumadebe]-[Sumahaber]), ([Sumadesaldoinicial]+[Sumahaber]-[Sumadebe])) como si estuviera tratando de anidar funciones de agregación (como Sum()) dentro de una expresión IIf(), lo cual puede ser complejo o imposible en el contexto de una consulta simple o una columna calculada de Access, especialmente si ya está utilizando campos que son resultados de agregaciones (como podría ser en una consulta de totales).

Cuando utiliza la expresión simple saldofinal:([Sumadesaldoinicial]+[Sumadebe]-[Sumahaber]), Access puede que la interprete como una simple operación aritmética sin problemas. Pero al añadir la lógica IIf, la sintaxis se vuelve más estricta, y el nombre del campo, que comienza con Suma, se confunde con una función de Access

Solución al Error de Sintaxis

La solución es encerrar los nombres de sus campos entre corchetes []. Esto le indica explícitamente a Access que se trata de nombres de campos y no de funciones o palabras reservadas.

Código corregido

Saldofinal: IIf(([Nivel]=1 Or [Nivel]=5), ([Sumadesaldoinicial]+[Sumadebe]-[Sumahaber]), ([Sumadesaldoinicial]+[Sumahaber]-[Sumadebe]))

Recomendaciones Adicionales

Nombres de Campos: Para evitar este tipo de problemas en el futuro, es una buena práctica💡 evitar nombrar campos con nombres que:

Empiecen con palabras que son funciones de Access (como Suma, Avg, Count, Max, Min, etc.).

Contengan espacios, caracteres especiales, o puntos.

Sean palabras reservadas de SQL o Access.

Verifique el Origen: Asegúrese de que los campos Sumadesaldoinicial, Sumadebe, y Sumahaber estén disponibles y correctamente nombrados en la fuente de datos (tablas o consultas previas) que está utilizando para su consulta actual.

Con esta corrección, el motor de Access debería interpretar la expresión IIf correctamente como una lógica condicional aplicada a los valores de sus campos.

Si quieres usar varios niveles de condiciones

Puedes hacerlo con Switch, que es más legible:

Saldofinal: Switch(
    [Nivel]=1 Or [Nivel]=5, [Sumadesaldoinicial]+[Sumadebe]-[Sumahaber],
    [Nivel]=2 Or [Nivel]=3, [Sumadesaldoinicial]+[Sumahaber]-[Sumadebe],
    True, Null
)
Respuesta
1

Si los datos (las sumas) se obtienen en la propia consulta, es fácil encontrar errores porque se utilizan en el calculo datos provenientes de otro calculo aun en ejecución.

La solución es generar una consulta que calcule los datos y utilizar esta consulta (los datos ya calculados) en el consulta final que presenta los resultados.

Habitualmente se hace con dos consultas independientes que (si se desea) se pueden combinar en una sola (esto es: generar una consulta auxiliar con los cálculos que Access procesará previamente).

La referencia a un elemento externo ( los datos calculados con la primera consulta) obliga a ejecutarla, por lo que sus resultados finales estarían disponibles durante todo el proceso como simples valores (no cálculos) y reutilizarlos en/para procesos posteriores.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas