Fórum Trigger e Stored Procedure não funcionam... Qual o problema? #40237

19/11/2003

0

Pessoal to com 3 problemas que não to conseguindo resolver, no meu projeto final para faculdade...

1.: Essa query não funciona no Delphi, mas IBExpert roda normalmente...

select PO.DESCRICAO, IPO.QUANTIDADE, IPO.PRECOVENDA from ITENS_PEPRO IPO
inner join PRODUTOS PO on (IPO.CODPROD = PO.CODPROD)
where IPO.CODPED = :CODPED
union all
select PA.DESCRICAO, IPA.QUANTIDADE, IPA.PRECOVENDA from ITENS_PEPA IPRA
inner join PRATOS PA on (IPA.CODPRATO = PA.CODPRATO)
where IPA.CODPED = :CODPED

OBS.: Se eu retirar qualquer uma das linha que contenham o WHERE funciona!! Só está aceitando um WHERE!!!


2.: Essa Stored Procedure está retornando null, eu acho que tem haver com as variáveis, que eu não sei se estão de forma correta...

/* PROCEDURE PARA CALCULAR TOTAL DO PEDIDO */

SET TERM ^ ;
CREATE PROCEDURE CALCULATOTALPEDIDO (
CODPED INTEGER)
AS
DECLARE VARIABLE VSOMA1 NUMERIC(15,2);
DECLARE VARIABLE VSOMA2 NUMERIC(15,2);
DECLARE VARIABLE VTOTAL NUMERIC(15,2);

BEGIN
SELECT SUM(QUANTIDADE * PRECOVENDA) FROM ITENS_PEPA WHERE CODPED = :CODPED INTO :VSOMA1;
SELECT SUM(QUANTIDADE * PRECOVENDA) FROM ITENS_PEPO WHERE CODPED = :CODPED INTO :VSOMA2;
VTOTAL = :VSOMA1 + :VSOMA2;
UPDATE PEDIDOS SET TOTAL = :VTOTAL WHERE CODPED = :CODPED;
END
^
SET TERM ; ^

3.: (Essa eu tô sem idéia...) Preciso de uma query + ou - assim...

CREATE TRIGGER TRG_POSINSERIRITENSPEPRA FOR ITENS_PEPRA
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
UPDATE PRODUTOS SET ESTOQUE = ESTOQUE - (NEW.QUANTIDADE * COMPOE.QUANTIDADE) WHERE CODPROD IN ( SELECT CODPROD, QUANTIDADE FROM COMPOE WHERE CODPRATO = NEW.CODPRATO);
EXECUTE PROCEDURE CALCULATOTALPEDIDO(NEW.CODPED);
END
^

Eu sei que o uso do IN só pode se o select retornar apenas uma coluna... mas qual seria a solução para esse problema???

Essa Trigger é para quando for adicionado um prato ao pedido ela consultar que produtos e em quais quantidades compoem o prato e dar baixa no estoque...

Pessoal vou ficar muito grato se alguem puder me passar alguma dica... Tenho que resolver esses problemas (e outros) para apresentar meu projeto final dia 15/12/03....

Se alguem tambem tiver alguma dica de como eu posso imprimir um cupom (não fiscal) eu també agradeço...

Um abraço!

Douglas C. Santos


Dodacs

Dodacs

Responder

Posts

19/11/2003

Afarias

|1.: Essa query não funciona no Delphi, mas IBExpert roda
|normalmente...

Que componentes está usando no Delphi e QUAL o ERRO que está recebendo??

(pode ser problema para lidar com 2 parâmetros de mesmo nome -- ou devo dizer: o mesmo parâmetro aparecendo 2 vezes)


|2.: Essa Stored Procedure está retornando null, eu acho que tem haver
|com as variáveis, que eu não sei se estão de forma correta...

me adimira q esteja retornando ALGO!! não há nenhuma variável de retorno!!!


|3.: (Essa eu tô sem idéia...) Preciso de uma query + ou - assim...

hum... bom, vc pode dar várias soluções diferentes para este caso. Não ficou claro para mim como vc implementou isso mas uma idéia seria::

1- vc teria uma tabela de composicao do prato (prato, item, qtde) onde cada prato poderia ter vários itens.

2- no pedido do prato vc teria uma trigger (after insert) +/- ::

for select item, qtde from composicao where prato=new.codprato
into :vitem, :vqtde do
begin
update produtos set estoque=estoque-(new.quantidade * :vqtde)
where codproduto = :vitem;
end;

{aqui executa o tal procedimento}



T+


Responder

Gostei + 0

19/11/2003

Dodacs

1.: Estou usando SQLQuery (dbexpress) , DataSetProvider, ClientDataset

O erro é o seguinte (quando eu tento adicionar as fields no clientdataset):
INCORRET VALUES WITHIN SQLDA STRUCTURE
Não é por causa do mesmo nome no parâmetro, pois eu já testei com nomes diferentes....

2.: Como eu coloco a variável de retorno?

Um abraço!!!


Responder

Gostei + 0

19/11/2003

Afarias

|O erro é o seguinte (quando eu tento adicionar as fields no lientdataset):
|INCORRET VALUES WITHIN SQLDA STRUCTURE

Bom, não tenho experiência com DBX mas, o lance ainda me parece coisa de parâmetros. Faça o seguinte teste:: após definir o SQL do SQLQuery, chame um PREPARE antes de executá-lo.

Bom, como vc usa clientDataSet, imagino q este SQL seja fixo (vc não mexe em código) certo??? sendo assim, vc pode chamar o prepare apenas 1 vez.

Antes de tudo isso, apenas certifíque-se de ter definido o parâmetro no SQLQuery e dar um FetchParams no ClientDataSet (se vc não fez isso, ai pode estar o problema)


|2.: Como eu coloco a variável de retorno?

create procedure nome_proc (par_de_entrada _tipo_)
RETURNS (par_de_saida _tipo_, {..}) AS {...}



T+


Responder

Gostei + 0

20/11/2003

Dodacs

afarias vc falou q a procedure não estava retornando nada, mas não é mesmo para ela retornar... ela tem que atualizar o campo da tabela produto... eu fiz aquela baseada nessa (que funciona):

CREATE PROCEDURE CALCULATOTALPEDIDO (
PNUMPEDIDO INTEGER)
AS
DECLARE VARIABLE VSOMA NUMERIC(15,2);
BEGIN
SELECT SUM(QUANTIDADE * PRECOVENDA) FROM ITENS WHERE ID_PEDIDO = :PNUMPEDIDO INTO :VSOMA;
UPDATE PEDIDOS SET TOTALPED = :VSOMA WHERE ID_PEDIDO = :PNUMPEDIDO;
END

Eu só adicionei mais duas variaveis... eu acho que o erro está no

VTOTAL = :VSOMA1 + VSOMA2


P.S.: Faleu pela query tá rodando redonda....

Um abraço...


Responder

Gostei + 0

20/11/2003

Afarias

ok... tinha entendido q vc queria q retornase algum valor.

Nota:: quando operar variáveis fora de comandos SQL (insert,update e delete), não use os dois-pontos ( : ), ex::

VTOTAL = VSOMA1 + VSOMA2;

no mais, se o q vc estava dizendo era q VTOTAL estava ficando NULO, note q deve ser pq ou VSOMA1 ou VSOMA2 são nulos. E estes podem ser nulo, se qualquer campo de qualquer registro que entram na sua soma é nulo.


T+


Responder

Gostei + 0

20/11/2003

Dodacs

Resolvi, ou melhor, vc resolveu!! hehehe

Substitui a linha VTOTAL = :VSOMA1 + :VSOMA2;
Por: VTOTAL = VSOMA1 + VSOMA2;

E está tudo funcionando...

Só falta agora aquele problema com o sql que o clientdataset não está aceitando...

Obrigado afarias, vc me salvou!!

Um abraço!!!


Responder

Gostei + 0

20/11/2003

Afarias

|Só falta agora aquele problema com o sql que o clientdataset não está
|aceitando...

achei q vc já tinha resolvido este...


bom, dê mais informações sobre o q está havendo... o pessoal com conhecimento em DBX pode ajudar...


T+


Responder

Gostei + 0

21/11/2003

Dodacs

To com problemas denovo...

Aquele problema numero 1 eu resolvi criando uma view...

Mas o problema numero 2 que eu pensei q tinha resolvido (não foi), a procedure funciona numa boa se já tiver algum item, mas se não tiver nenhum item o valor retorna nulo...
Eu acho q a solução seria algo assim, mas eu não sei verificar se uma variável tem valor nulo...

SET TERM ^ ;
CREATE PROCEDURE CALCULATOTALPEDIDO (
CODPED INTEGER)
AS
DECLARE VARIABLE VSOMA1 NUMERIC(15,2);
DECLARE VARIABLE VSOMA2 NUMERIC(15,2);
DECLARE VARIABLE VTOTAL NUMERIC(15,2);

BEGIN
SELECT SUM(QUANTIDADE * PRECOVENDA) FROM ITENS_PEPA WHERE CODPED = :CODPED INTO :VSOMA1;
SELECT SUM(QUANTIDADE * PRECOVENDA) FROM ITENS_PEPO WHERE CODPED = :CODPED INTO :VSOMA2;
[b:ee4fa2bc6b] IF (VSOMA1 = NULL) THEN VSOMA1 = 0;
IF (VSOMA2 = NULL) THEN VSOMA2 = 0;[/b:ee4fa2bc6b]
VTOTAL = VSOMA1 + VSOMA2;
UPDATE PEDIDOS SET TOTAL = :VTOTAL WHERE CODPED = :CODPED;
END
^
SET TERM ; ^


Responder

Gostei + 0

21/11/2003

Afarias

o operador de NULL é IS::

IF (VSOMA1 IS NULL) THEN VSOMA1 = 0;



T+


Responder

Gostei + 0

21/11/2003

Dodacs

Cara... eu tentei usar o (IS NULL) várias vezes ontem, mas não lembro se foi exatamente assim... mas eu acho que foi até igual a essa linha que vc me mandou!!! Mas hoje que eu olhei sua mensagem e já ia responder:
- Não isso eu já usei ontem..
Mas eu resolvi tentar é pronto! funcionando redondo...

Um abração e obrigado pela força!


Responder

Gostei + 0

23/11/2003

Afarias

8)


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar