diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt
index 80ce8b8..721a181 100644
--- a/FoxBin2PRGVersionFile.txt
+++ b/FoxBin2PRGVersionFile.txt
@@ -3,7 +3,7 @@ Lparameters toUpdateInfo
Local lcNote
With toUpdateInfo
.VersionNumber = 'v1.19.47'
- .VersionDate = Date(2016,05,24)
+ .VersionDate = Date(2016,05,28)
.SourceFileUrl = 'http://vfpxrepository.com/dl/thorupdate/Projects/FoxBin2Prg/FoxBin2Prg.Zip'
.Link = 'http://vfpx.codeplex.com/wikipage?title=FoxBin2PRG'
@@ -17,14 +17,14 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg
Change History -------------------------------------------------------------
-2016/05/24 v1.19.47
+2016/05/28 v1.19.47
- Bug Fix: When a filename "*" is specified with a type "*", an automatic regeneration of all binary files is made from text files (Alejandro Sosa)
- BugFix: Added variable declaration (Doug Hennig)
- BugFix: Fixed incorrectly named variable (Doug Hennig)
- BugFix: Added missing assignment (Doug Hennig)
- Enhancement: Put double quotes around path in case in contains single quote (Doug Hennig)
- BugFix: Added "+16" to Debug flags to maintain internal defaults to not generate timestamps on xx2 files
-- Feature: Added support for appending data from DB2 to DBF. All datatypes except General. (Walter Nicholls)
+- Feature: Added support for appending data from DB2 to DBF with the new value DBF_Conversion_Support=8. All datatypes except General. (Walter Nicholls)
2016/02/06 v1.19.46
- Bug Fix: set_UserValue() method causes error when trying to get information about another error and the VFP binary table can not be opened (ie, because corrupted memo)
diff --git a/TESTS/DATOS_READONLY/fb2p_free.cdx b/TESTS/DATOS_READONLY/fb2p_free.cdx
index a3f797b..e665b63 100644
Binary files a/TESTS/DATOS_READONLY/fb2p_free.cdx and b/TESTS/DATOS_READONLY/fb2p_free.cdx differ
diff --git a/TESTS/DATOS_READONLY/FB2P_FREE.DB2 b/TESTS/DATOS_READONLY/fb2p_free.db2
similarity index 74%
rename from TESTS/DATOS_READONLY/FB2P_FREE.DB2
rename to TESTS/DATOS_READONLY/fb2p_free.db2
index df554e5..3a8659c 100644
--- a/TESTS/DATOS_READONLY/FB2P_FREE.DB2
+++ b/TESTS/DATOS_READONLY/fb2p_free.db2
@@ -8,7 +8,7 @@
1252
- 2013/12/12
+
0x00000032
Visual FoxPro, Varchar, Varbinary, or Blob-enabled
@@ -371,7 +371,7 @@
- 30
+ 50
5
@@ -381,12 +381,12 @@
- LOGICO
- BINARY
- LOGICO
-
+ CARACTER
+ CANDIDATE
+ CARACTER
+ .NOT.EMPTY(caracter)
ASCENDING
- MACHINE
+ GENERAL
ENTERO
@@ -397,13 +397,93 @@
MACHINE
- CARACTER
- CANDIDATE
- CARACTER
- .NOT.EMPTY(caracter)
+ LOGICO
+ BINARY
+ LOGICO
+
ASCENDING
- GENERAL
+ MACHINE
+
+
+
+
+ / /
+ / / : :
+ .F.
+ 0.00000
+ 0.000000
+ 0.000
+
+ 0.0000
+ 0
+
+
+
+
+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+
+ 45
+
+
+ axaxaxaxaXAXA
+ 1969/11/26
+ 1969/11/26 22:10:06
+ .T.
+ 123.45676
+ 123.456786
+ 123.456
+ NgAuAEUAcwB0AGEAIABlAHMAIAB1AG4AYQAgAGYAcgBhAHMAZQAgAGMAbwBkAGkAZgBpAGMAYQBkAGEAIABlAG4AIABoAGUAeABhACAAeQAgAGMAbwBuACAAYwBhAHIAYQBjAHQAZQByAGUAcwAgAGUAcwBwAGUAYwBpAGEAbABlAHMALgAgAOEA6QDtAPMA+gDBAMkAzQDTANoAxADLAM8A1gDcAOQA6wDvAPYA/ADgAOgA7ADyAPkA8QDRAMcA5wBeAA==
+ 12345.6786
+ 1234567896
+ 6.notas TXT.
áéíóúÄËÏÖÜÑñäëïöü.
^FinÇç
+ Ni5GcmFzZSBVVEYtOC4gw6HDqcOtw7PDusOEw4vDj8OWw5w=
+ var char 6.áéíóúÜÑ
+ yQBzAHQAYQAgAGUAcwAgAGwAYQAgAHMAZQDxAGEAbAAhAA==
+ Q2hhckJpbi02LsOhw6nDrcOzw7rDnMORICAgICAg
+ VkNoYXJCaW4tNi7DocOpw63Ds8O6w5zDkQ==
+ 35
+
+
+ lalal.áéíóúÜÑ
+ 1969/11/27
+ 1969/11/27 22:10:07
+ .T.
+ 123.45677
+ 123.456787
+ 123.457
+ NwAuAEUAcwB0AGEAIABlAHMAIAB1AG4AYQAgAGYAcgBhAHMAZQAgAGMAbwBkAGkAZgBpAGMAYQBkAGEAIABlAG4AIABoAGUAeABhACAAeQAgAGMAbwBuACAAYwBhAHIAYQBjAHQAZQByAGUAcwAgAGUAcwBwAGUAYwBpAGEAbABlAHMALgAgAOEA6QDtAPMA+gDBAMkAzQDTANoAxADLAM8A1gDcAOQA6wDvAPYA/ADgAOgA7ADyAPkA8QDRAMcA5wBeAA==
+ 12345.6787
+ 1234567897
+ 7.notas TXT.
áéíóúÄËÏÖÜÑñäëïöü.
^FinÇç
+ Ny5GcmFzZSBVVEYtOC4gw6HDqcOtw7PDusOEw4vDj8OWw5w=
+ var char 7.áéíóúÜÑ
+ yQB4AGkAdABvAHMAIADaAG4AaQBjAG8AcwAhACAAOgApAA==
+ Q2hhckJpbi03LsOhw6nDrcOzw7rDnMORICAgICAg
+ VkNoYXJCaW4tNy7DocOpw63Ds8O6w5zDkQ==
+ 30
+
+
+ pepepepepEPE
+ 1969/11/25
+ 1969/11/25 22:10:05
+ .T.
+ 123.45675
+ 123.456785
+ 123.455
+ NQAuAEUAcwB0AGEAIABlAHMAIAB1AG4AYQAgAGYAcgBhAHMAZQAgAGMAbwBkAGkAZgBpAGMAYQBkAGEAIABlAG4AIABoAGUAeABhACAAeQAgAGMAbwBuACAAYwBhAHIAYQBjAHQAZQByAGUAcwAgAGUAcwBwAGUAYwBpAGEAbABlAHMALgAgAOEA6QDtAPMA+gDBAMkAzQDTANoAxADLAM8A1gDcAOQA6wDvAPYA/ADgAOgA7ADyAPkA8QDRAMcA5wBeAA==
+ 12345.6785
+ 1234567895
+ 5.notas TXT.
áéíóúÄËÏÖÜÑñäëïöü.
^FinÇç
+ NS5GcmFzZSBVVEYtOC4gw6HDqcOtw7PDusOEw4vDj8OWw5w=
+ var char 5.áéíóúÜÑ
+ yQBzAHQAYQAgAGUAcwAgAGwAYQAgAHMAZQDxAGEAbAAhAA==
+ Q2hhckJpbi01LsOhw6nDrcOzw7rDnMORICAgICAg
+ VkNoYXJCaW4tNS7DocOpw63Ds8O6w5zDkQ==
+ 40
+
+
+
diff --git a/TESTS/DATOS_READONLY/fb2p_free.dbf b/TESTS/DATOS_READONLY/fb2p_free.dbf
index c05a76f..27e8b18 100644
Binary files a/TESTS/DATOS_READONLY/fb2p_free.dbf and b/TESTS/DATOS_READONLY/fb2p_free.dbf differ
diff --git a/TESTS/DATOS_READONLY/fb2p_free.dbf.cfg b/TESTS/DATOS_READONLY/fb2p_free.dbf.cfg
new file mode 100644
index 0000000..2b5580f
--- /dev/null
+++ b/TESTS/DATOS_READONLY/fb2p_free.dbf.cfg
@@ -0,0 +1,3 @@
+DBF_Conversion_Support: 8
+DBF_Conversion_Order: caracter
+DBF_Conversion_Condition: .T.
\ No newline at end of file
diff --git a/TESTS/DATOS_READONLY/fb2p_free.fpt b/TESTS/DATOS_READONLY/fb2p_free.fpt
index 0fafd47..291b25e 100644
Binary files a/TESTS/DATOS_READONLY/fb2p_free.fpt and b/TESTS/DATOS_READONLY/fb2p_free.fpt differ
diff --git a/foxbin2prg.cfg.txt b/foxbin2prg.cfg.txt
index da907ad..338f943 100644
--- a/foxbin2prg.cfg.txt
+++ b/foxbin2prg.cfg.txt
@@ -1,5 +1,5 @@
****************************************************************************************************
-* FOXBIN2PRG v1.19.43
+* FOXBIN2PRG v1.19.47
* CONFIGURATION FILE / ARCHIVO DE CONFIGURACIÓN
****************************************************************************************************
@@ -34,7 +34,7 @@
* LBX_Conversion_Support: 2 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge)
* MNX_Conversion_Support: 2 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge)
* DBC_Conversion_Support: 2 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge)
-* DBF_Conversion_Support: 1 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge), 4=Generate TXT with DATA for DIFF (No Bidirectional!)
+* DBF_Conversion_Support: 1 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge/Only Structure!), 4=Generate TXT with DATA (Diff), 8=Export and Import DATA (Merge/Structure & Data)
* >>DBF_Conversion_Support NOTE: >> EN: FoxBin2Prg support bi-directional convertion of DBFs, but does not keep data. Use with care.
* >> ES: FoxBin2Prg tiene soporte bi-direccional para convertir DBF, pero no mantiene los datos. Usar con cuidado.
* DBF_Conversion_Included: * && If DBF_Conversion_Support:4, you can specify multiple filemasks: www,fb2p_free.dbf / Si DBF_Conversion_Support:4, se pueden indicar múltiples máscaras de archivo: www,fb2p_free.dbf
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index c63a786..96f56be 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -183,7 +183,7 @@
* 25/11/2015 FDBOZZO v1.19.46 Mejora dbf: Nuevo parámetro ExcludeDBFAutoincNextval para evitar diferencias por este dato (edyshor)
* 04/02/2016 FDBOZZO v1.19.46 Bug Fix: Cuando se procesa un archivo en el directorio raiz, se genera un error 2062 (Aurélien Dellieux)
* 10/02/2016 FDBOZZO v1.19.46 Bug Fix: Cuando se indica como nombre de archivo "*" y como tipo "*", se regeneran automáticamente todos los archivos binarios desde los archivos de texto (Alejandro Sosa)
-* 25/05/2016 FDBOZZO v1.19.47 Mejora DBF-Data: Permitir importar datos de los DB2 a los DBF. Todos los tipos de datos excepto General. (Walter Nicholls)
+* 25/05/2016 FDBOZZO v1.19.47 Mejora DBF-Data: Permitir importar datos de los DB2 a los DBF con el nuevo valor DBF_Conversion_Support=8. Todos los tipos de datos excepto General. (Walter Nicholls)
*
*
*---------------------------------------------------------------------------------------------------
@@ -2120,7 +2120,7 @@ DEFINE CLASS c_foxbin2prg AS Session
CASE LEFT( laConfig(I), 23 ) == LOWER('DBF_Conversion_Support:')
lcValue = ALLTRIM( SUBSTR( laConfig(I), 24 ) )
- IF INLIST( lcValue, '0', '1', '2', '4' ) THEN
+ IF INLIST( lcValue, '0', '1', '2', '4', '8' ) THEN
lo_CFG.DBF_Conversion_Support = INT( VAL( lcValue ) )
.writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > DBF_Conversion_Support: ' + TRANSFORM(lo_CFG.DBF_Conversion_Support) )
ENDIF
@@ -2355,6 +2355,67 @@ DEFINE CLASS c_foxbin2prg AS Session
ENDFUNC
+ PROCEDURE get_DBF_Configuration(tc_InputFile as String, to_out_DBF_CFG as Object, tlGenerateLog as Boolean) as Integer
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
+ * tc_InputFile (@! IN ) Ruta al archivo con Extensión para comprobar si tiene soporte de conversión
+ * to_out_DBF_CFG (@? OUT) Objeto CFG del DBF indicado, con las propiedades que contenga el CFG y sus valores
+ * RETORNO (v? OUT) Devuelve 0 si no existe el archivo CFG y 1 si lo encuentra
+ *---------------------------------------------------------------------------------------------------
+ #IF .F.
+ LOCAL to_out_DBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ LOCAL lcTableCFG, lnFileCount, laDirFile(1,5), I, lcConfigItem
+ lcTableCFG = tc_InputFile + '.CFG'
+ lnFileCount = ADIR(laDirFile, lcTableCFG)
+
+ IF lnFileCount = 1
+ to_out_DBF_CFG = CREATEOBJECT("CL_DBF_CFG")
+
+ IF tlGenerateLog THEN
+ THIS.writeLog()
+ THIS.writeLog(' > Found DBF configuration file: ' + lcTableCFG)
+ ENDIF
+
+ 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:')
+ to_out_DBF_CFG.DBF_Conversion_Order = ALLTRIM( SUBSTR( laConfig(I), 22 ) )
+ IF tlGenerateLog THEN
+ THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Order: ' + to_out_DBF_CFG.DBF_Conversion_Order )
+ ENDIF
+
+ CASE LEFT( lcConfigItem, 25 ) == LOWER('DBF_Conversion_Condition:')
+ to_out_DBF_CFG.DBF_Conversion_Condition = ALLTRIM( SUBSTR( laConfig(I), 26 ) )
+ IF tlGenerateLog THEN
+ THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Condition: ' + to_out_DBF_CFG.DBF_Conversion_Condition )
+ ENDIF
+
+ CASE LEFT( lcConfigItem, 23 ) == LOWER('DBF_Conversion_Support:')
+ to_out_DBF_CFG.DBF_Conversion_Support = INT( VAL( SUBSTR( laConfig(I), 24 ) ) )
+ IF tlGenerateLog THEN
+ THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Support: ' + TRANSFORM(to_out_DBF_CFG.DBF_Conversion_Support) )
+ ENDIF
+
+ ENDCASE
+ ENDFOR
+
+ IF tlGenerateLog THEN
+ THIS.writeLog()
+ ENDIF
+
+ ENDIF
+
+ RETURN lnFileCount
+ ENDPROC
+
+
PROCEDURE get_Ext2FromExt
*---------------------------------------------------------------------------------------------------
* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
@@ -2388,72 +2449,135 @@ DEFINE CLASS c_foxbin2prg AS Session
ENDPROC
- PROCEDURE hasSupport_Bin2Prg
+ PROCEDURE hasSupport_Bin2Prg(tcFileName as String, tcDir as String) as Boolean
*---------------------------------------------------------------------------------------------------
* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
- * tcExt (@! IN ) Extensión para comprobar si tiene soporte de conversión
+ * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión
* tcDir (@? IN ) Directorio del que devolver su configuración
* RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene
*---------------------------------------------------------------------------------------------------
- LPARAMETERS tcExt, tcDir
-
- LOCAL llhasSupport
- tcExt = UPPER(JUSTEXT('.' + tcExt))
+ LOCAL llhasSupport, lcExt, lcDir ;
+ , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG'
WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
- IF NOT EMPTY(tcDir)
- .evaluateConfiguration( '', '', '', '', '', '', '', '', tcDir, 'D' )
+ loDBF_CFG = NULL
+ lcExt = UPPER(JUSTEXT('.' + tcFileName))
+
+ IF '\' $ tcFileName AND lcExt == 'DBF' THEN
+ lcDir = JUSTPATH(tcFileName)
+ .get_DBF_Configuration(tcFileName, @loDBF_CFG)
+ ELSE
+ lcDir = tcDir
ENDIF
- llhasSupport = ICASE( tcExt == 'PJX', .PJX_Conversion_Support > 0 ;
- , tcExt == 'VCX', .VCX_Conversion_Support > 0 ;
- , tcExt == 'SCX', .SCX_Conversion_Support > 0 ;
- , tcExt == 'FRX', .FRX_Conversion_Support > 0 ;
- , tcExt == 'LBX', .LBX_Conversion_Support > 0 ;
- , tcExt == 'MNX', .MNX_Conversion_Support > 0 ;
- , tcExt == 'DBF', .DBF_Conversion_Support > 0 ;
- , tcExt == 'DBC', .DBC_Conversion_Support > 0 ;
+ IF NOT EMPTY(lcDir)
+ .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' )
+ ENDIF
+
+ llhasSupport = ICASE( lcExt == 'PJX', .PJX_Conversion_Support > 0 ;
+ , lcExt == 'VCX', .VCX_Conversion_Support > 0 ;
+ , lcExt == 'SCX', .SCX_Conversion_Support > 0 ;
+ , lcExt == 'FRX', .FRX_Conversion_Support > 0 ;
+ , lcExt == 'LBX', .LBX_Conversion_Support > 0 ;
+ , lcExt == 'MNX', .MNX_Conversion_Support > 0 ;
+ , lcExt == 'DBF', .DBF_Conversion_Support > 0 OR NOT ISNULL(loDBF_CFG) ;
+ , lcExt == 'DBC', .DBC_Conversion_Support > 0 ;
, .F. )
ENDWITH && THIS
- RELEASE tcExt
RETURN llhasSupport
ENDPROC
- PROCEDURE hasSupport_Prg2Bin
+ PROCEDURE hasSupport_Prg2Bin(tcFileName as String, tcDir as String) as Boolean
*---------------------------------------------------------------------------------------------------
* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
- * tcExt (@! IN ) Extensión para comprobar si tiene soporte de conversión
+ * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión
* tcDir (@? IN ) Directorio del que devolver su configuración
* RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene
*---------------------------------------------------------------------------------------------------
- LPARAMETERS tcExt, tcDir
-
- LOCAL llhasSupport
- tcExt = UPPER(JUSTEXT('.' + tcExt))
+ LOCAL llhasSupport, lcExt, lcDir ;
+ , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG'
WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
- IF NOT EMPTY(tcDir)
- .evaluateConfiguration( '', '', '', '', '', '', '', '', tcDir, 'D' )
+ loDBF_CFG = NULL
+ lcExt = UPPER(JUSTEXT('.' + tcFileName))
+
+ IF '\' $ tcFileName AND lcExt == .c_DB2 THEN
+ lcDir = JUSTPATH(tcFileName)
+ .get_DBF_Configuration(tcFileName, @loDBF_CFG)
+ ELSE
+ lcDir = tcDir
ENDIF
- llhasSupport = ICASE( tcExt == .c_PJ2, .PJX_Conversion_Support = 2 ;
- , tcExt == .c_VC2, .VCX_Conversion_Support = 2 ;
- , tcExt == .c_SC2, .SCX_Conversion_Support = 2 ;
- , tcExt == .c_FR2, .FRX_Conversion_Support = 2 ;
- , tcExt == .c_LB2, .LBX_Conversion_Support = 2 ;
- , tcExt == .c_MN2, .MNX_Conversion_Support = 2 ;
- , tcExt == .c_DB2, .DBF_Conversion_Support = 2 ;
- , tcExt == .c_DC2, .DBC_Conversion_Support = 2 ;
+ IF NOT EMPTY(lcDir)
+ .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' )
+ ENDIF
+
+ llhasSupport = ICASE( lcExt == .c_PJ2, .PJX_Conversion_Support = 2 ;
+ , lcExt == .c_VC2, .VCX_Conversion_Support = 2 ;
+ , lcExt == .c_SC2, .SCX_Conversion_Support = 2 ;
+ , lcExt == .c_FR2, .FRX_Conversion_Support = 2 ;
+ , lcExt == .c_LB2, .LBX_Conversion_Support = 2 ;
+ , lcExt == .c_MN2, .MNX_Conversion_Support = 2 ;
+ , lcExt == .c_DB2, INLIST(.DBF_Conversion_Support, 2, 8) OR NOT ISNULL(loDBF_CFG) AND loDBF_CFG.DBF_Conversion_Support = 8 ;
+ , lcExt == .c_DC2, .DBC_Conversion_Support = 2 ;
, .F. )
ENDWITH && THIS
- RELEASE tcExt
RETURN llhasSupport
ENDPROC
+ PROCEDURE conversionSupportType(tcFileName as String, tlGenerarLog as Boolean) as Integer
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
+ * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión
+ * RETORNO (v? OUT) Devuelve el código de soporte
+ *---------------------------------------------------------------------------------------------------
+ LOCAL lnSupportType, lcExt, lcDir, lcFilename ;
+ , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG'
+
+ TRY
+ WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
+ loDBF_CFG = NULL
+ lcExt = UPPER(JUSTEXT('.' + tcFileName))
+
+ IF '\' $ tcFileName AND INLIST(lcExt, .c_DB2, 'DBF') THEN
+ lcFilename = FORCEEXT(tcFileName, 'DBF')
+ lcDir = JUSTPATH(lcFileName)
+ .get_DBF_Configuration(lcFileName, @loDBF_CFG, tlGenerarLog)
+ ELSE
+ lcDir = SYS(5) + CURDIR()
+ ENDIF
+
+ IF NOT EMPTY(lcDir)
+ .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' )
+ ENDIF
+
+ lnSupportType = ICASE( ;
+ INLIST(lcExt, .c_PJ2, 'PJX'), .PJX_Conversion_Support ;
+ , INLIST(lcExt, .c_VC2, 'VCX'), .VCX_Conversion_Support ;
+ , INLIST(lcExt, .c_SC2, 'SCX'), .SCX_Conversion_Support ;
+ , INLIST(lcExt, .c_FR2, 'FRX'), .FRX_Conversion_Support ;
+ , INLIST(lcExt, .c_LB2, 'LBX'), .LBX_Conversion_Support ;
+ , INLIST(lcExt, .c_MN2, 'MNX'), .MNX_Conversion_Support ;
+ , INLIST(lcExt, .c_DB2, 'DBF'), ICASE( ISNULL(loDBF_CFG) OR loDBF_CFG.DBF_Conversion_Support = 0, .DBF_Conversion_Support, loDBF_CFG.DBF_Conversion_Support ) ;
+ , INLIST(lcExt, .c_DC2, 'DBC'), .DBC_Conversion_Support ;
+ , 0 )
+
+ lnSupportType = INT(lnSupportType)
+ ENDWITH && THIS
+
+ FINALLY
+ STORE NULL TO loDBF_CFG
+ RELEASE loDBF_CFG
+ ENDTRY
+
+ RETURN lnSupportType
+ ENDPROC
+
+
PROCEDURE execute
*--------------------------------------------------------------------------------------------------------------
* PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT)
@@ -3553,7 +3677,7 @@ DEFINE CLASS c_foxbin2prg AS Session
.changeFileAttribute( FORCEEXT( .c_InputFile, .c_LB2 ), lcForceAttribs )
CASE lcExtension = 'DBF'
- IF NOT INLIST(.DBF_Conversion_Support, 1, 2, 4)
+ IF NOT INLIST(.DBF_Conversion_Support, 1, 2, 4, 8)
ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC))
ENDIF
.c_OutputFile = FORCEEXT( .c_InputFile, .c_DB2 )
@@ -3622,7 +3746,9 @@ DEFINE CLASS c_foxbin2prg AS Session
.changeFileAttribute( FORCEEXT( .c_InputFile, 'LBT' ), lcForceAttribs )
CASE lcExtension = .c_DB2
- IF .DBF_Conversion_Support <> 2 AND ADIR(laDirFile, FORCEEXT(.c_InputFile, 'DBF') + '.CFG') = 0 THEN
+ IF INLIST(.DBF_Conversion_Support, 2, 8) OR ADIR(laDirFile, FORCEEXT(.c_InputFile, 'DBF') + '.CFG') = 1 THEN
+ *-- Soporte txt-2-bin habilitado
+ ELSE
ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC))
ENDIF
.c_OutputFile = FORCEEXT( .c_InputFile, 'DBF' )
@@ -11910,8 +12036,9 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
TRY
LOCAL lnCodError, loEx AS EXCEPTION, laCodeLines(1), lnCodeLines, laLineasExclusion(1), lnBloquesExclusion, I ;
- , lnIDInputFile, lcTableCFG, lnFileCount, llImportData, laConfig(1), lcConfigItem, lc_DBF_Conversion_Support ;
- , lcTempDBC
+ , lnIDInputFile, lnFileCount, laConfig(1), lcConfigItem, lc_DBF_Conversion_Support ;
+ , lcTempDBC, llImportData ;
+ , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG'
STORE 0 TO lnCodError, lnCodeLines
WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG'
@@ -11927,39 +12054,15 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
ENDIF
*-- If table CFG exists, use it for DBF-specific configuration. FDBOZZO. 2014/06/15
- lcTableCFG = FORCEEXT(.c_InputFile, 'DBF') + '.CFG'
- lnFileCount = ADIR(laDirFile, lcTableCFG)
+ lnFileCount = toFoxBin2Prg.get_DBF_Configuration( FORCEEXT(.c_InputFile, 'DBF'), @loDBF_CFG, .T. )
lcTempDBC = FORCEPATH( '_FB2P', JUSTPATH(.c_OutputFile) )
- IF toFoxBin2Prg.DBF_Conversion_Support = 5 ; && BIN2PRG (DATA IMPORT)
- OR INLIST(toFoxBin2Prg.DBF_Conversion_Support, 1, 2) AND lnFileCount = 1 THEN
+ DO CASE
+ CASE toFoxBin2Prg.DBF_Conversion_Support = 8 && TXT2BIN (DATA IMPORT)
llImportData = .T.
- ENDIF
-
- IF llImportData THEN
- IF INLIST(toFoxBin2Prg.DBF_Conversion_Support, 1, 2) AND lnFileCount = 1
- toFoxBin2Prg.writeLog()
- toFoxBin2Prg.writeLog('* Found configuration file: ' + lcTableCFG)
-
- *-- 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, 23 ) == LOWER('DBF_Conversion_Support:')
- lc_DBF_Conversion_Support = ALLTRIM( SUBSTR( laConfig(I), 24 ) )
- toFoxBin2Prg.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' -> DBF_Conversion_Support: ' + lc_DBF_Conversion_Support )
- llImportData = (lc_DBF_Conversion_Support == '2')
- EXIT && No me interesan las demás condiciones.
-
- ENDCASE
- ENDFOR
-
- ENDIF
- ENDIF
+ CASE INLIST(toFoxBin2Prg.DBF_Conversion_Support, 1, 2, 4) AND lnFileCount = 1
+ llImportData = (loDBF_CFG.DBF_Conversion_Support = 8)
+ ENDCASE
C_FB2PRG_CODE = FILETOSTR( .c_InputFile )
lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
@@ -12015,7 +12118,8 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
ERASE (FORCEEXT(lcTempDBC,'DCX'))
ENDIF
- RELEASE I
+ STORE NULL TO loDBF_CFG
+ RELEASE loDBF_CFG
ENDTRY
@@ -22933,9 +23037,10 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE
#ENDIF
TRY
- LOCAL lcText, lcTableCFG, lcIndexKey, lcIndexFile, laConfig(1), lcValue, lcConfigItem ;
+ LOCAL lcText, lcIndexKey, lcIndexFile, laConfig(1), lcValue, lcConfigItem ;
, lc_DBF_Conversion_Order, lc_DBF_Conversion_Condition, llExportData, laDirFile(1,5), lnFileCount ;
, loEx AS EXCEPTION ;
+ , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' ;
, loRecords AS CL_DBF_RECORDS OF 'FOXBIN2PRG.PRG' ;
, loFields AS CL_DBF_FIELDS OF 'FOXBIN2PRG.PRG' ;
, loIndexes AS CL_DBF_INDEXES OF 'FOXBIN2PRG.PRG'
@@ -22968,37 +23073,18 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE
lcText = lcText + loIndexes.toText( '', '', tc_InputFile, @toFoxBin2Prg )
*-- If table CFG exists, use it for DBF-specific configuration. FDBOZZO. 2014/06/15
- lcTableCFG = tc_InputFile + '.CFG'
- lnFileCount = ADIR(laDirFile, lcTableCFG)
+ lnFileCount = toFoxBin2Prg.get_DBF_Configuration( FORCEEXT(tc_InputFile, 'DBF'), @loDBF_CFG, .T. )
- IF toFoxBin2Prg.DBF_Conversion_Support = 4 ; && BIN2PRG (DATA EXPORT FOR DIFF)
- OR toFoxBin2Prg.DBF_Conversion_Support = 1 AND lnFileCount = 1 THEN
- llExportData = .T.
- ENDIF
+ DO CASE
+ CASE INLIST(toFoxBin2Prg.DBF_Conversion_Support, 4, 8) ; && BIN2TXT (DATA EXPORT FOR DIFF)
+ OR INLIST(toFoxBin2Prg.DBF_Conversion_Support, 1, 2) AND lnFileCount = 1
+ *-- ASUNCIÓN: Si hay un archivo DBF.CFG, es porque se quiere exportar datos, si no, no debe crearse el DBF.CFG
+ llExportData = .T.
+ ENDCASE
IF llExportData THEN
IF lnFileCount = 1
- toFoxBin2Prg.writeLog()
- toFoxBin2Prg.writeLog('* Found configuration file: ' + lcTableCFG)
-
- *-- 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
+ lc_DBF_Conversion_Order = loDBF_CFG.DBF_Conversion_Order
IF NOT EMPTY(lc_DBF_Conversion_Order)
lcIndexFile = FORCEEXT(tc_InputFile,'IDX')
@@ -23007,8 +23093,10 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE
ENDIF
ENDIF
+ ENDIF
- *** DH 06/02/2014: added _Records
+ *** DH 06/02/2014: added _Records
+ IF llExportData
loRecords = THIS._Records
FWRITE( toFoxBin2Prg.n_FileHandle, lcText )
loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition, @toFoxBin2Prg)
@@ -23032,12 +23120,13 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE
THROW
FINALLY
- STORE NULL TO loIndexes, loFields, loRecords
- RELEASE loFields, loIndexes, loRecords
IF NOT EMPTY(lcIndexFile) AND FILE(lcIndexFile)
SET INDEX TO
ERASE (lcIndexFile)
ENDIF
+
+ STORE NULL TO loIndexes, loFields, loRecords, loDBF_CFG
+ RELEASE loFields, loIndexes, loRecords, loDBF_CFG
ENDTRY
RETURN lcText
@@ -23895,7 +23984,7 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE
ENDCASE
- IF lcFieldType == 'G' OR lcFieldType == 'I' AND NOT EMPTY(loField._AutoInc_Step)
+ IF lcFieldType == 'G' OR lcFieldType == 'I' AND NOT EMPTY(INT(VAL(loField._AutoInc_Step)))
*-- Saltar campos General o Integer con AutoInc
ELSE
REPLACE (lcFieldName) WITH (luValue)
@@ -27838,3 +27927,23 @@ DEFINE CLASS CL_LANG AS Custom
ENDPROC
ENDDEFINE
+
+
+
+DEFINE CLASS CL_DBF_CFG AS CUSTOM
+ _MEMBERDATA = [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + []
+
+ #IF .F.
+ LOCAL THIS AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+
+ *-- Configuration class. By default asumes master value, except when overriding one.
+ DBF_Conversion_Order = ''
+ DBF_Conversion_Condition = ''
+ DBF_Conversion_Support = 0
+ENDDEFINE