Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Opciones para copiar registros de una tabla a otra (https://www.clubdelphi.com/foros/showthread.php?t=75264)

pmtzg 09-08-2011 22:06:06

Opciones para copiar registros de una tabla a otra
 
hola amigos
tengo la siguiente pregunta, estoy haciendo una pequeña aplicacion donde uno 2 tablas paradox para formar una sola
lo hago por medio de
1 query2 y table2

este es el codigo aqui selecciono todos los campos

Código Delphi [-]

consult:='select * from cuentas.db '+
' union '+
' select * from BdOld\cuentas.db ';

query1.SQL.Clear;
query1.SQL.Add(consult);

query2.Active := true;

table2.DatabaseName := 'Reporte';
table2.TableName := 'tableunion';

 table2.Open;

while not query2.Eof do
   table2.Append;
  begin
     for I := 0 to query2.fields.Count - 1 do
        begin
          table2.Fields[i].Value := query2.Fields[i].Value;
          table2.post;
         query2.Next;
        end;
   end;

y excelente todo muy bien

pero ahora por necesidad tengo un campo llamado noreg, que es key primary
y me guarda el no de registro q se va guardando, y este campo lo deseo colocar con un nuevo numero segun se vaya guardando en la nueva base o la union de las 2 bases y hago lo siguiente :

Código Delphi [-]
consult:='select cliente, fecha, importe, fechaven, descuento from cuentas.db '+
' union '+
' select cliente, fecha, importe, fechaven, descuento from BdOld\cuentas.db  order by fecha desc';

// selecciono todos los campos exepto noreg

query1.SQL.Clear;
query1.SQL.Add(consult);

query2.Active := true;

table2.DatabaseName := 'Reporte';
table2.TableName := 'tableunion';
nr:=query2.RecordCount;  // para gravar noreg con nuevo num. de registro
 table2.Open;
table2.Append;
while not query2.Eof do
   
  begin
    // for I := 0 to query2.fields.Count - 1 do    omiti esto 
       // begin
        //  table2.Fields[i].Value := query2.Fields[i].Value;  omiti esto

           table2.FieldByName('noreg').AsInteger:=nr;
           table2.FieldByName('cliente'):=query2.FieldValues['cliente'];
           table2.FieldByName('fecha'):=query2.FieldValues['fecha'];
           table2.FieldByName('importe'):=query2.FieldValues['importe'];
           table2.FieldByName('fechaven'):=query2.FieldValues['fechaven'];
           table2.FieldByName('descuento'):=query2.FieldValues['descuento'];

          table2.insert;
         query2.Next;
         nr:=nr-1;
       // end;
   end;

ahora mi pregunta es la siguiente
¿habra una forma de tomar todos los registros del query2 y solo anexar el valor del campo noreg por medio de variable ?

mas sencillo es un buen capturar todos los registros puesto que tengo que pasar asi varias tablas y unas traen hasta 52 campos con el mismo campo noreg como key prymary

si anexo esto al codigo

Código Delphi [-]
for I := 0 to query2.fields.Count - 1 do    
        begin
          table2.Fields[i].Value := query2.Fields[i].Value;  
           table2.FieldByName('noreg').AsInteger:=nr;

y mando grabar me manda error
solo me funciona declarando todos los campos de uno por uno

Código Delphi [-]
table2.FieldByName('cliente'):=query2.FieldValues['cliente'];

espero haberme explicado
si alguien me puede ayudar se lo agradecere porque me faltan mas tabla por unir y como les comentaba hay algunas que traen hasta 52 campos esta es la mas peque y es un ejemplo

gracias saludos

oscarac 09-08-2011 22:18:18

y has probado de esta manera?

te pongo el pseudocodigo

Código Delphi [-]
 
while not eof...
Begin
table2.FieldByName('noreg').AsInteger:=nr;
for I := 1 to query2.fields.Count - 1 do
        begin
          table2.Fields[i].Value := query2.Fields[i].Value;
          table2.post;
         query2.Next;
        end;
end

osea colocar fuera del for el primer campo

pmtzg 09-08-2011 23:46:16

error con el cambio
 
gracias oscarac
ya lo hice asi pero me marca error


raised exception class EVariantTypeCastError with message Could not convert variant of type (string) into type (date)

y tambien me dice

EDataBAseError with message invalid value for field fecha

¿alguna sugerencia? la verdad es que ya no se ni por donde

oscarac 09-08-2011 23:50:20

segun el ejemplo las 2 tablas tienen la misma estructura, pero mencionas que hay tablas que tienen hasta 52 campos... en esos casos como haces el query o solo los llamas con * (Select * from...)

pmtzg 10-08-2011 00:13:57

nota
 
aun no llego ahi mi estimado primero estoy haciendo pruebas con las tablas mas chicas

y si no encuentro otra solucion tendre que declarar para cada campo el

Código Delphi [-]
table2.FieldByName('cliente'):=query2.FieldValues['cliente'];

el insert imaginate primero hacer el select, que es mas sencillo
y despues esto es demaciado codigo para el exe

pero creo que pasa me va desfasando y me graba nr en noreg y lo demas lo hace o mas bien lo recorre al insert

para darme a entender hay alguna posibilidad de de hacer esto :
Código Delphi [-]
  table2.FieldByName('noreg').AsInteger:=nr;

  table2.Fields[i].Value := nr+query2.Fields[i].Value;

no es posible hacer esto pero alguna funcion o algo parecido para que grabe el registro completo
eso es lo que veo que me haria bien

oscarac 10-08-2011 00:28:11

a ver a ver aver....
segun entendi lo que deseas hacer es unir 2 tablas en una nueva verdad?

si las tablas tienen los campos iguales entonces funcionaria perfectamente

Código Delphi [-]
 
table2.FieldByName('noreg').AsInteger:=nr;
for I := 1 to query2.fields.Count - 1 do
Begin
        table2.Fields[i].Value := query2.Fields[i].Value;
        table2.post;
       query2.Next;

end

ten cuidado con los Begin y los end, quiza ahi esta tu problema

pmtzg 10-08-2011 00:42:32

asi es
 
asi es asi como tu lo pones es correto incluso lo ilustre desde el principio
ahora se me esta ocurriendo mejor desde select probar si hay una opción que me cuente los numeros de registros y por cada uno se lo asigno a noreg, se podra desde select , comandos sql ???

mightydragonlor 10-08-2011 04:23:06

claro que si, espero que esto te sirva.
http://www.firebirdfaq.org/faq343/

pmtzg 10-08-2011 08:13:00

gracias mightydragonlor

pero me funciona de paradox a paradox

o como seria de paradox a firebird

por que segun lei solo es para bases de datos en firebird

voy a leer a ver q se me ocurre una vez mas gracias

mightydragonlor 10-08-2011 14:28:47

claro que si la consulta inicial es paradox, pues este no reconocerá esa sentencia, así que los mas indicado es agregar una columna al table, controlando por código el nro que desees.

pmtzg 10-08-2011 16:43:51

amigo creo que esta vez me declaro incompetente o estoy mega bloqueado

si tu ves mi sentencia la que esta arriba me podrias ilustrar como se haria ??

perdon pero ahora si ya me agarraron las prisas

mightydragonlor 10-08-2011 16:50:09

Código Delphi [-]
for I := 1 to query2.fields.Count - 1 do
Begin
     table2.FieldByName('noreg').AsInteger:=I;
     table2.Fields[i].Value := query2.Fields[i].Value;
     table2.post;
     query2.Next;
end
Si te fijas, ya estas recorriendo los registros uno a uno, el I guarda el número de registro por así decirlo.

ecfisa 10-08-2011 17:06:18

Hola pmtzg.

Veo que oscarac y mightydragonlor coinciden con que te sugerí en el hilo anterior: 2 Tablas Paradox a Firebird ;)

