O que está errado nesta Procedure ??

Firebird

09/10/2006

Estou tentando executar a procedure abaixo (no IBExpert) - Está dando o seguinte erro:

[i:faf2904d8d]invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 31, char 2.
END.[/i:faf2904d8d]

Tentei com introduzir [SET TERM !! ;] (início e final da procvedure) - Mas o IBexpert não está aceitando esse termo - não sei por quê....

Vocês poderiam verificar o que está errado no código ??

Desde já, agradeço à atenção !!

[b:faf2904d8d]Segue procedure abaixo:[/b:faf2904d8d]


CREATE PROCEDURE ´COPIAR_DADOS_TAB_COMPRAS_PRECO´ (´I_AREANEGOCIO´ CHAR(5)
CHARACTER SET ASCII, ´I_EXERCICIO´ CHAR(5) CHARACTER SET ASCII,´I_VERSAO´
VARCHAR(15) CHARACTER SET ASCII )

AS

DECLARE VARIABLE COD_AREANEGOCIO CHAR(5);
DECLARE VARIABLE EXERCICIO CHAR(5);
DECLARE VARIABLE VERSAO CHAR(5);
DECLARE VARIABLE CODIGO_MATPRIMA CHAR(5);

BEGIN
FOR
SELECT C.COD_AREANEGOCIO, C.EXERCICIO, C.VERSAO, C.CODIGO_MATPRIMA

FROM
PLANO_COMPRAS_2(:I_AREANEGOCIO, :I_EXERCICIO , :I_VERSAO ) C

INTO :COD_AREANEGOCIO, : EXERCICIO, : VERSAO, :CODIGO_MATPRIMA

DO
BEGIN
INSERT INTO PLANO_COMPRAS_PRECO (COD_AREANEGOCIO, EXERCICIO, VERSAO,
CODIGO_MATPRIMA) VALUES (COD_AREANEGOCIO, EXERCICIO, VERSAO, CODIGO_MATPRIMA)
END
END;


Osvaldo Modesto

Osvaldo Modesto

Curtidas 0

Respostas

Cabelo

Cabelo

09/10/2006

É só tirar o ponte e vírgula depois do end


GOSTEI 0
Osvaldo Modesto

Osvaldo Modesto

09/10/2006

Valeu Cabelo !!
Vou testar + Tarde.
Depois falo como foi....

Muito Obrigado


GOSTEI 0
Osvaldo Modesto

Osvaldo Modesto

09/10/2006

Cabelo, Bom dia!!

Retirei o ponto-virgula [;] - Continua dando exatamente o mesmo erro...

A impressão que dá é que a linha anterior ao END tem alguma coisa errada...

Vc. tem alguma idéia do que pode ser??

Desde já, fico muito grato pela atenção


GOSTEI 0
Cabelo

Cabelo

09/10/2006

Colega.. tenta assim...

O que falta é um ponto e vírgula depois da intrução de insert..

CREATE PROCEDURE COPIAR_DADOS_TAB_COMPRAS_PRECO (
I_AREANEGOCIO CHAR(5) CHARACTER SET ASCII, 
I_EXERCICIO CHAR(5) CHARACTER SET ASCII,
I_VERSAO VARCHAR(15) CHARACTER SET ASCII
)
AS
DECLARE VARIABLE COD_AREANEGOCIO CHAR(5);
DECLARE VARIABLE EXERCICIO CHAR(5);
DECLARE VARIABLE VERSAO CHAR(5);
DECLARE VARIABLE CODIGO_MATPRIMA CHAR(5);
BEGIN
FOR
SELECT C.COD_AREANEGOCIO, C.EXERCICIO, C.VERSAO, C.CODIGO_MATPRIMA

FROM
PLANO_COMPRAS_2(:I_AREANEGOCIO, :I_EXERCICIO , :I_VERSAO ) C

INTO :COD_AREANEGOCIO, : EXERCICIO, : VERSAO, :CODIGO_MATPRIMA

