Atualização/Inserção

Firebird

17/10/2003

Colegas,

Estou com uma enorme dúvida, pois tenho um sistema de replicação de dados onde consigo Inserir dados de um banco para outro, mas na hora de atualizar dar erro ( PRIMARY KEY ), pois se o banco 02 tiver informações não dar certo, podem ajudar ????

A função :

Obs.: O nome Origem é do componente Filelistbox, que uso para listar todas as tabelas.

No OnShow do Formulário já seleciono todas as tabelas
////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.FormShow(Sender: TObject);
var i:integer;
begin
/////////
try DB1.Connected := true except showmessage(´Problemas na Conecçao´) end;
// Carrega Query
Query1.Close;
Query1.sql.Clear;
// Verifica Tabelas na Base

Query1.sql.Add(´SELECT RDB$RELATION_NAME Bancos FROM RDB$RELATIONS ´+
´ WHERE NOT RDB$RELATION_NAME LIKE :P00 ´);
Query1.Params[00].Text:= ´RDB$¬´;

try
Query1.Open
except
showmessage(´Base não conectada verifique´);
end;
// Alimenta o Bases
origem.Items.clear;
while not Query1.eof do begin
origem.Items.Add(Query1.Fields[0].AsString);
Query1.next;
end;
/////////
//gravo true em todas as tabelas
for i := 0 to origem.Items.count-1 do begin
origem.Checked[i] := true;
end;

//===============================================//
//===============================================//
//===============================================//

end;


////////////////////////////////////////////////////////////////////////////////////////////////

procedure TForm1.BitBtn2Click(Sender: TObject);
var i,j,xpos,xreg,xultimo : integer;
xtipo,xidx,xidx_old,xold,xbase_old,xcp_idx : string;
function Tira_Ponto(texto:string):string;
var i:integer;
s:string;
begin
for i := 1 to length(texto) do begin
if (copy(texto,i,1) <> chr(39)) then
s := s + copy(texto,i,1)
end;
Tira_Ponto := s;
end;

begin

/////// Conecta tabela destino
/////////rotina de inclusao das tabelas
// de.Visible := true;
for i := 0 to origem.Items.count-1 do begin
if origem.Checked[i] then begin
// tabela2.Active:=false;
query1.Close;
query1.sql.Clear;
query1.sql.add(´select * from ´+origem.items[i]);
// Mostra base exportada
BaseExport.Caption := origem.items[i];
BaseExport.Refresh;
GroupBox2 .Refresh;
try query1.open except end;
//////////////
query2.Close;
query2.sql.Clear;
query2.sql.add(´select * from ´+origem.items[i]);
try query2.open except end;

tabela2.TableName :=origem.items[i];
tabela2.Active:=true;
///////////////
xpos := 0;
xreg := 0;
xultimo := query1.RecordCount;
ProgressBar1.Position := 0;

// Passa dados entrea as Tabelas
while not Query1.EOF do begin
// Numero dos registros exportados
inc(xreg);

// Exporta.Caption := inttostr(xreg);
// Exporta.Refresh;
// Marca .Caption := inttostr(xultimo);
// Marca .Refresh;



// Barra de progressao
inc(xpos);
if xpos = Query1.RecordCount div 10 then begin
xpos := 0;
ProgressBar1.Position := ProgressBar1.Position + 10;
end;

if not Query2.IsEmpty then
begin

for j := 0 to Query1.FieldCount - 1 do begin
tabela2.edit;
tabela2.Fields[j].AsString := tira_ponto(Query1.Fields[j].AsString);
tabela2.post;

end;

end else
begin
tabela2.append;

for j := 0 to Query1.FieldCount - 1 do begin
tabela2.Fields[j].AsString := tira_ponto(Query1.Fields[j].AsString);

end;


end; ////////////

tabela2.ApplyUpdates;
tabela2.CancelUpdates;

Query1.Next;
end;
end;
end;
/////////fim da rotina de inclusao das tabelas


end;


Claudiomar

Claudiomar

Curtidas 0
POSTAR