diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index 52fb4af..abc9ea5 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -144,6 +144,22 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#DEFINE C_TAG_REPORTE 'Reportes'
#DEFINE C_TAG_REPORTE_I '<' + C_TAG_REPORTE + '>'
#DEFINE C_TAG_REPORTE_F '' + C_TAG_REPORTE + '>'
+#DEFINE C_DBF_HEAD_I ''
+#DEFINE C_LEN_DBF_HEAD_I LEN(C_DBF_HEAD_I)
+#DEFINE C_LEN_DBF_HEAD_F LEN(C_DBF_HEAD_F)
+#DEFINE C_FIELD_I ''
+#DEFINE C_LEN_FIELD_I LEN(C_FIELD_I)
+#DEFINE C_LEN_FIELD_F LEN(C_FIELD_F)
+#DEFINE C_INDEX_I ''
+#DEFINE C_CDX_I ''
+#DEFINE C_CDX_F ''
+#DEFINE C_LEN_CDX_I LEN(C_CDX_I)
+#DEFINE C_LEN_CDX_F LEN(C_CDX_F)
+#DEFINE C_LEN_INDEX_I LEN(C_INDEX_I)
+#DEFINE C_LEN_INDEX_F LEN(C_INDEX_F)
#DEFINE C_TAB CHR(9)
#DEFINE C_CR CHR(13)
#DEFINE C_LF CHR(10)
@@ -628,7 +644,9 @@ DEFINE CLASS c_conversor_base AS SESSION
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -1019,6 +1037,48 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE fileTypeDescription
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tn_HexFileType (@? IN ) Tipo de archivo en hexadecimal (Está detallado en la ayuda de Fox)
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tn_HexFileType
+ LOCAL lcFileType
+
+ DO CASE
+ CASE tn_HexFileType = 0x02
+ lcFileType = 'FoxBASE / dBase II'
+ CASE tn_HexFileType = 0x03
+ lcFileType = 'FoxBASE+ / FoxPro /dBase III PLUS / dBase IV, no memo'
+ CASE tn_HexFileType = 0x30
+ lcFileType = 'Visual FoxPro'
+ CASE tn_HexFileType = 0x31
+ lcFileType = 'Visual FoxPro, autoincrement enabled'
+ CASE tn_HexFileType = 0x32
+ lcFileType = 'Visual FoxPro, Varchar, Varbinary, or Blob-enabled'
+ CASE tn_HexFileType = 0x43
+ lcFileType = 'dBASE IV SQL table files, no memo'
+ CASE tn_HexFileType = 0x63
+ lcFileType = 'dBASE IV SQL system files, no memo'
+ CASE tn_HexFileType = 0x83
+ lcFileType = 'FoxBASE+/dBASE III PLUS, with memo'
+ CASE tn_HexFileType = 0x8B
+ lcFileType = 'dBASE IV with memo'
+ CASE tn_HexFileType = 0xCB
+ lcFileType = 'dBASE IV SQL table files, with memo'
+ CASE tn_HexFileType = 0xF5
+ lcFileType = 'FoxPro 2.x (or earlier) with memo'
+ CASE tn_HexFileType = 0xFB
+ lcFileType = 'FoxBASE (?)'
+ OTHERWISE
+ lcFileType = 'Unknown'
+ ENDCASE
+
+ RETURN lcFileType
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE fileTypeCode
LPARAMETERS tcExtension
@@ -1068,6 +1128,64 @@ DEFINE CLASS c_conversor_base AS SESSION
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE getDBFmetadata
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tc_FileName (v! IN ) Nombre del DBF a analizar
+ * tn_HexFileType (@? OUT) Tipo de archivo en hexadecimal (Está detallado en la ayuda de Fox)
+ * tl_FileHasCDX (@? OUT) Indica si el archivo tiene CDX asociado
+ * tl_FileHasMemo (@? OUT) Indica si el archivo tiene archivo MEMO asociado
+ * tl_FileIsDBC (@? OUT) Indica si el archivo es un DBC (base de datos)
+ * tcDBC_Name (@? OUT) Si tiene DBC, contiene el nombre del DBC asociado
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tc_FileName, tn_HexFileType, tl_FileHasCDX, tl_FileHasMemo, tl_FileIsDBC, tcDBC_Name
+
+ TRY
+ LOCAL lnHandle, lcStr, lnDataPos, lnFieldCount, loEx AS EXCEPTION
+ tn_HexFileType = 0
+ tcDBC_Name = ''
+ lnHandle = FOPEN(tc_FileName,0)
+
+ IF lnHandle = -1
+ EXIT
+ ENDIF
+
+ lcStr = FREAD(lnHandle,1) && File type
+ tn_HexFileType = EVALUATE( TRANSFORM(ASC(lcStr),'@0') )
+ lcStr = FREAD(lnHandle,3) && Last update (YYMMDD)
+ 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)
+ tl_FileHasCDX = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x01 ) > 0 )
+ tl_FileHasMemo = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x02 ) > 0 )
+ tl_FileIsDBC = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x04 ) > 0 )
+ 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)
+ lcStr = FREAD(lnHandle,263) && Backlink (relative path of an associated database (.dbc) file)
+ tcDBC_Name = RTRIM(lcStr,0,CHR(0)) && DBC Name (si tiene)
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ FINALLY
+ FCLOSE(lnHandle)
+ ENDTRY
+
+ RETURN lnHandle
+ ENDPROC
+
+
*******************************************************************************************************************
FUNCTION GetTimeStamp(tnTimeStamp)
*-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME
@@ -6250,6 +6368,144 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE write_DBF_HEADER
+ LPARAMETERS tn_HexFileType, tl_FileHasCDX, tl_FileHasMemo, tl_FileIsDBC, tc_DBC_Name
+ TRY
+ LOCAL laFields(1,18)
+
+ *FOR I = 1 TO AFIELDS(laFields)
+ * IF INLIST( laFields(I,2), 'M', 'Q', 'V', 'W' )
+ * ll_FileHasMemo = .T.
+ * EXIT
+ * ENDIF
+ *ENDFOR
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ *-- TABLE INFO
+
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+8
+ <>
+ memofile="<>"
+ codepage="<>"
+ database="<>"
+ filetype="<>"
+ filetype_descrip="<>"
+ <>
+ ENDTEXT
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DBF_FIELDS
+ TRY
+ LOCAL I, laFields(1,18)
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ *-- FIELDS
+ <<>>
+ ENDTEXT
+
+ FOR I = 1 TO AFIELDS(laFields)
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+8
+ <>
+ name="<>"
+ type="<>"
+ width="<>"
+ decimals="<>"
+ null="<>"
+ cptran="<>"
+ field_valid_exp="<>"
+ field_valid_text="<>"
+ field_default_value="<>"
+ table_valid_exp="<>"
+ table_valid_text="<>"
+ longtablename="<>"
+ ins_trig_exp="<>"
+ upd_trig_exp="<>"
+ del_trig_exp="<>"
+ tablecomment="<>"
+ autoinc_nextval="<>"
+ autoinc_step="<>"
+ <>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>>
+ ENDTEXT
+ ENDFOR
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DBF_INDEXES
+ TRY
+ LOCAL I
+
+ IF TAGCOUNT() > 0
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ *-- INDEXES
+ <><><>
+ <<>>
+ ENDTEXT
+
+ FOR I = 1 TO TAGCOUNT()
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+8
+ <>
+ tagname="<>"
+ collate="<>"
+ key="<>"
+ descending="<>"
+ for_exp="<>"
+ <>
+ ENDTEXT
+
+ TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>>
+ ENDTEXT
+ ENDFOR
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE write_DefinicionObjetosOLE
*-- Crea la definición del tag *< OLE: /> con la información de todos los objetos OLE
@@ -7053,7 +7309,7 @@ DEFINE CLASS c_conversor_frx_a_prg AS c_conversor_bin_a_prg
IF VARTYPE(loRegDataEnv) = "O"
THIS.write_DATAENVIRONMENT_REPORTE( @loRegDataEnv )
ENDIF
-
+
IF VARTYPE(loRegCur) = "O"
THIS.write_DETALLE_REPORTE( @loRegCur )
ENDIF
@@ -7102,26 +7358,34 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg
DODEFAULT( @toModulo, @toEx )
TRY
- LOCAL lnCodError, loRegCab, loRegDataEnv, loRegCur, loRegObj, lnMethodCount, laMethods(1), laCode(1), laProtected(1) ;
- , laPropsAndValues(1), laPropsAndComments(1), lnLastClass, lnRecno, lcMethods, lcObjName, la_NombresObjsOle(1)
- STORE 0 TO lnCodError, lnLastClass
- STORE '' TO laMethods(1), laCode(1), laProtected(1), laPropsAndComments(1)
- STORE NULL TO loRegObj, loRegCab, loRegDataEnv, loRegCur
+ LOCAL lnCodError, laDatabases(1), lnDatabases_Count, laDatabases2(1) ;
+ , ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name
+ STORE 0 TO lnCodError
- USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS TABLABIN_0
+ lnDatabases_Count = ADATABASES(laDatabases)
+ THIS.getDBFmetadata( THIS.c_InputFile, @ln_HexFileType, @ll_FileHasCDX, @ll_FileHasMemo, @ll_FileIsDBC, @lc_DBC_Name )
+ USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS TABLABIN
+
+ THIS.write_PROGRAM_HEADER()
*-- Header
- THIS.write_DBF_HEADER()
-
+ THIS.write_DBF_HEADER( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name )
+
*-- Fields
- THIS.write_DBF_FIELDS( @loRegObj )
+ THIS.write_DBF_FIELDS()
*-- Indexes
- THIS.write_DBF_INDEXES( @loRegCur )
-
-
- loRegObj = NULL
- USE IN (SELECT("TABLABIN_0"))
+ THIS.write_DBF_INDEXES()
+
+ USE IN (SELECT("TABLABIN"))
+
+ FOR I = 1 TO ADATABASES(laDatabases2)
+ IF ASCAN( laDatabases, laDatabases2(I) ) = 0
+ SET DATABASE TO (laDatabases2(I))
+ CLOSE DATABASES
+ EXIT
+ ENDIF
+ ENDFOR
*-- Genero el DB2
IF THIS.l_Test
@@ -7142,7 +7406,7 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg
FINALLY
USE IN (SELECT("TABLABIN"))
- USE IN (SELECT("TABLABIN_0"))
+ *USE IN (SELECT("TABLABIN_0"))
ENDTRY