Access - Problema con la función DBúsq

 
Vista:
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Problema con la función DBúsq

Publicado por Juanjo (37 intervenciones) el 07/10/2020 12:10:17
Hola a todos. Gracias de antemano por la ayuda.

En una consulta tengo este campo calculado:
1
Expr1: CMoneda(DBúsq("[Importe]";"Agencia";"[Peso]=100" Y "[IdProvincia]=24"))

No me da error, pero me devuelve un valor que no es correcto. La tabla "Agencia" tiene muchos registros dónde [Peso]=100 y muchos registros dónde [IdProvincia]=24, pero solo hay un único registro que cumple ambas condiciones. Sin embargo, el campo buscado [Importe] no corresponde con el que devuelve la función. Parece que fuera un problema con los criterios que no los interpreta bien.

¿Qué estoy haciendo mal?
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Problema con la función DBúsq

Publicado por Anonimo (3316 intervenciones) el 07/10/2020 15:50:56
Pon la consulta en su 'vista SQL' y copia (y publica) la SQL que genera Access es donde se podrá ver que es lo que interpreta.

Un detalle: DLookup (en castellano DBúsq) devuelve un NULL si no localiza el dato, ese Null no será interpretado por la función CMoneda y al final todo es un puro lio...

Plantéate el utilizar (antes de convertir el resultado a formato moneda) aplicar la función 'NZ' u otra que controle esa situación (y cambie un NULL por un valor numérico)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Problema con la función DBúsq

Publicado por Juanjo (37 intervenciones) el 07/10/2020 17:09:40
Hola. Gracias por la respuesta.
Siguiendo tu consejo he simplificado al máximo la expresión para rastrear donde está el problema. En lugar de buscar el campo "Importe" de la tabla "Agencia", lo he cambiado por "IdTarifa" que es el campo autonumérico que hace de clave principal.

He realizado 3 pruebas:

1. Con el primer criterio por separado:

1
Expr1: DBúsq("[IdTarifa]";"AGENCIA";"[Peso]=100")
Devuelve el primer registro de la tabla "Agencia" donde [Peso]=100. Resultado esperado

SELECT PEDIDOS.IdPedido, CLIENTES.IdProvinciaEnvio, DLookUp("[IdTarifa]","AGENCIA","[Peso]=100") AS Expr1
FROM CLIENTES INNER JOIN PEDIDOS ON (CLIENTES.IdCliente = PEDIDOS.IdCliente) AND (CLIENTES.IdCliente = PEDIDOS.IdCliente)
WHERE (((PEDIDOS.IdPedido)=2218));


2. Con el segundo criterio por separado:

1
Expr1: DBúsq("[IdTarifa]";"AGENCIA";"[IdProvincia]=24")
Devuelve el primer registro de la tabla "Agencia" donde [IdProvincia]=24. Resultado esperado

SELECT PEDIDOS.IdPedido, CLIENTES.IdProvinciaEnvio, DLookUp("[IdTarifa]","AGENCIA","[IdProvincia]=24") AS Expr1
FROM CLIENTES INNER JOIN PEDIDOS ON (CLIENTES.IdCliente = PEDIDOS.IdCliente) AND (CLIENTES.IdCliente = PEDIDOS.IdCliente)
WHERE (((PEDIDOS.IdPedido)=2218));


3. Con los dos criterios a la vez:

1
Expr1: DBúsq("[IdTarifa]";"AGENCIA";"[IdProvincia]=24" Y "[Peso]=100")
Devuelve el primer registro de la tabla MAL. Resultado inesperado


SELECT PEDIDOS.IdPedido, CLIENTES.IdProvinciaEnvio, DLookUp("[IdTarifa]","AGENCIA","[IdProvincia]=24" And "[Peso]=100") AS Expr1
FROM CLIENTES INNER JOIN PEDIDOS ON (CLIENTES.IdCliente = PEDIDOS.IdCliente) AND (CLIENTES.IdCliente = PEDIDOS.IdCliente)
WHERE (((PEDIDOS.IdPedido)=2218));



Si los dos criterios por separado funcionan bien y el problema viene cuando se unen, ¿entonces el problema viene porque no interpreta correctamente la "unión" de los criterios?

A ver si podéis ayudar. Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con la función DBúsq

Publicado por Anonimo (3316 intervenciones) el 08/10/2020 00:35:55
No interpreta el 'AND' de forma correcta, por culpa de las dobles comillas.

Modifica la SQL así y tras ello observa lo que traduce/pone en su vista diseño:

1
2
3
SELECT PEDIDOS.IdPedido, CLIENTES.IdProvinciaEnvio, DLookUp("[IdTarifa]","AGENCIA","[IdProvincia]=24 And [Peso]=100") AS Expr1
FROM CLIENTES INNER JOIN PEDIDOS ON (CLIENTES.IdCliente = PEDIDOS.IdCliente) AND (CLIENTES.IdCliente = PEDIDOS.IdCliente)
WHERE (((PEDIDOS.IdPedido)=2218));
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Problema con la función DBúsq

Publicado por Juanjo (37 intervenciones) el 08/10/2020 01:51:05
Funcionó perfectamente.

Volviendo a la vista diseño, la función quedó así:
1
Expr1: DBúsq("[IdTarifa]";"AGENCIA";"[IdProvincia]=24 And [Peso]=100")

Nunca imaginé que fuera este el problema. De hecho la probé muchas veces pero poniendo "Y" en lugar de "And".

Muchas gracias por la ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con la función DBúsq

Publicado por Anonimo (3316 intervenciones) el 08/10/2020 09:57:06
Lo causa el hecho de que Access espera un dato concreto y se le pasa una función con parámetros.

Al tener esa función una cadena de texto como parámetro, el motor de Access (que no tiene permitido analizar datos que van en formato cadena de texto), no puede evaluar esa expresión (que precisa un análisis independiente) por lo que pasa 'tal cual' y no traduce el 'Y' como un 'AND'.

Lo demuestra la interpretación que devuelve (la vista SQL): "[IdProvincia]=24" Y "[Peso]=100" <<== dos cadenas de texto + una conjunción en castellano, no en ingles)

Supongo que (como suele ser lo habitual) desprecia la condición o toma de ella lo que entiende y por ello devuelve el primer registro que encuentra que la cumpla.

Si se comienza a practicar utilizar expresiones 'en guiri' no solo se evitan estos problemas, sino que se va caminado (pasito a pasito) a trabajar en el entorno de VBA, que es donde el programador domina a la maquina (y no como ahora que la maquina le complica la vida al programador).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 59
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Problema con la función DBúsq

Publicado por Juanjo (37 intervenciones) el 08/10/2020 10:13:33
Fantástica explicación. Tomo nota para no cometer los mismos errores.
Gracias por tu tiempo e interés en ayudar.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar