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..12of 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 = 0and ((Anos mod 100 <> 0or (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..15of 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;