PROCEDURE Lit_to_Date
*------------------------------------------------------------------
* Convierte, una expresión Date Literal en un Valor Date
* tcDate (char,date,datetime,numeric) * 2020-07-28T16:49:32
* tnFlag
* 1 - AAAAMMDD (Default) AAAA/MM/DD, AAAA-MM-DD
* 2 - DDMMAAAA DD/MM/AAAA, DD-MM-AAAA
* 3 - MMDDAAAA MM/DD/AAAA, MM-DD-AAAA
* 4 - MMAAAADD
* ------------------------------------------------------------------
LPARAMETERS tcDate,tnFlag
LOCAL ldReturn,;
ln,;
lcVartype,;
loex as Exception
LOCAL ARRAY laDate(1)
TRY
ldReturn = {}
DO WHILE .t.
DO CASE
CASE VARTYPE(m.tcDate) = "C"
tcDate = ALLTRIM(tcDate)
CASE VARTYPE(m.tcDate) = "N"
tcDate = LTRIM(STR(m.tcDate,8,0))
CASE VARTYPE(m.tcDate) $ "DT"
tcDate = DTOS(m.tcDate)
* Sobreescribe el parámetro tnFlag
tnFlag = 1
OTHERWISE
tcDate = ""
ENDCASE
IF VARTYPE(tcDate)#"C"
tcDate = ""
ENDIF
* Se elimina cualquier caracter no numeric que tenga tcDate
* tomando los 8 primeros caracteres de la izquierda
tcDate = LEFT(CHRTRAN(m.tcDate,CHRTRAN(m.tcDate,"1234567890",""),""),8)
IF LEN(m.tcDate) # 8
EXIT
ENDIF
* Valida parámetro tnFlag
lcVartype = VARTYPE(m.tnFlag)
DO CASE
CASE m.lcVartype = "N"
tnFlag = ABS(m.tnFlag)
CASE m.lcVartype = "C"
tnFlag = VAL(CHRTRAN(m.tnFlag,CHRTRAN(m.tnFlag,"1234567890",""),""))
OTHERWISE
tnFlag = 1
ENDCASE
IF EMPTY(m.tnFlag) OR !BETWEEN(m.tnFlag,0,4)
tnFlag = 1
ENDIF
DO CASE
CASE m.tnFlag = 1
* 1 - AAAAMMDD
tcDate = RIGHT(m.tcDate,2)+CHR(47);
+ SUBSTR(m.tcDate,5,2)+CHR(47);
+ LEFT(m.tcDate,4)
CASE m.tnFlag = 2
* 2 - DDMMAAAA
tcDate = LEFT(m.tcDate,2)+CHR(47);
+ SUBSTR(m.tcDate,3,2)+CHR(47);
+ RIGHT(m.tcDate,4)
CASE m.TnFlag = 3
* 3 - MMDDAAAA
tcDate = SUBSTR(m.tcDate,3,2)+CHR(47) ;
+ LEFT(m.tcDate,2)+CHR(47);
+ RIGHT(m.tcDate,4)
CASE m.tnFlag = 4
* 4 - MMAAAADD
tcDate = RIGHT(m.tcDate,2)+CHR(47);
+ LEFT(m.tcDate,2)+CHR(47);
+ SUBSTR(m.tcDate,3,4)
ENDCASE
ln = ALINES(laDate,m.tcDate,1,CHR(47))
IF ln = 3
ldReturn = DATE(VAL(laDate[3]),VAL(laDate[2]),VAL(laDate[1]))
ENDIF
EXIT
ENDDO
CATCH TO loex
ldReturn = {}
FINALLY
ENDTRY
RETURN ldReturn
ENDPROC