Erro Token unknown ao executar procedure.
Eu quero que cada campo do registro seja adicionado nos parametro na procedure Reajustar Estoque, mas este select retorna "vários registros" e não estou conseguindo. O erro esta logo abaixo, alguem poderia me ajudar?
Banco Firebird 2.0
set term ^ ;
create trigger finalizar_venda for venda
active after update position 0
as
declare variable idProduto integer;
declare variable idEmbalagem integer;
declare variable valorCusto numeric(13,2);
declare variable margem numeric(7,2);
declare variable valorVenda numeric(13,2);
declare variable percDesc numeric(5,2);
declare variable qtdeEstq numeric(13,3);
declare variable qtdeSolic numeric(10,3);
begin
if ((old.status = 'P') and (new.status = 'F')) then
begin
for select s.id_produto, s.id_embalagem, s.valorCusto, s.percentual,
s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade
from venda v
inner join pedido_saida p on(v.id_pedido = p.id_pedido)
inner join item_saida i on(p.id_pedido = i.id_pedido)
inner join saldo_estoque s on(i.id_produto = s.id_produto and
i.id_embalagem = s.id_embalagem)
where v.id_pedido = old.id_pedido
and s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
into :idProduto, :idEmbalagem, :valorCusto, :margem, :valorVenda, :percDesc, :qtdeEstq, :qtdeSolic
do
execute procedure reajustarEstoque(:idProduto,:idEmbalagem,'S',:qtdeSolic,:qtdeEstq,:valorCusto,:margem,
:valorVenda,:percDesc)
end
end ^ set term ; ^ *** Error:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 33, column 5. end.
active after update position 0
as
declare variable idProduto integer;
declare variable idEmbalagem integer;
declare variable valorCusto numeric(13,2);
declare variable margem numeric(7,2);
declare variable valorVenda numeric(13,2);
declare variable percDesc numeric(5,2);
declare variable qtdeEstq numeric(13,3);
declare variable qtdeSolic numeric(10,3);
begin
if ((old.status = 'P') and (new.status = 'F')) then
begin
for select s.id_produto, s.id_embalagem, s.valorCusto, s.percentual,
s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade
from venda v
inner join pedido_saida p on(v.id_pedido = p.id_pedido)
inner join item_saida i on(p.id_pedido = i.id_pedido)
inner join saldo_estoque s on(i.id_produto = s.id_produto and
i.id_embalagem = s.id_embalagem)
where v.id_pedido = old.id_pedido
and s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
into :idProduto, :idEmbalagem, :valorCusto, :margem, :valorVenda, :percDesc, :qtdeEstq, :qtdeSolic
do
execute procedure reajustarEstoque(:idProduto,:idEmbalagem,'S',:qtdeSolic,:qtdeEstq,:valorCusto,:margem,
:valorVenda,:percDesc)
end
end ^ set term ; ^ *** Error:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 33, column 5. end.
Rogerio
Curtidas 0
Respostas
Emerson Nascimento
05/02/2010
não será a falta do ^ após o comando execute procedure?
set term ^ ; create trigger finalizar_venda for venda
active after update position 0
as
declare variable idProduto integer;
declare variable idEmbalagem integer;
declare variable valorCusto numeric(13,2);
declare variable margem numeric(7,2);
declare variable valorVenda numeric(13,2);
declare variable percDesc numeric(5,2);
declare variable qtdeEstq numeric(13,3);
declare variable qtdeSolic numeric(10,3);
begin
if ((old.status = 'P') and (new.status = 'F')) then
begin
for select s.id_produto, s.id_embalagem, s.valorCusto, s.percentual,
s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade
from venda v
inner join pedido_saida p on(v.id_pedido = p.id_pedido)
inner join item_saida i on(p.id_pedido = i.id_pedido)
inner join saldo_estoque s on(i.id_produto = s.id_produto and
i.id_embalagem = s.id_embalagem)
where v.id_pedido = old.id_pedido
and s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
into :idProduto, :idEmbalagem, :valorCusto, :margem, :valorVenda, :percDesc, :qtdeEstq, :qtdeSolic
do
execute procedure reajustarEstoque(:idProduto,:idEmbalagem,'S',:qtdeSolic,:qtdeEstq,:valorCusto,:margem,
:valorVenda,:percDesc)^
end
end ^ set term ; ^
set term ^ ; create trigger finalizar_venda for venda
active after update position 0
as
declare variable idProduto integer;
declare variable idEmbalagem integer;
declare variable valorCusto numeric(13,2);
declare variable margem numeric(7,2);
declare variable valorVenda numeric(13,2);
declare variable percDesc numeric(5,2);
declare variable qtdeEstq numeric(13,3);
declare variable qtdeSolic numeric(10,3);
begin
if ((old.status = 'P') and (new.status = 'F')) then
begin
for select s.id_produto, s.id_embalagem, s.valorCusto, s.percentual,
s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade
from venda v
inner join pedido_saida p on(v.id_pedido = p.id_pedido)
inner join item_saida i on(p.id_pedido = i.id_pedido)
inner join saldo_estoque s on(i.id_produto = s.id_produto and
i.id_embalagem = s.id_embalagem)
where v.id_pedido = old.id_pedido
and s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
into :idProduto, :idEmbalagem, :valorCusto, :margem, :valorVenda, :percDesc, :qtdeEstq, :qtdeSolic
do
execute procedure reajustarEstoque(:idProduto,:idEmbalagem,'S',:qtdeSolic,:qtdeEstq,:valorCusto,:margem,
:valorVenda,:percDesc)^
end
end ^ set term ; ^
GOSTEI 0
Rogerio
05/02/2010
Faltou acrecentar o begin execute procedure ... end, agora pelo menos não deu nenhum problema.
set term ^ ;
create trigger finalizar_venda for venda
active after update position 0
as
declare variable idProduto integer;
declare variable idEmbalagem integer;
declare variable valorCusto numeric(13,2);
declare variable margem numeric(7,2);
declare variable valorVenda numeric(13,2);
declare variable percDesc numeric(5,2);
declare variable qtdeEstq numeric(13,3);
declare variable qtdeSolic numeric(10,3);
begin
if ((old.status = 'P') and (new.status = 'F')) then
begin
for select s.id_produto, s.id_embalagem, s.valorCusto, s.percentual,
s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade
from venda v
inner join pedido_saida p on(v.id_pedido = p.id_pedido)
inner join item_saida i on(p.id_pedido = i.id_pedido)
inner join saldo_estoque s on(i.id_produto = s.id_produto and
i.id_embalagem = s.id_embalagem)
where (v.id_pedido = old.id_pedido)
and s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
into :idProduto, :idEmbalagem, :valorCusto, :margem,:valorVenda, :percDesc, :qtdeEstq, :qtdeSolic
do begin
execute procedure reajustar_estoque(:idProduto,:idEmbalagem,'S',:qtdeSolic,:qtdeEstq, :valorCusto,:margem,:valorVenda,:percDesc);
end
end
end ^ set term ; ^
Tenho outra dúvida. Se eu incluir o comando suspend; lógo apos o procedimento reajustar_estoque da erro: *** Error:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown.
SUSPEND. É necessário colocar o comando suspend nesta trigger?
Agora não querendo abusar de sua boa vontade, gostaria de saber se tem algum erro de lógica ou até mesmo com os comandos destes procedimentos? inciando com finalizar_venda -> reajustar_estoque - > add_saldo_estoque. set term ^ ; create procedure reajustar_estoque(
id_produto integer,
id_embalagem integer,
operacao char(1),
qtde numeric(10,3),
qtdeEstq numeric(10,3),
valorCusto numeric(13,2),
margem numeric(7,2),
valorVenda numeric(13,2),
percDesc numeric(5,2))
as
begin /* reajusta a quantidade em estoque. */
if (operacao = 'E') then /* entrada. */
qtdeEstq = (:qtdeEstq + :qtde);
else
if (operacao = 'S') then /* saída. */
qtdeEstq = (:qtdeEstq - :qtde);
else
if (operacao = 'I') then /* inicialização. */
qtdeEstq = :qtde;
/* inclui registro na tabela saldo_estoque */
execute procedure add_saldo_estoque(:id_produto, :id_embalagem, :valorCusto,
:margem, :valorVenda, :percDesc, :qtdeEstq);
end ^ set term ; ^ ----------------------------------------------------------------------------------------- set term ^ ;
create procedure add_saldo_estoque(
idProduto integer,
idEmbalagem integer,
valorCusto numeric(13,2),
margem numeric(7,2),
valorVenda numeric(13,2),
percDesc numeric(5,2),
qtdeEstq numeric(13,3))
as
begin /* inclui registro na tabela saldo_estoque */
insert into saldo_estoque (id_produto,id_embalagem,valorCusto,
margem,valorVenda,percentDesc,qtdeEstq)
values (:idProduto,:idEmbalagem,:valorCusto,:margem,:valorVenda,
:percDesc,:qtdeEstq);
end ^
set term ; ^ Muito Obrigado pela atenção!!!
active after update position 0
as
declare variable idProduto integer;
declare variable idEmbalagem integer;
declare variable valorCusto numeric(13,2);
declare variable margem numeric(7,2);
declare variable valorVenda numeric(13,2);
declare variable percDesc numeric(5,2);
declare variable qtdeEstq numeric(13,3);
declare variable qtdeSolic numeric(10,3);
begin
if ((old.status = 'P') and (new.status = 'F')) then
begin
for select s.id_produto, s.id_embalagem, s.valorCusto, s.percentual,
s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade
from venda v
inner join pedido_saida p on(v.id_pedido = p.id_pedido)
inner join item_saida i on(p.id_pedido = i.id_pedido)
inner join saldo_estoque s on(i.id_produto = s.id_produto and
i.id_embalagem = s.id_embalagem)
where (v.id_pedido = old.id_pedido)
and s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
into :idProduto, :idEmbalagem, :valorCusto, :margem,:valorVenda, :percDesc, :qtdeEstq, :qtdeSolic
do begin
execute procedure reajustar_estoque(:idProduto,:idEmbalagem,'S',:qtdeSolic,:qtdeEstq, :valorCusto,:margem,:valorVenda,:percDesc);
end
end
end ^ set term ; ^
Tenho outra dúvida. Se eu incluir o comando suspend; lógo apos o procedimento reajustar_estoque da erro: *** Error:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown.
SUSPEND. É necessário colocar o comando suspend nesta trigger?
Agora não querendo abusar de sua boa vontade, gostaria de saber se tem algum erro de lógica ou até mesmo com os comandos destes procedimentos? inciando com finalizar_venda -> reajustar_estoque - > add_saldo_estoque. set term ^ ; create procedure reajustar_estoque(
id_produto integer,
id_embalagem integer,
operacao char(1),
qtde numeric(10,3),
qtdeEstq numeric(10,3),
valorCusto numeric(13,2),
margem numeric(7,2),
valorVenda numeric(13,2),
percDesc numeric(5,2))
as
begin /* reajusta a quantidade em estoque. */
if (operacao = 'E') then /* entrada. */
qtdeEstq = (:qtdeEstq + :qtde);
else
if (operacao = 'S') then /* saída. */
qtdeEstq = (:qtdeEstq - :qtde);
else
if (operacao = 'I') then /* inicialização. */
qtdeEstq = :qtde;
/* inclui registro na tabela saldo_estoque */
execute procedure add_saldo_estoque(:id_produto, :id_embalagem, :valorCusto,
:margem, :valorVenda, :percDesc, :qtdeEstq);
end ^ set term ; ^ ----------------------------------------------------------------------------------------- set term ^ ;
create procedure add_saldo_estoque(
idProduto integer,
idEmbalagem integer,
valorCusto numeric(13,2),
margem numeric(7,2),
valorVenda numeric(13,2),
percDesc numeric(5,2),
qtdeEstq numeric(13,3))
as
begin /* inclui registro na tabela saldo_estoque */
insert into saldo_estoque (id_produto,id_embalagem,valorCusto,
margem,valorVenda,percentDesc,qtdeEstq)
values (:idProduto,:idEmbalagem,:valorCusto,:margem,:valorVenda,
:percDesc,:qtdeEstq);
end ^
set term ; ^ Muito Obrigado pela atenção!!!
GOSTEI 0
Rogerio
05/02/2010
Emerson eu hávia falado besteira quando citei o comando suspend. Como trigger não retorna valores, então não se utiliza o comando suspend, é isso né? somente utiliza este comando em procedimentos que retornavel.
GOSTEI 0
Thiago Santana
05/02/2010
É isso aí Rogerio só precisa utilizar o suspend se a procedure for retornavel, caso exista valores para retornar dentro do procedimento não há a necessidade de utilizar o suspend!
GOSTEI 0
Emerson Nascimento
05/02/2010
creio que haja sim, erro de lógica.
set term ^ ;; ^create trigger finalizar_venda for venda
active after update position 0
as
declare variable idProduto integer;
declare variable idEmbalagem integer;
declare variable valorCusto numeric(13,2);
declare variable margem numeric(7,2);
declare variable valorVenda numeric(13,2);
declare variable percDesc numeric(5,2);
declare variable qtdeEstq numeric(13,3);
declare variable qtdeSolic numeric(10,3);
begin
if ((old.status = 'P') and (new.status = 'F')) then
begin
for select s.id_produto, s.id_embalagem, s.valorCusto, s.percentual,
s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade
from venda v
inner join pedido_saida p on(v.id_pedido = p.id_pedido)
inner join item_saida i on(p.id_pedido = i.id_pedido)
inner join saldo_estoque s on(i.id_produto = s.id_produto and
i.id_embalagem = s.id_embalagem)
where (v.id_pedido = old.id_pedido)
and s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
into :idProduto, :idEmbalagem, :valorCusto, :margem,:valorVenda, :percDesc, :qtdeEstq, :qtdeSolic
do begin
execute procedure reajustar_estoque(:idProduto,:idEmbalagem,'S',:qtdeSolic,:qtdeEstq, :valorCusto,:margem,:valorVenda,:percDesc);
end
end
end ^ set term ; ^ esse inner join assinalado deve gerar algum problema, visto que pode haver um registro ou vários registros na tabela saldo_estoque e dessa forma o for...select vai devolver mais registros do que o pretendido por você, gerando um erro em cascata.execute o select separadamente e veja se o resultado é o esperado. note que o erro vai acontecer quando houver mais de um lançamento para um mesmo produto e embalagem na tabela saldo_estoque.
set term ^ ;; ^create trigger finalizar_venda for venda
active after update position 0
as
declare variable idProduto integer;
declare variable idEmbalagem integer;
declare variable valorCusto numeric(13,2);
declare variable margem numeric(7,2);
declare variable valorVenda numeric(13,2);
declare variable percDesc numeric(5,2);
declare variable qtdeEstq numeric(13,3);
declare variable qtdeSolic numeric(10,3);
begin
if ((old.status = 'P') and (new.status = 'F')) then
begin
for select s.id_produto, s.id_embalagem, s.valorCusto, s.percentual,
s.valorVenda, s.percentDesc, s.qtdeAtual, i.quantidade
from venda v
inner join pedido_saida p on(v.id_pedido = p.id_pedido)
inner join item_saida i on(p.id_pedido = i.id_pedido)
inner join saldo_estoque s on(i.id_produto = s.id_produto and
i.id_embalagem = s.id_embalagem)
where (v.id_pedido = old.id_pedido)
and s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
into :idProduto, :idEmbalagem, :valorCusto, :margem,:valorVenda, :percDesc, :qtdeEstq, :qtdeSolic
do begin
execute procedure reajustar_estoque(:idProduto,:idEmbalagem,'S',:qtdeSolic,:qtdeEstq, :valorCusto,:margem,:valorVenda,:percDesc);
end
end
end ^ set term ; ^ esse inner join assinalado deve gerar algum problema, visto que pode haver um registro ou vários registros na tabela saldo_estoque e dessa forma o for...select vai devolver mais registros do que o pretendido por você, gerando um erro em cascata.execute o select separadamente e veja se o resultado é o esperado. note que o erro vai acontecer quando houver mais de um lançamento para um mesmo produto e embalagem na tabela saldo_estoque.
GOSTEI 0
Rogerio
05/02/2010
Valeu Thiago eu entendi o conseito do Suspend .
GOSTEI 0
Rogerio
05/02/2010
Emerson, muito bem observado, mas neste caso eu teria problemas se não hávia este trecho:....
....
s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
que faz com que seja filtrado somente um registro de saldo de estoque, senão havia este trecho, então retornaria vários registros dependendo da quantidade de registros de saldo de estoque e consequentemente estaria errado.
....
s.id_estoque = (select max(id_estoque)
from saldo_estoque
where id_produto = s.id_produto
and id_embalagem = s.id_embalagem)
que faz com que seja filtrado somente um registro de saldo de estoque, senão havia este trecho, então retornaria vários registros dependendo da quantidade de registros de saldo de estoque e consequentemente estaria errado.
GOSTEI 0
Thiago Santana
05/02/2010
Blza Rogerio... Precisando estamos aqui para compartilhar conhecimentos...
AbraçoO
GOSTEI 0
Rogerio
05/02/2010
Emersom e Thiago Muito Obrigado por ter ajudado com este problema!!!
Agora eu gostaria de convidar vocês e todos os usuário do fórum a participar do tópico que eu vou criar chamado de "Uma outra alternativa de controlar os itens da venda e o estoque." na sala Delphi. Eu gostaria muito que vocês me ajudassem analisando, expondo as suas ideias e opiniões para que eu possa ter uma visão melhor deste controle.
Muito Obrigado!!!
GOSTEI 0
Rogerio
05/02/2010
Agora estou tentando concluir o chamado, mas não aparece a opção para fazer isso!
GOSTEI 0
Carlos Mazzi
05/02/2010
POde deixar, fecharemos pra vc. Abracos++
GOSTEI 0