Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-11-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
guardar registros en un IBDataSet que es consulta a varias tablas??

Hola,

Estoy trabajando con IB 7, en dialecto SQL 3, con Delphi 6.

En la aplicación necesito tener una consulta a varias tablas de mi base de datos. Los registros resultantes de esta consulta se muestran en un DBGrid, y en unos DBEdit. Pero luego necesito que, en el mismo IBDataSet, se guardan nuevos registros o se modifiquen los ya existentes.

El motivo de hacer la consulta, es por que la tabla principal, tiene guardado en sus campos, solo códigos. Estos códigos, que son numéricos, tienen su significado o interpretación definidos en las tablas "secundarias", a las que llama, para que se muestre en el programa, no el campo con el código numérico, sino el campo de la tabla secundaria con el significado escrito vinculado a este código.

Al insertar o modificar, necesito que, lo que aparece en los dbEdit esto es, los campos descriptivos, de alguna manera, busquen en las tablas secundarias correspondientes, el código que tienen asociado y escriba dicho código, en el campo asociado, de la tabla principal.

El código que tengo para esto en SelectSQL es:

select D1.NUMALU, D1.CODIGO, D1.NUMGRUP, D1.FECINI, D1.CAUBAJA,
D1.FECFIN, D1.CODVTO, D1.NUMEMPLEADO, D2.PRODUCTO, D2.ALIAS,
D2.NUMGRUP, D3.PRODUCTO, D3.DESCRIP, D4.CODIGO, D4.DESCRIPCION,
D5.NUMGRUP, D5.DESCRIPCION, D5.CODVTO, D6.NUMEMPLEADO, D6.PROFESOR
from MATRI D1
inner join GRUPOS D2 on (D2.NUMGRUP = D1.NUMGRUP)
inner join CAUBAJA D4 on (D4.CODIGO = D1.CAUBAJA)
inner join PROFE D6 on (D6.NUMEMPLEADO = D1.NUMEMPLEADO)
inner join PRODU D3 on (D3.PRODUCTO = D2.PRODUCTO)
inner join VTOS D5 on (D5.NUMGRUP = D1.NUMGRUP and D5.CODVTO = D1.CODVTO)
where
(D1.NUMALU=:NUMALU)
order by D1.NUMALU, D1.CODIGO


Por ejemplo. El campo, d1.numgrup (de la tabla principal TbMatri), busca, su valor actual, en el campo D2.numgrup (de la tabla secundaria grupos). En la aplicación se muestra este campo, d2.alias, que es la descripción del valor que tiene d1.numgrup.

Lo que necesito es que, cuando el usuario, a través del programa inserte un registro nuevo, o modifique el valor del campo d2.Alias, se identifique el valor que tiene en d2.numgrup en ese registro y lo guarda en d1.numgrup.

Lo que tengo en InsertSQL es:

insert into MATRI
(NUMALU, CODIGO, NUMGRUP, FECINI, CAUBAJA, FECFIN, CODVTO, NUMEMPLEADO)
values
(:NUMALU, :CODIGO, :NUMGRUP, :FECINI, :CAUBAJA, :FECFIN, :CODVTO, :NUMEMPLEADO)


y lo que tengo en ModifySQL es:


set
NUMALU = :NUMALU,
CODIGO = :CODIGO,
NUMGRUP = :NUMGRUP,
FECINI = :FECINI,
CAUBAJA = :CAUBAJA,
FECFIN = :FECFIN,
CODVTO = :CODVTO,
NUMEMPLEADO = :NUMEMPLEADO
where
NUMALU = :OLD_NUMALU and
CODIGO = :OLD_CODIGO


Espero haberme explicado suficientemente bien, pues el tema es algo farragoso.


Muchas gracias, de ante mano, por la ayuda.

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #2  
Antiguo 12-11-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
La verdad es que nunca lo he probado, pero tengo entendido (y si no es así corregirme) que no se pueden modificar/añadir registros en consultas en las que interbienen más de una tabla. Tu lo has probado? Te ha funcionado?

Bueno, si no te ha funcionado, una solución es la que yo hago. Haces una select sobre la tabla principal de la consulta y, luego, mediante campos calculados, sacas la descripción de los campos descriptivos.

Espero te sirva
Responder Con Cita
  #3  
Antiguo 12-11-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

Cita:
cadetill comentó:
La verdad es que nunca lo he probado, pero tengo entendido (y si no es así corregirme) que no se pueden modificar/añadir registros en consultas en las que interbienen más de una tabla. Tu lo has probado? Te ha funcionado?
Espero te sirva
Si utilizas IIBdataset, en vez de IBQuerys, si te permite guardar registros nuevos, aunque sólo te permite guardar los campos de una de las tablas, en mi caso la principal es Matri.

Si en onnewrecord, de mi QyMAtri, le fuerzo a tener datos, me guarda y luego muestra el resultado. De lo contrario, encuentra campos vacios para los campos que se utilizan en el selectSQL dentro de los inner join, de modo que al ser nulo, esos registros no existen para la aplicción y no los muestra.

Pero registros si estoy guardando, aunque he de reconocer que me da menos problemas para borrar registros. ¿Una BD algo destructiva? ;-P

Lo que dices de:

Cita:
cadetill comentó:
Bueno, si no te ha funcionado, una solución es la que yo hago. Haces una select sobre la tabla principal de la consulta y, luego, mediante campos calculados, sacas la descripción de los campos descriptivos.
Esto es precisamente mi principio, pero por motivos de lentitud, me cambié a la consulta.

De todos modos, exactamente ¿cómo lo harías?, por que tal vez el problema es que el planteamiento que tengo no era óptimo, y por eso me daba problemas de lentitud, no por usar campos calculados.


Gracias

Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
  #4  
Antiguo 12-11-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Cita:
Giniromero comentó:
Esto es precisamente mi principio, pero por motivos de lentitud, me cambié a la consulta.

De todos modos, exactamente ¿cómo lo harías?, por que tal vez el problema es que el planteamiento que tengo no era óptimo, y por eso me daba problemas de lentitud, no por usar campos calculados.
Bueno, supongo que tampoco hago nada raro ni del otro mundo.

Creo campos calculados en mi TIBDataset y, en el OnCalcFields, lanzo consultas SQL para saber la descripción de cada código.

Eso sí, las consultas SIEMPRE se han de lanzar sobre tablas indexadas y sobre esos índices

Ej.

Código:
select descripcion
from articulos
where cod_art = 22331
donde la tabla artículos tiene un índice (el PK) por el campo cod_art
Responder Con Cita
  #5  
Antiguo 14-11-2003
Giniromero Giniromero is offline
Miembro
 
Registrado: may 2003
Ubicación: Madrid
Posts: 296
Poder: 21
Giniromero Va por buen camino
Hola,

Parece que ya lo he solucionado.

Comencé esa parte del programa de nuevo. Le puse a la tabla Matri campos calculados, como tenía en un principio y como tú me aconsejaste, sólo que esta vez, en vez de asignar los valor del SelectSQL y del datasource, a cada una de las tablas secundarias, justo antes de tomar el valor de los campos calculados, he creado una tablas especificas en el DataModule, con las caracteristicas exactas que necesito, y en oncalcField, sólo pongo asignación de valor a los campos calculados, desde esas tablas.

Creo que el error era que, que estaba intentando "reutilizar" las tablas, por no tener varios IbDataSet conectados a la misma tabla, simplemente por que en una, necesito que tenga el datasource conectado al Srcmatri y un where numgrup=:numgrup en el selectSQL, y en la otra no.

Muchas gracias por la ayuda.

Virginia Romero
__________________
Sonrie al mundo, y el mundo te sonreirá :)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:46:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi