PDA

Ver la Versión Completa : como utilizar el UpdateSQL


Irina
30-05-2003, 18:23:15
Buenas, como tengo que utilizar los UpdateSQL para modificar los datos de una consulta.
Ya pregunte la ultima vez como podria modificar los datos de una consulta, y me dijeron que con un UpdateSQL, pero n se como funciona.

Os agredeceria que me respondierais pronto.
Gracias. Irina.

delphi.com.ar
30-05-2003, 18:37:38
Si no me equivoco yo fui quien te sugirió usarlo, y algo te expliqué de como usarlo.
Cuando uno tiene una consulta con varias tablas relacionadas, se le hace imposible al TQuery saber de donde proviene cada dato, entonces para solucionar ese problema, existen los TUpdateSQL, que a mi parecer, son una idea fantástica. Lo que uno hace en un TUpdateSql, es decirle al DataSet qué Sql´s ejecutar para cada Insert, Update o Delete, al igual que Oracle permite crear tres trigges en una vista para que esta sea modificable.

Si tenemos el un TQuery con el sql:

SELECT T.ID, T.NOMBRE, T.DOMICILIO, T.ID_PROVINCIA, P.DESCRIPCION
FROM TRABAJADORES T, PROVINCIAS P
WHERE T.ID_PROVINCIA = P.ID

Definiremos en el TUpdateSQL asociado a este query, SQL´s similares a estos:

InsertSql
INSERT INTO TRABAJADORES
(ID, NOMBRE, DOMICILIO, ID_PROVINCIA, FECHA_ALTA, FECHA_MODIF)
VALUES
(:ID, :NOMBRE, :DOMICILIO, :ID_PROVINCIA, SYSDATE, NULL)


UpdateSql
UPDATE TRABAJADORES
SET NOMBRE = :NOMBRE,
DOMICILIO = :DOMICILIO,
ID_PROVINCIA = :ID_PROVINCIA,
FECHA_MODIF = SYSDATE
WHERE ID = :ID

DeleteSql
DELETE FROM TRABAJADORES
WHERE ID = :ID

Utilizamos : + Nombre de campo, para referirnos al valor que se ha ingresado a este campo, también se puede notar el uso de otros campos no definidos en el Query al cual se le asigna una variable del motor.


Bueno, espero haber sido claro, me parece que este es un tema un poco conocido o poco utilizado, aunque existe desde las primeras versiones de Delphi, te prometo que voy a hacer un ejemplo para y lo publicaré en Internet.

Saludos!

Irina
30-05-2003, 19:19:55
Oye muchas gracias por tu respuesta, te lo has currado mogollon, todavia no le he provado, pero lo he entendidio todo.


Gracias por tu ayuda.
Un saludo Irina. :D

delphi.com.ar
30-05-2003, 19:27:44
Posteado originalmente por Irina
te lo has currado mogollon
Disculpa mi ignorancia, pero.... ¿Qué significa esta expresión?

Saludos!

Irina
30-05-2003, 19:32:25
No sabia que eras argentino, perdona.
'Te lo has currado mogollon' significa que has hecho un buen trabajo, que me has ayudado mucho, que sabes de que va el tema, en fin cosas asi.

Por cierto me encanta tu acento. Me refiero al agento argentino, ya que el tuyo no lo conozco y no puedo opinar, ya me entiendes.
Un saludo Irina

jzginez
16-03-2004, 17:26:55
Hola amigos, tengo problemas con con mi UpdateSQL, les explico tengo una tabla en paradox con datos de los alumnos (Matricula, Nombre, Dirección, Telefono, Reinscrp, etc.), genero el query siguiente:

Select Matricula, Nombre
from Alumnos
Where reinscrip = 'S'

