¿Cómo referenciar a un subformulario dentro de una función DBúsq usada en una expresión de campo?

Tengo la siguiente duda con el planteamiento de una expresión que me define un campo calculado en una consulta que sirve de origen de datos a un sub formulario.
Primero voy a mostrar el diseño de tablas y sus relaciones y luego paso a explicar el problema.
Tengo las tablas:
Compras(Campos: nºalbaran-compra, id-proveedor, fecha-compra, ... ; Clave: nºalbaran-compra)
Detalle de Compra (Campos: nºalbaran-compra, id-producto, kilos-compra, precio-compra; Clave: nºalbaran-compra, id-producto)
Ventas (Campos: nºalbaran-venta, id-cliente, fecha-venta, ... ; Clave nºalbaran-venta)
Detalles de Venta ( nºalbaran-venta, id-producto, kilos-venta, precio-venta, ...; Clave: nºalbaran-venta, id-producto)
Productos (id-producto, nombre-producto, ... ; Clave : id-producto)
Proveedores (Campos: id-proveedor, nombre-proveedor, ...; Clave: id-proveedor)
Existencia(Campos: id-producto, nºalbaran-compra, id-proveedor, kilos-existencia; Clave: idproducto, nºalbaran-compra, id-proveedor)
Las relaciones entre las tablas se deducen claramente, porque he usado nombres de campos con el mismo nombre en cada una de las relacionadas.

Tengo un formulario para Venta con un subformulario Detalle de Ventas incrustado y este subformulario usa como origen de datos una consulta que está creada a partir de la tabla [Detalles de Venta]. En dicha consulta necesito incluir un campo que reste al campo [precio-venta] el valor del campo [precio-compra] y para obtener este último necesito hacer una búsqueda en la tabla [Detalle de Compra] pero para el valor que tenga el campo [nºAlbaranCompra] y el campo [id-producto] en cada registro del subformulario. He usado esta expresión:

Bkilo: [precio-venta] DBúsq("[precio-compra]";"[Detalle-Compra]";"[Detalle-Compra]![nºalbaran-compra] = " & [Formularios]![Albaranes de Ventas]![Detalles Albaranes Venta Subformulario].[Form]![txtNAlbaranCompra] & " AND [Detalle-Compra]![id-producto] = " & [Formularios]![Albaranes de Ventas]![Detalles Albaranes Venta Subformulario].[Form]![cmbIdProducto])

Aclaro: txtNAlbaranCompra y cmbIdProducto son los controles vinculados a los campos correspondientes

Al abrir el formulario de Ventas, me sale una ventana de error que dice: "Error de sintaxis (falta operador) en la expresión de consulta "[Detalle-Compra]! [nºalbaran-compra] = AND [Detalle-Compra]![id-producto] = '."

No sé porque da este error. Me puedes ayudar.

También he usado esta otra expresión, pero tampoco la entendido bien el Access:

Bkilo: [precio-venta]-(SELECT precio FROM [Detalle-Compra] WHERE [Detalle-Compra]![nºalbaran-compra] = Me![txtNAlbaranCompra] AND [Detalle-Compra]![id-producto] = Me.[cmbIdProducto] ;)

Necesito saber si ambas expresiones son válidas o no, y qué tengo mal en su sintaxis que no me funcionan.

2 respuestas

Respuesta
1

Primero decirte que, debido al especial funcionamiento de esta página, la pregunta se la queda el experto que responde. Personalmente prefiero otras páginas de tipo foro dónde puede responder más de una persona.

En cuanto a tu problema.

Yo creo que se trata de un problema de orden de carga de los controles en el formulario. Según parece la expresión (que está en un control del formulario) apunta a controles del subformulario. Probablemente en el momento de evaluarse esa expresión el formulario no está aun cargado. Es un problema parecido al de utilizar expresiones como parte de otras expresiones.

Te cuento como trato yo esta casuística: realizo el cálculo mediante una función y asigno el resultado a un control TextBox (independiente). Esa función que realiza el cálculo es llamada desde todos los eventos que pueden intervenir sobre el cálculo.

No se si me explico...

Un consejo: en www.mvp-access.com puedes plantear la pregunta igual que aquí y, probablemente, encontrarás distintos enfoques para solucionarlo.

http://www.llodax.com

http://www.aesoft-databases.com

Muchas gracias llodax, por tu rápida respuesta y tus links sugeridos.

En mi caso, esta expresión se ejecuta como origen de un control que se encuentra en el subformulario, pero dicha expresión la creo como un campo calculado en la consulta que sirve de origen de datos al subformulario. O sea tengo una consulta llamada Detalles Albaranes Ventas que sirve de origen al subformulario Detalles de Ventas. Como te contaba he creado dos expresiones, una con DBúsq y otra inlcuyendo una subconsulta, pero hasta el momento ninguna me ha funcionado correctamente. Y lo que falla es en la referencia a los controles del subformulario cuyo valor sirve de criterio para hacer la búsqueda o la subconsulta.

Tengo otro campo calculado con una expresión que hace referencia a un control del formulario, no del subformulario, y esa no me da problemas. Parece que el problema es por referirme a controles del subformulario. Ah, y el subformulario lo muestro en vista hoja de datos.

En cuanto a lo de usar una función (function) me gustaría saber dónde tendría que definirla y dónde se invocaría.

Un saludo

Hola de nuevo llodax, quería puntualizar que el problema del campo calculado es que al abrí el subformulario me pide que entre como parámetros los valores de los dos controles del subformulario a los que hace refencia en el criterio de la función DBúsq o en la clausula WHere de la subconsulta según sea una u otra la expresión que use, de las que te mostré, como origen del subformulario. ¿Que puede ser?

Un saludo

En mi opinión es porque la consulta se ejecuta antes de que los controles se "formen" por lo que no los encuentra, los interpreta como parámetros y te los pide.

Creo que deberías intentar generar la expresión en la consulta intentando no referenciar al formulario (ni al subformulario).

En cualquier caso es muy difícil orientarte ya que me resulta complicado visualizar lo que tienes, lo que has hecho y lo que has conseguido. En cualquier caso habrá casi tantas soluciones como programadores.

Lamento no poder ayudarte más pero, sin verlo es muy complicado.

Muchas gracias Xavi, y perdona si no me he explicado bien, pero gracias por abrirme los ojos a otras posibilidades y bueno ya te consultaré en otra ocasión para otras dudas que me surjan.

Respuesta
1

Creo que tu problema, esta en que usaste un punto y coma (;)en los separadores, reemplazalos por la coma (,), y te tendría que dejar de tirar ese error de sintaxis...

Mientras pruebas esto, me fijo con mas detalle las tablas y consultas que enviaste.

Pero a simple vista, ya me di cuenta de ese error del punto y coma.

Siempre usa una coma para separar argumentos.

Avisame como te fue...

Hola muchas gracias por atender a mi pregunta.

Te explico, según tengo entendido y así es como la he usado hasta ahora, la función DBúsq, usa punto y coma para separar argumentos, y en su versión VBA se llama DLookUp y en este caso si se separan por comas.

Esto me tiene loco, pues nunca me había dado error esta función. NO sé si es porque estoy reverenciando controles situados en el mismo subformulario. Y cosa curiosa, si creo en el subformulario un control independiente y calculado usando esta misma expresión me funciona perfectamente, aunque en algunos registros no me devuelve nada, pero la expresión de búsqueda no da ningún error.

A ver si me puedes ayudar con esto.

Un saludo

Yo siempre use con coma, en vba y expresiones dentro del textbox, nunca use punto y coma. Pero si es vos te funciona con punto y coma, bueno, mejor... (¿pero probaste por lo menos cambiar las punto y coma por la coma solamente?)

Te pongo en negrita cosas que me parecen que están mal en la función.

[precio-venta] DBúsq("[precio-compra]";"[Detalle-Compra]";"[Detalle-Compra]![nºalbaran-compra] = " & (Acá faltaría comillas) [Formularios]![Albaranes de Ventas]![Detalles Albaranes Venta Subformulario].[Form]![txtNAlbaranCompra](Acá faltaría comillas) & " AND [Detalle-Compra]![id-producto] = " & (Acá faltaría comillas) [Formularios]![Albaranes de Ventas]![Detalles Albaranes Venta Subformulario].[Form]![cmbIdProducto] (Acá faltaría comillas))

Te pongo unos links donde se explica bien el uso de esta función:

http://www.accessyexcel.com/donde-y-como-utilizar-la-funcion-de-dominio-dlookup/

http://support.microsoft.com/kb/136122/es

Si podes enviame por mail un ejemplo así lo veo con mas claridad..

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas