diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt
index 643d396..21b4f44 100644
Binary files a/foxbin2prg.pjt and b/foxbin2prg.pjt differ
diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx
index 73aed1e..2434764 100644
Binary files a/foxbin2prg.pjx and b/foxbin2prg.pjx differ
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index 4667e95..809fc31 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -111,6 +111,8 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#DEFINE C_ENDTEXT 'ENDTEXT'
#DEFINE C_PROCEDURE 'PROCEDURE'
#DEFINE C_ENDPROC 'ENDPROC'
+#DEFINE C_WITH 'WITH'
+#DEFINE C_WNDWITH 'ENDWITH'
#DEFINE C_SRV_HEAD_I '*'
#DEFINE C_SRV_HEAD_F '*'
#DEFINE C_SRV_DATA_I '*'
@@ -684,6 +686,7 @@ DEFINE CLASS c_conversor_base AS SESSION
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -1447,14 +1450,14 @@ DEFINE CLASS c_conversor_base AS SESSION
FOR I = 1 TO OCCURS( '/>', tcValue )
TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><><', I, 1+4 )>>
+ <<>> <', I, 1+4 )>>
ENDTEXT
ENDFOR
TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
<>
- <><>
+ <<>>
ENDTEXT
CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I
@@ -1508,6 +1511,72 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDFUNC
+ *******************************************************************************************************************
+ PROCEDURE write_DBF_Metadata
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tc_FileName (v! IN ) Nombre del DBF a analizar
+ * tcDBC_Name (v! IN ) Nombre del DBC a asociar
+ * tdLastUpdate (v? IN ) Fecha de última actualización
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tc_FileName, tcDBC_Name, tdLastUpdate
+
+ TRY
+ LOCAL lnHandle, lcStr, lnDataPos, lnFieldCount, loEx AS EXCEPTION
+
+ IF NOT EMPTY(tcDBC_Name)
+ tn_HexFileType = 0
+ lnHandle = FOPEN(tc_FileName,2)
+
+ IF lnHandle = -1
+ EXIT
+ ENDIF
+
+ lcStr = FREAD(lnHandle,1) && File type
+ tn_HexFileType = EVALUATE( TRANSFORM(ASC(lcStr),'@0') )
+
+ IF EMPTY(tdLastUpdate)
+ lcStr = FREAD(lnHandle,3) && Last update (YYMMDD)
+ ELSE
+ lcStr = CHR( VAL( RIGHT( PADL( YEAR( tdLastUpdate ),4,'0'), 2 ) ) ) ;
+ + CHR( VAL( PADL( MONTH( tdLastUpdate ),2,'0' ) ) ) ;
+ + CHR( VAL( PADL( DAY( tdLastUpdate ),2,'0' ) ) ) && Last update (YYMMDD)
+ =FWRITE( lnHandle, PADR(lcStr,3,CHR(0)) )
+ ENDIF
+
+ lcStr = FREAD(lnHandle,4) && Number of records in file
+ lcStr = FREAD(lnHandle,2) && Position of first data record
+ lnDataPos = CTOBIN(lcStr,"2RS")
+ lnFieldCount = (lnDataPos - 296) / 32
+ lcStr = FREAD(lnHandle,2) && Length of one data record, including delete flag
+ lcStr = FREAD(lnHandle,16) && Reserved
+ lcStr = FREAD(lnHandle,1) && Table flags: 0x01=Has CDX, 0x02=Has Memo, 0x04=Id DBC (flags acumulativos)
+ lcStr = FREAD(lnHandle,1) && Code page mark
+ lcStr = FREAD(lnHandle,2) && Reserved, contains 0x00
+ lcStr = FREAD(lnHandle,32 * lnFieldCount) && Field subrecords (los salteo)
+ lcStr = FREAD(lnHandle,1) && Header Record Terminator (0x0D)
+
+ IF FWRITE( lnHandle, PADR(tcDBC_Name,263,CHR(0)) ) = 0
+ ERROR 'No se pudo actualizar el backlink [' + tcDBC_Name + '] de la tabla [' + tc_FileName + ']'
+ ENDIF
+ ENDIF
+
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ FINALLY
+ FCLOSE(lnHandle)
+ ENDTRY
+
+ RETURN lnHandle
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE sortPropsAndValues
* KNOWLEDGE BASE:
@@ -2333,7 +2402,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<>
-
+ <<>>
ENDTEXT
ENDFOR
@@ -2374,7 +2443,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<>
-
+ <<>>
ENDTEXT
ENDFOR
@@ -2511,7 +2580,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
TEXT TO tcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
<>
-
+ <<>>
ENDTEXT
ENDIF
ENDFOR
@@ -5131,10 +5200,11 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
LOCAL I, lnCodError, loEx AS EXCEPTION
LOCAL loField AS CL_DBF_FIELD OF 'FOXBIN2PRG.PRG'
LOCAL loIndex AS CL_DBF_INDEX OF 'FOXBIN2PRG.PRG'
- LOCAL lcCreateTable, lcLongDec, lcFieldDef
+ LOCAL lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate
+
+ STORE '' TO lcIndex, lcFieldDef
lcCreateTable = 'CREATE TABLE "' + THIS.c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' ('
- lcFieldDef = ''
*-- Conformo los campos
FOR EACH loField IN toTable._Fields FOXOBJECT
@@ -5157,7 +5227,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
ENDIF
lcLongDec = lcLongDec + loField._Decimals
ENDIF
-
+
IF NOT EMPTY(lcLongDec)
lcLongDec = lcLongDec + ')'
ENDIF
@@ -5184,9 +5254,43 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
*STRTOFILE(lcCreateTable,'CreateTable.txt')
&lcCreateTable.
+ *-- Regenero los índices
+ FOR EACH loIndex IN toTable._Indexes FOXOBJECT
+ lcIndex = 'INDEX ON ' + loIndex._Key + ' TAG ' + loIndex._TagName
+
+ IF loIndex._TagType = 'BINARY'
+ lcIndex = lcIndex + ' BINARY'
+ ELSE
+ lcIndex = lcIndex + ' COLLATE "' + loIndex._Collate + '"'
+
+ IF NOT EMPTY(loIndex._Filter)
+ lcIndex = lcIndex + ' FOR ' + loIndex._Filter
+ ENDIF
+
+ lcIndex = lcIndex + ' ' + loIndex._Order
+
+ IF loIndex._TagType <> 'REGULAR'
+ *-- Si es PRIMARY lo cambio a CANDIDATE y luego lo recodifico
+ lcIndex = lcIndex + ' ' + STRTRAN( loIndex._TagType, 'PRIMARY', 'CANDIDATE' )
+ ENDIF
+ ENDIF
+
+ *STRTOFILE( lcIndex, 'index_' + loIndex._TagName + '.txt' )
+ &lcIndex.
+ ENDFOR
+
+
+ USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile)))
+
+ ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' )
+ THIS.write_DBF_Metadata( THIS.c_OutputFile, toTable._Database, ldLastUpdate )
+
CATCH TO loEx
- lnCodError = loEx.ERRORNO
+ lnCodError = loEx.ErrorNo
+ loEx.UserValue = 'lcIndex="' + TRANSFORM(lcIndex) + '"' + CR_LF ;
+ + 'lcFieldDef="' + TRANSFORM(lcFieldDef) + '"' + CR_LF ;
+ + 'lcCreateTable="' + TRANSFORM(lcCreateTable) + '"'
IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON
@@ -6421,18 +6525,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF '.' $ toRegObj.PARENT
*-- Este caso: clase.objeto.objeto ==> se quita clase
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>ADD OBJECT '<>.<>' AS <> <<>>
+ <<>> ADD OBJECT '<>.<>' AS <> <<>>
ENDTEXT
ELSE
*-- Este caso: objeto
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>ADD OBJECT '<>' AS <> <<>>
+ <<>> ADD OBJECT '<>' AS <> <<>>
ENDTEXT
ENDIF
IF NOT EMPTY(lcMemo)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- WITH ;
+ <> ;
<>
ENDTEXT
ENDIF
@@ -6461,7 +6565,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
<>
-
+ <<>>
ENDTEXT
CATCH TO loEx
@@ -6491,9 +6595,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
FOR I = 1 TO lnMethodCount
*-- Genero los métodos indentados
*TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- * <><>PROCEDURE <>
+ * <<>> <>PROCEDURE <>
* <>
- * <>ENDPROC
+ * <<>> ENDPROC
*ENDTEXT
*-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso
@@ -6544,20 +6648,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Nombre del método
TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><> <>
+ <<>> <> <>
ENDTEXT
*-- Comentarios del método (si tiene)
IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2))
TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <><>&& <>
+ <<>> && <>
ENDTEXT
ENDIF
*-- Código del método
*TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
* <>
- * <>ENDPROC
+ * <<>> ENDPROC
*ENDTEXT
*-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso
@@ -6637,20 +6741,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes)
FOR I = 1 TO ALEN(taPropsAndValues, 1)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><> = <>
+ <<>> <> = <>
ENDTEXT
lnComment = ASCAN( taPropsAndComments, taPropsAndValues(I,1), 1, 0, 1, 8)
IF lnComment > 0 AND NOT EMPTY(taPropsAndComments(lnComment,2))
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <><>&& <>
+ <<>> && <>
ENDTEXT
ENDIF
ENDFOR
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
-
+ <<>>
ENDTEXT
ENDIF
ENDWITH && THIS
@@ -6688,7 +6792,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
lcPropsMethodsDefd = ''
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><>
+ <<>> <>
ENDTEXT
FOR I = 1 TO tnPropsAndComments_Count
@@ -6702,18 +6806,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
, 'p' )
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><>*<>: <>
+ <<>> *<>: <>
ENDTEXT
IF NOT EMPTY(taPropsAndComments(I,2))
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <><><<'&'>><<'&'>> <>
+ <<>> <<'&'>><<'&'>> <>
ENDTEXT
ENDIF
ENDFOR
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><>
+ <<>> <>
ENDTEXT
ENDIF
@@ -6746,7 +6850,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Comentario de la clase
IF NOT EMPTY(toRegClass.RESERVED7) THEN
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <><><<'&'+'&'>> <>
+ <<>> <<'&'+'&'>> <>
ENDTEXT
ENDIF
ENDPROC
@@ -6758,7 +6862,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF tnLastClass = 1
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<<'ENDDEFINE'>>
-
+ <<>>
ENDTEXT
ENDIF
ENDPROC
@@ -6770,7 +6874,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- #INCLUDE
IF NOT EMPTY(toReg.RESERVED8) THEN
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>#INCLUDE "<>"
+ <<>> #INCLUDE "<>"
ENDTEXT
ENDIF
ENDPROC
@@ -6782,11 +6886,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
-
+ <<>>
ENDTEXT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+8
- <><>
+ <<>> <>
Baseclass="<>"
Timestamp="<>"
Scale="<>"
@@ -6824,7 +6928,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF NOT EMPTY(tcHiddenProp)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>HIDDEN <>
+ <<>> HIDDEN <>
ENDTEXT
ENDIF
ENDPROC
@@ -6851,7 +6955,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF NOT EMPTY(tcProtectedProp)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>PROTECTED <>
+ <<>> PROTECTED <>
ENDTEXT
ENDIF
ENDPROC
@@ -6871,7 +6975,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDTEXT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>>
+ <<>> platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>>
ENDTEXT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
@@ -6943,13 +7047,13 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDTEXT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>>]]>
- <>>]]>
- <>>]]>
- <>>]]>
- <>