Problemas con formularios

No se si te ha llegado alguna pregunta mía sobre lo que te voy a comentar ahora.Si es así ya puedes perdonar porque he tenido algún problema.
Mi pregunta es la siguiente:
Tengo dos tablas
Equipos(IdEquipo, Nombre, Descripción)
Items(IdItem,Nombre,Precio,IdEquipo)
La relacion es de 1-N
Quiero que en un formulario aparezcan los datos para rellenar distintos equipos y que haya un subformulario que me permita rellenar los items de los que se compone cada equipo. También quiero que el formulario principal tenga un campo de texto donde se vaya viendo cual es el precio que vale el equipo(sumatorio del precio de los items de los que se compone). Muchas gracias por tu tiempo

1 respuesta

Respuesta
1
Antiguamente se hacía poniendo un pie que fuese la suma en el subformulario, y luego un control en el formulario que fuese 'copia' de dicho pie...
Pero tenía algunos inconvenientes de temporización
Además ahora (lo vengo observando en mi XP) el 'subformulario' puede ser una simple 'tabla'
Por eso te recomiendo poner en un control independiente, el origen del control
---
=SiInm(EsNulo([IdEquipo]);0;DSuma("precio";"_items";"IdEquipo=" & [idequipo]))
---
Se contempla el valor nulo para los nuevos registros, si solo ponemos dsuma en los registros nuevos muestra '#error'
Salud
Hola buenas, gracias por haberme contestado tan rapido pero quería que me explicaras detalladamente que hace realmente la linea de código que me pusiste.Ya te comente que acabo de empezar con este tipo de aplicaciones y estoy bastante perdido.
----- Introducción:
La linea de código propuesta esta pensada para copiar y pegar a la propiedad 'origen del control' de un control independiente (esto es, no basado en datos, esto es, agregado al formulario mediante cuadro de herramientas, cuadro de texto etc) del formulario principal.
Nota:
La sintaxis empleada funciona para access en castellano (de modo que las funciones de visual basic iif, isnull y dsum, en el diseñador de formularios de access en castellano se auto-traducen respectivamente por SiInm, EsNulo y DSuma, respectivamente) y el separador predeterminado de VB ',' se auto-traduce respectivamente al separador de listas predeterminado en el panel de control, esto es ';'.
Conclusión:
Si se quiere usar VBA en un módulo, para cualquier otra utilidad como asignar este resultado a un campo de tabla, hay que emplear el formato en ingles,
iif(isnull(idequipo), 0, dsum(... etc.
Pero usando esa sintaxis en el diseñador, y debido a la auto-traducción, al final queda tal cual copio y pego en mi respuesta anterior.
----- Funcionamiento detallado:
La linea mencionada:
Muestra una suma de todos los registros de la tabla items (nótese que en el ejemplo anterior va precedida de un underscore '_' por conveniencia: he 'bautizado' tu tabla items como '_items', para que al ordenar alfabéticamente el listado de tablas de mi base de datos, aparezca al principio de mi lista)
La ayuda sobre dsuma o dsum se puede ver en access o visual basic.
A partir de la version 2000 que se usan ventanas y ayudas separadas, por lo que si este es tu caso, puede serte conveniente buscar ayuda en ambas indistintamente.
Resumiendo dichas ayudas y aplicándolas a nuestro caso, la función dsum requiere 3 agrtumentos:
1) Expresión o dato a sumar 'precio',
2) Dominio u origen de datos para sumar 'items', y
3) Criterios, o fórmula para seleccionar ciertos registros del origen de datos.
Este 3º argumento (citerios) consiste en que los registros de la tabla items cuyo precio vamos a sumar tengan idequipo igual al valor de idequipo en el formulario principal (equipos) y de ahí el final de la linea: "IdEquipo=" & [idequipo].
Los corchetes cuadrados son una vez más parte del auto-traductor del diseñador de formularios, vienen a decir que idequipo es detectado como nombre de control en el formulario equipos donde estamos creando el control de suma, es un 'objeto' del formulario.
(Nota: si se usase VBA en el módulo de clase del propio formulario principal, [criterios] podría ser escirto como 'me. Criterios' y si estuviese en un módulo de código, había que llamar desde el formulario a una función del modulo que aceptase como parámetro de entrada un objeto y devolver la suma en la función... pero esto es complicado en proporción a la funcionalidad requerida, por lo que no vamos a entrar en detalles sobre el particular)
Las comillas dobles que rodean a los 3 argumentos de la dsum, se requieren porque estos parámetros deben ser textos (literales) y en criterios, hay una parte literal ("IdEquipo=") y una parte variable [idequipo]. En medio hay una cuncion concatenar texto '&' que convierte en texto la concatenación del literal entrecomillado y la propiedad predeterminada del objeto (value, valor, contenido del control en tiempo de ejecución)
(Funcionamiento detallado: Mi aportación:)
Todo lo anterior funciona normalmente siempre que idequipo no sea nulo
(Cosa que de usar solo el Dsum inicialmente, observé que ocurría cuando el registro del formulario principal es un nuevo registro y aun no se ha ejecutado la suma, en tiempo de ejecución, donde la suma debería aparecer en blanco o a cero, se apreciaba un poco estético '#error')
Efectivamente la función DSUM devuelve #error cuando alguno de sus 3 argumentos no es correcto, y el caso que estamos contemplando es que la concatenación del literal "IdEquipo=" con un valor nulo en el control cuadro de texto [idequipo] resulta nulo, y nulo no es una cadena.
Para esto he agregado la función iif / siinm, que consta de tres partes:
1) Condición -en nuestro caso : isnull(idequipo)- porque he comprobado que en los registros nuevos idEquipo es nulo
2) Acción a tomar en caso de que la condición se cumple : 0 (para sustituir el poco comprensible '#error' por un 0 menos sospechoso)
3) Acción a tomar en caso de que la condición NO se cumple : la suma (porque se asume que todo esta bien)
Cualquier otra consulta, a tu disposición, en Sevilla España a 17-10-2004
Salud.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas