Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   copiar registros de una tabla a otra (https://www.clubdelphi.com/foros/showthread.php?t=74216)

Rofocale 06-06-2011 09:18:45

copiar registros de una tabla a otra
 
Código Delphi [-]
      Close;
                SQL.Clear;
                SQL.Add('SELECT * FROM ventasareas');
                Open;
                articulo1 := FieldByName('articulo').value;
                cantidad1 := FieldByName('cantidad').value;
                precio1 := FieldByName('precio').value;
                fecha1 := FieldByName('fecha').value;


            Close;
            SQL.Clear;
            SQL.Add('INSERT INTO ventasdet (venta, orden, articulo, cantidad, precio,iva,devolucion, fecha)');
            SQL.Add('VALUES (:venta, :orden, :articulo, :cantidad, :precio, :iva,:devolucion,:fecha)');

            params.ParamByName('venta').Value :=  sVenta;
            params.ParamByName('orden').Value := IntToStr(i);
            params.ParamByName('articulo').Value := articulo1;
            params.ParamByName('cantidad').Value := cantidad1;
            params.ParamByName('precio').Value :=  precio1;
            params.ParamByName('iva').Value :=  rIva;
            params.ParamByName('devolucion').Value :=  riva;
            params.ParamByName('fecha').Value :=  fecha1;

Hola a todos este codigo me copia el primer registro de ventasareas a ventasdet

ahora mi pregunta es como puedo hacer para copiar todos los registros de ventasareas a ventasdet.. ya que ventasareas no solo tiene un registro si no mas..
alguien me puede ayudar ?

gracias

Casimiro Notevi 06-06-2011 09:31:38

Un bucle, por ejemplo, aprovechando un poco tu código:

Código Delphi [-]
SQL.Clear;                 
SQL.Add('SELECT * FROM ventasareas');                 
Open; 
while not sql.eof dobegin
 SQL.articulo1 := FieldByName('articulo').value;
 SQL.cantidad1 := FieldByName('cantidad').value;
 etc...

 SQL2.Clear;
 SQL2.Add('INSERT INTO ventasdet (venta, orden, articulo, cantidad, precio,iva,devolucion, fecha)');
 SQL2.Add('VALUES (:venta, :orden, :articulo, :cantidad, :precio, :iva,:devolucion,:fecha)');
 SQL2.params.ParamByName('venta').Value :=  sVenta;
 SQL2.params.ParamByName('orden').Value := IntToStr(i);
 etc...     


 SQL.next;
end;

Rofocale 06-06-2011 09:54:26

no funciona el bucle da error de que el query esta cerrado y no puede realizar la operacion
tampoco hay parametro sql.next

Casimiro Notevi 06-06-2011 10:03:05

Ya sé que no funciona, tal y como he dicho antes, sólo he modificado un poco tu código para que te hagas una idea de cómo debe hacerse y para hacerte pensar un poco, que es la única forma en que se aprenden las cosas :)

Casimiro Notevi 06-06-2011 10:10:04

A ver si te sirve esta "plantilla":

Código Delphi [-]
try
  Q1.Close;
  Q1.SQL.Text := 'select ...';
      
  Q2.Close;
  Q2.SQL.Text := 'insert into ...';
    
  Q1.Open;
  while not Q1.Eof do
  begin      
    Q2.Close;
    Q2.ParamByName('campo1').AsInteger := Q1.FieldByName('campo1').AsInteger;
    Q2.ParamByName('campo2').AsString  := Q1.FieldByName('campo2').AsString;
    etc.
    Q2.Execquery;      

    Q1.Next;
  end;

finally
  Q2.Transaction.CommitRetaining;
end;

Rofocale 06-06-2011 10:25:31

queria saber si en el codigo que he puesto se le puede agregar unas lineas .. un bucle como me lo mencionaste al inicio.. ya que no quisiera cambiarlo por otro codigo distinto..

solo es cuestion de que quiero aprenderlo asi...

Casimiro Notevi 06-06-2011 10:34:33

Claro, fíjate en la "plantilla" que te he puesto, sólo has de seguir esa estructura con tu código.

Rofocale 06-06-2011 16:08:18

Código Delphi [-]
          try
           dmdatos.qryconsulta.Close;
           dmdatos.qryconsulta.SQL.Clear;
           dmdatos.qryconsulta.SQL.Add('SELECT * FROM ventasareas');

           dmdatos.qrymodifica.Close;
           dmdatos.qrymodifica.SQL.Clear;
           dmdatos.qrymodifica.SQL.Add('INSERT INTO ventasdet (venta, orden, articulo, cantidad, precio,iva,devolucion, fecha)');
           dmdatos.qrymodifica.SQL.Add('VALUES (:venta, :orden, :articulo, :cantidad, :precio, :iva,:devolucion,:fecha)');

           dmdatos.qryconsulta.open;

           while not dmdatos.qryconsulta.Eof do
           begin
           articulo1 := dmdatos.qryconsulta.FieldByName('articulo').value;
           cantidad1 := dmdatos.qryconsulta.FieldByName('cantidad').value;
           precio1 := dmdatos.qryconsulta.FieldByName('precio').value;
           fecha1 := dmdatos.qryconsulta.FieldByName('fecha').value;

           dmdatos.qrymodifica.params.ParamByName('venta').Value :=  sVenta;
           dmdatos.qrymodifica.params.ParamByName('orden').Value := IntToStr(i);
           dmdatos.qrymodifica.params.ParamByName('articulo').Value := articulo1;
           dmdatos.qrymodifica.params.ParamByName('cantidad').Value := cantidad1;
           dmdatos.qrymodifica.params.ParamByName('precio').Value :=  precio1;
           dmdatos.qrymodifica.params.ParamByName('iva').Value :=  rIva;
           dmdatos.qrymodifica.params.ParamByName('devolucion').Value :=  riva;
           dmdatos.qrymodifica.params.ParamByName('fecha').Value :=  fecha1;

           dmdatos.qrymodifica.open;
           dmdatos.qryconsulta.next;
            //ExecSQL;
           end;
           finally
           dmdatos.qrymodifica.Transaction.CommitRetaining;
           end;

no funciona la estructura.. osea compila normal pero sigue copiando solo la primera linea

ElDioni 06-06-2011 16:49:15

Para que funcione deberías hacer la instrucción de insertar y de guardar los cambios dentro del bucle, ¿no?, para que lo haga con todos los registros.

Saludos.

Rofocale 06-06-2011 17:28:17

Código Delphi [-]
 for i := 0 to grdDatos.RowCount - 1 do begin
            Close;
            SQL.Clear;
            SQL.Add('INSERT INTO ventasdet (venta, orden, articulo, cantidad, precio,');
            SQL.Add('iva, descuento, juego, devolucion, ventareforden, comentario, fecha, cantidad_cnt) VALUES(');
            SQL.Add(sVenta + ',' + IntToStr(i) + ',');
            SQL.Add(grdDatos.Cells[0,i] + ',');
            SQL.Add(grdDatos.Cells[3,i] + ',');
            SQL.Add(grdDatos.Cells[4,i] + ',');
            SQL.Add(grdDatos.Cells[5,i] + ',');
            SQL.Add(grdDatos.Cells[8,i] + ',0,0,');
            if(grdDatos.Cells[12,i] = '') then
                SQL.Add('null,')
            else
                SQL.Add(grdDatos.Cells[12,i] + ',');
            SQL.Add(sClaveComent + ',' + QuotedStr(grdDatos.Cells[15,i]) + ',');
            SQL.Add('''' + grdDatos.Cells[16,i] + ''')');
            ExecSQL;

ese codigo por ejemplo si funciona pero con un stringgrid.. yo no quiero eso queria hacerlo como en el codigo que puse ya que no uso un stringgrid si no un cxgrid

alguna otra sugerencia ? ya que me da error si meto el insert dentro del bucle tambien
gracias

ElDioni 07-06-2011 12:42:52

¿Podrías poner que error es el que te da?
¿Podrías poner el código como lo has puesto para que te de el error?

ecfisa 07-06-2011 13:23:55

Hola.

No entiendo por que no lo realizas como te sugirío Casimiro, de ese modo funciona correctamente.

Código Delphi [-]
...
begin
  qyVtasArea.SQL.Clear;
  qyVtasArea.SQL.Add('SELECT * FROM VENTASAREAS');
  qyVtasArea.Open;
  qyVtasDet.SQL.Clear;
  qyVtasDet.SQL.Add('INSERT INTO VENTASDET(VENTA,ORDEN,ARTICULO,CANTIDAD,PRECIO,IVA,DEVOLUCION,FECHA)');
  qyVtasDet.SQL.Add('VALUES(:VENTA,:ORDEN,:ARTICULO,:CANTIDAD,:PRECIO,:IVA,:DEVOLUCION,:FECHA)');
  while not qyVtasArea.Eof do
  begin
    qyVtasDet.ParamByName('VENTA').Value:= qyVtasArea.FieldByName('VENTA').Value;
    qyVtasDet.ParamByName('ORDEN').Value:= qyVtasArea.FieldByName('ORDEN').Value;
    qyVtasDet.ParamByName('ARTICULO').Value:= qyVtasArea.FieldByName('ARTICULO').Value;
    qyVtasDet.ParamByName('PRECIO').Value:= qyVtasArea.FieldByName('PRECIO').Value;
    qyVtasDet.ParamByName('IVA').Value:= qyVtasArea.FieldByName('IVA').Value;
    qyVtasDet.ParamByName('DEVOLUCION').Value:= qyVtasArea.FieldByName('DEVOLUCION').Value;
    qyVtasDet.ParamByName('FECHA').Value:= qyVtasArea.FieldByName('FECHA').Value;
    qyVtasDet.ExecSQL;
    qyVtasArea.Next;
  end;
  qyVtasDetqyVtasArea.Close;
end;

Saludos.


La franja horaria es GMT +2. Ahora son las 14:02:49.

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