Atulizar campos em outra tabela - for ?
Boa Tarde á todos !!
Estou usando Delphi 2009 + Firebird + DBX 4.
Estou precisando atualizar uma tabela, não sei como fazer.
Tabela ORIGEM
CPF
DDD
TELEFONE
Tabela DESTINO
CPF
NOME
DDD
TELEFONE
Como eu faço um LOOP para comparar os CPF se tiver o CPF atualiza, se não ignora.
Segue abaixo o codigo mas não esta funcionando.
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
cdsOrigem.first;
while not cdsOrigem.eof do
begin
while not cdsDestino.eof do
begin
if cdsDestinoCPF.AsString = cdsOrigemCPF.AsString then
Begin
cdsDestino.Edit; cdsDestinoDDD_RES.AsString := cdsOrigemDDD .AsString;
cdsDestinoTEL_RES.AsString := cdsOrigemTELEFONE.AsString; cdsDestino.Post;
cdsDestino.ApplyUpdates(0); cdsDestino.next;
End;
cdsOrigem.next;
end;
end;
end; No aguardo... Abraços.
begin
cdsOrigem.first;
while not cdsOrigem.eof do
begin
while not cdsDestino.eof do
begin
if cdsDestinoCPF.AsString = cdsOrigemCPF.AsString then
Begin
cdsDestino.Edit; cdsDestinoDDD_RES.AsString := cdsOrigemDDD .AsString;
cdsDestinoTEL_RES.AsString := cdsOrigemTELEFONE.AsString; cdsDestino.Post;
cdsDestino.ApplyUpdates(0); cdsDestino.next;
End;
cdsOrigem.next;
end;
end;
end; No aguardo... Abraços.
Osvaldo Domênico
Curtidas 0
Respostas
Emerson Nascimento
04/04/2010
é necessário usar o loop? não dá pra fazer via instrução SQL?
GOSTEI 0
Osvaldo Domênico
04/04/2010
Boa Noite !!
Estou usando Delphi 2009 + Firebird + DBX 4
Usando uma sintaxe SQL
Ainda esta um pouco confuso para eu entender, estou usando o IBEXPERT em um banco de dados FIREBIRD, coloquei os dois parametros e executei, logicamente ele pede o 1. e 2. parametro para preencher, é ai que eu estou me perdendo porque eu quero que ele verifique o CPF se existir ele pega o campo da tabela origem e copia na destino, fiz um teste colocando por exemplo o valor no 1. params de 12 e 2. de 0000-0000, ele executa e confirma a quantidade de registros atualizados porem vou fazer a consulta e não esta gravando, por enquanto estou usando só o console do ibexpert.
Se puder ajudar ficarei muito grato. Abraços
update clientes cli set cli.ddd_res =:DDD_RES, cli.tel_res =:TEL_RES where (exists(select tel.ddd_1, tel.tel_1 from telefones tel where cli.cpf = tel.cpf))
Ainda esta um pouco confuso para eu entender, estou usando o IBEXPERT em um banco de dados FIREBIRD, coloquei os dois parametros e executei, logicamente ele pede o 1. e 2. parametro para preencher, é ai que eu estou me perdendo porque eu quero que ele verifique o CPF se existir ele pega o campo da tabela origem e copia na destino, fiz um teste colocando por exemplo o valor no 1. params de 12 e 2. de 0000-0000, ele executa e confirma a quantidade de registros atualizados porem vou fazer a consulta e não esta gravando, por enquanto estou usando só o console do ibexpert.
Se puder ajudar ficarei muito grato. Abraços
GOSTEI 0
Osvaldo Domênico
04/04/2010
Boa Noite !!
Estou usando Delphi 2009 + Firebird + DBX 4
Usando uma sintaxe SQL
No IBEXPERT funciona perfeito só que forma manual e um a um. O que eu preciso é que ele faço a comparação e se existir faça o UPDATE, cheguei neste codigo, porem esta gravando os campos em branco na tabela destino, mesmo existindo os dados na tabela origem.
Se puder ajudar ficarei muito grato. Abraços
update clientes cli set cli.ddd_res =:DDD_RES, cli.tel_res =:TEL_RES where (exists(select tel.ddd_1, tel.tel_1 from telefones tel where cli.cpf = tel.cpf))
No IBEXPERT funciona perfeito só que forma manual e um a um. O que eu preciso é que ele faço a comparação e se existir faça o UPDATE, cheguei neste codigo, porem esta gravando os campos em branco na tabela destino, mesmo existindo os dados na tabela origem.
Begin
with sqlqryClientes do
begin
Close;
SQL.Clear;
SQL.Add('select DDD_RES,TEL_RES from clientes');
Open;
If not IsEmpty then
begin
first;
If not eof then
begin
close;
sql.clear;
sql.add ('update clientes cli set cli.ddd_res =:DDD_RES, ');
sql.add(' cli.tel_res =:TEL_RES ');
sql.add(' where (exists(select tel.ddd_1, tel.tel_1 ');
sql.add(' from telefones tel where cli.cpf = tel.cpf)) ');
Params[0].AsString := ClientDataSet1DDD_RES.AsString;
Params[1].AsString := ClientDataSet1TEL_RES.AsString;
Open;
end;
Next;
end;
exit;
end;
end;
Se puder ajudar ficarei muito grato. Abraços
GOSTEI 0
Emerson Nascimento
04/04/2010
faça algo assim:
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
cdsOrigem.first;
cdsDestino.Close;
cdsDestino.CommandText :=
'update clientes set '+
' ddd_res = :DDD_RES, tel_res = :TEL_RES '+
'where cpf = :CPF';
while not cdsOrigem.eof do
begin
cdsDestino.params.parambyname('DDD_RES').AsString := cdsOrigemDDD.AsString;
cdsDestino.params.parambyname('TEL_RES').AsString := cdsOrigemTELEFONE.AsString;
cdsDestino.params.parambyname('CPF').AsString := cdsOrigemCPF.AsString;
cdsDestino.ExecSQL;
cdsOrigem.next;
end;
end;
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
cdsOrigem.first;
cdsDestino.Close;
cdsDestino.CommandText :=
'update clientes set '+
' ddd_res = :DDD_RES, tel_res = :TEL_RES '+
'where cpf = :CPF';
while not cdsOrigem.eof do
begin
cdsDestino.params.parambyname('DDD_RES').AsString := cdsOrigemDDD.AsString;
cdsDestino.params.parambyname('TEL_RES').AsString := cdsOrigemTELEFONE.AsString;
cdsDestino.params.parambyname('CPF').AsString := cdsOrigemCPF.AsString;
cdsDestino.ExecSQL;
cdsOrigem.next;
end;
end;
GOSTEI 0
Ricardo Araujo
04/04/2010
bom dia,
segue o codigo este jeito é o mais simples.
qualquer coisa segue meu Email : rbbarreto@hotmail.com
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, DBTables;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
BitBtn1: TBitBtn;
Destino: TQuery;
Origem: TQuery;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Math;
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Origem.Open;
Origem.First;
while not Origem.Eof do
begin
Destino.close;
Destino.SQL.Clear;
Destino.SQL.Add('SELECT * FROM DESTINO');
Destino.SQL.Add('WHERE CPF = :P_CPF ');
Destino.ParamByName('p_cpf').AsString := Origem.FieldByName('CPF').AsString;
Destino.Open;
if Destino.RecordCount > 0 then
begin
Destino.close;
Destino.SQL.Clear;
Destino.SQL.Add('update DESTINO');
Destino.SQL.Add(' set ddd_res = :ddd_res , ');
Destino.SQL.Add(' tel_res = :tel_res ');
Destino.SQL.Add('where cpf = :p_cpf ');
Destino.ParamByName('ddd_res').AsString := Origem.FieldByName('ddd').AsString;
Destino.ParamByName('tel_res').AsString := Origem.FieldByName('telefones').AsString;
Destino.ParamByName('p_cpf').AsString := Origem.FieldByName('CPF').AsString;
Destino.ExecSQL;
Origem.Next;
end;
Origem.Next;
end;
end;
end.
segue o codigo este jeito é o mais simples.
qualquer coisa segue meu Email : rbbarreto@hotmail.com
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, DBTables;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
BitBtn1: TBitBtn;
Destino: TQuery;
Origem: TQuery;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Math;
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Origem.Open;
Origem.First;
while not Origem.Eof do
begin
Destino.close;
Destino.SQL.Clear;
Destino.SQL.Add('SELECT * FROM DESTINO');
Destino.SQL.Add('WHERE CPF = :P_CPF ');
Destino.ParamByName('p_cpf').AsString := Origem.FieldByName('CPF').AsString;
Destino.Open;
if Destino.RecordCount > 0 then
begin
Destino.close;
Destino.SQL.Clear;
Destino.SQL.Add('update DESTINO');
Destino.SQL.Add(' set ddd_res = :ddd_res , ');
Destino.SQL.Add(' tel_res = :tel_res ');
Destino.SQL.Add('where cpf = :p_cpf ');
Destino.ParamByName('ddd_res').AsString := Origem.FieldByName('ddd').AsString;
Destino.ParamByName('tel_res').AsString := Origem.FieldByName('telefones').AsString;
Destino.ParamByName('p_cpf').AsString := Origem.FieldByName('CPF').AsString;
Destino.ExecSQL;
Origem.Next;
end;
Origem.Next;
end;
end;
end.
GOSTEI 0