[RESUELTO] Filtrar datos en form y subform (3 tablas)

Discute sobre las herramientas de la base de datos
Responder
Urxvt
Mensajes: 40
Registrado: Vie Mar 10, 2017 10:13 pm
Contactar:

[RESUELTO] Filtrar datos en form y subform (3 tablas)

Mensaje por Urxvt »

Hola, me encuentro con un pequeño problema que no logro resolver.

Tengo una BD que registra fechas (tabla Jornades) y cada fecha puede tener varias tareas (tabla Tasques) de X horas de duración cada una. Cada tarea pertenece a un trabajo concreto (tabla Treballs). En esa tercera tabla, Treballs, tengo un campo binario para determinar si está facturado o no.

Hasta aquí todo bien. Tengo un formulario llamado Jornades para navegar entre todas las fechas, y este formulario tiene un subformulario con las tareas asignadas a cada formulario, y me funciona perfecto.

Esquema (sólo importan las tablas azul, verde y roja):
Imagen

Sin embargo, ahora quiero hacer el mismo formulario pero mostrando/filtrando únicamente las fechas y las tareas de los trabajos sin facturar. (Esto será muy útil para dejar en el olvido los trabajos ya facturados y centrarme en los activos).

En el formulario principal (Jornades), pongo esta orden SQL:

Código: Seleccionar todo

SELECT 
    "Jornades"."IDJornada", 
    "Jornades"."Jornada", 
    "Tasques"."IDTasca", 
    "Treballs"."Facturat" 
FROM 
    "Tasques", "Jornades", "Treballs" 
WHERE 
    "Tasques"."ID_Jornada" = "Jornades"."IDJornada" AND "Tasques"."ID_Treball" = "Treballs"."IDTreball"
Y en el filtro:

Código: Seleccionar todo

( "Treballs"."Facturat" = FALSE )
En el subformulario le pongo el contenido de la tabla Tasques.

Todo esto me funciona parcialmente, ya que los campos de las jornadas aparecen repetidos por tantas tareas tengan cada jornada. Y entonces no me deja añadir nuevas jornadas. ¿Cómo es posible si Jornades es la fuente principal de datos del formulario padre?

Una de dos: o no es posible hacer lo que quiero hacer, o lo estoy haciendo mal. Adjunto la BD sin datos.

Los formularios en cuestión son JornadesSenseFacturar y JornadesSenseFacturar1, ambos son intentos fallidos. Si os fijáis en la lista de jornadas, aparece el día 23 de julio repetido porque tiene dos tareas. Tendría que salir [agrupado] sólo 1 vez. Y luego está el problema de que este formulario no me permite añadir nuevas jornadas, como ya mencioné antes.

Pienso que lo que me falla es el código superior que corresponde al formulario principal (Jornades), pero no doy con la solución. ¿Por qué no funciona o cómo lo arreglo?

PD: Curiosamente, el formulario de tareas sin facturar (TasquesSenseFacturar) sí que me filtra bien y me permite añadir nuevas tareas, pero en este caso intervienen dos tablas, mientras que en el caso que me falla intervienen tres, siendo la tabla Jornades la que me lo "enreda" todo. :)
Adjuntos
treballs_share.odb.zip
(80.51 KiB) Descargado 132 veces
Última edición por Urxvt el Mar Ago 01, 2017 2:54 pm, editado 2 veces en total.
Debian 9 & i3wm + LibreOffice 5.2.7.2
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: Filtrar datos en form y subform (3 tablas)

Mensaje por RMG »

Hola,

Revisa la tabla "Jornades" el campo IDJornada no es autonumerico y en el formulario "Jornades" no deja introducir datos. También debes usar la tabla y no una sentencia SQL en el formulario SenseFacturar para poder introducir datos.

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Urxvt
Mensajes: 40
Registrado: Vie Mar 10, 2017 10:13 pm
Contactar:

Re: Filtrar datos en form y subform (3 tablas)

Mensaje por Urxvt »

Muchas gracias, RMG!

Arreglando el fallo del autonumérico de la tabla Jornades, he visto que puedo hacer el filtro de la siguiente manera:

Código: Seleccionar todo

SELECT
	"Jornades"."IDJornada",
	"Jornades"."Jornada",
	"Tasques"."IDTasca",
	"Treballs"."IDTreball"

FROM
	"Jornades",
	"Tasques",
	"Treballs"

WHERE
	"Tasques"."ID_Jornada" = "Jornades"."IDJornada"
	AND
	"Tasques"."ID_Treball" = "Treballs"."IDTreball"

HAVING ( ( "Treballs"."Facturat" = FALSE ) )
Resumiendo, tenía que introducir en el SELECT como mínimo el ID de las tres tablas que intervienen (algo que visto ahora suena hasta lógico y todo) para después en el WHERE poder hacer las relaciones de tablas necesarias. El filtro con HAVING ya funciona. El caso es que la tabla Tasques tiene que ser intermediaria de las otras dos.

Esto provocará siempre que los campos de Jornades aparezcan repetidos por tantas tareas que tenga cada uno. Si los agrupase, dejaría de ser un campo editable porque la función GROUP BY es una función de agregado en base a un grupo de valores dando como resultados valores "nuevos", inhabilitando así la posibilidad de crear registros.

En la versión antigua de mi BD no separaba Jornades en una tabla diferente. Simplemente la tabla Tasques contenía un campo fecha, y voy viendo que era mejor así, ya que si quiero cambiar la fecha de una tarea tengo que seleccionarla en un desplegable y si no está, tengo que ir a Jornades a crearla. Demasiado engorroso sólo para poder añadir varias tareas a la vez en la misma jornada. Esto tiene que poder hacerse más simple...

Me toca repensar un poco el diseño.

Gracias de nuevo y saludos! :)
Debian 9 & i3wm + LibreOffice 5.2.7.2
Urxvt
Mensajes: 40
Registrado: Vie Mar 10, 2017 10:13 pm
Contactar:

Re: Filtrar datos en form y subform (3 tablas)

Mensaje por Urxvt »

He eliminado la tabla Jornades y he dejado el campo de la fecha directamente en la tabla Tasques. Hecho esto, el filtro que quería hacer se puede hacer igualmente con las dos tablas y un poco de HSQLDB, y por supuesto me encuentro con el mismo problema:
Esto provocará siempre que los campos de Jornades aparezcan repetidos por tantas tareas que tenga cada uno. Si los agrupase, dejaría de ser un campo editable porque la función GROUP BY es una función de agregado en base a un grupo de valores dando como resultados valores "nuevos", inhabilitando así la posibilidad de crear registros.
Dos formas de hacer lo mismo que llevan, inevitablemente, al mismo resultado. (Me sorprende que esperara un resultado distinto xD). Pero esto ya forma parte de los límites naturales de las bases de datos relacionales y sus filtros. He hecho lo mismo en Access 2007 con SQL Server y sucede exactamente lo mismo.

He dejado el campo Jornada sin agrupar y ya está. Si se repiten que se repitan. Tema solucionado.
Debian 9 & i3wm + LibreOffice 5.2.7.2
mriosv
Mensajes: 2335
Registrado: Sab Dic 27, 2008 1:12 am
Ubicación: Galiza (España)

Re: [RESUELTO] Filtrar datos en form y subform (3 tablas)

Mensaje por mriosv »

No has pasado la base con las correcciones indicadas, pero es extraño un HAVING sin GROUP y no se si jugando con el tipo de JOIN se podría solucionar en lugar del WHERE.
Puedes usar "Subir adjunto" en Respuesta rápida - Editor Completo - Pestaña Subir adjunto
Apache OpenOffice 4, LibreOffice (Win10x64)
Urxvt
Mensajes: 40
Registrado: Vie Mar 10, 2017 10:13 pm
Contactar:

Re: [RESUELTO] Filtrar datos en form y subform (3 tablas)

Mensaje por Urxvt »

Al final lo simplifiqué un poco más ya que al dejarlo sin agrupar quité el HAVING y usé el WHERE directamente, quedando así:

Código: Seleccionar todo

SELECT 
    "Tasques".*, 
    "Treballs"."IDTreball" 
FROM 
    "Tasques", "Treballs" 
WHERE
    "Tasques"."ID_Treball" = "Treballs"."IDTreball" 
    AND 
    "Treballs"."Facturat" = FALSE
Fíjate por ejemplo como en el formulario TasquesSenseFacturar aparece el día 21/07/17 repetido tres veces porque tiene tres tareas. Me habría gustado agruparlos y a la vez aplicar el filtro (Facturat = Falso), pero no lo logré en ninguna implementación de SQL. Ahora miro si puedo hacerlo con un INNER JOIN.
Adjuntos
treballs_share.odb.zip
(102.6 KiB) Descargado 143 veces
Debian 9 & i3wm + LibreOffice 5.2.7.2
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: [RESUELTO] Filtrar datos en form y subform (3 tablas)

Mensaje por RMG »

Hola,

Mi comentario es una opinión sobre lo que entiendo del funcionamiento de tu BD. Por supuesto quien mejor lo sabe eres tú.

En vez de tener un ID del trabajo en la tabla tareas, no es mejor tener un ID tareas en la tabla trabajos?.

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Urxvt
Mensajes: 40
Registrado: Vie Mar 10, 2017 10:13 pm
Contactar:

Re: [RESUELTO] Filtrar datos en form y subform (3 tablas)

Mensaje por Urxvt »

Hola RMG,

Bueno, yo no soy experto en diseño de bases de datos (ya me gustaría especializarme un poco), pero lo que yo entiendo es que un trabajo puede contener muchas tareas, pero una tarea solo puede pertenecer a un trabajo concreto. Entendamos trabajo como sinónimo de proyecto, no al revés, en el que le dedicamos cada día unas horas (especificadas en las tareas). A lo mejor, los nombres de las tablas, semánticamente pueden conducir a confusión, no sé si es ese el caso.

