Tabela maluca...trazendo informação errada...
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
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
Curtidas 0
Respostas
Rjun
21/03/2006
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.
Números como CPF não devem ser tratados como inteiros. Acho que a maioria dos programadores definiem CPF/CGC como sendo strings.
GOSTEI 0
Martins
21/03/2006
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.
Não deveria ter nenhum mistério para fazer isso.
pseudo código.
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;
GOSTEI 0
Martins
21/03/2006
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.
GOSTEI 0
Cavalcanti.fabio
21/03/2006
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
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
GOSTEI 0
Rjun
21/03/2006
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.
GOSTEI 0
Cavalcanti.fabio
21/03/2006
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
valeu,
fabio
GOSTEI 0
Rjun
21/03/2006
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.
GOSTEI 0
Cavalcanti.fabio
21/03/2006
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
grato,
fabio
GOSTEI 0
Rjun
21/03/2006
[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:
você está fazendo uma conversão. Eu sugeri que você faça assim:
Aqui você também esta fazendo uma conversão:
Seria melhor você fazer isso:
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].
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].
GOSTEI 0
Cavalcanti.fabio
21/03/2006
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
Seria melhor você fazer isso:
Código:
vCPF := MDPrincipal.tbl_temp.FieldByname(´CIC____FU´).AsString;
grato,
fabio
GOSTEI 0
Martins
21/03/2006
Espero q agora tenha ficado mais claro para o colega, depois dos esclarecimentos do amigo [b:2017229fb0]Rjun[/b:2017229fb0].
Tente colocar mais ou menos como descrito acima.
e retorne aqui.
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.
GOSTEI 0
Cavalcanti.fabio
21/03/2006
Olá...valeu...deu certo...obrigado a todos que ajudaram...
abraço,
fabio cavalcanti
abraço,
fabio cavalcanti
GOSTEI 0
Martins
21/03/2006
Olá...valeu...deu certo...obrigado a todos que ajudaram...
abraço,
fabio cavalcanti
Blz :wink:
Valew pela participação [b:5e2976b877]Rjun[/b:5e2976b877]
GOSTEI 0