Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ultimo dia Viernes de cada mes (https://www.clubdelphi.com/foros/showthread.php?t=38389)

Ricsato 13-12-2006 05:50:27

Ultimo dia Viernes de cada mes
 
Alguien conoce alguna funcion o consulta SQL que me regrese la fecha que le corresponde ya sea al Primer o Ultimo Viernes de cada mes utilizando Dephi 5 y SQL Server 2000?

Saludos desde Mexicali, B.C., Mexico.

Lepe 13-12-2006 11:58:41

En delphi sip, en sql ya es más dificil, no sé si sql server permite la creación de UDFs (funciones definidas por el usuario) si es así, puedes hacer una:

Código Delphi [-]
          // si la fecha de aviso era un martes,
          // averiguamos el primer martes del parametro Fecha

DecodeDayOfWeekInMonth(FechaAviso, y, m, an, d);
          NotaActualizada := EncodeDayOfWeekInMonth(YearOf(Fecha),
            MonthOf(Fecha),
            1,
            d);
el 1 indica que en la primera semana del mes
el d indica el día de la semana (lunes, martes, miercoles, etc)

Edito: esto pertenece a Delphi 6 (no sé si está disponible en delphi 5, consulta la ayuda)

Saludos

Ricsato 13-12-2006 19:14:36

Gracias
 
Agradezco tu ayuda, pero lamentablemente esa funcion no esta disponible para Delphi 5 :(

Lepe 13-12-2006 19:38:54

No sé si incumplo alguna norma del foro o licencia de Borland, si algún moderador lo sabe, que no dude en eliminar este mensaje e informarme de ello.

El código de la vcl es:
Código Delphi [-]

const   SInvalidDayOfWeekInMonth = '(%d, %d, %d, %d) is not a valid DayOfWeekInMonth quad';

procedure DecodeDayOfWeekInMonth(const AValue: TDateTime; out AYear, AMonth,
  ANthDayOfWeek, ADayOfWeek: Word);
var
  ADay: Word;
begin
  DecodeDate(AValue, AYear, AMonth, ADay);
  ANthDayOfWeek := (ADay - 1) div 7 + 1;
  ADayOfWeek := DayOfTheWeek(AValue);
end;

function EncodeDayOfWeekInMonth(const AYear, AMonth, ANthDayOfWeek,
  ADayOfWeek: Word): TDateTime;
begin
  if not TryEncodeDayOfWeekInMonth(AYear, AMonth, ANthDayOfWeek, ADayOfWeek, Result) then
    InvalidDayOfWeekInMonthError(AYear, AMonth, ANthDayOfWeek, ADayOfWeek);
end;

function TryEncodeDayOfWeekInMonth(const AYear, AMonth,
  ANthDayOfWeek, ADayOfWeek: Word; out AValue: TDateTime): Boolean;
var
  LStartOfMonth, LDay: Word;
begin
  LStartOfMonth := DayOfTheWeek(StartOfAMonth(AYear, AMonth));
  if LStartOfMonth <= ADayOfWeek then
    LDay := (ADayOfWeek - LStartOfMonth + 1) + 7 * (ANthDayOfWeek - 1)
  else
    LDay := (7 - LStartOfMonth + 1) + ADayOfWeek + 7 * (ANthDayOfWeek - 1);
  Result := TryEncodeDate(AYear, AMonth, LDay, AValue);
end;


procedure InvalidDayOfWeekInMonthError(const AYear, AMonth, ANthDayOfWeek,
  ADayOfWeek: Word);
begin
  raise EConvertError.CreateFmt(SInvalidDayOfWeekInMonth, [AYear, AMonth,
    ANthDayOfWeek, ADayOfWeek]);
end;

Quizás esta función la tenga ya:
Código Delphi [-]
function DayOfTheWeek(const AValue: TDateTime): Word;
begin
  Result := (DateTimeToTimeStamp(AValue).Date - 1) mod 7 + 1;
end;

Saludos

Ricsato 13-12-2006 20:32:24

Gracias por publicar el codigo
 
Gracias por compartir el codigo y aprovechando tu buena disposicion, compile el codigo que me enviaste, pero el compilador de delphi 5 me indica error de declaracion en las siguientes funciones:

YearOf(Fecha)
MonthOf(Fecha)
SInvalidDayOfWeekInMonth, [AYear, AMonth, ANthDayOfWeek, DayOfWeek]);
StartOfAMonth(AYear, AMonth)
TryEncodeDate(AYear, AMonth, LDay, AValue)

me imagino que estas funciones ya estan declaradas en delphi 6, te agradecere si me envias su codigo.

Saludos.

Lepe 13-12-2006 23:07:47

Edito el mensaje para que quede todo, es una simple constante declarada en otra unidad.

Añade "uses Dateutils", el resto de funciones si deben estar en delphi 5. He mirado pero son llamadas de unas funciones a otras, bastante lioso, es preferible que antes mires si ya las tienes disponibles.

Saludos

Ricsato 14-12-2006 00:08:52

Marca error en DateUtils
 
Añadi al Uses el DateUtils, pero caray, que lastima, creo que esa libreria es de Delphi 6, me marca "File no Found: DateUtils.dcu", bueno gracias por tu ayuda, intentare hacerlo creando alguna rutina.


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

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