diff --git a/TESTS/ut__foxbin2prg__c_foxbin2prg__FilenameFoundInFilter.prg b/TESTS/ut__foxbin2prg__c_foxbin2prg__FilenameFoundInFilter.prg
new file mode 100644
index 0000000..568548b
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_foxbin2prg__FilenameFoundInFilter.prg
@@ -0,0 +1,239 @@
+DEFINE CLASS ut__foxbin2prg__c_foxbin2prg__FilenameFoundInFilter AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ut__foxbin2prg__c_foxbin2prg__FilenameFoundInFilter OF ut__foxbin2prg__c_foxbin2prg__FilenameFoundInFilter.PRG
+ #ENDIF
+
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ *LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ *oFXU_LIB.setup_comun()
+ THIS.icObj = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+ *loObj = THIS.icObj
+ *loObj.l_Test = .F.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ *oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ RELEASE oFXU_LIB
+ CLOSE PROCEDURES
+ CLEAR RESOURCES
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, tl_Valor, tl_ValorEsperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ LOCAL loFoxBin2Prg AS c_foxbin2prg OF "FOXBIN2PRG.PRG"
+
+ IF ISNULL(toEx)
+ loFoxBin2Prg = THIS.icObj
+
+ *-- MESSAGES
+ THIS.messageout( 'Filename found in filter >> Esperado: ' + TRANSFORM(tl_ValorEsperado) )
+ THIS.messageout( 'Filename found in filter >> Actual : ' + TRANSFORM(tl_Valor) )
+
+ *-- ASSERTIONS
+ THIS.assertequals( tl_ValorEsperado, tl_Valor, 'Filename found in filter' )
+
+ loFoxBin2Prg = NULL
+ RELEASE loFoxBin2Prg
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ IF NOT INLIST( toEx.ERRORNO, 1098, 2071 ) && Error del usuario (ERROR y THROW)
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+ ENDIF
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+
+ THIS.messageout( '' )
+ THIS.messageout( REPLICATE('*',80) )
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_EncontrarElArchivo__FB2P_FOXUSER_DBF__UsandoElFiltro__TB2P_xpx
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_Filtros, ll_Valor, ll_ValorEsperado ;
+ , loFoxBin2Prg AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loFoxBin2Prg = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+ *loFoxBin2Prg.l_Debug = .F.
+ loFoxBin2Prg.l_ShowErrors = .F.
+ *loFoxBin2Prg.l_Test = .T.
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError, lnCodError_Esperado
+ lc_File = 'FB2P_FOXUSER.DBF'
+ lc_Filtros = 'XX.DBF,FF.FRX,FB2P_*.*'
+ ll_ValorEsperado = .T.
+
+ *-- EVALUACIÓN DEL TEST
+ ll_Valor = loFoxBin2Prg.FilenameFoundInFilter( lc_File, lc_Filtros )
+
+ CATCH TO loEx
+
+ FINALLY
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ll_Valor, ll_ValorEsperado )
+ STORE NULL TO loFoxBin2Prg
+ RELEASE loFoxBin2Prg
+ ENDTRY
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_EncontrarElArchivo__FB2P_FOXUSER_DBF__UsandoElFiltro__x_FOXUSERpx
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_Filtros, ll_Valor, ll_ValorEsperado ;
+ , loFoxBin2Prg AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loFoxBin2Prg = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+ *loFoxBin2Prg.l_Debug = .F.
+ loFoxBin2Prg.l_ShowErrors = .F.
+ *loFoxBin2Prg.l_Test = .T.
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError, lnCodError_Esperado
+ lc_File = 'FB2P_FOXUSER.DBF'
+ lc_Filtros = 'XX.DBF,FF.FRX,*_FOXUSER.*'
+ ll_ValorEsperado = .T.
+
+ *-- EVALUACIÓN DEL TEST
+ ll_Valor = loFoxBin2Prg.FilenameFoundInFilter( lc_File, lc_Filtros )
+
+ CATCH TO loEx
+
+ FINALLY
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ll_Valor, ll_ValorEsperado )
+ STORE NULL TO loFoxBin2Prg
+ RELEASE loFoxBin2Prg
+ ENDTRY
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_EncontrarElArchivo__FB2P_FOXUSER_DBF__UsandoElFiltro__x_F_Xxpx
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_Filtros, ll_Valor, ll_ValorEsperado ;
+ , loFoxBin2Prg AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loFoxBin2Prg = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+ *loFoxBin2Prg.l_Debug = .F.
+ loFoxBin2Prg.l_ShowErrors = .F.
+ *loFoxBin2Prg.l_Test = .T.
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError, lnCodError_Esperado
+ lc_File = 'FB2P_FOXUSER.DBF'
+ lc_Filtros = 'XX.DBF,FF.FRX,*_F?X*.*'
+ ll_ValorEsperado = .T.
+
+ *-- EVALUACIÓN DEL TEST
+ ll_Valor = loFoxBin2Prg.FilenameFoundInFilter( lc_File, lc_Filtros )
+
+ CATCH TO loEx
+
+ FINALLY
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ll_Valor, ll_ValorEsperado )
+ STORE NULL TO loFoxBin2Prg
+ RELEASE loFoxBin2Prg
+ ENDTRY
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_NoEncontrarElArchivo__FB2P_FOXUSER_DBF__UsandoElFiltro__uuFxpx
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_Filtros, ll_Valor, ll_ValorEsperado ;
+ , loFoxBin2Prg AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loFoxBin2Prg = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+ *loFoxBin2Prg.l_Debug = .F.
+ loFoxBin2Prg.l_ShowErrors = .F.
+ *loFoxBin2Prg.l_Test = .T.
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError, lnCodError_Esperado
+ lc_File = 'FB2P_FOXUSER.DBF'
+ lc_Filtros = 'XX.DBF,FF.FRX,??F*.*'
+ ll_ValorEsperado = .F.
+
+ *-- EVALUACIÓN DEL TEST
+ ll_Valor = loFoxBin2Prg.FilenameFoundInFilter( lc_File, lc_Filtros )
+
+ CATCH TO loEx
+
+ FINALLY
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, ll_Valor, ll_ValorEsperado )
+ STORE NULL TO loFoxBin2Prg
+ RELEASE loFoxBin2Prg
+ ENDTRY
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index 5cd6a9f..a721a70 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -451,6 +451,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -492,6 +493,8 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -566,6 +569,8 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
MNX_Conversion_Support = 2
DBF_Conversion_Support = 1
DBC_Conversion_Support = 2
+ DBF_Conversion_Included = ''
+ DBF_Conversion_Excluded = ''
PROCEDURE INIT
@@ -832,6 +837,24 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
ENDPROC
+ PROCEDURE DBF_Conversion_Included_ACCESS
+ IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) )
+ RETURN THIS.DBF_Conversion_Included
+ ELSE
+ RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).DBF_Conversion_Included, THIS.DBF_Conversion_Included )
+ ENDIF
+ ENDPROC
+
+
+ PROCEDURE DBF_Conversion_Excluded_ACCESS
+ IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) )
+ RETURN THIS.DBF_Conversion_Excluded
+ ELSE
+ RETURN NVL( THIS.o_Configuration( THIS.n_CFG_Actual ).DBF_Conversion_Excluded, THIS.DBF_Conversion_Excluded )
+ ENDIF
+ ENDPROC
+
+
PROCEDURE DBC_Conversion_Support_ACCESS
IF THIS.n_CFG_Actual = 0 OR ISNULL( THIS.o_Configuration( THIS.n_CFG_Actual ) )
RETURN THIS.DBC_Conversion_Support
@@ -1329,6 +1352,28 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
ENDPROC
+ FUNCTION FilenameFoundInFilter
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
+ * tcFilename (v! IN ) Nombre del archivo a evaluar
+ * tcFilters (v! IN ) Filtros a evaluar (*,??E.*,R*.*)
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tcFilename, tcFilters
+
+ LOCAL llFound, laFiltros(1)
+ tcFilename = UPPER(tcFilename)
+
+ FOR I = 1 TO ALINES( laFiltros, tcFilters + ',', 1+4, ',' )
+ IF LIKE( UPPER(laFiltros(I)), tcFilename )
+ llFound = .T.
+ EXIT
+ ENDIF
+ ENDFOR
+
+ RETURN llFound
+ ENDFUNC
+
+
PROCEDURE Get_Ext2FromExt
LPARAMETERS tcExt
LOCAL lcExt2
@@ -11131,7 +11176,7 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg
DODEFAULT( @toModulo, @toEx )
TRY
- LOCAL lnCodError, laDatabases(1), lnDatabases_Count, laDatabases2(1), lnLen, lc_FileTypeDesc ;
+ LOCAL lnCodError, laDatabases(1), lnDatabases_Count, laDatabases2(1), lnLen, lc_FileTypeDesc, laLines(1) ;
, ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, lnDataSessionID, lnSelect ;
, loTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' ;
, loDBFUtils AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG'
@@ -11140,6 +11185,22 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg
loDBFUtils = CREATEOBJECT('CL_DBF_UTILS')
WITH THIS AS c_conversor_dbf_a_prg OF 'FOXBIN2PRG.PRG'
+ *-- EVALUAR OPCIONES ESPECÍFICAS DE DBF
+
+ *-- Include
+ IF NOT EMPTY(toFoxBin2Prg.DBF_Conversion_Included) AND NOT toFoxBin2Prg.DBF_Conversion_Included == '*' ;
+ AND NOT toFoxBin2Prg.FilenameFoundInFilter( .c_InputFile, toFoxBin2Prg.DBF_Conversion_Included )
+ toFoxBin2Prg.writeLog(' ' + .c_InputFile + ' no está en el filtro DBF_Conversion_Included (' + toFoxBin2Prg.DBF_Conversion_Included + ')' )
+ EXIT
+ ENDIF
+
+ *-- Exclude
+ IF NOT EMPTY(toFoxBin2Prg.DBF_Conversion_Excluded) ;
+ AND toFoxBin2Prg.FilenameFoundInFilter( .c_InputFile, toFoxBin2Prg.DBF_Conversion_Excluded )
+ toFoxBin2Prg.writeLog(' ' + .c_InputFile + ' está en el filtro DBF_Conversion_Excluded (' + toFoxBin2Prg.DBF_Conversion_Included + ')' )
+ EXIT
+ ENDIF
+
loDBFUtils.getDBFmetadata( .c_InputFile, @ln_HexFileType, @ll_FileHasCDX, @ll_FileHasMemo, @ll_FileIsDBC, @lc_DBC_Name )
lc_FileTypeDesc = loDBFUtils.fileTypeDescription(ln_HexFileType)
lnDatabases_Count = ADATABASES(laDatabases)
@@ -15900,7 +15961,9 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE
#ENDIF
TRY
- LOCAL lcText, lcTableCFG, lcIndexKey, lcIndexFile, loEx AS EXCEPTION ;
+ LOCAL lcText, lcTableCFG, lcIndexKey, lcIndexFile, laConfig(1), lcValue, lcConfigItem ;
+ , lc_DBF_Conversion_Order, lc_DBF_Conversion_Condition ;
+ , loEx AS EXCEPTION ;
, loRecords AS CL_DBF_RECORDS OF 'FOXBIN2PRG.PRG' ;
, loFields AS CL_DBF_FIELDS OF 'FOXBIN2PRG.PRG' ;
, loIndexes AS CL_DBF_INDEXES OF 'FOXBIN2PRG.PRG'
@@ -15932,24 +15995,43 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE
lcText = lcText + loIndexes.toText( '', '', tc_InputFile )
IF toFoxBin2Prg.DBF_Conversion_Support = 4 && BIN2PRG (DATA EXPORT FOR DIFF)
- *-- If table CFG exists, use it to order records. FDBOZZO. 2014/06/15
+ *-- If table CFG exists, use it for DBF-specific configuration. FDBOZZO. 2014/06/15
lcTableCFG = tc_InputFile + '.CFG'
IF FILE(lcTableCFG)
toFoxBin2Prg.writeLog()
toFoxBin2Prg.writeLog('* Found configuration file: ' + lcTableCFG)
- lcIndexKey = ALLTRIM( FILETOSTR(lcTableCFG), 0, ' ', CHR(13), CHR(10) )
- IF NOT EMPTY(lcIndexKey)
+ *-- Leer valores de configuración
+ FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcTableCFG ), 1+4 )
+ lcConfigItem = LOWER( laConfig(I) )
+
+ DO CASE
+ CASE INLIST( LEFT( lcConfigItem, 1 ), '*', '#', '/', "'" )
+ LOOP
+
+ CASE LEFT( lcConfigItem, 21 ) == LOWER('DBF_Conversion_Order:')
+ lc_DBF_Conversion_Order = ALLTRIM( SUBSTR( laConfig(I), 22 ) )
+ toFoxBin2Prg.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' -> DBF_Conversion_Order: ' + lc_DBF_Conversion_Order )
+
+ CASE LEFT( lcConfigItem, 25 ) == LOWER('DBF_Conversion_Condition:')
+ lc_DBF_Conversion_Condition = ALLTRIM( SUBSTR( laConfig(I), 26 ) )
+ toFoxBin2Prg.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' -> DBF_Conversion_Condition: ' + lc_DBF_Conversion_Condition )
+
+ ENDCASE
+ ENDFOR
+
+ IF NOT EMPTY(lc_DBF_Conversion_Order)
lcIndexFile = FORCEEXT(tc_InputFile,'IDX')
- INDEX ON &lcIndexKey. TO (lcIndexFile) COMPACT
- toFoxBin2Prg.writeLog(' > Using Index order key: ' + lcIndexKey)
+ INDEX ON &lc_DBF_Conversion_Order. TO (lcIndexFile) COMPACT
+ toFoxBin2Prg.writeLog(' > Using Index order key: ' + lc_DBF_Conversion_Order)
ENDIF
+
ENDIF
*** DH 06/02/2014: added _Records
loRecords = THIS._Records
- lcText = lcText + loRecords.toText(@laFields, lnFieldCount)
+ lcText = lcText + loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition)
ENDIF
@@ -16548,11 +16630,12 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE
PROCEDURE toText
*---------------------------------------------------------------------------------------------------
- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT)
- * taFields (@! IN ) Array de información de campos
- * tnField_Count (v! IN ) Cantidad de campos
+ * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT)
+ * taFields (@! IN ) Array de información de campos
+ * tnField_Count (v! IN ) Cantidad de campos
+ * tc_DBF_Conversion_Condition (v? IN ) Condición de filtro para la conversión. Solo se exporta lo que la cumpla.
*---------------------------------------------------------------------------------------------------
- LPARAMETERS taFields, tnField_Count
+ LPARAMETERS taFields, tnField_Count, tc_DBF_Conversion_Condition
EXTERNAL ARRAY taFields
@@ -16567,8 +16650,12 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE
ENDTEXT
loRecord = CREATEOBJECT('CL_DBF_RECORD')
+
+ IF EMPTY(tc_DBF_Conversion_Condition)
+ tc_DBF_Conversion_Condition = '.T.'
+ ENDIF
- SCAN
+ SCAN FOR &tc_DBF_Conversion_Condition.
lcText = lcText + loRecord.toText(@taFields, tnField_Count)
ENDSCAN
@@ -16579,6 +16666,7 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE
CATCH TO loEx
+ loEx.UserValue = loEx.UserValue + 'tc_DBF_Conversion_Condition = [' + TRANSFORM(tc_DBF_Conversion_Condition) + ']' + CR_LF
IF THIS.l_Debug AND _VFP.STARTMODE = 0
SET STEP ON
ENDIF
@@ -19652,7 +19740,7 @@ DEFINE CLASS CL_CFG AS CUSTOM
#ENDIF
- *--
+ *-- Configuration class. By default asumes master value, except when overriding one.
c_Foxbin2prg_FullPath = ''
c_Foxbin2prg_ConfigFile = ''
c_CurDir = ''
@@ -19679,6 +19767,8 @@ DEFINE CLASS CL_CFG AS CUSTOM
LBX_Conversion_Support = NULL
MNX_Conversion_Support = NULL
DBF_Conversion_Support = NULL
+ DBF_Conversion_Included = NULL
+ DBF_Conversion_Excluded = NULL
DBC_Conversion_Support = NULL