Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 3561 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Bom dia pessoal,

 

Gostaria da ajuda e opinião de vocês com relação a um problema que estou tendo.

 

Sempre que tenho que fazer uma alteração em uma trigger ou criar uma trigger nova no Firebird diretamente pelo sistema, enfrento alguns problemas.

 

Eu utilizo o componente TSqlQuery sempre que preciso fazer um acesso ao Firebird, seja pra consultas SQL, Insert, Update, etc...

 

Recentemente tive que fazer uma alteração em uma trigger, onde a mesma tinha variáveis declaradas, e ao executar o 'ExecSql', ocorre um erro referente à variável :DATA .

 

E executando o trecho de código no IBExpert funciona normalmente.

 

Segue um exemplo do problema:

CREATE TRIGGER TRG_ITENS_ENTRADA_MOVIMENTO FOR ITENS_ENTRADA
  ACTIVE AFTER INSERT POSITION 0                                             
  AS                                                                         
  declare variable DATA date;                                                
  declare variable DESCRICAO varchar(30);                                    
  begin                                                                      
    SELECT ENT_DATA FROM ENTRADAS WHERE ID_ENTRADA = NEW.ITE_ENT INTO :DATA; 
    DESCRICAO = 'REFERENTE A ENTRADA: ' || NEW.ITE_ENT;                    
    EXECUTE PROCEDURE INSERE_MOVIMENTO(                                      
                        NULL,                                                
                        NEW.ITE_PRO,                                         
                        NEW.ITE_ENT,                                         
                        'ENTRADA',                                         
                        :DATA,                                               
                        'E',                                               
                        :DESCRICAO,                                          
                        'E',                                               
                        NEW.ITE_QUANTIDADE);                                 
  end  

Gostaria de saber como vocês contornam este problema, e como faço para resolver isto?

 

Att,

Postado

Eu não costumo fazer este tipo de alteração no banco via Delphi de forma rotineira, uso apenas em situações isoladas, como importação de dados ou manutenção massiva. De qualquer modo, à primeira vista, acredito que o problema esteja no uso uso do TsqlQuery, embora não possa afirmar em virtude não usá-lo e, portanto, não estar familiarizado com ele. Fazendo uma analogia com componentes de nome parecido, acredito que ele  se preste a executar uma única sentença SQL (select ... from.., [where], execute procedure ...).

 

Se for este o caso, o problema é que o ";" é o terminador de comando default, e não pode ocorrer em meio a uma sentença. A solução é usar um componente que seja capaz de processar scripts, ou seja, uma ou mais sentenças em sequência, separadas umas das outras por um terminador específico.

SET TERM ^ ;

CREATE TRIGGER TRG_ITENS_ENTRADA_MOVIMENTO FOR ITENS_ENTRADA
  ACTIVE AFTER INSERT POSITION 0                                             
  AS                                                                         
  declare variable DATA date;                                                
  declare variable DESCRICAO varchar(30);                                    
  begin                                                                      
    SELECT ENT_DATA FROM ENTRADAS WHERE ID_ENTRADA = NEW.ITE_ENT INTO :DATA; 
    DESCRICAO = 'REFERENTE A ENTRADA: ' || NEW.ITE_ENT;                    
    EXECUTE PROCEDURE INSERE_MOVIMENTO(                                      
                        NULL,                                                
                        NEW.ITE_PRO,                                         
                        NEW.ITE_ENT,                                         
                        'ENTRADA',                                         
                        :DATA,                                               
                        'E',                                               
                        :DESCRICAO,                                          
                        'E',                                               
                        NEW.ITE_QUANTIDADE);                                 
  end  ^


SET TERM ; ^

Cordialmente,

Carlos

 

  • Membros Pro
Postado

Boa tarde Carlos,

 

Faz todo sentido o que você disse.

 

Irei pesquisar mais neste sentido e postarei aqui caso obtiver sucesso.

 

Atenciosamente. 

  • 2 semanas depois ...
  • Consultores
Postado

Utilize o TIBSQL ou o TIBScript da paleta Interbase Express (IBX).

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
  • 4 meses depois ...
  • Este tópico foi criado há 3561 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.