Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Consulta não obedece parâmetro. Bug do Delphi?


Posts recomendados

Bom dia, amigos. Tenho um programa de cadastro de membros de uma igreja. Criei um relatório de aniversariantes entre duas datas. Por exemplo, seleciono duas datas (inicial e final) cada uma em um datetimepicker, e o grid me mostra os aniversariantes entre aquelas datas.

 

Contudo, quando a data inicial é em dezembro, e a final é em janeiro, o filtro buga. Ele acrescenta datas de outubro e novembro. E nada faz com que isso se acerte.

 

Meu código:

 


procedure TAniversarios.DateTimePicker1Change(Sender: TObject);

begin

    Edit2.Text := DateToStr(Datetimepicker1.Date);

    AdoQuery1.Close;

    AdoQuery1.SQL.Clear;

    AdoQuery1.SQL.Add('SELECT Nome, DtNasc, tel, Cel, Status FROM CadPessoas');

    AdoQuery1.SQL.Add('WHERE ( ((Month(DtNasc) * 100) + Day(DtNasc)) between :pinicial and :pfinal');

    AdoQuery1.SQL.Add('or ((Month(DtNasc) * 100) + Day(DtNasc)) between :pinicial2 and :pfinal2 )');

    ADOQuery1.SQL.add('and not (status in ('+QuotedStr('Falecido')+','+QuotedStr('Transferido')+','+QuotedStr('Desligado')+'))');

    AdoQuery1.SQL.Add('Order by Day(DtNasc)');

    AdoQuery1.Parameters.ParamByName('pinicial').Value := MonthOf(datetimepicker1.Date) * 100 + DayOf(datetimepicker1.Date);

    AdoQuery1.Parameters.ParamByName('pfinal').Value := MonthOf(datetimepicker2.Date) * 100 + DayOf(datetimepicker2.Date);

    AdoQuery1.Parameters.ParamByName('pinicial2').Value := MonthOf(datetimepicker1.Date) * 100 + DayOf(datetimepicker1.Date);

    AdoQuery1.Parameters.ParamByName('pfinal2').Value := MonthOf(datetimepicker2.Date) * 100 + DayOf(datetimepicker2.Date);

    if monthOf(Datetimepicker1.DateTime) > monthOf(Datetimepicker2.DateTime) then

    begin

        AdoQuery1.Parameters.ParamByName('pfinal').Value := 1231;

        AdoQuery1.Parameters.ParamByName('pinicial2').Value := 101;

    end;

    Adoquery1.Open;

end;

:

 

Assim, na minha lógica, se a data inicial for, por exemplo, 25 de dezembro e a data final for 5 de janeiro, estaria na condicional if, do código cima. Assim:

pinicial = 12 * 100 + 25 = 1225
pfinal = 1231
pinicial 2 = 101
pfinal2 = 1 * 100 + 5 = 105

Logo ele só poderia retornar os aniversários cuja soma fosse entre 101 e 105, e entre 1225 e 1231. Ou seja, os únicos aceitos seriam:

01, 02, 03, 04 e 05 de janeiro, cujas somas são, 101, 102, 103, 104 e 105, respectivamente e
25, 26, 27, 28, 29, 30 e 31 de dezembro, cujas somas são 1225, 1126, 1227, 1228, 1229, 1230 e 1231.

Mas aí está o problema. Ele também retorna datas de nascimento do mês 10 e do mês 11. Por exemplo, nessa consulta, ele retornou um aniversário de 29/10, um de 02/11 e um de 04/11, cujas somas são 1029, 1102 e 1104, três números que estão fora dos parâmetros, mas aparecem no grid.

E nada do que eu faça consegue resolver isso.

Penso que tem algo a ver com o mês 10 e 11 terem o número 1 na composição, mas acredito ser algo totalmente sem sentido.

Alguém pode tentar dar uma força?

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...