Error type mismatch for field ´codigo´, expect...FMTCcdfield

Delphi

31/08/2009

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

Curtidas 0

Respostas

Andcarpi

Andcarpi

31/08/2009

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.


GOSTEI 0
Rweberich

Rweberich

31/08/2009

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


GOSTEI 0
Thiagoangra2

Thiagoangra2

31/08/2009

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!


GOSTEI 0
Thiagoangra2

Thiagoangra2

31/08/2009

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


GOSTEI 0
Andcarpi

Andcarpi

31/08/2009

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]


GOSTEI 0
Thiagoangra2

Thiagoangra2

31/08/2009

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!


GOSTEI 0
Andcarpi

Andcarpi

31/08/2009

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.


GOSTEI 0
Osocram

Osocram

31/08/2009

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.


GOSTEI 0
Thiagoangra2

Thiagoangra2

31/08/2009

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


GOSTEI 0
Osocram

Osocram

31/08/2009

remove os campos...

mudar isso aqui
SqlQuery.NumericMapping = true;

ativa o SqlQuery
depois puxa os fields novamente.


GOSTEI 0
Thiagoangra2

Thiagoangra2

31/08/2009

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


GOSTEI 0
Thiagoangra2

Thiagoangra2

31/08/2009

[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


GOSTEI 0
Fabriciocolombo

Fabriciocolombo

31/08/2009

Qual foi a solução encontrada?


GOSTEI 0
Thiagoangra2

Thiagoangra2

31/08/2009

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í...


GOSTEI 0
POSTAR