Saludos.

oscarac 10-08-2011 17:20:55

sigo pensando en que debes tener cuidado con los begin y end en tu bloque de codigo

Código Delphi [-]
 
for I := 1 to query2.fields.Count - 1 do
Begin
     table2.FieldByName('noreg').AsInteger:=I;
     table2.Fields[i].Value := query2.Fields[i].Value;
     table2.post;
     query2.Next;
end

creo que el post deberia estar fuera del bloque, porque solo te "grabaria" la primera modificacion y no veo un edit despues del query2.next

pmtzg 10-08-2011 17:57:26

haciendo los cambios ahora me marca

table2:Dataset no in edit or insert mode

si lo cambio a insert

no graba bien los registros

graba en cada renglon un solo campo nada mas

oscarac 10-08-2011 18:02:17

Cita:

Empezado por pmtzg (Mensaje 409052)
haciendo los cambios ahora me marca

table2:Dataset no in edit or insert mode

si lo cambio a insert

no graba bien los registros

graba en cada renglon un solo campo nada mas

es por lo que te acabo de comentar en el comentario anterior.... estas haciendo post sin hacer edit o appen
debes sacar ese post fuera del bloque begin end...

pmtzg 10-08-2011 18:09:14

lo volvi a crear distinto y me hace los mismo este es el codigo:

corregido ya funciona este codigo

Código Delphi [-]
procedure TForm2.Button4Click(Sender: TObject);
var
  I,nr: Integer;
begin
query2.DatabaseName := 'Report1';   {es un addalias con el path de files paradox}
query2.SQL.Clear;

{para q me funcionara agregue este a la consulta  (ctlpol) as num_reg }

consult := 'Select distinct (ctlpol) as num_reg, cclie, status, tipo_mov, no_factura, docto, refer, importe, '+
'fecha_apli, fecha_venc, cob, afec_coi, obs_cxccxp, bank_com, strcvevend, num_moned, '+
'tcambio, impmon_ext, cconrefer, fechaelab, usuario, ctlpol, cvefolio ' +
' from BdOld\cuen04 '+
'union '+
'Select  (ctlpol) as num_reg, cclie, status, tipo_mov, no_factura, docto, refer, importe, '+
'fecha_apli, fecha_venc, cob, afec_coi, obs_cxccxp, bank_com, strcvevend, num_moned, '+
'tcambio, impmon_ext, cconrefer, fechaelab, usuario, ctlpol, cvefolio ' +
'from cuen04  order by fecha_apli desc ' ;


query2.SQL.Add(consult);
query2.Active := true;
label1.Caption :='Total Reg.: '+ inttostr(query2.RecordCount);

//query2.First;
table2.DatabaseName := 'Report1';
table2.TableName := 'CONSULTA2';
g1.MinValue := 0;
g1.MaxValue := query2.RecordCount;
SHOWMESSAGE ('NO. REG.: '+inttostr(query2.RecordCount));
 table2.Open;
 //table2.Append;
 //query2.First;
 nr:=query2.RecordCount;  {total de registros en la base} 
 while not query2.Eof do
  begin
      table2.append;
     for I := 0 to query2.fields.Count - 1 do
        begin

          table2.FieldByName('num_reg').AsInteger:=nr;
           table2.Fields[i].Value := query2.Fields[i].Value;
        end;                           {aqui estaba mi error  modifique esto y a la consulta agrege el campo q se incrementa}
          table2.insert;
          query2.Next;
          g1.Progress := query2.RecNo;
           nr:=nr-1;
        

  end;

   table2.Close;
   query2.Close;
   showmessage ('Listo proceso terminado con exito ');

end;


quiza si estoy cometiendo un error y no me doy cuenta

pmtzg 10-08-2011 18:16:10

mi estimado oscarac

eres grande

por tu paciencia
ahora si ... ya quedo este asunto }

en verdad no lo pude ver tenias razon gracias mi amigo que amigo mi hermano

oscarac 10-08-2011 18:27:10

Cita:

Empezado por pmtzg (Mensaje 409060)
mi estimado oscarac

eres grande

por tu paciencia
ahora si ... ya quedo este asunto }

en verdad no lo pude ver tenias razon gracias mi amigo que amigo mi hermano

de nada.... en esta pagina tambien he recibido mucha ayuda...
P.D.
hermano hazme un prestamo... jajajajaja:D:D

pmtzg 10-08-2011 18:30:40

ya estas

me ha hecho un gran favor y ya modifique para que cualquier persona q busque y en tu honor

sepa como orientarse


saludos y cuanto nece$$$$$itas jejejejeej


La franja horaria es GMT +2. Ahora son las 10:08:37.

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