ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[Resolvido] Erro "Token unknown" ao executar procedure.

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 2080
Localização: Araras-SP

MensagemEnviada: Sex Fev 05, 2010 11:35 am    Assunto: [Resolvido] Erro "Token unknown" ao executar procedure. Responder com Citação

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

Código:
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.

_________________
"De tropeços , vitórias e quedas se constrói a experiência"

Very Happy Good Codes!


Editado pela última vez por pestana em Seg Fev 08, 2010 9:29 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2507
Localização: Pra lá de Bagda

MensagemEnviada: Sex Fev 05, 2010 3:25 pm    Assunto: Responder com Citação

pelas minhas contas a linha 33 é essa aqui

Citação:
:qtdeEstq,:valorCusto,:margem,


deve ser algum erro de sintaxe...
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 2080
Localização: Araras-SP

MensagemEnviada: Sex Fev 05, 2010 4:14 pm    Assunto: Responder com Citação

Faltou acrecentar o begin execute procedure ... end, agora pelo menos não deu nenhum problema.

Código:
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, Embarassed 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.

Código:
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!!!
_________________
"De tropeços , vitórias e quedas se constrói a experiência"

Very Happy Good Codes!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 9824
Localização: Curitiba-PR

MensagemEnviada: Sex Fev 05, 2010 9:13 pm    Assunto: Responder com Citação

Olá Pestana, blz amigo....

Citação:
É necessário colocar o comando suspend nesta trigger?


A grosso modo: Suspend é o comando que retorna os dados que estão nos parâmetros de saída (aqueles listados em return da stored procedure).

A diferença da trigger com SP é que trigger não tem parametro de entrada e nem retorna valores, a trigger é disparada automaticamente a tabela que esta ligada.

Outra coisa amigo, não seria mais facil vc tratar tudo isso diretamente na trigger?
_________________
www.aldac.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 2080
Localização: Araras-SP

MensagemEnviada: Seg Fev 08, 2010 9:18 am    Assunto: Responder com Citação

blz Adriano e obrigado por ter respondido!


É mesmo eu tinha esquecido completamente o que este comando Suspend fazia, falei besteira. Embarassed

Como estes procedimentos não estão retornando valores, então não preciso utilizar o Suspend.

Adriano eu já havia pensado em tratar tudo isso diretamente na trigger, mas como eu vou utilizar o trecho de código da procedure reajustar_estoque em outros lugares (a mesma acontece com "add_saldo_estoque") achei que o melhor seria criar esta procedure.

Bom acho que erro de sintase não tem, porque estou testando aqui e não esta dando errado.


Valeu Adriano e DonOctavio pela ajuda!!!
_________________
"De tropeços , vitórias e quedas se constrói a experiência"

Very Happy Good Codes!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB