Array
(
)

transferencia de dados

Mahdak
   - 07 fev 2006

caros colegas, criei um aplicativo simples para copiar os dados de uma tabela para outra.
-> Firebird 1.5, Delphi 7

Erro gerado:
-------------------------------------------------------------------------------
´arithmetic exception, numeric overflow, or string truncation cannot transliterate character between character sets´
-------------------------------------------------------------------------------

O que acontece após o erro:
-------------------------------------------------------------------------------
ao invés de serem copiados os 9.979 registros existentes na tabela de origem para de destino é copiado apenas o primeiro registro.
-------------------------------------------------------------------------------

se alguem puder me ajudar, abaixo segue os códigos e campos das respectivas tabelas...

Abraços!

Rotina:
#Código


procedure Limpa_Edit;
begin
Principal.Edit_Codigo.Clear;
Principal.Edit_Nome.Clear;
Principal.Edit_CODUF.Clear;
Principal.Edit_Data.Clear;
end;

procedure TPrincipal.Btn_CopiaClick(Sender: TObject);
begin
Tbl_Para.First;
Tbl_De.First;
while not Tbl_De.Eof do
begin
Limpa_Edit;
Edit_Codigo.Text := IntToStr(Tbl_DECODIGO.AsInteger);
Edit_Nome.Text := Tbl_DENOME.AsString;
Edit_CODUF.Text := IntToStr(Tbl_DECODIGO_ESTADO.AsInteger);
Edit_Data.Text := DateToStr(Tbl_DEDATA_CADASTRO.AsDateTime);

Tbl_Para.Insert;
Tbl_ParaCODIGO.AsInteger := StrToInt(Edit_Codigo.Text);
Tbl_ParaNOME.AsString := Edit_Nome.Text;
Tbl_ParaCODIGO_ESTADO.AsInteger := StrToInt(Edit_CODUF.Text);
Tbl_ParaDATA_CADASTRO.AsDateTime := StrToDateTime(Edit_Data.Text);

end;
Tbl_Para.post;
Tbl_Para.ApplyUpdates;
ShowMessage(´transferencia realizada com sucesso!´);
end;


campos da tabelas:

tabela ´PARA´
----------------
#Código

/* Table: CIDADE, Owner: SYSDBA */

CREATE TABLE CIDADE
(
CODIGOINTEGER NOT NULL,
NOMEVARCHAR(50) CHARACTER SET WIN1252 NOT NULL COLLATE PXW_INTL850,
CODIGO_ESTADOINTEGER NOT NULL,
DATA_CADASTROTIMESTAMP DEFAULT ´now´ NOT NULL,
CONSTRAINT PK_CIDADE_CODIGO PRIMARY KEY (CODIGO)
);


Tabela ´De´:
--------------
#Código

/* Table: CIDADE, Owner: SYSDBA */

CREATE TABLE "CIDADE"
(
"CODIGO"INTEGER NOT NULL,
"NOME"VARCHAR(50) CHARACTER SET WIN1252 NOT NULL COLLATE PXW_INTL850,
"CODIGO_ESTADO"INTEGER NOT NULL,
"CODIGO_REGIAO"INTEGER,
"CODIGO_ROTA_ENTREGA"VARCHAR(20) CHARACTER SET WIN1252,
"DATA_CADASTRO"TIMESTAMP DEFAULT ´now´ NOT NULL,
CONSTRAINT "PK_CIDADE_CODIGO" PRIMARY KEY ("CODIGO")
);
ALTER TABLE "CIDADE" ADD CONSTRAINT "FK_CIDADE_CODESTADO" FOREIGN KEY ("CODIGO_ESTADO") REFERENCES ESTADO ("CODIGO");
ALTER TABLE "CIDADE" ADD CONSTRAINT "FK_CIDADE_CODREGIAO" FOREIGN KEY ("CODIGO_REGIAO") REFERENCES REGIAO ("CODIGO");
ALTER TABLE "CIDADE" ADD CONSTRAINT "FK_CIDADE_CODROTENT" FOREIGN KEY ("CODIGO_ROTA_ENTREGA") REFERENCES ROTA_ENTREGA ("CODIGO");



