PDA

Ver la Versión Completa : DBEdit dependiente de dos campos de distintas tablas


fortran
19-06-2003, 18:52:02
Hola a todos:

Tengo 2 problemas, el primero (y más importante) es que es la primera vez que me enfrento a una base de datos.

Y el segundo es el siguiente:

Estoy trabajando con Delphi 5 y paradox con W98 y quiero hacer una agenda de citas para una peluquería. Para ello he creado 4 tablas:

TablaEmpleados, de la que necesito el campo codigoempleado
TablaCitas ligada como master-detail a la anterior por el campo codigoempleado y que contiene 24 campos (uno para cada media hora), otro campo que es la fecha, otro campo que es el código del cliente y otro que es el código del empleado.
TablaFechas que contiene las fechas en las que se han añadido las fechas

TablaClientes (de la que necesito el código de cliente).


He puesto 24 DBEdit (uno para cada hora) con el datasource correspondiente a la tabla de citas, y DBlistbox con el datasource correspondiente a la tabla de empleados para que cada vez que seleccione el empleado me salgan sus citas.

Hasta ahí todo va bien:

Lo que ahora necesito hacer es ligar todo esto con la fecha (que obtengo de un TMonthCalendar).

Como resumen después de este rollo.

Necesito que al seleccionar en el TListBox un empleado me salgan las citas que este tiene en los DBEDit (pero únicamente las de la fecha que está marcada en el TMonthCalendar).

Espero haberme expresado bien :rolleyes:

Gracias por la atención y perdón por el rollo.

andres1569
19-06-2003, 19:19:46
Respecto al primer problema, todos nos hemos tenido que enfrentar por primera vez a una base de datos, ¡ánimo!

Respecto a lo segundo, puedes usar un filtro en la tabla de citas, de este modo:

Filter := 'fecha = ' + QuotedStr(FormatDateTime ('dd/mm/aaaa', MonthCalendar.Date));
Filtered := TRUE;

fortran
19-06-2003, 19:58:51
Gracias Andrés:
Ahora me viene el segundo problema (derivado del primero por supuesto), ¿donde y como pongo el filtro?

Gracias por la antención.

fortran
19-06-2003, 20:12:41
Bueno, mirando otro post que había por ahí ya vi como hacerlo. He hecho lo siguiente

procedure TFormularioPrincipal.CalendarioClick(Sender: TObject);
begin
modulodedatos.Tablacitas.filter := 'fechacita = ' + QuotedStr(FormatDateTime ('dd/mm/aaaa', calendario.Date));
modulodedatos.tablacitas.Filtered := TRUE;
end;


Ahora el problema que tengo es que me salta un error porque la conversión esa me la hace así: "19/06/jueves", en vez de "19/06/2003" y claro me dice que no es un dato válido.

¿que es lo que hay mal?

andres1569
19-06-2003, 20:20:37
Las propiedades Filter y Filtered pertenecen a los Datasets, ya sea un TTable, un TQuery ...

¿Dónde y cómo? Puesto que cambias la fecha en ejecución, lo lógico es que cuando cambie el MonthCalendar asignes el filtro. Puedes dejar Filtered = TRUE desde diseño y una fecha imposible para que por defecto no aparezca ningún registro, y cada vez que el peluquero (digo el usuario ... je, je :) ) cambia la fecha reasignas la propiedad Filter.

Si te referías a qué tabla, debes ponerlo en la tabla de citas, supongo que esta tabla la tienes ligada en Master-Detail a Empleados o algo así, por lo que no te dije de filtrar también por empleado.

...

Uff!! No tan deprisa, acabo de leer tu respuesta, me equivoqué, debes poner 'dd/mm/yyyy' (estaba pensando en castellano año, y es year).

fortran
19-06-2003, 20:28:55
Si cierto, a lo del yyyy llegué justo después de postear mi mensaje, ahora tengo otro problema...

Al crear la tablacitas lo he creado con un índice secundario para ligarlo con el master (en el campo codigo de usuario), ahora cada vez que introduzco datos me salta un error que me dice que el índice es ReadOnly ¿como puedo solucionar esto?.

Gracias por anticipado y perdón por la lata que estoy dando con este tema. :(

marcoszorrilla
19-06-2003, 22:20:34
La tabla citas tiene que tener una clave única, aunque sea un autoincrementado, sino no te funciona y te da el error que reportas.

Un Saludo.

fortran
20-06-2003, 12:01:18
Muchas gracias Marcos, le he creado un indice primario autoincrementado y funciona pero ¿por que sucede así?, ¿Es necesario que todas las tablas de detalle lo lleven?.

andres1569
20-06-2003, 12:41:32
Hola Fortran:

No te contesté a esa pregunta porque hacía años que no me aparecía ese error y no recordaba la causa. Leyendo la respuesta de Marcos me acordé de que efectivamente, ese error salta en Paradox si no halla ese índice primario.

En realidad es aconsejable definir siempre una clave primaria para Paradox (en otras BD también), vaya a ser una tabla maestra o de detalle, puesto que Paradox lo necesita como referencia para actualizar los registros insertados / modificados (es la forma de tenerlos identificados inequívocamente). Si te resulta difícil de mantener esa clave, la idea de que sea un Autoincrementativo es la más adecuada.

De hecho hace ya años hice un programa para una escuela que en un principio usaba como clave primaria en varias tablas un AutoInc. Luego me tuve que arrepentir y los cambié todos por Integer, encargándome de asignar esos valores "a mano" (para calcular el último valor puedes lanzar un SELECT MAX(ID_CLAVE) FROM TABLA cada vez que vas a dar de alta un nuevo registro). La única tabla donde dejé el AutoInc fue la de asistencias (algo parecido a lo tuyo de Citas) porque es una tabla que genera muchos registros y no es eficiente cada vez asignarle el nuevo MAX + 1, así que lo dejo en manos del BDE.

Aunque es de las pocas ventajas que le veo, otra ventaja de los AutoInc es que en una consulta de inserción en la que tomas datos de otra consulta, el BDE te genera esa clave automáticamente, si no sería casi imposible mediante SQL.

Resumiendo: Usa SIEMPRE claves primarias en Paradox, y campos AutoInc sólo cuando sea una gran ventaja por eso que te he comentado; si no, mejor un Integer.

marcoszorrilla
20-06-2003, 15:36:40
Bueno ayer no tenía mucho tiempo, aunque veo que Andrés ya te ha aclarado tu pregunta, yo te decía aunque sea un autoincrementado, es decir no debiera ser autoincrementado, como ya te ha dicho Andrés conviene que sea un campo que tu mismo incrementes, con un entero debiera de servirte.

Un Saludo.

fortran
24-06-2003, 11:53:10
Gracias a los dos.