trigger e store procedure via codigo na aplicação
07/02/2010
0
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
Jose Narezzi
Posts
07/02/2010
Dev Comercial
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
08/02/2010
Jose Narezzi
08/02/2010
Perivaldo Martins
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.
08/02/2010
Jose Narezzi
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
09/02/2010
Jose Narezzi
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
Clique aqui para fazer login e interagir na Comunidade :)