trigger e store procedure via codigo na aplicação

07/02/2010

1

Carissimos boa noite   Tenho uma aplicação em delphi 7 FB 2.0 ZEOS 6.6.5 stable multicamada   Antes de iniciar o Data Module, coloquei uma funcão na aplicação a qual verifica se o banco de dados que estou abrindo falta algum campo, bem, se falta então mando criar um campo, criar uma tabela, alterar um tamanho de campo.  até ai está uma maravilha. Meu problema esta nas store procedures e trigger criadas diretamente no banco.  Essa benditas eu não consigo alterar via codigo.  Copia exatamente igual esta funcionando no banco e na hora de rodar a aplicação ou seja ela teria que fazer o seguinte:   DROP trigger Comprado1 DROP procedure SdComprado   RECREATE PROCEDURE SDCOMPRADO (
 PCODIGO VARCHAR(13))
AS
 DECLARE VARIABLE VSALDO FLOAT;
BEGIN
  BEGIN
    SELECT SUM(PEDIDOCSUB.QUANTIDADE-PEDIDOCSUB.FATURADO) AS VSALDO
    FROM
    PEDIDOCSUB
    INNER JOIN PEDIDOC ON (PEDIDOCSUB.PEDIDO=PEDIDOC.PEDIDO)
    WHERE
    (PEDIDOC.SITUACAO = '1') AND
    (PEDIDOCSUB.CODIGO = :pcodigo)
    GROUP BY PEDIDOCSUB.CODIGO
    INTO:VSALDO;
  END   UPDATE ESTOQUE
  SET ESTOQUE.COMPRADO=:VSALDO
  WHERE ESTOQUE.CODIGO=:pcodigo;
  BEGIN
  SUSPEND;
  END
END   em seguida deveria recriar a trigger conforme abaixo   CREATE TRIGGER COMPRADO1 FOR PEDIDOCSUB
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  EXECUTE PROCEDURE SDCOMPRADO(NEW.CODIGO);
END   No entanto quando começa a criar a procedure ela dá um erro -104 e diz que na linha 1 coluna 313 tem algo que não foi identificado.  Então eu cheguei até a coluna 313 e percebi que ele diz que o sinal de ":" não esta sendo reconhecido ou é invalido.  O interessante é que esta exatamente igual no banco e funcionando faz 11 meses. Não mudei versão de banco nem de componente nada. Gostaria de saber se alguem se habilita a responder? Até um tempo atras eu tentei fazer isso mas como estava com pouco tempo acabei abandonando, mas naquela epoca, havio lido algo do tipo que quando se escreve um procedure ou uma trigger via codigo, parece que tem que eliminar o cabeçalho da mesma, não consigo me lembrar, portanto estou pedindo ajuda.
Mas vejam bem o codigo acima esta funcionando no banco hoje.  e se eu criar a mesma coisa com nome diferente diretamente no aplicativo de gerenciador de BD ele funciona normal.  Só não funciona quando eu tento criar via codigo no delphi.   obrigado a quem puder ajudar  
Responder

Posts

07/02/2010

Dev Comercial

Olá amigo, recentemente tivemos um problema parecido com esse ao tentar criar procedures via delphi.

A maneira que solucionamos foi com esse pequeno código. Mas não foi com componentes dbexpress

esse é o código que usamos.

SQLDataSet1.ParamCheck:=False;


Péricles Sosusa
Mega News Irecê Bahia
Responder

08/02/2010

Jose Narezzi

Carissimo Pericles   Obrigado pela tentativa de ajudar mas acho que voce não entendeu minha colocalção ou não me expressei corretamente.   Primeiro, não mencionei que uso o DbExpress e mesmo assim, voce disse que não utiliza o dbexpress mas referenciou um componente da dbexpress.   Se puder complementar a ajuda, agradeceria muito, se puder expor um exemplo de como criar a minha procedure em via codigo delphi seria muito.  Um exemplo da minha procedure foi exposto neste assunto.   Quanto ao que voce colocou eu realmente não entendi a sua dica, visto que o comando   sqldataset.paramcheck serviria para checar algum parametro mas de onde? da minha procedure? que razão teria isso.   A questão é que minha procedure que foi exposta no posta anterior, foi escrita diretamente no banco atraves do gerenciador FBMaestro e assim ela esta funcionado de boa.  mas se tento DROPAR e em seguida CREATE exatamente como ela estava, então da um erro onde esta o simbolo de ":"      INTO :VSALDO       obrigado se puder responder
Responder
Colega, o código abaixo foi copiado de sua postagem, então verifique se não é a falta de espaço.   DROP trigger Comprado1 DROP procedure SdComprado   RECREATE PROCEDURE SDCOMPRADO (
 PCODIGO VARCHAR(13))
AS
 DECLARE VARIABLE VSALDO FLOAT;
BEGIN
  BEGIN
    SELECT SUM(PEDIDOCSUB.QUANTIDADE-PEDIDOCSUB.FATURADO) AS VSALDO
    FROM
    PEDIDOCSUB
    INNER JOIN PEDIDOC ON (PEDIDOCSUB.PEDIDO=PEDIDOC.PEDIDO)
    WHERE
    (PEDIDOC.SITUACAO = '1') AND
    (PEDIDOCSUB.CODIGO = :pcodigo)
    GROUP BY PEDIDOCSUB.CODIGO
    INTO:VSALDO;  <== veja se não é a falta do espaço nesta linha.
  END   UPDATE ESTOQUE
  SET ESTOQUE.COMPRADO=:VSALDO
  WHERE ESTOQUE.CODIGO=:pcodigo;
  BEGIN
  SUSPEND;
  END
END   Boa sorte e bons códigos.
Responder

08/02/2010

Jose Narezzi

Ola Perivaldo   Realmente ja havia percebido esse espaço, gostaria muito que fosse somente isso mas ja fiz com espaço, sem espaço e se eu tiro os : ai ferro... da outro tipo de erro que indica que a expressao esta errada.   Dessa vez gerei o erro novamente e estou postando a imagem  aqui   Alem do que vou mostrar a forma que estou fazendo para executar [Code]/    {matando a trigger que aciona o a Procedure SDCOMPRADO }     IF triggerExists('COMPRADO0')=true then begin
    dm.CTemp1.Close;
    dm.CTemp1.Params.Clear;
    dm.CTemp1.CommandText:='DROP TRIGGER COMPRADO0 ';
    dm.CTemp1.Execute;
  end;    {matando a segunda trigger que aciona o a Procedure SDCOMPRADO }
  IF triggerExists('COMPRADO1')=true then begin
    dm.CTemp1.Close;
    dm.CTemp1.Params.Clear;
    dm.CTemp1.CommandText:='DROP TRIGGER COMPRADO1 ';
    dm.CTemp1.Execute;
  end;    {matando a procedure SDCOMPRADO }
  IF storeExists('SDCOMPRADO')=true then begin
    dm.CTemp1.Close;
    dm.CTemp1.Params.Clear;
    dm.CTemp1.CommandText:='DROP PROCEDURE SDCOMPRADO ';
    dm.CTemp1.Execute;
  end;    {Recriando a procedure SDCOMPRADO }
  IF storeExists('SDCOMPRADO')=False then begin
    dm.CTemp2.Close;
    dm.CTemp2.Params.Clear;
    dm.CTemp2.CommandText:=dm.SDCOMPRADO.SQL.Text;
    dm.CTemp2.Execute;
    showmessage('foi criada');
  end else begin
    showmessage('Já existe');
  end;
/[Code]   Se alguem me perguntar se o problema esta na funcçao que criei para testar a existencia das procedures ou das triggers, a resposta é: foram criadas e testadas e funcionam como uma maravilha.   Obrigado
Responder

09/02/2010

Jose Narezzi

Ola Pericles   Mil desculpas, voce estava certo, o único problema é que sua dica foi muito supercial para a minha capacidade de entendimento na hora que recebi a mensagem.   Me perdoe mesmo.   E gostaria de agrader de coração, não sabes quanto fiquei feliz depois de ter entendido a dica atraves de outros Foruns.   Estou usando o ZEOS como componente e nele tem o Paramcheck:=false como propriedade.           t.Close;
      t.SQL.Clear;
      t.ParamCheck:=false;
      t.SQL.Add(dm.SDCOMPRADO.SQL.Text);
      t.ExecSQL;         t.Close;
      t.SQL.Clear;
      t.ParamCheck:=false;
      t.SQL.Add(dm.COMPRADO0.SQL.Text);
      t.ExecSQL;         t.Close;
      t.SQL.Clear;
      t.ParamCheck:=false;
      t.SQL.Add(dm.COMPRADO1.SQL.Text);
      t.ExecSQL;
    Foi bater e valer.   muito obrigado
Responder

09/02/2010

Jose Narezzi

[RESOLVIDO]
Responder