Fórum Rotina de aniversariantes por período. #429805

27/11/2012

0

Estou tentando fazer uma rotina para me retornar os aniversariantes em um determinado período, porem estou recebendo a mensagem " input parameter mismatch for procedure" abaixo segue a parte do código para analise.
Antes informações sobre o que estou utilizando:
Delphi XE3 e SGBD FIREBIRD 2.1.
No Firebird, criei uma Procedure conf abaixo:
SET TERM ^ ;

create or alter procedure PRC_ANIVERSARIO (
DT_INI timestamp,
DT_FIM timestamp)
returns (
NOME varchar(60) collate PT_BR,
DT_NASC timestamp)
as
begin
WHILE (DT_INI <= DT_FIM) DO
BEGIN
FOR SELECT NOME, DATA_NASCIMENTO FROM sindicalizado WHERE
EXTRACT(DAY FROM DATA_NASCIMENTO) = EXTRACT(DAY FROM :DT_INI) AND
EXTRACT(MONTH FROM DATA_NASCIMENTO) = EXTRACT(MONTH FROM :DT_INI)
ORDER BY NOME, DATA_NASCIMENTO INTO :NOME, :DT_NASC DO SUSPEND;
DT_INI = DT_INI + 1;
END
End^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON SINDICALIZADO TO PROCEDURE PRC_ANIVERSARIO;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PRC_ANIVERSARIO TO SYSDBA;

em Delphi, para executar a procedure, o codigo que estou utilizando é:
DM_Pesq.SdsAniversario.Close;
DM_Pesq.SdsAniversario.CommandText := 'select * from prc_aniversario(' + dt_ini +', ' + dt_fim+')';
DM_Pesq.SdsAniversario.Open;

Onde dt_ini = NOW e dt_fim = NOW + Quantidade de dias desejado.

Quando em entro com o cod em SQL gerado acima no commandText direto no SqlDataSet, funciona, mais quando entro pelo codigo acima, recebo a mensagem:
input parameter mismatch for procedure
Não sei onde estou errando.

Ps. é minha primeira vez utilizando Procedure no Firebird. Esta rotina retirei da internet, porem não consegui utilizar em meu programa.
Desde já agradeço a todos que me ajudarem.
Sérgio Arantes

Sérgio Arantes

Responder

Posts

27/11/2012

Alisson Santos

Bom dia Amigo

Notei que está passando os valores
DT_INI timestamp,
DT_FIM timestamp
Só que são campo data, ao invés de passar como timestamp passa como date mesmo e faz o teste novamente.

Só não sei o por que para uma rotina desse tipo para retornar uma consulta simples.
Acho que se fisesse direto no delphi ficaria melhor.

Responder

Gostei + 0

27/11/2012

Sérgio Arantes

Obrigado pela resposta, vou tentar alterar, utilizei dessa forma que foi como achei na internet.
Fazer essa consulta direto pelo delphi, eu achei que seria mais demorado. Não sei como fazer em SQL direto. Se tiver alguma coisa desse tipo para que eu possa alterar meu modo por um melhor eu agradeço.
Responder

Gostei + 0

27/11/2012

Sérgio Arantes

Obrigado pela resposta, vou tentar alterar, utilizei dessa forma que foi como achei na internet.
Fazer essa consulta direto pelo delphi, eu achei que seria mais demorado. Não sei como fazer em SQL direto. Se tiver alguma coisa desse tipo para que eu possa alterar meu modo por um melhor eu agradeço.
Responder

Gostei + 0

27/11/2012

William

Colega acho que é essa consulta deve facilitar um pouco, estou fazendo um cast para date na instrução SQL:

DM_Pesq.SdsAniversario.Close;
DM_Pesq.SdsAniversario.SQL.Add('SELECT NOME, DATA_NASCIMENTO FROM sindicalizado WHERE cast(DATA_NASCIMENTO as date) between :di and :df');
DM_Pesq.SdsAniversario.ParamByName('di').AsDate := Now;
DM_Pesq.SdsAniversario.ParamByName('df').AsDate := IncDay(Now, 10);
DM_Pesq.SdsAniversario.Open;


Note que estou usando a função incDay para incrementar 10 dias, mas vc pode incrementar quantos dias quiser.

Para usar essa função declare na cláusula Uses do form a Unit DateUtils.

Qualquer problema poste novamente.
Responder

Gostei + 0

27/11/2012

William

Desculpe a falha, no SQLDataSet atribuímos a instrução ao CommandText e não adicionamos (Add), correto é assim:

DM_Pesq.SdsAniversario.CommandText := 'SELECT NOME, DATA_NASCIMENTO FROM sindicalizado WHERE cast(DATA_NASCIMENTO as date) between :di and :df';
Responder

Gostei + 0

29/11/2012

Sérgio Arantes

wllfl,

Tentei esta rotina, porem não me retornou nenhum aniversariante (tentei direto no CommandText do SdsAniverariantes substituindo os parametros pela data 01/01/2012 e 12/12/2012 (teria que me retornar quase todos os clientes, ficando apenas de fora, os cliente que fazem aniversario apos 13/12.
Tentei direto, pois não estava funcionado pela linha de código, e também não acusa nenhum erro. o comando tem que ignorar o ano, o que não esta acontecendo, pois como trata-se de aniversario, o ano é diferente para cada cliente. em teste utilizando um determinado ano (1973) retorno todos que nasceram nesta data.
Responder

Gostei + 0

29/11/2012

Sérgio Arantes

consegui resolver. Segue abaixo como ficou o codigo.

DM_Pesq.SdsAniversario.Close;
DM_Pesq.SdsAniversario.CommandText := 'select * from prc_aniversario(:dt_ini, :dt_fim)';
DM_Pesq.SdsAniversario.ParamByName('dt_ini').AsDate := Now;
DM_Pesq.SdsAniversario.ParamByName('dt_fim').AsDate := IncDay(Now, 15);
DM_Pesq.SdsAniversario.Open;

Para passar a data, tem que ser por parametro.

RESOLVIDO

Obrigado a todos que viram o post e a todos que me ajudaram.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar