ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Problemas de compilaçao em um Stored Procedure?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Dez 15, 2006 5:45 pm    Assunto: Problemas de compilaçao em um Stored Procedure? Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Maick
Aprendiz
Aprendiz


Registrado: Terça-Feira, 10 de Agosto de 2004
Mensagens: 183
Localização: Interior SP

MensagemEnviada: Dom Dez 17, 2006 7:27 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
thomazs
Moderador
Moderador


Registrado: Segunda-Feira, 1 de Março de 2004
Mensagens: 2835

MensagemEnviada: Seg Dez 18, 2006 7:33 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Dez 19, 2006 9:20 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
thomazs
Moderador
Moderador


Registrado: Segunda-Feira, 1 de Março de 2004
Mensagens: 2835

MensagemEnviada: Ter Dez 19, 2006 12:06 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Dez 19, 2006 1:31 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
thomazs
Moderador
Moderador


Registrado: Segunda-Feira, 1 de Março de 2004
Mensagens: 2835

MensagemEnviada: Ter Dez 19, 2006 6:49 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Dez 20, 2006 9:37 am    Assunto: Responder com Citação

thomazs escreveu:
Adriano, você deve dar um "Select" para pegar o return. Por exemplo:

SELECT DV FROM DVMODULO10('123456789')


Agora complicou mais anida Thomazs...Aonde faço este select?

To confuso, quero ver se eu consigo fazer essa SP dentro do IBExpert, ai to indo em New Procedure para criar essa SP. Mais nao esta compilando.

Se puder me explicar com mais clareza, fico agradecido.

Muito obrigado amigo
Abraços
Adriano.
_________________
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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB