[firebase-br] Erro com Stored Procedure, sum e inner join

renato_br renato_br em bol.com.br
Seg Jan 26 17:54:53 -03 2009


Obrigado Alex,
Era isto mesmo, fiz aqui e deu certo, obrigado :D
Valeu
Renato Alves


Em 25/01/2009 22:53, Alex Miranda de Oliveira   escreveu:


Alex Miranda de Oliveira

select c.ccodcartao, sum(c.cvalor), c.cdatavencimento, t.camaxgasto
from compra c
inner join cartao t on c.ccodcartao = t.cacodigo

where (ccodcartao = :ecodcartao) and
(extract(month from cdatavencimento) = :emes)
and (extract(year from cdatavencimento) = :eano)


Ta faltando vc usar o Group by na consulta porque vc esta usando valores
agregados que e o sum()


group by c.ccodcartao,c.cdatavencimento,t.camaxgasto

Espero que te ajude ate .+





2009/1/25 renato_br 

> 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
>
>
>
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista