28 de abril de 2006

Funciones de fecha del API de Windows en Visual FoxPro

Estas funciones hacen más fácil trabajar con los nombres de los días y los nombres del mes en el idioma/formato configurado por el usuario en el sistema operativo , utilizando las funciones API disponibles en Windows.

CDOWEX(dFecha, nFormato)
Acepta como primer parámetro una fecha o un número de día del 1 al 7 (1 es Lunes). Devuelve una cadena con el nombre completo o el nombre abreviado correspondiente al día de la semana.
  • dFecha: es una expresión de fecha, o un número del 1 al 7 que representa un día de la semana, siendo 1 el día Lunes.
  • nFormato: indica el formato deseado, puede ser 1, "S" (Short), "C" (Corto) ó 2, "L" (Long o Largo). El valor por omisión es 2.
Ejemplo:
? CDOWEX(1,2)
Lunes
? CDOWEX(Date(2007,1,3),1)
Mié
CMONTHEX(dFecha, nFormato)
Acepta como primer parámetro una fecha o un número de mes del 1 al 12. Devuelve una cadena con el nombre completo o abreviado correspondiente al mes.
  • dFecha: es una expresión de fecha, o un número del 1 al 12 que representa un mes del año, siendo 1 el mes Enero.
  • nFormato: indica el formato deseado, puede ser 1, "S" (Short), "C" (Corto) ó 2, "L" (Long o Largo). El valor por omisión es 2.
Ejemplo:
? CMONTHEX(1,1), CMONTHEX(1,2)
Ene Enero
? CMONTHEX(Date(2007,12,7),1), CMONTHEX(12,2)
Dic Diciembre
CDATEEX(dFecha, nFormato)
Acepta como primer parámetro una fecha o una expresión cualquiera. Devuelve una cadena con la fecha formateada según el formato del sistema.
  • dFecha: es una expresión de fecha, si se pasa cualquier otro tipo de valor, la función utiliza el valor de DATE() como expresión de fecha.
  • nFormato: indica el formato deseado, puede ser 1, "S" (Short), "C" (Corto) ó 2, "L" (Long o Largo). El valor por omisión es 2.
Ejemplo:
? CDATEEX(Date(),1)
20/04/2006
? CDATEEX(Date(),2)
Jueves, 20 de Abril de 2006
Otro ejemplo:
? Transform(Day(Date())) + [/] + CMONTHEX(Date(),1) + ; 
  [/] + Transform((Year(Date())))
20/Abr/2006

NOTA: Dado que los valores devueltos por estas funciones dependen de la configuración del formato de fecha y del idioma del sistema operativo Windows, en cada caso los valores pueden ser distintos a los mostrados en los ejemplos, y pueden variar en cada equipo de acuerdo al gusto del usuario.

CODIGO:

CLEAR
? CDATEEX(DATE(),1)
? CDATEEX(DATE(),2)
?
FOR i = 1 TO 12
  ? CDATEEX(DATE(2007,i,1),2)
ENDFOR
?
? CDOWEX(DATE(2007,1,1),1), CDOWEX(1,2)
? CDOWEX(DATE(2007,1,2),1), CDOWEX(2,2)
? CDOWEX(DATE(2007,1,3),1), CDOWEX(3,2)
? CDOWEX(DATE(2007,1,4),1), CDOWEX(4,2)
? CDOWEX(DATE(2007,1,5),1), CDOWEX(5,2)
? CDOWEX(DATE(2007,1,6),1), CDOWEX(6,2)
? CDOWEX(DATE(2007,1,7),1), CDOWEX(7,2)
?
FOR i = 1 TO 12
  ? CMONTHEX(i,1), CMONTHEX(i,2)
ENDFOR
?
? CMONTHEX(DATE(2007,12,7),1), CMONTHEX(12,2)
?
? TRANSFORM(DAY(DATE())) + [/] + CMONTHEX(DATE(),1) + ;
  [/] + TRANSFORM((YEAR(DATE())))
RETURN
*
*****
* CDOWEX(dDate, nFormat)
* dDate: expresión de fecha/fechahora/dia de la semana
* nFormat: 1/S/C = nombre de dia abreviado,
* 2/L = nombre de dia completo (Default)
*****
FUNCTION CDOWEX
  PARAMETERS tdDate, tnFormat
  DeclareDlls()
  LOCAL lnType, lcBuffer, lnBufferLen, lnRetVal
  IF VARTYPE(m.tnFormat) = [C] AND UPPER(m.tnFormat) $ "SC" THEN
    m.tnFormat = 1
  ENDIF
  IF NOT VARTYPE(m.tnFormat) = [N] THEN
    m.tnFormat = 2
  ENDIF
  IF NOT BETWEEN(m.tnFormat, 1, 2) THEN
    m.tnFormat = 2
  ENDIF
  IF VARTYPE(m.tdDate) = [N] AND BETWEEN(m.tdDate, 1, 7)
    m.lnType = m.tdDate + IIF(m.tnFormat = 1, 48, 41)
  ELSE
    IF NOT VARTYPE(m.tdDate) $ [DT] THEN
      m.tdDate = DATE()
    ENDIF
    m.lnType = DOW(m.tdDate,2) + IIF(m.tnFormat = 1, 48, 41)
  ENDIF
  m.lcBuffer = SPACE(254)
  lnRetVal = GetLocaleInfo(1024, m.lnType, @m.lcBuffer, 254)
  m.lcBuffer = LEFT(m.lcBuffer, m.lnRetVal - 1)
  RETURN m.lcBuffer
ENDFUNC
*****
* CMONTHEX(dDate, nFormat)
* dDate: expresión de fecha/fechahora/numero de mes
* nFormat: 1/S/C = nombre de mes abreviado,
* 2/L = nombre de mes completo (Default)
*****
FUNCTION CMONTHEX
  PARAMETERS tdDate, tnFormat
  DeclareDlls()
  LOCAL lnType, lcBuffer, lnBufferLen, lnRetVal
  IF VARTYPE(m.tnFormat) = [C] AND UPPER(m.tnFormat) $ "SC" THEN
    m.tnFormat = 1
  ENDIF
  IF NOT VARTYPE(m.tnFormat) = [N] THEN
    m.tnFormat = 2
  ENDIF
  IF NOT BETWEEN(m.tnFormat, 1, 2) THEN
    m.tnFormat = 2
  ENDIF
  IF VARTYPE(m.tdDate) = [N] AND BETWEEN(m.tdDate, 1, 12)
    m.lnType = m.tdDate + IIF(m.tnFormat = 1, 67, 55)
  ELSE
    IF NOT VARTYPE(m.tdDate) $ [DT] THEN
      m.tdDate = DATE()
    ENDIF
    m.lnType = MONTH(m.tdDate) + IIF(m.tnFormat = 1, 67, 55)
  ENDIF
  m.lcBuffer = SPACE(254)
  lnRetVal = GetLocaleInfo(1024, m.lnType, @m.lcBuffer, 254)
  m.lcBuffer = LEFT(m.lcBuffer, m.lnRetVal - 1)
  RETURN m.lcBuffer
ENDFUNC
*****
* CDATEEX(dDate, nFormat)
* dDate: expresión de fecha/fechahora
* nFormat: 1/S/C = formato de fecha corta,
* 2/L = formato de fecha larga (Default)
*****
FUNCTION CDATEEX
  PARAMETERS tdDate, tnFormat
  DeclareDlls()
  LOCAL lcDate, lcBuffer, lnBufferLen, lnRetVal
  IF NOT VARTYPE(m.tdDate) $ [DT] THEN
    m.tdDate = DATE()
  ENDIF
  IF VARTYPE(m.tnFormat) = [C] AND UPPER(m.tnFormat) $ "SC" THEN
    m.tnFormat = 1
  ENDIF
  IF NOT VARTYPE(m.tnFormat) = [N] THEN
    m.tnFormat = 2
  ENDIF
  IF NOT BETWEEN(m.tnFormat,1,2) THEN
    m.tnFormat = 2
  ENDIF
  m.lcDate = ShortToBin(YEAR(m.tdDate)) + ;
    ShortToBin(MONTH(m.tdDate)) + ;
    ShortToBin(DOW(m.tdDate,2)) + ;
    ShortToBin(DAY(m.tdDate)) + ;
    REPLICATE(CHR(0),8)
  m.lcBuffer = SPACE(254)
  m.lnBufferLen = 254
  m.lnRetVal = GetDateFormat_CDATEEX(1024, m.tnFormat, ;
    @m.lcDate, 0, @m.lcBuffer, m.lnBufferLen)
  m.lcBuffer = LEFT(m.lcBuffer, m.lnRetVal - 1)
  RETURN m.lcBuffer
ENDFUNC
*****
* DeclareDlls
* Declara las funciones API usadas por CDOWEX, CMONTHEX, CDATEEX
*****
PROCEDURE DeclareDlls
  LOCAL laDlls(1,3), lnLen AS NUMBER
  m.lnLen = ADLLS(laDlls )
  IF ASCAN(laDlls, "GetDateFormat_CDATEEX", 1, m.lnLen , 2, 15) = 0
    DECLARE INTEGER GetDateFormat ;
      IN kernel32 AS GetDateFormat_CDATEEX ;
      INTEGER Locale, ;
      INTEGER dwFlags, ;
      STRING @lpDate, ;
      INTEGER lpFormat, ;
      STRING @lpDateStr, ;
      INTEGER cchDate
  ENDIF
  IF ASCAN(laDlls, "GetLocaleInfo", 1, m.lnLen , 2, 15) = 0
    DECLARE INTEGER GetLocaleInfo ;
      IN kernel32 ;
      INTEGER Locale, ;
      INTEGER LCType, ;
      STRING lpLCData, ;
      INTEGER cchData, ;
      ENDIF
  ENDIF
  RETURN
ENDFUNC
*****
* ShortToBin
* Convierte un numero en una cadena binaria de 2 bytes
*****
FUNCTION ShortToBin
  PARAMETERS tnLongVal
  PRIVATE i, lcRetstr
  IF VERSION(5) < 900 THEN
    m.lcRetstr = ""
      FOR i = 8 TO 0 STEP -8
        m.lcRetstr = CHR(INT(m.tnLongVal/(2^i))) + m.lcRetstr
        m.tnLongVal = MOD(m.tnLongVal, (2^i))
      NEXT
  ELSE
    m.lcRetstr = BINTOC(m.tnLongVal,[2RS])
  ENDIF
  RETURN m.lcRetstr
ENDFUNC

Carlos Alloatti

No hay comentarios. :

Publicar un comentario