QueryFluxo: Type mismatch for field ´VALOR´, expecting: FMTB
20/01/2006
0
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
Posts
21/01/2006
Edilcimar
21/01/2006
Marcoskblo
21/01/2006
Marcoskblo
21/01/2006
Cesarpir
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
21/01/2006
Edilcimar
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
21/01/2006
Marcoskblo
21/01/2006
Marcoskblo
21/01/2006
Cesarpir
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
Clique aqui para fazer login e interagir na Comunidade :)