Tempo - datecalc e separadatas |
Top Previous Next |
|
// Calcula datas: // Data := DataCalc( Date, 10, 0, 0); // Daqui a 10 dias... // Data := DataCalc( Date, 0, 90, 0); // Daqui a 2 meses... // Data := DataCalc( Date, 0, -1, 0); // Mes passado (dia de hoje) // Data := DataCalc( Date, 10, -1, 20); // Soma 10 dias, do mês passado, e mostra isso daqui a vinte anos
Function DataCalc(Data:TDateTime; D, M, A:Integer): TDateTime; Const Mj: array[1..12] of Integer=(31,28,31,30,31,30,31,31,30,31,30,31); Var Add: Integer; Dias, Meses, Anos: Word; Begin DecodeDate(Data, Anos, Meses, Dias); Dias := Dias + D; Meses := Meses + M; Anos := Anos + A;
While TRUE do begin Anos := Anos + ( Meses - 1 ) div 12; Meses:= ( Meses - 1 ) mod 12 + 1; If Meses <= 0 then begin Inc( Meses, 12); Dec( Anos ); end; If ((Anos mod 4 = 0) and ((Anos mod 100 <> 0) or (Anos mod 400 = 0))) and ( Meses = 2) then Add:=1 // Bissexto (Fevereiro + 1) else Add:=0; If ( Dias > 0 ) and ( Dias <= ( Mj[ Meses ] + Add)) then break; If Dias > 0 then begin Dec( Dias, Mj[ Meses ] + Add ); Inc( Meses ); end else begin Inc( Dias, Mj[ Meses ] + Add ); Dec( Meses ); end; end; Result := EncodeDate( Anos, Meses, Dias ); end;
// Esta função usa os prazos no formato 30/60/90 ou 60.120,150 e devolve // As datas somadas na matriz result (TMatrizData=MD) MD.Data[1], MD.Data[2]... // Consulte MD.Quant = quantidade de datas e MD.OK = False Para entrada errada
Type TMatrizData = Record Data : Array [1..15] of TDateTime; Quant : Byte; Resultado : Integer; end;
Function SeparaDatas(Prazos : String; DataInicial:TDateTime ): TMatrizData; var DataR : TMatrizData; Dias,E : Integer; I,T : Byte; S : String; D,M,A : Word; begin DataR.Resultado := -1; E := 0;
S := Prazos; S := TrocaString(',','/',S,True); // Troca , por / S := TrocaString('.','/',S,True); // Troca . por / S := TrocaString('\','/',S,True); // Troca \ por / S := TrocaString(';','/',S,True); // Troca ; por / S := TrocaString(':','/',S,True); // Troca : por /
T := Ocorrencias(S,'/')+1; If T > 15 then T := 0; Dias := 0; // Dias=0 para não dar HINT For I:=1 to T do begin Try Dias := StrToInt( SeparaString(S,'/',I) ); If E > Dias then Begin DataR.Resultado := -2; Result := DataR; Exit; end; E := Dias; Except // DEU ERRO, o usuário não digitou apenas numeros... Result := DataR; Exit; end; // Usa a DataCalc DecodeDate( DataInicial, A, M, D); DataR.Data[I] := DataCalc(D + Dias,M,A); end; DataR.Resultado:= 0; DataR.Quant := T; Result := DataR; end; |