trigger e store procedure via codigo na aplicação
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
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
Curtidas 0
Respostas
Dev Comercial
07/02/2010
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
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
GOSTEI 0
Jose Narezzi
07/02/2010
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
GOSTEI 0
Perivaldo Martins
07/02/2010
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.
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.
GOSTEI 0
Jose Narezzi
07/02/2010
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
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
GOSTEI 0
Jose Narezzi
07/02/2010
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
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
GOSTEI 0
Jose Narezzi
07/02/2010
[RESOLVIDO]
GOSTEI 0