Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Leo Barreto

Erro "expecting: Integer actual: Float" em Oracle

Recommended Posts

Tenho um sistema em Delphi 7 que ao carregar uma tela gera o erro abaixo.

 

---------------------------

Mister Way - Versão 9.0.2

---------------------------

qry_ListaEquipes: Type mismatch for field 'EMPRE_CODIGO', expecting: Integer actual: Float

---------------------------

OK

---------------------------

 

O erro é gerado tanto em Oracle quanto em SQL Server.

O que acontece: Se removo os campos e insiro novamente na query, para Oracle, dá o erro no SQL.

Se removo e insiro novamente, para SQL Server, gera o erro no Oracle.

Porém, o erro acontece somente nesta query, nesta tela. O sistema tem outras queries para Oracle/SQL e não acontece o erro.

 

Segue o código onde o erro acontece:

 

qry_ListaEquipes.Close;
 qry_ListaEquipes.SQL.Clear;
 qry_ListaEquipes.SQL.Add('SELECT CAST(EMPRE_CODIGO AS NUMBER(9)) EMPRE_CODIGO, CAST(EQUIP_CODIGO AS NUMBER(9)) EQUIP_CODIGO, EQUIP_DESCRICAO');
 qry_ListaEquipes.SQL.Add('FROM CALLCENTER_EQUIPE');
 qry_ListaEquipes.SQL.Add('WHERE EMPRE_CODIGO = :EMPRE_CODIGO');
 qry_ListaEquipes.SQL.Add('UNION');

 if (UpperCase(dbs_Base.DriverName) = 'ORACLE') then
   qry_ListaEquipes.SQL.Add('SELECT CAST(0 AS NUMBER(9)) EMPRE_CODIGO, CAST(0 AS NUMBER(9)) EQUIP_CODIGO, ' + QuotedStr('SEM EQUIPE') + ' EQUIP_DESCRICAO FROM DUAL')
 else
 begin
   qry_ListaEquipes.SQL.Add('SELECT :EMPRE_CODIGO EMPRE_CODIGO, 0 EQUIP_CODIGO, ' + QuotedStr('SEM EQUIPE') + ' EQUIP_DESCRICAO');

 end;

 qry_ListaEquipes.Open;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço SQL Server nem Oracle. Mas acho que a própria mensagem de erro que você proveu já poderia ajudar:

 

Type mismatch for field 'EMPRE_CODIGO', expecting: Integer actual: Float

 

Incompatibilidade de tipos para o campo 'EMPRE_CODIGO', esperado: Integer, atual: Float

 

Acredito que você está fornecendo um float quando deveria ser um integer. Dê uma revisada na consulta, aquele "AS NUMBER" dentro daquele CAST não retorna um float?

 

O ideal era que esse tópico estivesse na área de SQL Server ou Oracle, já que o erro é provável da consulta, e não da linguagem. Se não resolver, peça para um moderador mover o tópico. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço SQL Server nem Oracle. Mas acho que a própria mensagem de erro que você proveu já poderia ajudar:

 

 

 

Incompatibilidade de tipos para o campo 'EMPRE_CODIGO', esperado: Integer, atual: Float

 

Acredito que você está fornecendo um float quando deveria ser um integer. Dê uma revisada na consulta, aquele "AS NUMBER" dentro daquele CAST não retorna um float?

 

O ideal era que esse tópico estivesse na área de SQL Server ou Oracle, já que o erro é provável da consulta, e não da linguagem. Se não resolver, peça para um moderador mover o tópico. :)

 

FK.

Você, provavelmente, não entendeu o que acontece.

Quando eu removo os campos e insiro novamente - apontando para o banco em Oracle - o problema se resolve para banco Oracle e assim com o SQL Server. Porém temos clientes que usam Oracle e clientes que usam SQL Server.

Não podemos fazer duas versões distintas, já que outras telas de nosso sistema não gera este tipo de erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que entendi sim cara. Você disse que só aparece o erro nesta tela onde você está tentando substituir os campos para que fiquem de acordo com um banco ou outro, não é?

Porém eu disse que não conheço SQL Server e Oracle.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tranforma o campo FLOAT em DECIMAL dentro do select

 

CAST(campo as DECIMAL(15,2)) as campo_novo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tranforma o campo FLOAT em DECIMAL dentro do select

 

CAST(campo as DECIMAL(15,2)) as campo_novo

 

DannyND,

 

Fiz o teste e o erro persistiu. E o campo na tabela, no ORACLE, é NUMBER(9) e no SQL é INTEGER.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai está o seu problema Leo... em um banco é inteiro, no outro é numérico.... não há como os dois funcionarem do mesmo modo, a menos que sua select traga o campo retornando sempre inteiro ou sempre numérico, independente do banco.... ai entra a questão de como você está alimentando seu componente também, se nele o campo "EMPRE_CODIGO" for declarado como inteiro, então sua consulta obrigatoriamente sempre terá que retorná-lo como inteiro ou dará o erro citado.

 

Vendo o erro e vendo seu código SQL, me parece que o campo está sendo adicionado a sua query como tipo integer e a sua consulta está o retornando como float. O ideal seria normalizar suas tabelas de modo que tanto no SQL Server quanto no Oracle o campo fosse do mesmo tipo, porque senão poderá ter problemas na hora de gravar os dados (em um terá que mandar um inteiro, em outro um float).

 

Dê uma pensada nisso.... ou monte sua query dinâmica criando um if baseado no banco para capturar o dado corretamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.