Entonces, en el momento de introducir las horas, puedo hacerlo de dos formas:

1. Con un formulario tareas que me permita seleccionar el trabajo/proyecto de una lista, le ponga el día y las horas dedicadas ese día. Para el día siguiente creo una tarea nueva, selecciono el proyecto que sea otra vez y le indico las horas; y así sucesivamente. El ejemplo es el formulario Tasques.

2. Con un formulario de trabajos/proyectos y un subformulario de tareas (la típica parrilla) de modo que pueda introducir tantas filas como horas dedicadas por día hagan falta, este sería un todo en uno, y puede verse como ejemplo el formulario CostosTreballs_0_Totals.

La verdad es que me cuesta mucho visualizarlo al revés. En cualquier caso, me gusta que me hagáis replantear las cosas para saber si lo hago bien o no. En parte se trata también de aprender.

PS: El siguiente paso será incorporar una tabla de facturas y relacionarlas con los trabajos, de modo que pueda hacer más de una factura por trabajo, seleccionando períodos concretos, dado que tenemos trabajos contratados de larga duración y los facturamos periódicamente. Voy a ello.

¡Saludos! :)
Debian 9 & i3wm + LibreOffice 5.2.7.2
RMG
Mensajes: 3879
Registrado: Mar Nov 17, 2009 6:59 am
Ubicación: Valencia - España

Re: [RESUELTO] Filtrar datos en form y subform (3 tablas)

Mensaje por RMG »

Hola,

De acuerdo, según tu explicación el modo que lo has hecho es correcto. No la había entendido al principio.

Veo la segunda opción de entrada de tareas más lógica que la primera ya que en esta te evitas tener que efectuar la entrada del trabajo, por lo tanto menos errores.

Para el tema de facturación, una sugerencia. Añadir un campo a la tabla tareas donde indiques que esa tarea se ha facturado a un trabajo. De esta forma cuando factures un trabajo indefinido que lo puedes facturar varias veces, sabrás que tareas se han facturado de ese trabajo. Espero haberme explicado.

Saludos
OpenOffice 4.1.15 y LibreOffice 6.2.4.2 en W-10, y LibreOffice 4.1.6.2 en Open Suse 13.1(VirtualBox)
Urxvt
Mensajes: 40
Registrado: Vie Mar 10, 2017 10:13 pm
Contactar:

Re: [RESUELTO] Filtrar datos en form y subform (3 tablas)

Mensaje por Urxvt »

Para el tema de facturación, una sugerencia. Añadir un campo a la tabla tareas donde indiques que esa tarea se ha facturado a un trabajo. De esta forma cuando factures un trabajo indefinido que lo puedes facturar varias veces, sabrás que tareas se han facturado de ese trabajo. Espero haberme explicado.
Hola, RMG!

Le estuve dando muchas vueltas al asunto y creo que ya le voy dando forma. Lo que he hecho, de momento, es crear dos campos de tipo fecha en la factura: uno para indicar desde que tarea facturar y otro para indicar hasta que tarea facturar.

Además, en el formulario he puesto dos botones que lo que hacen es, mediante dos macros, poner automáticamente la fecha correspondiente a la primera tarea de dicho trabajo y a la última fecha, de este modo si quiero facturar todo el trabajo puedo seleccionar todo el período con un par de clics.

Ahora lo que podría hacer es lo que tú comentas, de crear el campo de facturado para cada tarea y que luego mediante una macro pueda marcar como facturadas todas las tareas que están en una factura (aunque no sé si seré capaz), y a la vez, con un filtro en el formulario para que para la próxima factura solo se muestren las que no están facturadas.

PD: También le añadi la tabla de IVAs con todos los IVA que se han cambiado desde su creación (1986), con sus fechas de entrada en vigor y sus salidas, de modo que ahora puedo introducir facturas de X año y aplicar el IVA automático según la fecha de emisión de la factura.

Para muestra, un botón:
Imagen

EDITO: Mejor aún, otra solución sería poner el campo ID_Factura en la tabla de tareas, que por defecto no tendrán ningún valor. Entonces cuando haga la factura y seleccione el período, con un botón (macro) se pueda poner (mediante un UPDATE en SQL) el ID de la factura al campo ID_Factura de todas las tareas seleccionadas entre las dos fechas. Sería mejor así porque no solo sabría si están facturadas, sino que también sabría en qué factura lo están.

Esto sería muy bueno porque, a pesar de que no cambia el resultado de las facturas (que ya funcionan bien tal y como están), ayudaría a relacionar mejor las tareas con las facturas. Ahora no hay relación entre ellas: funciona mediante una consulta SQL y con la ayuda de BASIC a través del formulario. Entonces tendría además integridad referencial en este aspecto, con todas las ventajas que conlleva el poder jugar mejor con las sentencias SQL.
Debian 9 & i3wm + LibreOffice 5.2.7.2
Responder