Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Alguien sabe como hacer que una query sea modificable (https://www.clubdelphi.com/foros/showthread.php?t=42331)

pjmedina 11-04-2007 19:51:28

Alguien sabe como hacer que una query sea modificable
 
Hola a tod@s.
Alguien sabria decirme que diferencia existe entre una Query (TQuery) modificable y una que no lo es.

Os comento el porqué de mi pregunta:

he creado una tquery con la siguiente consulta:
"select * from tabla1 t1 join tabla2 t2 on t1.codigo=t2.cod_referencia". He puesto la propiedad Request Live a true pero dice que la Table is read only.

Se que existe una propiedad llamada CanModify que te dice si permite o no modificar la Query, pero no me ayuda para poder corregirla.

Espero que podais ayudarme.

Saludos y muchas gracias a tod@s por colaborar.

Caral 11-04-2007 20:01:16

Hola
La verdad no entiendo muy bien, para que modificar en una consulta la propiedad Request Live, dices que es un query y te dice que la tabla es read only.
Sinceramente no lo entiendo.
Otra sugerencia, el codigo delphi, colocalo con las etiquetas se entendera mejor.
Saludos

pjmedina 11-04-2007 20:05:47

A ver intento expresarme mejor....:p

Tengo un Tquery, un DataSource, y un formulario con un DbGrid. Lo que quiero hacer es poder modificar valores en el grid, pero me dice el siguiente mensaje de error "Table is read only". Pero no estoy utilizando un TTable estoy utilizando un TQuery.

Me gustaría saber el porqué mi consulta no es modificable.


No se si me entenderás ahora.


Saludos y gracias por contestar.

Caral 11-04-2007 20:08:00

Hola
Que base de datos usas?
Saludos

pjmedina 11-04-2007 20:09:00

Utilizo Firebird 1.5

egostar 11-04-2007 20:11:20

Tienes que utilizar un TUpdateSQL, lo ligas al Query y cambias la propiedad CachedUpdates a True.

En el TUpdateSQL, generas las sentencias SQL dando doble click y te mostrará una pantalla con un boton de Generate SQL, dale click y OK.

Nos comentas que paso.

Salud OS.

Caral 11-04-2007 20:12:21

Hola
Me quedo un poco en ascuas, no entiendo el porque, pudiera ser que la base de datos tenga alguna restriccion.
Has provado con otro componente como ado?
Saludos

gluglu 11-04-2007 20:14:55

En el DataSet tienes que incluir correctamente las propiedades 'InsertSQL', 'ModifySQL', 'DeleteSQL' y 'RefreshSQL'.

Si lo que utilizas es un TIBQuery, lo tienes que relacionar con otro componente TIBUpdateSQL.

Si en cambio utilizas un componente TIBDataSet puedes incluir las sentencias correspondientes a inserción, modificación, borrado y refresco en el mismo componente pulsando el botón derecho y eligiendo 'DataSet Editor'.

Si precisas más información al respecto de como completar esas sentencias, busca en el foro, o simplemente expón de nuevo tus dudas al respecto.

Saludos, ;)

gluglu 11-04-2007 20:15:34

Vaya !!! Cuantas respuestas de golpe ! :p

Caral 11-04-2007 20:18:20

Bueno, pero varias muy buenas como la tuya y la de egostar.
Yo estoy como en las grandes ligas, dando batazos.
Saludos

pjmedina 11-04-2007 20:18:32

muchas gracias por preocuparos

Lepe 11-04-2007 20:22:07

Caral, el problema es una query que incluye Inner joins... y eso será siempre de solo lectura, aquí no sirve la propiedad RequestLive ni CanModify.

Si no tuviese inner joins, y solo recopilara datos de una sola tabla, poniendo a True la propiedad RequestLive, ya podría insertar y modificar datos.

Al tener inner joins, se debe hacer lo propuesto por guglu.

Saludos

pjmedina 11-04-2007 20:26:41

A ver, parece que si que va a funcionar. Tan solo me queda saber como puedo hacer para que unicamente modifique.
En que evento le paso el valor del campo del grid que yo quiero al MODIFYSQL para que me modifique el valor de la query?


Ah! por cierto utilizo TQuery ,TDataSet

egostar 11-04-2007 20:34:08

Cita:

Empezado por Lepe
Caral, el problema es una query que incluye Inner joins... y eso será siempre de solo lectura, aquí no sirve la propiedad RequestLive ni CanModify.

Si no tuviese inner joins, y solo recopilara datos de una sola tabla, poniendo a True la propiedad RequestLive, ya podría insertar y modificar datos.

Al tener inner joins, se debe hacer lo propuesto por guglu.

Saludos

Muy cierto, no vi la sentencia SQL, aunque debo decir que no lo sabia tampoco.

En todo caso lo que necesita solamente seria un TIBDataSet y omitir el TIBQuery, corrijanme si estoy mal.

Salud OS.

avmm2004 11-04-2007 23:55:36

Por lo general, el resultado de una consulta que implique mas de una tabla es siempre de solo lectura, independientemente de la base de datos, los componentes y de las propiedades que quieras ponerle. Si quieres que el resultado del query sea modificable (asociandolo a un grid, por ejemplo) has de usar una sola tabla o en su caso un view (y en este ultimo con restricciones).

AzidRain 12-04-2007 00:12:30

Como ya dijo avmm2004 el un query multitabla siempre es de solo lectura. No se puede modificar directamente, para poder hacerlo hay que crear los querys necesarios para cada caso (borrar, insertar y actulizar) como lo dice gluglu.

vtdeleon 12-04-2007 04:24:22

Cita:

Ah! por cierto utilizo TQuery ,TDataSet
Es mejor que utilices IBX (Interbase), pues las respuestas que te han dado mas arriba estan relacionadas con esos componentes, ademas de que es muchisimo mejor acceder a esa base de datos con esos compoentens que con lo que estas ahora mismo.

Para acceder a Firebird conozco estos compoentes: IBX(Interbase), MDOLIB y FIBPLus. Cualquiera es superior.

Saludos

pjmedina 12-04-2007 10:44:16

Finalmente he decidido poner un TTable, y ponerle campos LOOKUP.

Lo que no se si el rendiemiento del programa será el mismo. He añadido unos 6 campos LookUp.

gluglu 12-04-2007 10:55:39

Un TTable te va a bajar el rendimiento muchísimo. No se debería utilizar nunca en un entorno Cliente-Servidor.

Deberías utilizar siempre un Query (bien en form de TQuery o TDataSet). Aunque sea más fácil trabajar sobre un TTable.

pjmedina 12-04-2007 11:07:49

Cita:

Empezado por gluglu
Un TTable te va a bajar el rendimiento muchísimo. No se debería utilizar nunca en un entorno Cliente-Servidor.

Deberías utilizar siempre un Query (bien en form de TQuery o TDataSet). Aunque sea más fácil trabajar sobre un TTable.

Entonces que me recomiendas, que cambie el TTable por un TQuery, y ponga campos LOOKUP al TQuery?


La franja horaria es GMT +2. Ahora son las 16:54:21.

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