Martins
   - 07 fev 2006

#Código


procedure TPrincipal.Btn_CopiaClick(Sender: TObject);
begin
Tbl_Para.First;
Tbl_De.First;
while not Tbl_De.Eof do
begin
Limpa_Edit;
Edit_Codigo.Text := IntToStr(Tbl_DECODIGO.AsInteger);
Edit_Nome.Text := Tbl_DENOME.AsString;
Edit_CODUF.Text := IntToStr(Tbl_DECODIGO_ESTADO.AsInteger);
Edit_Data.Text := DateToStr(Tbl_DEDATA_CADASTRO.AsDateTime);

Tbl_Para.Insert;
Tbl_ParaCODIGO.AsInteger := StrToInt(Edit_Codigo.Text);
Tbl_ParaNOME.AsString := Edit_Nome.Text;
Tbl_ParaCODIGO_ESTADO.AsInteger := StrToInt(Edit_CODUF.Text);
Tbl_ParaDATA_CADASTRO.AsDateTime := StrToDateTime(Edit_Data.Text);
Tbl_Para.post;
Tbl_De.Next;
end;
Tbl_Para.ApplyUpdates;
ShowMessage(´transferencia realizada com sucesso!´);
end;



Mahdak
   - 07 fev 2006

martins, continua com o mesmo problema com esse código...
abraços


Martins
   - 07 fev 2006


Citação:
martins, continua com o mesmo problema com esse código...
abraços


Ok!

vou fazer um exemplo para teste!!!


Martins
   - 07 fev 2006

Antes criar um exemplo, tente dessa forma:

#Código


procedure TPrincipal.Btn_CopiaClick(Sender: TObject);
begin
Tbl_Para.First;
Tbl_De.First;
while not Tbl_De.Eof do
begin
Tbl_Para.Append;
Tbl_ParaCODIGO.AsInteger := Tbl_DECODIGO.AsInteger;
Tbl_ParaNOME.AsString := Tbl_DENOME.AsString;
Tbl_ParaCODIGO_ESTADO.AsInteger := Tbl_DECODIGO_ESTADO.AsInteger;
Tbl_ParaDATA_CADASTRO.AsDateTime := Tbl_DEDATA_CADASTRO.AsDateTime;
Tbl_Para.post;
Tbl_De.Next;
end;
ShowMessage(´transferencia realizada com sucesso!´);
end;


Se não der certo, então eu vou criar as tabelas com a mesma estrutura das suas e testar.


Aasn
   - 07 fev 2006

Caros colegas,

Este erro está relacionado a presença de caracteres especiais e/ou acentos. Corrigindo isso, desaparecem as mensagens de erro.

[]´s
AASN


Martins
   - 07 fev 2006


Citação:

´arithmetic exception, numeric overflow, or string truncation cannot transliterate character between character sets´



Citação:
Caros colegas,

Este erro está relacionado a presença de caracteres especiais e/ou acentos. Corrigindo isso, desaparecem as mensagens de erro.


Então mahdak, veja os seus caracteres acentuados!

Mas se as tabelas são identicas, e existem dados em uma delas..., eu hein... :?: :?


Mahdak
   - 07 fev 2006

puts, são 9.979 registros... nao tem algum outro jeito de fazer isso?? sei lá derrepente removendo os acentos antes da transferencia... ??
abraços


Mahdak
   - 07 fev 2006

bom, entao para remover os acentos fiz o seguinte:
- coloquei a função que quemove os acentos e varri a tabela editando (removendo) os acentos e depois tentei fazer a transferencia, mas deu um erro ao tentar remover (editando a tabela de origem ) os acentos..
ERRO: ´Not in Edit Mode´

- o que fazer???

#Código


procedure Limpa_Edit;
begin
Principal.Edit_Codigo.Clear;
Principal.Edit_Nome.Clear;
Principal.Edit_CODUF.Clear;
Principal.Edit_Data.Clear;
end;

