Rotina de aniversariantes por período.
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.
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
Curtidas 0
Respostas
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.
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
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.
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
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.
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
27/11/2012
Colega acho que é essa consulta deve facilitar um pouco, estou fazendo um cast para date na instrução SQL:
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.
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
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
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.
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
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.
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