Array
(
)

QueryFluxo: Type mismatch for field ´VALOR´, expecting: FMTB

Marcoskblo
   - 20 jan 2006

Prezados amigos,
Estou com um problema, utilizo o FIREBIRD 1.5.3 e o IBOConsole para gerar script, criei um banco assim: (exemplo de um livro) porem quando executo da o seguinte erro: QueryFluxo: Type mismatch for field ´VALOR´, expecting: FMTBcdField actual: BCD. Utilizo DELPHI 6

/******************************************************************************/
/**** Generated by IBExpert 2.5.0.38 10/5/2003 22:29:43 ****/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1252;

CREATE DATABASE ´c:\ClubeDelphi\caixa.gdb´
USER ´SYSDBA´ PASSWORD ´masterkey´
PAGE_SIZE 4096
DEFAULT CHARACTER SET WIN1252;



/******************************************************************************/
/**** Generators ****/
/******************************************************************************/

CREATE GENERATOR GEN_APAGAR_ID;
CREATE GENERATOR GEN_ARECEBER_ID;


/******************************************************************************/
/**** Exceptions ****/
/******************************************************************************/

CREATE EXCEPTION EXP_NEGATIVO ´O expoente não pode ser negativo !´;



SET TERM ^ ;



/******************************************************************************/
/**** Stored Procedures ****/
/******************************************************************************/

CREATE PROCEDURE CAIXA (
INICIO DATE,
FIM DATE)
RETURNS (
DATA DATE,
HISTORICO VARCHAR(30),
VALOR NUMERIC(9,2),
TIPO CHAR(1))
AS
BEGIN
EXIT;
END^


CREATE PROCEDURE POWER (
NUMERO NUMERIC(9,2),
EXPOENTE INTEGER)
RETURNS (
RESULTADO NUMERIC(15,2))
AS
BEGIN
EXIT;
END^



SET TERM ; ^


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

CREATE TABLE APAGAR (
ID INTEGER NOT NULL,
DATA DATE DEFAULT CURRENT_DATE NOT NULL,
HISTORICO VARCHAR(30),
VALOR NUMERIC(9,2) DEFAULT 0.00 NOT NULL
);


CREATE TABLE ARECEBER (
ID INTEGER NOT NULL,
DATA DATE DEFAULT CURRENT_DATE NOT NULL,
HISTORICO VARCHAR(30),
VALOR NUMERIC(9,2) DEFAULT 0.00 NOT NULL
);





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

ALTER TABLE APAGAR ADD CONSTRAINT FK_APAGAR PRIMARY KEY (ID);
ALTER TABLE ARECEBER ADD CONSTRAINT FK_ARECEBER PRIMARY KEY (ID);


/******************************************************************************/
/**** Indices ****/
/******************************************************************************/

CREATE INDEX APAGAR_DATA ON APAGAR (DATA);
CREATE INDEX ARECEBER_DATA ON ARECEBER (DATA);


/******************************************************************************/
/**** Triggers ****/
/******************************************************************************/


SET TERM ^ ;




/* Trigger: APAGAR_BI_BI */
CREATE TRIGGER APAGAR_BI_BI FOR APAGAR
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_APAGAR_ID,1);
END
^

/* Trigger: ARECEBER_BI_BI */
CREATE TRIGGER ARECEBER_BI_BI FOR ARECEBER
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_ARECEBER_ID,1);
END
^


SET TERM ; ^


/******************************************************************************/
/**** Stored Procedures ****/
/******************************************************************************/


SET TERM ^ ;

ALTER PROCEDURE CAIXA (
INICIO DATE,
FIM DATE)
RETURNS (
DATA DATE,
HISTORICO VARCHAR(30),
VALOR NUMERIC(9,2),
TIPO CHAR(1))
AS
DECLARE VARIABLE SALDO_ANT_CREDITO NUMERIC(9,2);
DECLARE VARIABLE SALDO_ANT_DEBITO NUMERIC(9,2);
DECLARE VARIABLE SALDO_FINAL NUMERIC(9,2);
begin

