Actualizar una tabla con datos de otra

Estoy tratando de actualizar una tabla llamada "porcodigo", usando sql, con datos que tengo en otra tabla llamada "libro", sin embargo como mis conocimientos son limitados (y no he conseguido más información), solo he llegado a recuperar los datos con el siguiente código:
with SQL do
begin
SQL.Clear;
add('select sum(valor)from libro.dbf libro');
add('where fecha between :strtodateTime(01-01-2007) and :strtodateTime(31-12-2007)');
add('group by codigo,fecha');
end;
Y no se como seguir. El esquema de datos es el siguiente
Tabla libro
Fecha código valor
01-01-2005 11-02-001 3017263
01-01-2005 11-04-001 3542630
07-02-2005 11-02-001 178500
18-02-2005 11-02-001 452200
23-02-2005 11-02-001 2082500
01-02-2005 21-01-001 63233
01-02-2005 21-01-001 59854
01-02-2005 21-01-001 10000
La agrupación de datos debería quedar en la tabla por código de la siguiente forma:
Código total1 total2
11-02-001 3017263 2713200
11-04-001 3542630 0
11-04-003 0 0
11-07-002 0 0
12-01-003 0 0
21-01-001 0 133087
41-01-001 0 0
Te agradeceré si me puedes ayudar (uso delphi 5 y las tablas son dbf).

1 respuesta

Respuesta
1
Bueno hazlo así:
En el select que tienes deberán ir los campos tal y como te los pide la tabla porCodigo es decir: Primero Código, luego Total1 y después Total2, entonces el SQL seria más o menos así:
Insert into porCodigo select codigo, sum(valor) from libro where aqui va la condiciion de fechas que tienes y luego Group by codigo.La fecha en el group by no la ocupas ya que no la estas insertando, ahora si te das cuenta solo estas poniendo codigo y la sumatoria de valor, los cuales va a los campos codigo y total1 de la tabla porCodigo, entonces faltaria el total2 ese de que campo de la tabla libro lo sacarias?
Si te das cuenta estoy haciendo lo que se llama un Insert Select esto significa que todo lo que te retorne el select sera insertado automáticamente, entonces para ejecutar el QUERY que tienes solo sera con la propiedad Query1. ExecSQL; es decir no deberas hacerle active := true; ya que no es un query que te mostrara informacion sino que te insertara informacion, ok.
Entonces queda pendiente de donde saldrá el valor para total2, lo único que deberás hacer es ponerlo en el select después del sum(valor) y también ponerlo en el group by después del código.
Hola
Gracias por tu respuesta y a pesar que aun no logro que funcione me ha dado alguna herramienta para seguir trabajando. Modifique el código por el siguiente:
procedure TForm3.GenerarClick(Sender: TObject);
begin
with datamodule6.Qrylibro do
begin
Active:=False;
with SQL do
begin
SQL.Clear;
add('insert into porcodigo (codigo,total1)');
add('select codigo,sum(valor)from libro.dbf libro');
add('where fecha between :strtodateTime(01-01-2007) and :strtodateTime(31-01-2007)');
add('group by codigo'); //add('group by codigo,fecha');
ExecSQL;
end;
end;
end;
Me dio error de Invalid use of keyword token con el ExecSQL.
Por otra parte los valores del total2 se deben obtener de los campos valor que tienen fecha febrero en la tabla libro (el total1 es para las fechas de enero). También me queda la siguiente duda, si uso insert me agregara los códigos y total1 como una nueva fila, sin embargo la tabla porcodigo ya tiene filas con cada código y debería por lo tanto grabar el total1 en la fila correspondiente (¿debería usar update?).
De nuevo te pido ayuda con esto.
Jorge
creo que ahi en el where esta mal, despues de la palabra between tienes dos puntos (:) como indicando que es un parametro, entonces debera ser asi;
Between '01-01-2007'and '31-01-2007', es decir en pocas palabras le pasarías directamente la fecha, osea estaría fija ahí en el SQL, ¿si me explico?
Hola Gaunmanuel
De nuevo te molesto, hice el cambio que me sugeriste con las fechas, pero ahora me da un error de type mismatch en el execsql y a pesar de haber intentado varias alternativas no lo soluciono.
Atentamente. Jorge
Debes encontrar cual es el formato de las fechas, posiblemente sea día primero luego mes y año, y sino le encuentras, entonces si ponlos como parámetros y bajo código le pasas el valor por ejemplo:
El between quedaria asi: between :fechaIni and :fechaFin
Entonces al ejecutar el query primero le pasas los parámetros:
Query1.Params[0].Value := date-10;
Query1.Params[1].Value := date;
Query1.ExecSQL;
Esto significa que las fechas serán 10 días atrás hasta el día de hoy.
¿Si me explico?
Gaunmanuel: no logre lo que quería, pero agradezco tu oportuna respuesta, que me sirvió para tratar de mejorar mis pocas habilidades con el sql de delphi. Atentamente.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas