Fórum Error type mismatch for field ´codigo´, expect...FMTCcdfield #374355

31/08/2009

0

ai galera meu codigo está dando o seguinte error!
erro type mismatch for field ´codigo´, expecting: integer actual: FMTCcdField

Alguem poderia me ajudar? O codigo é esse:

begin
dm.cdsfunc.Close;
dm.cdsfunc.CommandText:=´select GEN_ID(GEN_FUNCIONARIOS_ID, 1) as CODIGO FROM RDB$DATABASE´;
dm.cdsfunc.Open;
editcod.text := IntToStr(dm.cdsfunc.FieldByName(´CODIGO´).AsInteger);

end

esperam q entendam!vlw


Thiagoangra2

Thiagoangra2

Responder

Posts

31/08/2009

Andcarpi

Provavelmente seu campo no banco de dados está definido como bcdfield, que é binary-code decimal.

Tente ir no banco, com algum manager do seu banco, recriar o campo em integer, e ai sim, vai dar certo.


Responder

Gostei + 0

31/08/2009

Rweberich

Ola Tiago,

begin dm.cdsfunc.Close; dm.cdsfunc.CommandText:=´select GEN_ID(GEN_FUNCIONARIOS_ID, 1) as CODIGO FROM RDB$DATABASE´; dm.cdsfunc.Open; editcod.text := IntToStr(dm.cdsfunc.FieldByName(´CODIGO´).AsInteger); end


Faz o seguinte:

begin
dm.cdsfunc.Close;
dm.cdsfunc.CommandText:=´select GEN_ID(GEN_FUNCIONARIOS_ID, 1) as CODIGO FROM RDB$DATABASE´;
dm.cdsfunc.Open;
editcod.text := (dm.cdsfunc.FieldByName(´CODIGO´).value);

end


Responder

Gostei + 0

31/08/2009

Thiagoangra2

Ola Tiago, [quote:f5a6616622=´thiagoangra2´] begin dm.cdsfunc.Close; dm.cdsfunc.CommandText:=´select GEN_ID(GEN_FUNCIONARIOS_ID, 1) as CODIGO FROM RDB$DATABASE´; dm.cdsfunc.Open; editcod.text := IntToStr(dm.cdsfunc.FieldByName(´CODIGO´).AsInteger); end


Faz o seguinte:

begin
dm.cdsfunc.Close;
dm.cdsfunc.CommandText:=´select GEN_ID(GEN_FUNCIONARIOS_ID, 1) as CODIGO FROM RDB$DATABASE´;
dm.cdsfunc.Open;
editcod.text := (dm.cdsfunc.FieldByName(´CODIGO´).value);

end[/quote:f5a6616622]


amigao, deu certo nau! continuo dando o msm error! nau faço ideia de como resolver isso!


Responder

Gostei + 0

31/08/2009

Thiagoangra2

Provavelmente seu campo no banco de dados está definido como bcdfield, que é binary-code decimal. Tente ir no banco, com algum manager do seu banco, recriar o campo em integer, e ai sim, vai dar certo.



deu uma olhada no meu firebird(ibexpert) e o campo codigo está sim como integer! é pra mudar em algum lugar especifico? vlw


Responder

Gostei + 0

31/08/2009

Andcarpi

estava olhando sobre isso, tente algo como:

´select cast(GEN_ID(GEN_FUNCIONARIOS_ID, 1) as integer) as CODIGO FROM RDB$DATABASE´; 


meio no chute essa solucao, mas sei lá né, achei no forum mesmo essa resposta.[/code]


Responder

Gostei + 0

31/08/2009

Thiagoangra2

estava olhando sobre isso, tente algo como:
´select cast(GEN_ID(GEN_FUNCIONARIOS_ID, 1) as integer) as CODIGO FROM RDB$DATABASE´; 
meio no chute essa solucao, mas sei lá né, achei no forum mesmo essa resposta.[/code]


é rapaz deu certo nau!


Responder

Gostei + 0

31/08/2009

Andcarpi

solucao 2 q eu achei:

Por Rômulo Barros.
Amigo... passei por isso e "quase morri do coração" com esse problema. Isto aconteceu comigo quando eu estava migrando um sistema feito em ADO com Oracle e eu estava o covertendo para DBEXPRESS com Oracle. Finalmente, consegui resolver o problema. É o seguinte:

O delphi apenas aceita valores numéricos com, no máximo, 15 posicoes: Exemplo: (183493657589087). Então, sempre que um determinado campo resultante de uma consulta retorna um valor numérico maior do que 15 posições, ocorre o erro.

Para resolver, eu identifiquei o campo que trazia mais de 15 posições e resolvi com a seguinte instrução SQL:

Código:
SELECT SUBSTR(CAMPO,0,15)FROM TABELA


O método SUBSTR é específico do Oracle. Verfique qual o método equivalente para o SGBD q vc utiliza.


Tenta ae :P

Mas bom, mais que isso, nao sei... :/

Entao, que eu nao manjo de firebird, mas pelo visto, a sua funcao ´GEN_ID()´ está retornando valores neste tipo, imaginei que o cast pudesse redefinir o tipo do campo, se vc souber alguma funcao que faca isso no firebird, tenta ae, deve resolver também.


Responder

Gostei + 0

01/09/2009

Osocram

Olha o melhor a se falar é abrir seu DataSet, se vc usar o Triad SqlConnection+SQLQuery+DataSetProvider então delete do fieldList da SqlQuery este campo e delete do ClientDataSet tbm. e puxe novamente eles p o FieldList.

Veja se ele esta vindo c o tipo certo.

==================================
Eu ja tive esse prob. varias vezes, pois o delphi tenta entender qual o tipo de dados, e as vezes ele muda de ideia. Se não me engano tipo numeric até não sei qtos numeros o delphi considera sendo apenas Bcd, e apartir dae ele usa o FmtBcd.

O que vc pode fazer para evitar de ficar acontecendo esse prob é mudar uma configuração no caso do SqlQuery.NumericMapping = true; o default dele é false. Mudando isso para true vai fazer com que o delphi não fique tentando adivinhar sempre o tipo dos campos.

So tem um pequeno porem se vc ja tem os campos no FieldList, todos que são bcd vai dar erro e vc vai ter que tirar todos eles da memoria e adicionar de novo.


Responder

Gostei + 0

01/09/2009

Thiagoangra2

Olha o melhor a se falar é abrir seu DataSet, se vc usar o Triad SqlConnection+SQLQuery+DataSetProvider então delete do fieldList da SqlQuery este campo e delete do ClientDataSet tbm. e puxe novamente eles p o FieldList. Veja se ele esta vindo c o tipo certo. ================================== Eu ja tive esse prob. varias vezes, pois o delphi tenta entender qual o tipo de dados, e as vezes ele muda de ideia. Se não me engano tipo numeric até não sei qtos numeros o delphi considera sendo apenas Bcd, e apartir dae ele usa o FmtBcd. O que vc pode fazer para evitar de ficar acontecendo esse prob é mudar uma configuração no caso do SqlQuery.NumericMapping = true; o default dele é false. Mudando isso para true vai fazer com que o delphi não fique tentando adivinhar sempre o tipo dos campos. So tem um pequeno porem se vc ja tem os campos no FieldList, todos que são bcd vai dar erro e vc vai ter que tirar todos eles da memoria e adicionar de novo.



amigo, pelo que intendi é remover os campos da query e do dataset e adiciona-los novamente certo? se for isso ja fiz! e continua do msm jeito dando o msm error! Oo


Responder

Gostei + 0

01/09/2009

Osocram

remove os campos...

mudar isso aqui
SqlQuery.NumericMapping = true;

ativa o SqlQuery
depois puxa os fields novamente.


Responder

Gostei + 0

01/09/2009

Thiagoangra2

remove os campos... mudar isso aqui SqlQuery.NumericMapping = true; ativa o SqlQuery depois puxa os fields novamente.


Poxa infelizmente nau funfo, q raio de erro deve ser esse hein!
vlw pelas dicas!
abraços


Responder

Gostei + 0

16/09/2009

Thiagoangra2

[quote:99be7a23ec=´osocram´]remove os campos... mudar isso aqui SqlQuery.NumericMapping = true; ativa o SqlQuery depois puxa os fields novamente.


Poxa infelizmente nau funfo, q raio de erro deve ser esse hein!
vlw pelas dicas!
abraços[/quote:99be7a23ec]

depois de quebrar cabeça consegui! :wink:
vlw pela força


Responder

Gostei + 0

16/09/2009

Fabriciocolombo

Qual foi a solução encontrada?


Responder

Gostei + 0

17/09/2009

Thiagoangra2

Qual foi a solução encontrada?



procedure Tfrmcadfun.BitBtn1Click(Sender: TObject);

begin
messagebox(frmcadfun.Handle,´Deseja novo registro?´,´Atenção´, mb_YesNo+mb_iconinformation);
if messagebox(frmcadfun.handle,´Deseja novo registro?´,´Atenção´, mb_YesNo+mb_iconinformation) =(mryes) then
begin
dm.cdsfunc.Append;
editcod.Text:=inttostr(retornachave(´GEN_FUNCIONARIOS_ID´, 1));
editnome.SetFocus;
end
else
if messagebox(frmcadfun.Handle,´Deseja novo registro?´,´Atenção´, mb_YesNo+mb_iconinformation)=(mrno) then
begin
editnome.SetFocus;
end;
end;

ta aí...


Responder

Gostei + 0

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

Aceitar