transferencia de dados

07/02/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:
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´
----------------
/* 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´:
--------------
/* 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");



Mahdak

Respostas

07/02/2006

Martins

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; 



Responder Citar

07/02/2006

Mahdak

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


Responder Citar

07/02/2006

Martins

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


Ok!

vou fazer um exemplo para teste!!!


Responder Citar

07/02/2006

Martins

Antes criar um exemplo, tente dessa forma:

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.


Responder Citar

07/02/2006

Aasn

Caros colegas,

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

[]´s
AASN


Responder Citar

07/02/2006

Martins

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


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


Então [b:bf82c21142]mahdak[/b:bf82c21142], veja os seus caracteres acentuados!

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


Responder Citar

07/02/2006

Mahdak

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


Responder Citar

07/02/2006

Mahdak

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???

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&93;,ComAcento)<>0 Then
Str&91;x&93; := SemAcento&91;Pos(Str&91;x&93;,ComAcento)&93;;
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;



Responder Citar

07/02/2006

Aasn

Caro mahdak,

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

Tbl_De.Open; 
Tbl_De.Edit; 


remova o comando [b:e1d7bcb0b9]Tbl_De.Open;[/b:e1d7bcb0b9] e tente novamente.

[]´s
AASN


Responder Citar

08/02/2006

Thomaz_prg

Antes de remover os acentos, tente assim:

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; 



Responder Citar