function RemoveAcento(Str:String): String;
Const
ComAcento = ´àâêôûãõáéíóúçüÀÂÊÔÛÃÕÁÉÍÓÚÇÜ´;
SemAcento = ´aaeouaoaeioucuAAEOUAOAEIOUCU´;
Var
x : Integer;
Begin
For x := 1 to Length(Str) do
if Pos(Str[x],ComAcento)<>0 Then
Str[x] := SemAcento[Pos(Str[x],ComAcento)];
Result := Str;
end;



procedure TPrincipal.Btn_CopiaClick(Sender: TObject);
begin

// remove acentos da tabela de origem
Tbl_De.First;
while not Tbl_De.Eof do
begin
Limpa_Edit;
Edit_Codigo.Text := IntToStr(Tbl_DECODIGO.AsInteger);
Edit_Nome.Text := Tbl_DENOME.AsString;
Edit_CODUF.Text := IntToStr(Tbl_DECODIGO_ESTADO.AsInteger);
Edit_Data.Text := DateToStr(Tbl_DEDATA_CADASTRO.AsDateTime);
Edit_Nome.Text := RemoveAcento(edit_nome.Text);

Tbl_De.Open;
Tbl_De.Edit;
Tbl_ParaCODIGO.AsInteger := StrToInt(Edit_Codigo.Text);
Tbl_ParaNOME.AsString := Edit_Nome.Text;
Tbl_ParaCODIGO_ESTADO.AsInteger := StrToInt(Edit_CODUF.Text);
Tbl_ParaDATA_CADASTRO.AsDateTime := StrToDateTime(Edit_Data.Text);

Tbl_De.Next;
end;
Tbl_De.Post;
Tbl_De.ApplyUpdates;
ShowMessage(´Acentos removidos com sucesso!´);


// copia os dados da tabela de origem para a de destino
Tbl_Para.First;
Tbl_De.First;
while not Tbl_De.Eof do
begin
Limpa_Edit;
Edit_Codigo.Text := IntToStr(Tbl_DECODIGO.AsInteger);
Edit_Nome.Text := Tbl_DENOME.AsString;
Edit_CODUF.Text := IntToStr(Tbl_DECODIGO_ESTADO.AsInteger);
Edit_Data.Text := DateToStr(Tbl_DEDATA_CADASTRO.AsDateTime);

Tbl_Para.Insert;
Tbl_ParaCODIGO.AsInteger := StrToInt(Edit_Codigo.Text);
Tbl_ParaNOME.AsString := Edit_Nome.Text;
Tbl_ParaCODIGO_ESTADO.AsInteger := StrToInt(Edit_CODUF.Text);
Tbl_ParaDATA_CADASTRO.AsDateTime := StrToDateTime(Edit_Data.Text);

end;
Tbl_Para.post;
Tbl_Para.ApplyUpdates;
ShowMessage(´transferencia realizada com sucesso!´);
end;



Aasn
   - 07 fev 2006

Caro mahdak,

O erro está no comando para abertura do arquivo dentro do loop.

#Código

Tbl_De.Open; 
Tbl_De.Edit;


remova o comando Tbl_De.Open; e tente novamente.

[]´s
AASN


Thomaz_prg
   - 08 fev 2006

Antes de remover os acentos, tente assim:

#Código


procedure TPrincipal.Btn_CopiaClick(Sender: TObject);
begin
Tbl_Para.First;
Tbl_De.First;
while not Tbl_De.Eof do begin
Tbl_Para.Insert;
Tbl_ParaCODIGO.Value := Tbl_DECODIGO.Value;
Tbl_ParaNOME.Value := Tbl_DENOME.Value;
Tbl_ParaCODIGO_ESTADO.Value :=Tbl_DECODIGO_ESTADO.Value;
Tbl_ParaDATA_CADASTRO.Value := Tbl_DEDATA_CADASTRO.Value;
Tbl_Para.post;
Tbl_De.Next;
end;
Tbl_Para.ApplyUpdates;
ShowMessage(´transferencia realizada com sucesso!´);
end;