Ver la Versión Completa : copiar registros de una tabla a otra
Rofocale
06-06-2011, 09:18:45
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:
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":
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
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
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.
...
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.
vBulletin v3.6.8, Derechos ©2000-2013, Jelsoft Enterprises Ltd.