DO
BEGIN
INSERT INTO PLANO_COMPRAS_PRECO (COD_AREANEGOCIO, EXERCICIO, VERSAO,
CODIGO_MATPRIMA) VALUES (COD_AREANEGOCIO, EXERCICIO, VERSAO, CODIGO_MATPRIMA);
END
END


Outra coisa.. por quê você usa esta aspas???? repare que eu retirei e irá funcionar perfeitamente..

Não há necessidade de usá-las..

Se executar a procedure exatamente como está tenho certeza que irá funcionar..

um abraço..


GOSTEI 0
Osvaldo Modesto

Osvaldo Modesto

09/10/2006

Cabelo, Beleza...
Obrigado pelo retorno!!

Também faltava 2 pontos (:) nos parametros logo após a instrução VALUE. Já compilei no IBExpert... Agora estou com outro probleminha:

Estou tentando executar esta procedure (ainda no IBExpert) com o seguinte código

EXECUTE PROCEDURE COPIAR_DADOS_TAB_COMPRAS_PRECO
´
Me dá o seguinte erro:

[i:80498be223]Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Dynamic SQL Error.
parameter mismatch for procedure COPIAR_DADOS_TAB_COMPRAS_PRECO.[/i:80498be223]

Se eu adicionar os parametros de entrada na sentença, como no código abaixo, dá outra msg.:

EXECUTE PROCEDURE COPIAR_DADOS_TAB_COMPRAS_PRECO (
i_areanegocio char(5),
i_exercicio char(5),
i_versao varchar(15))

Msg. Erro:

[i:80498be223]Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 2, char 3.
i_areanegocio.[/i:80498be223]

O que há de errado na instrução de execução ??

Obrigado pela atenção!!
Grande Abraço!!


GOSTEI 0
Sremulador

Sremulador

09/10/2006

verifique se o tamanho dos campos são compativeis com o tamanho das informalçoes que você esta passando...


GOSTEI 0
Cabelo

Cabelo

09/10/2006

Colega...

Você está usando o comando EXECUTE PROCEDURE, então tem que usar a procedure como se fosse no delphi, ou em qualquer linguagem..

EXECUTE PROCEDURE COPIAR_DADOS_TAB_COMPRAS_PRECO (
´teste´, ´2006´, ´Ver Teste´)

Assim deve funcionar...

No IBExpert compilou??? se não deu erro deve funcionar...


GOSTEI 0
Osvaldo Modesto

Osvaldo Modesto

09/10/2006

Cabelo, Boa Tarde!! – Obrigado pelo retorno!!

Está meio complicado aqui...

Primeiramente eu queria executar a procedure no IBExpert pra ver se funciona... Mandei a instrução na forma como vc. me deu:

[i:814d756499][[b:814d756499]i]EXECUTE PROCEDURE COPIAR_DADOS_TAB_COMPRAS_PRECO (
´teste´, ´2006´, ´Ver Teste´[/i:814d756499])[/b:814d756499][/i]

O IBExp executa, como o primeiro dado é incorreto, não atualiza a tabela, normal... Aí eu substitui o primeiro dado ‘ Teste’ por ‘12111’ que é um dado válido, o IBEXp dá a msg.:

[i:814d756499][b:814d756499]Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation[/b:814d756499][/i:814d756499].

Reparei que qualquer conjunto das 3 informações, onde pelo menos delas seja falsa – O IBExp compila, se as 3 forem verdadeiras – não compila.

Bem, depois dessas tentativas, fui tentar direto na aplicação....

Aqui também tenho dúvidas. Primeiro criei um esquema de conexão com 1 sqlStoredProc, 1 dataSetProvider, 1 ClientDataSet e 1 DataSource – Bem, o primeiro componente (SqlStoredProc – estou usando em substituição ao sqlQuery – pois a procedure que irei buscar não tem sentença RETURNS – está correto ??

Porém não consegui identificar no Object Inspector, onde colocar a instrução Execute Procedure....

Onde coloco a instrução EXECUTE PROCEDURE (...) nesse objeto ??

Bem, além disso tudo, agora estou em dúvida se uma procedure com parâmetros (como é o caso dessa...) servirá para fazer o que preciso... Não sei se construí a procedure da forma correta...

Relembrando, preciso que toda vez que a procedure PLANO_COMPRAS_2 “calcula” os volumes de compras, os campos COD_MATPRIMA, EXERCICIO, VERSAO e AREANEGOCIO, sejam copiados para outra tabela: PLANO_COMPRAS_PRECO, (de forma que o usuário, necessite apenas informar os preços de compra nessa ultima tabela). Isso deverá funcionar de forma automatica, trazendo todos esses dados... Se precisarmos informar parâmetros, só estaremos “copiando” os dados informados ??

Então pensando nisso tentei criar uma outra Procedure idêntica sem os parâmetros (ainda sem saber se isso é necessário...), deu o seguinte erro:


[i:814d756499][b:814d756499]Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.[/b:814d756499][/i:814d756499]

Da nova procedure (sem parâmetros) retirei o trecho abaixo:

( i_areanegocio char(5),
i_exercicio char(5),
i_versao varchar(15))



Então a procedure que tentei compilar está assim (acusando o erro acima)... O que está errado ??

CREATE PROCEDURE COPIAR_DADOS_COMPRAS_PRECO

as
declare variable cod_areanegocio char(5);
declare variable exercicio char(5);
declare variable versao char(5);
declare variable codigo_matprima char(5);
BEGIN
FOR
SELECT C.COD_AREANEGOCIO, C.EXERCICIO, C.VERSAO, C.CODIGO_MATPRIMA
FROM PLANO_COMPRAS_2 (:I_AREANEGOCIO, :I_EXERCICIO , :I_VERSAO )C
INTO :COD_AREANEGOCIO, :EXERCICIO, :VERSAO, :CODIGO_MATPRIMA

DO BEGIN
INSERT INTO PLANO_COMPRAS_PRECO (COD_AREANEGOCIO, EXERCICIO, VERSAO, CODIGO_MATPRIMA)
VALUES (:COD_AREANEGOCIO, :EXERCICIO, :VERSAO, :CODIGO_MATPRIMA);
END
END;

Desculpe ter me alongado tanto...

Novamente, Muito Obrigado pela Ajuda!!!


GOSTEI 0
Cabelo

Cabelo

09/10/2006

[quote:dc907ddaff=´Osvaldo Modesto´]Cabelo, Boa Tarde!! – Obrigado pelo retorno!![/quote:dc907ddaff]

Bom dia.. vamos lá..

Está meio complicado aqui... Primeiramente eu queria executar a procedure no IBExpert pra ver se funciona... Mandei a instrução na forma como vc. me deu: [i:dc907ddaff][[b:dc907ddaff]i]EXECUTE PROCEDURE COPIAR_DADOS_TAB_COMPRAS_PRECO ( ´teste´, ´2006´, ´Ver Teste´[/i:dc907ddaff])[/b:dc907ddaff][/i] O IBExp executa, como o primeiro dado é incorreto, não atualiza a tabela, normal... Aí eu substitui o primeiro dado ‘ Teste’ por ‘12111’ que é um dado válido, o IBEXp dá a msg.: [i:dc907ddaff][b:dc907ddaff]Arithmetic overflow or division by zero has occurred. arithmetic exception, numeric overflow, or string truncation[/b:dc907ddaff][/i:dc907ddaff].


Colega é o seguinte, esta mensagem dá erro quando há uma divisão por zero, ou o campo string é maior que o indicado, ou então quando existem caracteres especiais não indicados por um charset ou collate adequado. Qual é o charset que você está usando na conexão do IBExpert??

Reparei que qualquer conjunto das 3 informações, onde pelo menos delas seja falsa – O IBExp compila, se as 3 forem verdadeiras – não compila.


Repare que o mesmo problema ainda persiste..

Bem, depois dessas tentativas, fui tentar direto na aplicação.... Aqui também tenho dúvidas. Primeiro criei um esquema de conexão com 1 sqlStoredProc, 1 dataSetProvider, 1 ClientDataSet e 1 DataSource – Bem, o primeiro componente (SqlStoredProc – estou usando em substituição ao sqlQuery – pois a procedure que irei buscar não tem sentença RETURNS – está correto ?? Porém não consegui identificar no Object Inspector, onde colocar a instrução Execute Procedure.... Onde coloco a instrução EXECUTE PROCEDURE (...) nesse objeto ??


Você deve indicar o SQLConnection neste componente e indicar o nome da Procedure no Banco, assim:

SqlStoredProc.StoredProcName := ´COPIAR_DADOS_TAB_COMPRAS_PRECO´;
SqlStoredProc.ParamByName(´i_areanegocio´).AsString := ´Valor do parâmetro´;
SqlStoredProc.ParamByName(´i_exercicio´).AsString := ´Valor do parâmetro´;
SqlStoredProc.ParamByName(´i_versao´).AsString := ´Valor do parâmetro´;
SqlStoredProc.ExecProc;


Bem, além disso tudo, agora estou em dúvida se uma procedure com parâmetros (como é o caso dessa...) servirá para fazer o que preciso... Não sei se construí a procedure da forma correta... Relembrando, preciso que toda vez que a procedure PLANO_COMPRAS_2 “calcula” os volumes de compras, os campos COD_MATPRIMA, EXERCICIO, VERSAO e AREANEGOCIO, sejam copiados para outra tabela: PLANO_COMPRAS_PRECO, (de forma que o usuário, necessite apenas informar os preços de compra nessa ultima tabela). Isso deverá funcionar de forma automatica, trazendo todos esses dados... Se precisarmos informar parâmetros, só estaremos “copiando” os dados informados ?? Então pensando nisso tentei criar uma outra Procedure idêntica sem os parâmetros (ainda sem saber se isso é necessário...), deu o seguinte erro: [i:dc907ddaff][b:dc907ddaff]Column does not belong to referenced table. Dynamic SQL Error. SQL error code = -206. Column unknown.[/b:dc907ddaff][/i:dc907ddaff] Da nova procedure (sem parâmetros) retirei o trecho abaixo: ( i_areanegocio char(5), i_exercicio char(5), i_versao varchar(15)) Então a procedure que tentei compilar está assim (acusando o erro acima)... O que está errado ?? CREATE PROCEDURE COPIAR_DADOS_COMPRAS_PRECO as declare variable cod_areanegocio char(5); declare variable exercicio char(5); declare variable versao char(5); declare variable codigo_matprima char(5); BEGIN FOR SELECT C.COD_AREANEGOCIO, C.EXERCICIO, C.VERSAO, C.CODIGO_MATPRIMA FROM PLANO_COMPRAS_2 (:I_AREANEGOCIO, :I_EXERCICIO , :I_VERSAO )C INTO :COD_AREANEGOCIO, :EXERCICIO, :VERSAO, :CODIGO_MATPRIMA DO BEGIN INSERT INTO PLANO_COMPRAS_PRECO (COD_AREANEGOCIO, EXERCICIO, VERSAO, CODIGO_MATPRIMA) VALUES (:COD_AREANEGOCIO, :EXERCICIO, :VERSAO, :CODIGO_MATPRIMA); END END;


Colega.. sua procedure está bem estruturada.. deve funcionar.. só preste atenção nos tamanhos dos parâmetros e campos usados e sempre use um charset adequado.. tanto na conexão do IBExpert quanto na conexão do SQLConnection no Delphi..

Desculpe ter me alongado tanto... Novamente, Muito Obrigado pela Ajuda!!!


Não esquenta, enquanto puder ajudar estou aí..

Um abraço..


GOSTEI 0
Osvaldo Modesto

Osvaldo Modesto

09/10/2006

Valeu Cabelo!!

Obrigado pela ajuda e pelos códigos que enviou...

Vou avaliar os tópicos que vc. comentou.

Qq. problema posso lhe contatar novamente??

Muito Obrigado!!


GOSTEI 0
Cabelo

Cabelo

09/10/2006

Claro que sim...


GOSTEI 0
POSTAR