en un updateSql genero el codigo de forma automatica y me da el siguiente resultado:
--------------------
delete from "ALUMNOS.DB"
where
MATRICULA = :OLD_MATRICULA and
NOMBRE = :OLD_NOMBRE
------------------------
insert into "ALUMNOS.DB"
(MATRICULA, NOMBRE)
values
(:MATRICULA, :NOMBRE)
-------------------------
update "ALUMNOS.DB"
set
MATRICULA = :MATRICULA,
NOMBRE = :NOMBRE
where
MATRICULA = :OLD_MATRICULA and
NOMBRE = :OLD_NOMBRE
-------------------------------

Conecto un DBNavigator y un DBGrid al query para ver los resultados y no puedo insertar, modificar ni eliminar ningun registro.

delphi.com.ar comentas en este hilo que "Cuando uno tiene una consulta con varias tablas relacionadas, se le hace imposible al TQuery saber de donde proviene cada dato, entonces para solucionar ese problema, existen los TUpdateSQL,", así que hice lo propio y modifique mi consulta y updateSql para usar dos tablas relacionas pero el resultado es el mismo no puedo modificar, insertar ni eliminar registros de mi consulta, tengo estas mismas tablas en intebase así que probe copiando el sql del query y los del updateSql al IBDataset y este funciona bien.

Que creen que me este faltando.

Gracias

jachguate
16-03-2004, 22:04:48
hola Jorge. No hace falta que los datos de tu Query provengan de diferentes tablas para poder usar los TupdateSQL... pero son el único mecanismo disponible en todos los motores (a excepción de oracle) para lograr modificar consultas de este tipo, que son Read-Only por "circunstancia"... valiendose de la jerga del BDE.

Creo que en tu caso simplemente podes quitar el objeto TUpdateSQL, y poner la propiedad del query RequestLive a True. Si de cualquier forma queres aprender mas sobre esta técnica... por aqui te dejo una pequeña introducción...


Use a TUpdateSQL object to provide SQL statements used to update read-only datasets represented by TQuery components when cached updates are enabled. A dataset is read-only either by design or circumstance. If a dataset is read-only by design, the application itself does not provide a user interface for updating data, but may institute a programmatic scheme behind the scenes. If a dataset is read-only by circumstance, it indicates that the Borland Database Engine (BDE) returned a read-only result set. This usually happens for queries made against multiple tables. Such queries are, by SQL-92 definitions, read-only.

TUpdateSQL provides a mechanism for circumventing what some developers consider an SQL-92 limitation. It enables a developer to provide INSERT, UPDATE, and DELETE statements for performing separate update queries on otherwise read-only result sets in such a manner that the separate update queries are transparent to the end user.

In practical application, a TUpdateSQL object is placed on a data module or form, and linked to a TQuery component through that component’s UpdateObject property. If the UpdateObject property points to a valid TUpdateSQL object, the SQL statements belonging to the update object are automatically applied when cached updates are applied.

Hasta luego.

;)

jachguate
16-03-2004, 22:11:26
Solo añadir que las sentencias SQL que te ha generado Delphi están en perfecto estado..

delphi.com.ar
17-03-2004, 14:23:02
...pero son el único mecanismo disponible en todos los motores (a excepción de oracle) para lograr modificar consultas de este tipo, que son Read-Only por "circunstancia"...
Curiosamente Oracle ha implementado vistas modificables mediante triggers (a no ser que se trate de consultas simples), y esta técnica es MUY SIMILAR a la implementada en Delphi anteriormente.

Saludos!

jachguate
17-03-2004, 15:11:57
para completar la idea, y por si a alguno le interesa... los triggers se crean sobre las vistas, bajo la categoría instead of (en lugar de).


Create or Replace Trigger NombreTrigger
Instead of insert on NombreVista, bla, bla, bla


Esta característica, si no estoy mal, está disponible a partir de la versión 9i (y si lo estoy, que alguien me corrija... por favor).

Hasta luego ;)

delphi.com.ar
17-03-2004, 15:35:39
Esta característica, si no estoy mal, está disponible a partir de la versión 9i (y si lo estoy, que alguien me corrija... por favor).No tengo doc para buscar, pero de memoria digo que si... :D

Saludos!