Duvida Cruel - A respeito de Datas

Delphi

21/02/2004

var Dia, Mes, Aviso : Integer; Arq : TextFile; Linha : String; begin AssignFile(Arq, ´C:\Aniversario.Txt´); Reset(Arq); Dia := StrToInt(FormatDateTime(´DD´,Date)); Mes := StrToInt(FormatDateTime(´MM´,Date)); While not Eof(Arq) do Readln(Arq,Linha); Aviso := StrToInt(Linha); Dia := Aviso + Dia; Query1.Close; Query1.SQL.Clear; Query1.Sql.text := ´SELECT * FROM CLIENTES WHERE EXTRACT(DAY FROM DT_NASCIMENTO)=:pDIA AND EXTRACT(MONTH FROM DT_NASCIMENTO)=:pMES´; Query1.ParamByName(´pDia´).AsInteger := Dia; Query1.ParamByName(´pMes´).AsInteger := Mes; Query1.Prepare; Query1.Open; Label1.Caption := ´Existe(m) ´+IntToStr(Query1.RecordCount) + ´ cliente(s) fazendo aniversário´; CloseFile(Arq); end;


tenho esse código que retorna alguns dias antes (o usuário que estipula o dia) apenas akeles clientes que irão fazer aniversário no mês. Mas cai numa dúvida cruel! Como vou fazer para saber se esse dia é válido? Exemplo, dia 30 e 31 não existem no mês de Fevereiro, mas se o meu usuário cadastrar no arquivo (não no banco de dados, mas no aviso) um dia que somado com o dia atual cair num desses dias? Tipo 21/02/2004 somado com 10 irá para 31/02/2004 (NÃO EXISTE ESSE DIA) o computador sabe, mas e meu sistema????
Vale Também para akeles meses que não vão até dia 31.

Valeu pela ajuda


Facc

Facc

Curtidas 0

Respostas

Facc

Facc

21/02/2004

// acrescente a unit DateUtils na cláusula uses var     Aviso : Integer;     Arq : TextFile;     Linha : String;     Data: TDateTime;     Plural: string[1]; begin     AssignFile(Arq, ´C:\Aniversario.Txt´);     Reset(Arq);     While not Eof(Arq) do         Readln(Arq,Linha);     CloseFile(Arq);     try         Aviso := StrToInt(Linha);     except         Aviso := 0;     end;     Data := Date + Aviso; // já traz a data correta, somando-se os dias     Query1.Close;     Query1.SQL.Clear;     Query1.Sql.Text := ´SELECT COUNT(DT_NASCIMENTO) TOTAL_CLIENTES FROM CLIENTES ´+                                           ´ WHERE EXTRACT(DAY FROM DT_NASCIMENTO) = :pDIA ´+                                           ´ AND EXTRACT(MONTH FROM DT_NASCIMENTO) = :pMES´;     Query1.ParamByName(´pDia´).AsInteger := DayOf(Data);     Query1.ParamByName(´pMes´).AsInteger := MonthOf(Data);     Query1.Prepare;     Query1.Open;     if Query1.FieldByName(´TOTAL_CLIENTES´).AsInteger > 1     then Plural := ´s´     else Plural := ´´;     Label1.Caption := ´Há ´+Query1.FieldByName(´TOTAL_CLIENTES´).AsString+ ´ cliente´+Plural+´ fazendo aniversário´; end;



daí no caso se eu quiser que apareça o nome do cliente que irá fazer aniversário, é só colocar depois do SELECT? eu tentei fazer mas retornou erro


GOSTEI 0
Rômulo Barros

Rômulo Barros

21/02/2004

Isso mesmo, você deverã adicionar na cláusula SELECT o campo referente ao nome do cliente e, ao final do seu sql, agrupar pelo nome do cliente:


// acrescente a unit DateUtils na cláusula uses
var
Aviso : Integer;
Arq : TextFile;
Linha : String;
Data: TDateTime;
Plural: string[1];
begin
AssignFile(Arq, ´C:\Aniversario.Txt´);
Reset(Arq);

While not Eof(Arq) do
Readln(Arq,Linha);
CloseFile(Arq);

try
Aviso := StrToInt(Linha);
except
Aviso := 0;
end;

Data := Date + Aviso; // já traz a data correta, somando-se os dias

Query1.Close;
Query1.SQL.Clear;
Query1.Sql.Text := ´SELECT [color=red:db9f1eecd8]NOMEDOCLIENTE[/color:db9f1eecd8],COUNT(DT_NASCIMENTO) TOTAL_CLIENTES FROM CLIENTES ´+
´ WHERE EXTRACT(DAY FROM DT_NASCIMENTO) = :pDIA ´+
´ AND EXTRACT(MONTH FROM DT_NASCIMENTO) = :pMES [color=red:db9f1eecd8]GROUP BY NOMEDOCLIENTE[/color:db9f1eecd8]´;
Query1.ParamByName(´pDia´).AsInteger := DayOf(Data);
Query1.ParamByName(´pMes´).AsInteger := MonthOf(Data);
Query1.Prepare;
Query1.Open;

if Query1.FieldByName(´TOTAL_CLIENTES´).AsInteger > 1
then Plural := ´s´
else Plural := ´´;

Label1.Caption := ´Há ´+Query1.FieldByName(´TOTAL_CLIENTES´).AsString+ ´ cliente´+Plural+´ fazendo aniversário´;
end;


GOSTEI 0
POSTAR