Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Fechas de Pagos 15 y 30 de cada mes! (https://www.clubdelphi.com/foros/showthread.php?t=67862)

TheNew 10-05-2010 23:11:13

Fechas de Pagos 15 y 30 de cada mes!
 
Hola a todos los miembros de este gran equipo. Soy novato de delphi y necesito saber como hago un bucle para fechas de pago 15 y 30 de
cada mes y que pueda aceptar tambien el cambio del año, si es visiesto.
Gracias de antemano.

Ej: 15/01/2010
30/01/2010
15/02/2010
28/02/2010
15/03/2010
30/03/2010

ecfisa 11-05-2010 03:14:44

Hola TheNew.

No está muy claro el planteo de lo que querés hacer, pero supongo que querrás validar los ingresos,
de forma que no acepte fechas que no estén entre los días 15 y el máximo día del mes ingresado.
Para correr el código siguiente deberás previamente complementar con ceros.
Por ejemplo si ingresa la cadena: '2/2/2008' tendrás que llevarla a: '02/02/2008'.
Esto se simplificaría si usaras TDate como argumento de la función... es más,
sería sencillísimo si usaras por ejemplo; un TDateTimePicker para el ingreso de las fechas,
puesto que sólo tendrías que verificar el día:
if YearOf(Date) < 15 then 'Error' (YearOf está en la Unit DateUtils).

Pero suponiendo que usamos un TEdit sería:
Código:

{ SUPONE FECHA EN FORMATO : DD/MM/AAAA }
function FechaEnRango(Fecha: string): Boolean;
{$J+}
const DiasMes: array[1..12] of Byte=(31,28,31,30,31,30,31,31,30,31,30,31);
{$J-}
var
  Dia,Mes,Anio: Integer;
begin
  Result:= True;
  Anio:= StrToInt(Copy(Fecha,7,4));
  Mes:=  StrToInt(Copy(Fecha,4,2));
  Dia:=  StrToInt(Copy(Fecha,1,2));
  // si el año es bisiesto agregar 1 día a enero
  if ((Anio mod 4 = 0)and(Anio mod 100 <> 0))or(Anio mod 400 = 0) then
  DiasMes[2]:= DiasMes[2] + 1;
  if (Dia < 15)or(Dia > DiasMes[Mes]) then Result:= False;
end;

Espero te pueda servir.

Saludos.

TheNew 11-05-2010 17:44:45

Gracias ecfisa. pero me gustaria saber en realidad como desplego en un dbgrid la amortizacion de las fechas. osea visualizar en el grid por medio de un bucle los dias de pagos asi.

cuota fecha pago valor cuota
1 15/01/2010 1500
2 30/01/2010 1500
3 15/02/2010 1500
4 28/02/2010 1500

la cantidad de cuotas las tomo de un Tedit y el valor de las cuotas la obtengo al calcular los field del adoquery. pero no se manejar las fechas para hacer un bucle con ellas, donde solo se pueda visualizar los cortes los 15 y 30 dias de cada mes. Infinitamente agradecido por tu disposicion a ayudarme.

ecfisa 11-05-2010 21:55:26

Hola de nuevo, ahora sí está claro.

Mirá, se me ocurre esto:
Código:

procedure TForm1.PonerFechas(AYear: string);
{$J+}
const
  DiasMes: array[1..12] of string=('31','28','31','30','31','30',
      '31','31','30','31','30','31');
  Mes: array[1..12] of string=('01','02','03','04','05','06','07',
      '08','09','10','11','12');
{$J-}
var
  i,Anio: Integer;
  FeStr: string;
  BM: TBookMarkStr;
  d15: Boolean;
begin
  Anio:= StrToInt(AYear);
  if ((Anio mod 4 = 0)and(Anio mod 100 <> 0))or(Anio mod 400 = 0) then
  DiasMes[2]:= '29';
  d15:= False;
  // al último para agregar, guardar 1er fecha
  with tbPrueba do
  begin
    Last;
    Append;
    FieldByName('FECHA').Value:= '15/' + Mes[1] + '/' +AYear;
    Post;
    BM:= Bookmark; // guardar posicion para ingresar
    for i:= 2 to 12 do
    begin
      Append;
      d15:= not d15;
      if d15 then
        FeStr:= '15'
      else
        FeStr:= DiasMes[i];
      FieldByName('FECHA').Value:= FeStr + '/' + Mes[i] + '/' +AYear;
      Post;
    end;
    Bookmark:= BM;  // en posición de ingreso
  end;
end;

El código crea las fechas en el DBGrid (en realidad en el DataSet), respetando
los días 29 de enero de los años bisiestos, por supuesto deberá existir el campo 'FECHA'
en el DataSet.

Saludos.

TheNew 12-05-2010 00:16:18

Gracias amigo. pero aun no se como ejecutar ese procedimiento en un TButton, como te dige al inicio soy novato de delphi7. Como hago para ejecutar este procedimiento al hacer click en un Tbutton.

ecfisa 12-05-2010 03:22:26

Hola, disculpame, ya te pongo dos formas de llamarlo.

Código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  PonerFechas('2000');
end;

o también:
Código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  PonerFechas(Edit1.Text); // suponiendo que allí tengas el año
end;

Saludos.

ecfisa 12-05-2010 03:43:10

Hola TheNew.

Mil disculpas, cometí un error al copiar y pegar. Puse una versión anterior de mis pruebas.
Pero como todavía no pudiste probarla, estoy a tiempo.

Esta es la que funciona:
Código:

procedure TForm1.PonerFechas(AYear: string);
{$J+}
const
  DiasMes: array[1..12] of string=('31','28','31','30','31','30',
      '31','31','30','31','30','31');
  Mes: array[1..12] of string=('01','02','03','04','05','06','07',
      '08','09','10','11','12');
{$J-}
var
  i,Anio: Integer;
  BM: TBookMarkStr;
begin
  Anio:= StrToInt(AYear);
  if ((Anio mod 4 = 0)and(Anio mod 100 <> 0))or(Anio mod 400 = 0) then
  DiasMes[2]:= '29';
  with tbPrueba do
  begin
    Last;  // al último para agregar, guardar 1er fecha
    BM:= Bookmark; // guardar posicion para ingreso
    for i:= 1 to 12 do
    begin
      Append; // agregar dia 15 del mes 'i'
      FieldByName('FECHA').Value:= '15/' + Mes[i] + '/' +AYear;
      Post;
      Append; // agregar dia 'N' del mes 'i'
      FieldByName('FECHA').Value:= DiasMes[i]+'/'+ Mes[i] + '/' +AYear;
      Post;
    end;
    Bookmark:= BM;  // en posición de ingreso
  end;
end;

Perdón nuevamente y Saludos.

TheNew 25-05-2010 22:21:17

Mil Gracias amigo.

ecfisa 26-05-2010 04:10:51

De nada, ha sido un gusto.:)


La franja horaria es GMT +2. Ahora son las 23:41:38.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi