30 de noviembre de 2000

Inversa de la función SYS(2015)

Una función para conocer la inversa de la función SYS(2015).

Ejemplo:
lc = SYS(2015)
? Inv2015(lc)
*-------------------------------
* FUNCTION Inv2015(tcCadena)
*-------------------------------
* Función que invierte el retorno de SYS(2015)
* USO: Inv2015("_0AB0123AB")
* RETORNA: Caracter "DD/MM/AAAA HH:MM:SS.mmm"
*-------------------------------
FUNCTION Inv2015(tcCadena)
  LOCAL lnDia, lnAnio
  lnDia = B36TOB10(SUBS(tcCadena, 2, 3))
  lnAnio = INT(lnDia / 367)
  lnDia = MOD(lnDia, 367)
 SET STRICTDATE TO 0
  RETURN DTOC(EVAL("{^"+STR(lnAnio,2)+"/01/01}") ;
    + lnDia - 1) + " " ;
    + S2HMSm(B36TOB10(SUBS(tcCadena, 5, 6))/1000)
ENDFUNC


*-------------------------------
* FUNCTION B36TOB10(tcN36)
*-------------------------------
* Función que pasa un número de base 36 a base 10
* Usada por Inv2015()
* RETORNA: Numérico
*-------------------------------
FUNCTION B36TOB10(tcN36)
  LOCAL lnN10, lcChr, lnLen, lnI, lnAux
  tcN36 = ALLTRIM(UPPER(tcN36))
  lnLen = LEN(tcN36)

  lnN10 = 0
  lnI = 1
  FOR lnI = 1 TO lnLen
    lcChr = SUBS(tcN36, lnI, 1)
    lnAux = ASC(lcChr)-IIF(lcChr < 'A', 48, 55)
    lnN10 = lnN10 + lnAux * 36^(lnLen-lnI)
  ENDFOR
  RETURN INT(lnN10)
ENDFUNC

*-------------------------------
* FUNCTION S2HMSm(tnSeg)
*-------------------------------
* Transforma segundos a formato HH:MM:SS.mmm
* Usada por Inv2015()
* RETORNA: Caracter 'HH:MM:SS.mmm'
*-------------------------------
FUNCTION S2HMSm(tnSeg)
  LOCAL lnHor, lnMin, lnSeg, lnMil
  lnHor = INT(tnSeg/3600)
  lnMin = INT(((tnSeg - (lnHor*3600))/60))
  lnSeg = MOD(tnSeg, 60)
  lnMil = (tnSeg - INT(tnSeg))*1000
  RETURN TRANSFORM(lnHor, "@L 99") + ":" + ;
    TRANSFORM(lnMin, "@L 99") + ":" + ;
    TRANSFORM(lnSeg, "@L 99") + "." + ;
    TRANSFORM(lnMil, "@L 999")
ENDFUNC

*-------------------------------
Luis María Guayán