Rotina de aniversariantes por período.

Delphi

27/11/2012

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

Curtidas 0

Respostas

Alisson Santos

Alisson Santos

27/11/2012

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.

GOSTEI 0
Sérgio Arantes

Sérgio Arantes

27/11/2012

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.
GOSTEI 0
Sérgio Arantes

Sérgio Arantes

27/11/2012

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.
GOSTEI 0
William

William

27/11/2012

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.
GOSTEI 0
William

William

27/11/2012

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';
GOSTEI 0
Sérgio Arantes

Sérgio Arantes

27/11/2012

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.
GOSTEI 0
Sérgio Arantes

Sérgio Arantes

27/11/2012

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.
GOSTEI 0
POSTAR