[firebase-br] Erro com Stored Procedure, sum e inner join
renato_br
renato_br em bol.com.br
Dom Jan 25 18:31:08 -03 2009
Boa Tarde a todos da Lista :)
Estou com uma dúvida que esta me atormentando.
Não estou conseguindo fazer uma stored procedure de inserção em uma tabela, é o mesmo esquema de um cartão de crédito, verifica se o cliente possui saldo na conta, caso não possua não deixa inserir, neste caso verifica o valor da conta do cliente se pode inserir o débito.
Está muito difícil, já tentei de mil maneiras,mas não sai.
Utilizo Firebird 2.1 + Delphi7+IBExpert
Estou utilizando sum com inner join, mas dá o seguinte erro:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Solicito ajuda da lista na solução.
Segue as duas tabelas:
CREATE TABLE COMPRA (
CORDEM INTEGER NOT NULL,
CCODCARTAO DMCARTAO NOT NULL /* DMCARTAO = BIGINT NOT NULL CHECK (VALUE = '1111111111111111' OR (VALUE > '1111111111111111' AND VALUE <= '9999999999999999' )) */,
CCODEMPRESA INTEGER NOT NULL,
CDATACOMPRA DMDATACAD NOT NULL /* DMDATACAD = TIMESTAMP DEFAULT 'NOW' */,
CDESCRICAO DMNOMEGERAL /* DMNOMEGERAL = VARCHAR(60) CHECK (VALUE = UPPER (VALUE)) */,
CPARCELA DMPARCELAS NOT NULL /* DMPARCELAS = SMALLINT DEFAULT 1 CHECK (VALUE = 1 OR (VALUE > 1 AND VALUE <= 12)) */,
CVALOR NUMERIC(9,2) NOT NULL,
CDATAVENCIMENTO DATE DEFAULT 'NOW' NOT NULL
);
CREATE TABLE CARTAO (
CACODIGO DMCARTAO NOT NULL /* DMCARTAO = BIGINT NOT NULL CHECK (VALUE = '1111111111111111' OR (VALUE > '1111111111111111' AND VALUE <= '9999999999999999' )) */,
CACODIGORH SMALLINT NOT NULL,
CANOMECARTAO VARCHAR(28) NOT NULL,
CASITUACAO DMSITUACAO NOT NULL COLLATE WIN_PTBR /* DMSITUACAO = VARCHAR(1) DEFAULT 'A' CHECK (VALUE IN ('A', 'B', 'C', 'I')) */,
CAMAXSALARIO NUMERIC(9,2) NOT NULL,
CABONUS NUMERIC(6,2) NOT NULL,
CAMAXGASTO COMPUTED BY (CAMAXSALARIO + CABONUS),
CAFTIPOEMPRESA VARCHAR(2) NOT NULL,
CAORGAO SMALLINT NOT NULL,
CASENHA CHAR(7) NOT NULL,
CAVENCIMENTO DATE DEFAULT 'NOW' NOT NULL
);
E a procedure:
CREATE OR ALTER PROCEDURE SP_INSERE_COMPRA (
ecodcartao bigint,
ecodempresa integer,
ecdatacompra timestamp,
ecdescricao char(60) character set win1252,
ecparcela smallint,
ecvalor numeric(9,2),
ecdatavencimento date,
emes smallint,
eano smallint,
ecvalorsoma numeric(9,2),
emesaux smallint,
eanoaux smallint)
returns (
ecodcartaosaida bigint,
edatavencsaida timestamp,
evalorsaida numeric(9,2))
as
begin
emes = extract(month from :ecdatavencimento);
eano = extract(year from :ecdatavencimento);
/*esta parte esta me matando, é aqui que que não sai*/
if (exists (select c.ccodcartao, sum(c.cvalor), c.cdatavencimento, t.camaxgasto
from compra c inner join cartao t
on c.ccodcartao = t.cacodigo
where (ccodcarta o = :ecodcartao) and (extract(month from cdatavencimento) = :emes)
and (extract(year from cdatavencimento) = :eano))) then
begin
if (c.cvalor+ecvalor > t.camaxgasto ) then
exception incluir_compra;
else
if (c.cvalor+ecvalor <= t.camaxgasto ) then
insert into compra(
cordem,
ccodcartao,
ccodempresa,
cdatacompra,
cdescricao,
cparcela,
cvalor,
cdatavencimento)
values (
gen_id(gen_compra_id,1),
:ecodcartao,
:ecodempresa,
:ecdatacompra,
:ecdescricao,
:ecparcela,
:ecvalor,
:ecdatavencimen to);
end
end
Agradeço a ajuda de todos,
Renato Alves
Poços de Caldas - Sul das Geraes
Mais detalhes sobre a lista de discussão lista