/* Primeiro recuperamos a soma dos valores dos debitos anteriores ao
periodo informado para posteriormente calcularmos nosso saldo inicial */

select sum(ap.valor)
from apagar ap
where (ap.data < :inicio)
into :saldo_ant_debito;

/* Agora recuperamos a soma dos valores dos creditos anteriores ao
periodo informado */

select sum(ar.valor)
from areceber ar
where (ar.data < :inicio)
into :saldo_ant_credito;

/* Caso não haja lancamentos anteriores, a variavel ficara no estado NULL,
como no SQL qualquer operação matemática feita com valores NULL sempre
resulta em NULL, temos que verificar isso e atribuir 0.00 na variavel nula
para que forneça o resultado esperado */

if (:saldo_ant_credito is null) then saldo_ant_credito = 0.00;
if (:saldo_ant_debito is null) then saldo_ant_debito = 0.00;

data = :inicio - 1;
historico = ´SALDO ANTERIOR´;
valor = (saldo_ant_credito - saldo_ant_debito);

/* Inicializando a variavel que armazenara o saldo final
com o valor do saldo anterior */
saldo_final = valor;

/* Por questões ´estéticas´ não queremos ter valores negativos no campo valor,
sendo assim, se o saldo anterior é negativo, devemos informar que o lançamento é
de débito e tornar o valor do saldo positivo, caso contratio informamos que o
lançamento é de crédito.*/

if (:valor < 0) then
begin
tipo = ´D´;
valor = valor * -1;
end
else
begin
tipo = ´C´;
end

suspend; /* Retornando a primeira linha (registro) com o saldo anterior */

/* o comando a seguir seleciona os registros dentro do periodo informado
buscando na tabela de contas a pagar */

tipo = ´D´; /* Estamos recuperando débitos */

for select ap.data, ap.historico, ap.valor
from apagar ap
where (ap.data between :inicio and :fim)
into :data, :historico, :valor
do
begin
/* Subtraimos o valor do lançamento do saldo final */
saldo_final = saldo_final - valor;
/* O suspend a seguir retorna uma ´linha´ contendo os campos
data, historico, tipo e valor que tem seus valores armazenados
nas variáveis de mesmo nome */
suspend;
end

tipo = ´C´; /* Estamos recuperando créditos */

/* seleciona os registros dentro do periodo informado
buscando na tabela de contas a receber */
for select ar.data, ar.historico, ar.valor
from areceber ar
where (ar.data between :inicio and :fim)
into :data, :historico, :valor
do
begin
/* Adicionamos o valor do lançamento ao saldo final */
saldo_final = saldo_final + valor;
/* O suspend a seguir retorna uma ´linha´ contendo os campos
data, historico, tipo e valor que tem seus valores armazenados
nas variáveis de mesmo nome */
suspend;
end

/* Montamos o ultimo ´registro´ que conterá os valores do saldo FINAL */
data = :fim;
historico = ´SALDO FINAL´;
tipo = ´C´;
valor = saldo_final;

suspend;

end
^

ALTER PROCEDURE POWER (
NUMERO NUMERIC(9,2),
EXPOENTE INTEGER)
RETURNS (
RESULTADO NUMERIC(15,2))
AS
DECLARE VARIABLE CONTADOR INTEGER;
begin
resultado = -1; /* Em caso de erro, retorna -1 */

if (:expoente < 0) then /* Está rotina só funciona para expoentes positivos */
exception exp_negativo;

contador = 0;
resultado = 1;
while (:contador < :expoente) do
begin
resultado = resultado * numero;
contador = contador + 1;
WHEN any do /* Caso ocorra algum erro, como por exemplo */
begin /* um overflow, então retorna -1 */
resultado = -1;
exit;
end
end
end
^


SET TERM ; ^


Marcoskblo
   - 20 jan 2006

Como faço para funcionar ha SP???


Edilcimar
   - 21 jan 2006

o erro é de que está esperando um campo binário codificado decimal formatado, porém o atual é um binário codificado decimal (não formatado), veja como estão os campos da tabela, provavelmente não estão com a mesma formatação da procedure


Marcoskblo
   - 21 jan 2006

Edilcimar, ja verifiquei e os campos da tabela estao com a mesma formatação da SP


Edilcimar
   - 21 jan 2006

todos os campos pegam 9,2 por que o resultado é 15,2?


Marcoskblo
   - 21 jan 2006

Edilcilmar alterei os campos numericos todos para NUMERIC (9,2) mas continua dando o mesmo erro


Cesarpir
   - 21 jan 2006

Amigo vou comentar o acontece comigo constantemente, espero que ajude e se não for nada disto peço perdão.
Uso delphi 7, firebird 1.5.3 e dbexpress e tb mysql 4.1, bom no firebird eu nunca uso numeric(xx,xx) pois sei que no fortes report dá erro, pois só uso este gerador para relatórios, então somente uso double precision, fica um pouco mais trabalhoso pois dentro do banco antes da gravação tenho que converter os valores para numeric(15,2) quando necessário, tenho duas sugestões:

1) Se vc adicionou field na query simplesmente remova e adicione novamente, e execute novamente;

2) Se vc puder trocar para teste digo, os numeric nesta procedure tudo para double precision;

A 1ª opção geralmente resolve eu não sei explicar mas recentemente tive que comprar um drive para acesso ao mysql 4.0, 4.1, 5.0 para dbexpress e fiz tudo em 4.1, blz funcionou tudo, quiz testar no 5.0 deu estes tipos de erros em alguns campos, removi os fields e adicionei novamente pronto.

Para executar a procedure em questão pelo entendi dela na strings da sua query se vc tiver o ibexpert acho que o iboconsole tb faz, desculpe num lembro dele, eu faço assim para testar:
select * from caixa(´01.01.2006´,´31.01.2006´)

No delphi na strings da sua query :
select * from caixa(:DataIni,:DataFin)
Ai vc configura os parametros corretamente e executa a query.

Espero que ajude e como disse anteriormente perdão se não for nada disto.

César


Edilcimar
   - 21 jan 2006


Citação:
Type mismatch for field ´VALOR´, expecting: FMTBcdField actual: BCD

eu não posso nem tentar fazer o seu programa pois o meu delphi é o 7, e aí pode dar diferença, outra coisa o firebird estável é o 1.5.2, a versão que vc está usando é beta


Marcoskblo
   - 21 jan 2006

Edilcimar, troquei tbem o FireBird para 1.5.2 justamente por isso... mas continua, agora vou fazer o que o nosso outro amigo esta me orientando e reporto aqui o resultado


Marcoskblo
   - 21 jan 2006

Infelizmente nao funcionou, o driver q utilizo para conexao com o FIREBIRD e UIB FireBird15, mas ja tentei outros ate mesmo criei outro banco ex: banco.gdb e banco.fdb para ver se tinha alguma diferença nos dois tipos mas continua o erro...


Cesarpir
   - 21 jan 2006

Amigo marcoskblo fiz aki com acesso dbexpress tive apenas que trocar o tipo das variáveis INICIO e FIM que ficam na sessão de INPUT PARAMETERS na procedure alterei para timestamp, outro tipo de campo que nunca uso é do tipo date somente TIMESTAMP, no dbexpress comigo do jeito que eu faço dá erro o tipo date.
Fora isto rodou legal, fiz um form pedindo um período de data e um button processar no grid aparece as informações.
Será que é o seu delphi 6, tá atualizado ? sei que tem servicepacks para ele, agora não tenho certeza, se quiser posso te enviar por email o projeto, mas uso o delphi 7.

César