PDA

Ver la Versión Completa : insertar o modificar un registro completo a otro


osvrom
11-08-2003, 17:13:24
Necesito saber si existe alguna forma si se puede hacer
que todos los campos de un registro se inserten en otro o actualicen otro sin necesidad de hacer un sql insert o update
especificando todos los campos y sus valores respectivamente.

Si es posible hacerlo con SQL y/o con Datasets.:confused:

gracias

delphi.com.ar
11-08-2003, 17:16:41
INSERT INTO TABLA T1
(CAMPO1, CAMPO2, CAMPO3)
SELECT CAMPO1, CAMPO2, CAMPO3
FROM TABLA T2
WHERE T2.CAMPO1='XXXX'

Esta sintaxis varía en los diferentes motores

UPDATE TABLA T1
SET (CAMPO1, CAMPO2, CAMPO3) = (SELECT CAMPO1, CAMPO2, CAMPO3
FROM TABLA T2
WHERE T2.CAMPO1=T1.CAMPO1)
WHERE T1.CAMPO1='XXXX'

Saludos!

osvrom
11-08-2003, 17:37:00
Primero muchas gracias por tu respuesta tan pronto.
Segundo mi siquiente inquietud es:
si o si tengo que escribir el nombre de todos los campos?? porque para tablas con muchos campos se hace una cadena muy larga que puede ser confusa.


Gracias

delphi.com.ar
11-08-2003, 17:43:34
Yo siempre recomiendo que en los SQL de los programas definan explícitamente todos los campos, porque si en un futuro alguien agrega un campo en una tabla, es muy probable que estas consultas dejen de funcionar, aunque este no sería el caso porque estas tratando con la misma tabla.

Dos comentarios:

- En el insert lo mas normal es que pongas un campo con un valor constante, para que no se dupliquen registros, ej: (el 55)
INSERT INTO TABLA T1
(CAMPO1, CAMPO2, CAMPO3)
SELECT 55 CAMPO1, CAMPO2, CAMPO3
FROM TABLA T2
WHERE T2.CAMPO1='XXXX'

- El update que te pasé es medio inútil, porque esta haciendo un update de un registro con si mismo, la idea es que tome los datos de otro registro:
UPDATE TABLA T1
SET (CAMPO1, CAMPO2, CAMPO3) = (SELECT CAMPO1, CAMPO2, CAMPO3
FROM TABLA T2
WHERE T2.CAMPO1='XX2')
WHERE T1.CAMPO1='XXXX'


Saludos!

osvrom
11-08-2003, 17:53:57
aparentemente el update con BDE no funciona esa igualdad de campos con el select parece que no le gusta.

Este es mi codigo de prueba
UPDATE prueba
SET (id, uno, dos) =

( SELECT id, uno, dos
FROM prueba1 p1
WHERE p1.id='2')

WHERE prueba.id='1'


Existiría alguna forma con datasets de hacer traspasos directos de la siguiente forma, es obvio que las dos tablas tiene que tener los mismos campos.

table1.record:=table2.record

o es muy loco lo que pido:cool:

Gracias

delphi.com.ar
11-08-2003, 18:01:43
Si los campos estan en el mismo orden, puedes hacer un ciclo e igualar los campos.

procedure CopiarRegistros(ADataSet1, ADataSet2 :TDataSet);
var
i: Integer;
begin
for i := 0 to ADataSet1.Fields.Count-1 do
ADataSet2.Fields[i].Value := ADataSet1.Fields[i].Value;
end;

osvrom
11-08-2003, 18:21:40
muy buenísimo tu código, Gracias che.:)

La única acotación es que al dataset hay que ponerlo en estado de edición o inserción.


procedure TForm1.CopiarRegistros(ADataSet1, ADataSet2 :TDataSet);
var
i: Integer;
begin
AdataSet2.Insert;
// Adataset2.Edit;
for i := 0 to ADataSet1.Fields.Count-1 do begin
ADataSet2.Fields[i].Value := ADataSet1.Fields[i].Value;
end;
Adataset2.Post;
end;

delphi.com.ar
11-08-2003, 18:29:07
Posteado originalmente por osvrom
La única acotación es que al dataset hay que ponerlo en estado de edición o inserción.
Es que mi idea es que eso lo hagas de afuera del procedimiento, así te sirve tanto para inserts como para updates.

Saludos!

Ektor!
23-01-2013, 18:53:11
Hola Buen día

Me parece muy buena todas sus aportaciones por lo que me gustaría extender un poco mas el tema y me pudieran ayudar con algunas dudas relacionadas que tengo.

Quisiera hacer un query en SQL Server que me devuelva todos los campos no nulos de una tabla y si hay una manera después de validar si un campo es nulo o no que se pueda actualizar en base a otro registro.
Y por ultimo si existe una manera de condicionar un mismo campo sin que me devuelva un true o false que son los casos de AND, OR, NOT, etc. esto es consultar diferentes valores de un mismo campo sin tener que usar un UNION haciendo la misma consulta

Espero que me puedan responder y cualquier duda o comentario es bienvenido.

Saludos y gracias

Casimiro Notevi
23-01-2013, 19:38:23
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

ecfisa
23-01-2013, 20:10:14
Quisiera hacer un query en SQL Server que me devuelva todos los campos no nulos de una tabla

Hola.

Revisa si te sirve este [enlace (http://stackoverflow.com/questions/63291/sql-select-columns-with-null-values-only)].

Como te aconsejó Casimiro lee la guía de estilo, en especial el punto [8 (http://www.clubdelphi.com/foros/guiaestilo.php#preguntas)].

Saludos. :)