PDA

Ver la Versión Completa : Problema Con Relacion de Tablas


JamesBond_Mx
01-07-2003, 20:39:10
Hola de nuevo, tengo un problema, les explico:

Tengo Dos tablas a una de ellas le llamo Anomalias y a la otra instalaciones.

En la Primera se capturarán todas las anomalias que presentan las instalaciones Y en la segunda están capturadas las instalaciones que atendemos, la tabla Anomalias tiene su campo llave llamado Cve_princ, y un campo con el que quiero relacionarla con la otra llamado Cve_inst, La tabla Instalaciones tiene su campo clave llamado Cve_Inst, los dos campos tienen las mismas caracteristicas (Tipo de datos, tamaño, etc.),
En la form donde voy a realizar la captura de las anomalias tengo dos DataSource y dos TTable uno por cada tabla, en las propiedades de la tabla Anomalias pongo que el MasterSource es el DataSource de la tabla instalaciones y que el campo por el que se relacionan es Cve_Inst, ahora coloco un DBLookupComboBox Que los datos obtendrá de la tabla Instalaciones y actualizara la tabla Anomalías, y en las propiedades de ste pongo esto:

DataSource :DSAnomalias (DataSource de Anomalías)
DataField:Cve_Inst
ListSoruce:DSInst (DataSource de Instalaciones)
KeyField:Cve_Inst

Al correr la aplicación de prueba me manda el error de que no acepta DataLinks circulares, pero si no le pongo nada en DataSource y Datafield, el combo si me muestra los datos de la tabla instalaciones.

¿Que estoy haciendo mal?

Gracias por la atención.

andres1569
01-07-2003, 21:01:27
Hola agente 007:

Con tanto chino mandarín incordiando entre el código, es normal que falle :D (me refiero a los smilies traicioneros que te han aparecido en el mensaje).

No sé exactamente por que colocas un TDBLookUpComboBox, si ya tienes ligadas las tablas como Master-Detail. Delphi ya se encarga de asignar, cuando das de alta una nueva anomalía, el campo Cve_inst al valor que hay en Cve_inst de la tabla de instalaciones, así pues te puedes ahorrar ese paso. Te sugiero que coloques dos DBGrids, cada uno ligado a una tabla, y hagas pruebas recorriendo el de instalaciones, y dando de alta registros en el de anomalías, verás eso que te digo.

El error de referencia circular se debe a que Delphi no puede hacer una búsqueda en una tabla de la que depende la tabla que estás editando, por eso al desactivar esas dos propiedades que mencionas no te da ese error, aunque en ese caso el TDBLookUpComboBox sólo te sirve para ver la lista de instalaciones, nada más.

Espero haberme explicado.

SoftMakerMex
01-07-2003, 22:17:13
quihubo...

El error que te aparece es debido a lo que te comenta andres; "referencia circular"... y en este caso, sucede porque el componente que utilizas crea una dependencia de la tabla de donde tomas el dato con la tabla donde guardas la información, y si a esto le añadimos que creas una relación maestro detalle... se complican las referencias y eso produce el error...

La mejor solución es que la relación maestro detalle la indiques a nivel de archivos en el manejador de datos que utilices.... y la elimines de los ttable dentro de tu aplicación, con esto se evita la referencia circular... y no debe marcarte ya ningun error...

Espero que te sea de utilidad...

JamesBond_Mx
01-07-2003, 22:23:20
Bueno, El combo lo quería utilizar para tomar los datos de la tabla Instalaciones y colocarlos en la tabla Anomalías, pues esta aún está vacía es la que se va a capturar, Pero ahora surgió otro detalle, les explico.

Resulta que mi tabla Instalaciones tiene 3 campos:

Cve_Inst //Clave Principal
Tipo_Inst //Tipo de Instalación
Nombre_Inst //Nombre de La instalación

La tabla consta de 92 registros pero el detalle es que Hay varios nombres que se me repiten, Por que solo tengo 9 tipos de instalaciones distintas, pero hay instalaciones que pertenecen a dos tipos entonces si la instalación X es del tipo A pero tambien del Tipo B aparecerá 2 veces su nombre ¿me explico?

Bueno, lo que quiero hacer ahora es tomar un componente TQuery, y filtrar por medio del campo Tipo_Inst, pero que sea dinámico, habia pensado en un comobox normal, en el cual estén listados los 9 tipos de instalaciones distintas y que al seleccionar cualquiera de los tipos, se ejecutara el Query con el dato seleccionado, pero ¿como mento el dato seleccionado en el combobox al string del Query? o sea como hago esto:

SELECT Cve_Inst, Nombre_Inst
FROM Instalaciones
WHERE Tipo_Inst = ????? /¿Como paso el valor aqui???

Haciendo esto, el filtro me presentaría solo las instalaciones que pertenecen al tipo seleccionado.

¿como lo hago?.

Espero no haberme extendido demasiado, y haber sido explicito.

Gracias

JamesBond_Mx
01-07-2003, 23:29:32
ok ya lo vi en otro hilo, gracias... para la otra primero reviso...

SoftMakerMex
01-07-2003, 23:45:34
Ok. lo que tienes que hacer es utilizar un query para tu consulta añadiendole un parametro para indicarle el tipo de instalación, esto quedaria así en la propiedad "sql" del query:

SELECT Cve_Inst, Nombre_Inst
FROM Instalaciones
WHERE Tipo_Inst = :tipo


donde :tipo es el nombre del parametro que recibira el tipo de instalación

despues en la propiedad "params" del query configura el parametro indicando el tipo de dato que recibira (string, integer, etcétera) en la propiedad "DataType", y el tipo de parametro en "ParamType" como ptInput porque es una consulta que requiere el parametro para ser ejecutada.

despues en el evento "OnCloseUp" del combo que utilices para seleccionar el tipo de instalación agrega los siguiente:

with Query1 do
begin
DisableControls;
Active:= False;
ParamByName['tipo'].AsString:= combobox1.text;
Active:=True;
EnableControls;
end;

donde dice AsString, debes especificar el tipo que hayas definido en tu parametro.

y con esto debe funcionar tu consulta con el filtro que deseas...