Erro SP de inserir. Is not a valid BCD value.

Delphi

01/08/2007

Estou com essa SP:
dm.SP_MATERIAL_I_U.Close;
dm.SP_MATERIAL_I_U.Params[1].AsString:=cod.Text;
dm.SP_MATERIAL_I_U.Params[2].AsString:=descricao.Text;
dm.SP_MATERIAL_I_U.Params[3].AsString:=un.Text;
dm.SP_MATERIAL_I_U.Params[4].AsString:=unitario.Text;
dm.SP_MATERIAL_I_U.Params[5].AsString:=tipo.Text;
dm.SP_MATERIAL_I_U.ExecProc;
-------------------------------------------------------------------------
Quando vou gravar gravar da esse erro na linha ´ExecProc´.
O que pode ser?

Erro completo:
---------------------------
Debugger Exception Notification
---------------------------
Project MATERIAIS.exe raised exception class EBcdException with message ´2,>303000000030000000>04<;100020000000100000041 is not a valid BCD value´.
---------------------------
Break Continue Help
---------------------------

Tem um campo que é de valor, lá no banco coloquei como DOUBLE PRECISION.

Alguem tem ideia de como resolver? Estou iniciando agora a fazer inserção/atualização por SP.

FireBird 2.0
DBExpress


Jpauloss

Jpauloss

Curtidas 0

Respostas

Fabiano Góes

Fabiano Góes

01/08/2007

Bom,
não sou nenhum expert em DBExpress mais ...

os parametros de entrada da SP são todos do tipo string mesmo ?

tente para os parametros tipo integer usar:
Params[0].AsInteger := StrToInt(cod.Text);


pada o parametro do tipo valor como você mencionou tente:
Params[4].Value := Edit.Text;

ou
Params[4].Value := StrToFloat( Edit.Text);


espero ter ajudado !!!


GOSTEI 0
Claudio_f

Claudio_f

01/08/2007

Bom dia JPauloss!

tive esse problema com DBExpress e Oracle e resolvi da seguinte forma, ve te ajuda.

var
    bC       : TBCD;
    xPreco : string;
.
.
.
    bC     := StrToBCD(unitario.Text);
    xPreco := BCDToStrf(bC,ffFixed,11,2);
.
.
.
dm.SP_MATERIAL_I_U.Params[4].AsString:=xPreco; //unitario.Text;



GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

Bom dia JPauloss! tive esse problema com DBExpress e Oracle e resolvi da seguinte forma, ve te ajuda.
var
    bC       : TBCD;
    xPreco : string;
.
.
.
    bC     := StrToBCD(unitario.Text);
    xPreco := BCDToStrf(bC,ffFixed,11,2);
.
.
.
dm.SP_MATERIAL_I_U.Params[4].AsString:=xPreco; //unitario.Text;


Esse BCD da dando:
[Pascal Error] U_MATERIAIS.pas(53): E2003 Undeclared identifier: ´TBCD´
Que faço?


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

[quote:a2440436e3=´Claudio_F´]Bom dia JPauloss! tive esse problema com DBExpress e Oracle e resolvi da seguinte forma, ve te ajuda.
var
    bC       : TBCD;
    xPreco : string;
.
.
.
    bC     := StrToBCD(unitario.Text);
    xPreco := BCDToStrf(bC,ffFixed,11,2);
.
.
.
dm.SP_MATERIAL_I_U.Params[4].AsString:=xPreco; //unitario.Text;


Esse BCD da dando:
[Pascal Error] U_MATERIAIS.pas(53): E2003 Undeclared identifier: ´TBCD´
Que faço?[/quote:a2440436e3]


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

dm.SP_MATERIAL_I_U.Close;
dm.SP_MATERIAL_I_U.Params[1].AsString:=cod.Text;
dm.SP_MATERIAL_I_U.Params[2].AsString:=descricao.Text;
dm.SP_MATERIAL_I_U.Params[3].AsString:=un.Text;
dm.SP_MATERIAL_I_U.Params[4].AsFloat:=StrToFloat(unitario.Text);
dm.SP_MATERIAL_I_U.Params[5].AsString:=tipo.Text;
dm.SP_MATERIAL_I_U.ExecProc;


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

[quote:d38790c082=´jpauloss´][quote:d38790c082=´Claudio_F´]Bom dia JPauloss! tive esse problema com DBExpress e Oracle e resolvi da seguinte forma, ve te ajuda.
var
    bC       : TBCD;
    xPreco : string;
.
.
.
    bC     := StrToBCD(unitario.Text);
    xPreco := BCDToStrf(bC,ffFixed,11,2);
.
.
.
dm.SP_MATERIAL_I_U.Params[4].AsString:=xPreco; //unitario.Text;


Esse BCD da dando:
[Pascal Error] U_MATERIAIS.pas(53): E2003 Undeclared identifier: ´TBCD´
Que faço?[/quote:d38790c082][/quote:d38790c082]

**Isso já descobri. Tem que declarar na USES: FMTBcd**

Estou com outro probleminha. Quando vou gravar esta dando OverFlow.

---------------------------
Debugger Exception Notification
---------------------------
Project MATERIAIS.exe raised exception class EBcdOverflowException with message ´BCD overflow´.
---------------------------
Break Continue Help
---------------------------

Já tentei várias coisas. Que faço?
O campo unitário que está como BCD, lá no banco está como float.


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

sobe


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

Meu código está desse jeito:

************************************************

procedure TF_MATERIAIS.salvarClick(Sender: TObject);
Var
bC : TBCD;
v_unitario: String; //**Encontrei informações sobreo o BCD no HELP.**//

begin
//********* Inicio da complicação ***************//
bC := StrToBCD(unitario.Text);
v_unitario:=BcdToStrF(bC, ffFixed, 11,2);
//********* Final da complicação ****************//
dm.SP_MATERIAL_I_U.Close;
dm.SP_MATERIAL_I_U.Params[1].Value:=(cod.Text);
dm.SP_MATERIAL_I_U.Params[2].AsString:=descricao.Text;
dm.SP_MATERIAL_I_U.Params[3].AsString:=un.Text;
dm.SP_MATERIAL_I_U.Params[4].AsFloat:=StrToFloat(v_unitario);
dm.SP_MATERIAL_I_U.Params[5].AsString:=tipo.Text;
dm.SP_MATERIAL_I_U.ExecProc;
end;

*******************************************************

Já fiz o debug, e o erro na na Execução da SP.
Já fui no help do delphi e diz isso:


*********************************************************
EBcdOverflowException is raised when

A call to VarFMTBcdCreate tries to create a BCD value with a precision and number of decimals that can´t be supported.
An application tries to cast a Variant to a BCD value but it can´t be expressed using the default precision and number of decimals.
*********************************************************


Alguem tem idéia de como resolver?


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

sobe


GOSTEI 0
Claudio_f

Claudio_f

01/08/2007

Bom dia!

dm.SP_MATERIAL_I_U.Params[4].AsFloat:=StrToFloat(v_unitario);

eu gravo no banco como string.
dm.SP_MATERIAL_I_U.Params[4].AsString:= v_unitario;




GOSTEI 0
Martins

Martins

01/08/2007

Coloque a estrutura de sua tabela para vermos por favor.

Obrigado.


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

Coloque a estrutura de sua tabela para vermos por favor. Obrigado.


/******************************************************************************/
/**** Generated by IBExpert 6/8/2007 22:00:54 ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;



/******************************************************************************/
/**** Tables ****/
/******************************************************************************/


CREATE GENERATOR SEQ_PROJETO_ID;

CREATE TABLE PROJETO (
ID_PROJETO INTEGER NOT NULL,
NOME_PROJETO VARCHAR(70),
DATA_REGISTRO VARCHAR(15)
);




/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/

ALTER TABLE PROJETO ADD CONSTRAINT PK_PROJETO PRIMARY KEY (ID_PROJETO);


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

Desculpa a tabela certa vai aí:

/******************************************************************************/
/**** Generated by IBExpert 6/8/2007 22:15:21 ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES ISO8859_1;



/******************************************************************************/
/**** Tables ****/
/******************************************************************************/


CREATE GENERATOR SEQ_MATERIAL_ID;

CREATE TABLE MATERIAL (
ID_COD INTEGER NOT NULL,
COD_ORDENADO VARCHAR(20),
DESCRICAO VARCHAR(70) COLLATE PT_BR,
UN VARCHAR(2),
PRECO_UNITARIO FLOAT,
TIPO_CONTA VARCHAR(1)
);




/******************************************************************************/
/**** Primary Keys ****/
/******************************************************************************/

ALTER TABLE MATERIAL ADD CONSTRAINT PK_MATERIAL PRIMARY KEY (COD_ORDENADO, ID_COD);


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

o que exatamente foi digitado em unitario.Text?


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

o que exatamente foi digitado em unitario.Text?


O valor do produto em questão.


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

o que exatamente foi digitado em unitario.Text?


O preço do produto em questão.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

o que exatamente foi digitado em unitario.Text?


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

o que exatamente foi digitado em unitario.Text?


100,00


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/08/2007

[size=18:4dba4f8101]uma coisa: a lista de parâmetros não é iniciada em 0 (zero)?[/size:4dba4f8101]

dm.SP_MATERIAL_I_U.Close;
dm.SP_MATERIAL_I_U.Params[[b:4dba4f8101]0[/b:4dba4f8101]].AsString:=cod.Text;
dm.SP_MATERIAL_I_U.Params[[b:4dba4f8101]1[/b:4dba4f8101]].AsString:=descricao.Text;
dm.SP_MATERIAL_I_U.Params[[b:4dba4f8101]2[/b:4dba4f8101]].AsString:=un.Text;
dm.SP_MATERIAL_I_U.Params[[b:4dba4f8101]3[/b:4dba4f8101]].AsFloat:=StrToFloat(unitario.Text);
dm.SP_MATERIAL_I_U.Params[[b:4dba4f8101]4[/b:4dba4f8101]].AsString:=tipo.Text;
dm.SP_MATERIAL_I_U.ExecProc;

outra coisa: se ainda assim não der certo, troque a vírgula por ponto, pra ver o que acontece.


GOSTEI 0
Jpauloss

Jpauloss

01/08/2007

[size=18:e76c66373d]uma coisa: a lista de parâmetros não é iniciada em 0 (zero)?[/size:e76c66373d] dm.SP_MATERIAL_I_U.Close; dm.SP_MATERIAL_I_U.Params[[b:e76c66373d]0[/b:e76c66373d]].AsString:=cod.Text; dm.SP_MATERIAL_I_U.Params[[b:e76c66373d]1[/b:e76c66373d]].AsString:=descricao.Text; dm.SP_MATERIAL_I_U.Params[[b:e76c66373d]2[/b:e76c66373d]].AsString:=un.Text; dm.SP_MATERIAL_I_U.Params[[b:e76c66373d]3[/b:e76c66373d]].AsFloat:=StrToFloat(unitario.Text); dm.SP_MATERIAL_I_U.Params[[b:e76c66373d]4[/b:e76c66373d]].AsString:=tipo.Text; dm.SP_MATERIAL_I_U.ExecProc; outra coisa: se ainda assim não der certo, troque a vírgula por ponto, pra ver o que acontece.


O parametro [0] é um id_cod que esta como auto-incremente.


GOSTEI 0
POSTAR