 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sex Dez 15, 2006 5:45 pm Assunto: Problemas de compilaçao em um Stored Procedure? |
|
|
Olah pessoal estou tentando compilar essa Stored Procedure no Firebird 2.0, mais esta dando erro
Citação: | CREATE PROCEDURE DVMODULO10
AS
declare variable V_SOMA integer;
declare variable V_REGISTRO integer;
declare variable V_MULTIPLICADOR integer;
declare variable I integer;
declare variable J integer;
declare variable H integer;
declare variable N integer;
begin
V_SOMA=0; V_REGISTRO=0; V_MULTIPLICADOR=2;
I=strlen(STR); H=I;
J=1;
while (J<=I) do
begin
V_REGISTRO=cast((substrlen(STR,H,1))as integer)*V_MULTIPLICADOR;
V_SOMA=V_SOMA+V_REGISTRO;
if (V_MULTIPLICADOR = 2) then V_MULTIPLICADOR=1;
else V_MULTIPLICADOR=V_MULTIPLICADOR+1;
J=J+1; H=H-1;
end
N=V_SOMA;
-- encontrar o primeiro múltiplo de 10 imediatamente
-- superior ao resultado V_SOMA
while(mod(N,10)<>0)do
begin
N=N+1;
end
DV=abs(N - V_SOMA); --efetuar a diferença retornando um número positivo(ABS)
/* Procedure Text */
suspend;
end | Da erro na compilaçao na linha em negrito
Código: | An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Function unknown.
STRLEN. |
Achei um artigo interessante no Active, mais pelo visto o Autor Lucio Mauro Marquezi Ferro – luciomarqueziferro@yahoo.com.br nao respondeu a duvida la que foi postado. Que no caso eh a mesma que eu tenho.
Nao sou familiarizado com SP. por isso nao sei o motivo do erro gerado, me pareçe que pode ser algo com UDF, numa parte que ele escreve assim
Citação: | Lembrando que estas funções são para o Firebird, sendo que para serem usadas em outros SGBD 's se faz necessário converte-las para suas linguagens correspondentes. Um outro detalhe é que algumas UDFs utilizadas no código fazem parte das bibliotecas de funções padrão do Firebird (fbudf e ib_udf), que devem ser instaladas na pasta UDF no diretório de instalação do Firebird. |
O link para quem quiser dar uma olhada eh esse
http://www.activedelphi.com.br/modules.php?op=modload&name=News&file=article&sid=120
Obs: Alguem ja tentou usar essa rotina? Achei bem legal, e queria testa-la no meu projeto. |
|
Voltar ao Topo |
|
 |
Maick Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2004 Mensagens: 183 Localização: Interior SP
|
Enviada: Dom Dez 17, 2006 7:27 pm Assunto: |
|
|
Olá Adriano.
Eu nunca utilizei o FireBird, sempre utilizei o MySQL por isso ñ sei se meu post lhe sera util, mas acho q ñ custa tentar ajudar.
No MySQL ocorre um erro parecido, e quando ele ocorre a solução é colocar o nome da Stored Procedure entre aspas invertida ` ` ou melhor ainda.. colocar o nome do banco.nome da Stored Procedure
Ex:
`NomedoDoBanco`.`Login`(parametros)
Não sei se vai resolver, mas acho q ñ custa tentar...
Flws
[]s |
|
Voltar ao Topo |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Seg Dez 18, 2006 7:33 pm Assunto: |
|
|
Adriano, você registrou essa UDF para seu banco?
Ela faz parte das UDF's que acompanham o Firebird.
Mas se preferir, no Firebird 2.0 existe uma função que substitui a strlen, a characterlength. Usando essa, não precisa registrar a UDF. _________________ Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Dez 19, 2006 9:20 am Assunto: |
|
|
Pessoal, nao consegui, as UDFs ja estavam registradas e tambem
strlen, a characterlength nao funcionou, a nao ser que eu nao saiba fazer.
o codigo eh esse
Código: | CREATE PROCEDURE DVMODULO10
AS
declare variable V_SOMA integer;
declare variable V_REGISTRO integer;
declare variable V_MULTIPLICADOR integer;
declare variable V_RESTO integer;
declare variable DV integer;
declare variable I integer;
declare variable J integer;
declare variable H integer;
begin
V_SOMA=0; V_REGISTRO=0; V_MULTIPLICADOR=2;
I=characterlength(); --pegar o tamanho da string
H=I;
J=1;
while (J<I>=10) then DV=0;
else DV=V_RESTO;
suspend;
end |
e o erro eh esse
Citação: | An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Function unknown.
STRLEN. |
Se eu usar o CHARACTERLENGTH
da esse erro
Citação: | An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Function unknown.
CHARACTERLENGTH. | .
Mais tanto uma funçao como a outra, tive que deixar a linha assim
I=characterlength(); --pegar o tamanho da string
ou I=strlen(); --pegar o tamanho da string
E no artigo original esta assim
I=strlen(STR); --pegar o tamanho da string
Outra que eu tive que fazer para pelo menos compilar foi declarar a variavel DV
declare variable DV integer;
Bom pessoal, nao sei como fazer ou se tem como fazer essa SP.
Mesmo assim valeu pela ajuda.
------------------editado---------------
Ueh parece que o forum esta com probelmas, nao estou conseguindo mandar o codigo todo. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Ter Dez 19, 2006 12:06 pm Assunto: |
|
|
Adriano, tente assim:
Código: |
CREATE PROCEDURE DVMODULO10 (STR VARCHAR(9))
RETURNS (DV INTEGER)
AS
declare variable V_SOMA integer;
declare variable V_REGISTRO integer;
declare variable V_MULTIPLICADOR integer;
declare variable I integer;
declare variable J integer;
declare variable H integer;
declare variable N integer;
begin
V_SOMA=0; V_REGISTRO=0; V_MULTIPLICADOR=2;
I=CHARACTER_LENGTH(STR);
H=I;
J=1;
while (J<=I) do begin
V_REGISTRO=cast( (substring(STR from H for 1) )as integer)*V_MULTIPLICADOR;
V_SOMA=V_SOMA+V_REGISTRO;
if (V_MULTIPLICADOR = 2) then
V_MULTIPLICADOR=1;
else
V_MULTIPLICADOR=V_MULTIPLICADOR+1;
J=J+1; H=H-1;
end
N=V_SOMA;
while(mod(N,10)<>0)do begin
N=N+1;
end
DV=(N - V_SOMA);
IF DV < 0 THEN
DV = DV * (-1);
suspend;
end
|
Pode ser que tenha algum ajuste a ser feito, mas se tiver é coisa pouca.
Note que DV é um retorno, e não uma variável. E outra coisa, que foi falha minha, escreve-se character_length() e não characterlength() como eu havia dito. Quanto ao strlen, pelo erro que apareceu (mostrado em seu primeiro post) ele deve estar registrado com outro nome. E, quanto a criar ou não a variável DV: não deve criar uma variável, mas sim um retorno, para capturar o resultado da procedure. _________________ Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django
Editado pela última vez por thomazs em Ter Dez 19, 2006 6:51 pm, num total de 1 vez |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Ter Dez 19, 2006 1:31 pm Assunto: |
|
|
thomazs escreveu: | Adriano, tente assim:
Código: |
CREATE PROCEDURE DVMODULO10
RETURNS (DV INTEGER)
AS
declare variable V_SOMA integer;
declare variable V_REGISTRO integer;
declare variable V_MULTIPLICADOR integer;
declare variable I integer;
declare variable J integer;
declare variable H integer;
declare variable N integer;
begin
V_SOMA=0; V_REGISTRO=0; V_MULTIPLICADOR=2;
I=CHARACTER_LENGTH(STR);
H=I;
J=1;
while (J<=I) do begin
V_REGISTRO=cast( (substring(STR from H for 1) )as integer)*V_MULTIPLICADOR;
V_SOMA=V_SOMA+V_REGISTRO;
if (V_MULTIPLICADOR = 2) then
V_MULTIPLICADOR=1;
else
V_MULTIPLICADOR=V_MULTIPLICADOR+1;
J=J+1; H=H-1;
end
N=V_SOMA;
while(mod(N,10)<>0)do begin
N=N+1;
end
DV=(N - V_SOMA);
IF DV < 0 THEN
DV = DV * (-1);
suspend;
end
|
Pode ser que tenha algum ajuste a ser feito, mas se tiver é coisa pouca.
Note que DV é um retorno, e não uma variável. E outra coisa, que foi falha minha, escreve-se character_length() e não characterlength() como eu havia dito. Quanto ao strlen, pelo erro que apareceu (mostrado em seu primeiro post) ele deve estar registrado com outro nome. E, quanto a criar ou não a variável DV: não deve criar uma variável, mas sim um retorno, para capturar o resultado da procedure. | Olah Thomazs, boa tarde, e como eu coloco esse RETURN?
Desculpe eu nao saber, mais to usando o Edit do IBExpert, e nao consigo coloca-lo.
Citação: | CREATE PROCEDURE DVMODULO10
RETURNS (DV INTEGER) |
Obrigado pela atençao amigo. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
 |
thomazs Moderador


Registrado: Segunda-Feira, 1 de Março de 2004 Mensagens: 2835
|
Enviada: Ter Dez 19, 2006 6:49 pm Assunto: |
|
|
Adriano, você deve dar um "Select" para pegar o return. Por exemplo:
SELECT DV FROM DVMODULO10('123456789') _________________ Suporte e Consultoria em Desenvolvimento de Sistemas
Bacharel em Sistemas de Informação
Especialista em Bancos de Dados
Desenvolvimento: Clipper, Delphi, PHP, Python/Django |
|
Voltar ao Topo |
|
 |
adriano_servitec Colaborador

Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|