Fórum Tabela maluca...trazendo informação errada... #316907

21/03/2006

0

Olá colegas...estou já faz dois dias tentendo resolver este problema...tenho que importar via programação os cadastro de uma tabela em DBASE para uma em Paradox...e tenho um registro que possui uma campo CIC e ao importar ele me traz um outro valor totalmente sem logica...tipo assim 3880328822 e ele 148532544 e na tabela esta certo so que importar maluco...não existe nenhum valor com este numero...eis o meu codigo :

if MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger <> 0 then
begin
if Length(Trim(IntToStr(MDPrincipal.tbl_temp.FieldByname (´CIC____FU´).AsInteger))) < 11 then
begin
vCPF := StrZero(MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger,11);
MDPrincipal.tbl_temp1.FieldByname(´CIC____FU´).AsString := vCPF;
end
else
begin
(´CIC____FU´).AsInteger));
vCPF := IntToStr(MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger);
MDPrincipal.tbl_temp1.FieldByname(´CIC____FU´).AsString := vCPF;
end;
end;

ja fiz de tudo e nada...

valeu pela força.

fabio cavalcanti


Cavalcanti.fabio

Cavalcanti.fabio

Responder

Posts

21/03/2006

Rjun

Veja que um inteiro varia de [b:1457c1334c]-2147483648 a 2147483647[/b:1457c1334c]. Provavelmente quando você faz a conversão de string para inteiro com AsInteger, está estourando o limite do inteiro, retornando um número que não é o esperado.

Números como CPF não devem ser tratados como inteiros. Acho que a maioria dos programadores definiem CPF/CGC como sendo strings.


Responder

Gostei + 0

21/03/2006

Martins

vc poderia ter usado o datapump para fazer isso, mas já q resolveu fazer no código, tô achando meio complicado tudo isso, os campos são do mesmo tamanho?

vc poderia postar o código completo.

if MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger <> 0 then 
  begin 
     if Length(Trim(IntToStr(MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger))) < 11 then 
     begin 
        vCPF := StrZero(MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger,11); 
        MDPrincipal.tbl_temp1.FieldByname(´CIC____FU´).AsString := vCPF; 
     end 
   else 
     begin 
      (´CIC____FU´).AsInteger)); //De onde é essa linha?
       vCPF := IntToStr(MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger); 
       MDPrincipal.tbl_temp1.FieldByname(´CIC____FU´).AsString := vCPF; 
     end; 
end; 


Não deveria ter nenhum mistério para fazer isso.

pseudo código.


Tabela_A.First;
While not (Tabela_A.Eof) do
begin
   Tabela_B.Campo := Tabela_A.Campo;
  ....
  Tabela_A.next;
  ...
end;



Responder

Gostei + 0

21/03/2006

Martins

Veja que um inteiro varia de [b:123ac2f43c]-2147483648 a 2147483647[/b:123ac2f43c]. Provavelmente quando você faz a conversão de string para inteiro com AsInteger, está estourando o limite do inteiro, retornando um número que não é o esperado. Números como CPF não devem ser tratados como inteiros. Acho que a maioria dos programadores definiem CPF/CGC como sendo strings.


Ótima observação [b:123ac2f43c]Rjun[/b:123ac2f43c], eu uso String, e acredito q o colega poderia ter convertido sua tabela de Dbase para Paradox usando DataPump q vem com o Delphi.


Responder

Gostei + 0

21/03/2006

Cavalcanti.fabio

Olá...concordo que os cpf deveria ser string e tanto que estou importando transformando em string...na tabela em DBASE ele e Inteiro e na tabela Paradox ele e String com valor A 11.
o estranho e que no cadastro vamos dizer 6879 o cpf em inteiro e 38803207256 ou seja um valor inteiro com 11 e ao transformar em string ele esta me jogando este valor doido...

esta linha eu coloquei sem quere no poster ((´CIC____FU´).AsInteger)); //De onde é essa linha? ) pode desconsiderar

tem alguma outra forma de pegar este valor inteiro e transfromar em string sem que ele me retorno um estouro por exemplo.

grato.

fabio


Responder

Gostei + 0

21/03/2006

Rjun

Acho que em vez de vc fazer a conversão para integer (AsInteger) faça direto para string (AsString). Na comparação para saber se o valor é igual a zero, em vez de AsInteger utilize Value.


Responder

Gostei + 0

21/03/2006

Cavalcanti.fabio

olá martins...seria bom tratar a importação com datapump...so que tenho varios diretorios e na tabela paradox eu tenho alguns campos que não existe na DBASE...com isso tenho que fazer a importação na munheca mesmo...so esta dando erro no cpf que em dbase e inteiro e esta me trazendo um valor doido...mesmo antes de testar e transformar em string com 11 caracteres...estou fazendo um teste (showmessage) antes e o retorno e este numero maluco...ou seja antes de incluir na nova tabela o valor ja vem totalmente sem logica...ou seja vendo pelo database desktop o cpf em dbase esta lá so que ao busca via sistema ele se perde e retorna este valor maluco...estranho...

valeu,

fabio


Responder

Gostei + 0

21/03/2006

Rjun

Não sei se você prestou atenção no que escrevi, mas esse valor ´maluco´ é devido ao fato de o valor que você está tentando converter estar fora da faixa do tipo inteiro.


Responder

Gostei + 0

21/03/2006

Cavalcanti.fabio

Olá RJuan...acho que entendi ou não...na dbase o valor esta correto eu so quero pegar o valor do dbase (com o valor 38802365780) e converte em string utilizando o strzero(valor:integer;qtdzero:integer):String ou seja não trato o calor do cpf em dbase para conversão de tipo...so quero pegar e transformar em string...não estou entendendo como esta estourando a faixa do inteiro.

grato,

fabio


Responder

Gostei + 0

21/03/2006

Rjun

[b:b8f77151d3] RJUN amigo, RJUN[/b:b8f77151d3]

Vamos lá:

Se eu estiver errado, alguem me corrija.

No DBASE você define um tipo com numérico, e não inteiro. Você define o tamanho e o número de casas decimais. Se você quer representar um inteiro define o numero de casas decimais como sendo 0. Por isso o número 38802365780 é suportado no DBASE.

Nessa linha:
MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger <> 0


você está fazendo uma conversão. Eu sugeri que você faça assim:
MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).Value <> 0


Aqui você também esta fazendo uma conversão:
vCPF := IntToStr(MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsInteger); 


Seria melhor você fazer isso:
vCPF := MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsString; 


Quando você usa AsInteger, o Delphi vai converter o valor para um inteiro. O número [b:b8f77151d3]38802365780[/b:b8f77151d3] está fora da faixa de inteiros que é [b:b8f77151d3]-2147483648 a 2147483647[/b:b8f77151d3].


Responder

Gostei + 0

21/03/2006

Cavalcanti.fabio

Olá RJuan...ao fazer fazer como vc postou dar o seguinte erro : Incompatible type : ´Integer´ and ´String´ ou seja na tabela dbase esta como numerico...então não posso passar direto para :

Seria melhor você fazer isso:
Código:

vCPF := MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsString;


grato,

fabio


Responder

Gostei + 0

21/03/2006

Martins

Espero q agora tenha ficado mais claro para o colega, depois dos esclarecimentos do amigo [b:2017229fb0]Rjun[/b:2017229fb0].

var
 vCPF :Variant;
begin
 ...

   vCPF := MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).Value;
   MDPrincipal.tbl_temp1.FieldByname(´CIC____FU´).AsString := vCPF; 
...


Tente colocar mais ou menos como descrito acima.

e retorne aqui.


Responder

Gostei + 0

22/03/2006

Cavalcanti.fabio

Olá...valeu...deu certo...obrigado a todos que ajudaram...

abraço,

fabio cavalcanti


Responder

Gostei + 0

22/03/2006

Martins

Olá...valeu...deu certo...obrigado a todos que ajudaram... abraço, fabio cavalcanti


Blz :wink:

Valew pela participação [b:5e2976b877]Rjun[/b:5e2976b877]


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar