Fórum Trigger e Stored Procedure não funcionam... Qual o problema? #40237
19/11/2003
0
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
Curtir tópico
+ 0Posts
19/11/2003
Afarias
|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+
Gostei + 0
19/11/2003
Dodacs
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!!!
Gostei + 0
19/11/2003
Afarias
|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+
Gostei + 0
20/11/2003
Dodacs
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...
Gostei + 0
20/11/2003
Afarias
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+
Gostei + 0
20/11/2003
Dodacs
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!!!
Gostei + 0
20/11/2003
Afarias
|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+
Gostei + 0
21/11/2003
Dodacs
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 ; ^
Gostei + 0
21/11/2003
Afarias
IF (VSOMA1 IS NULL) THEN VSOMA1 = 0;
T+
Gostei + 0
21/11/2003
Dodacs
- Não isso eu já usei ontem..
Mas eu resolvi tentar é pronto! funcionando redondo...
Um abração e obrigado pela força!
Gostei + 0
23/11/2003
Afarias
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)