Fórum Rotina de aniversariantes por período. #429805
27/11/2012
0
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
Curtir tópico
+ 0Posts
27/11/2012
Alisson Santos
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
27/11/2012
Sérgio Arantes
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
27/11/2012
Sérgio Arantes
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
27/11/2012
William
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
27/11/2012
William
DM_Pesq.SdsAniversario.CommandText := 'SELECT NOME, DATA_NASCIMENTO FROM sindicalizado WHERE cast(DATA_NASCIMENTO as date) between :di and :df';
Gostei + 0
29/11/2012
Sérgio Arantes
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
29/11/2012
Sérgio Arantes
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
Clique aqui para fazer login e interagir na Comunidade :)