diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dbc b/TESTS/DATOS_READONLY/fb2p_dbc.dbc
new file mode 100644
index 0000000..397b87f
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbc.dbc differ
diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dct b/TESTS/DATOS_READONLY/fb2p_dbc.dct
new file mode 100644
index 0000000..7194905
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbc.dct differ
diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dcx b/TESTS/DATOS_READONLY/fb2p_dbc.dcx
new file mode 100644
index 0000000..5db0c26
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbc.dcx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.cdx b/TESTS/DATOS_READONLY/fb2p_dbf.cdx
new file mode 100644
index 0000000..65f433f
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbf.cdx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.dbf b/TESTS/DATOS_READONLY/fb2p_dbf.dbf
new file mode 100644
index 0000000..101ebdc
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbf.dbf differ
diff --git a/TESTS/DATOS_READONLY/fb2p_test.vct b/TESTS/DATOS_READONLY/fb2p_test.vct
index 38d0119..be2b80b 100644
Binary files a/TESTS/DATOS_READONLY/fb2p_test.vct and b/TESTS/DATOS_READONLY/fb2p_test.vct differ
diff --git a/TESTS/DATOS_READONLY/fb2p_test.vcx b/TESTS/DATOS_READONLY/fb2p_test.vcx
index 0e72e7f..f7b847c 100644
Binary files a/TESTS/DATOS_READONLY/fb2p_test.vcx and b/TESTS/DATOS_READONLY/fb2p_test.vcx differ
diff --git a/TESTS/foxbin2prg__c_conversor_base__doBackup.prg b/TESTS/foxbin2prg__c_conversor_base__doBackup.prg
new file mode 100644
index 0000000..23f0e02
--- /dev/null
+++ b/TESTS/foxbin2prg__c_conversor_base__doBackup.prg
@@ -0,0 +1,121 @@
+DEFINE CLASS foxbin2prg__c_conversor_base__doBackup AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS foxbin2prg__c_conversor_base__doBackup OF foxbin2prg__c_conversor_base__doBackup.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ 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_conversor_bin_a_prg", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ 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'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, tcMemo, tcMemo_Salida, tcMemo_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+ *-- Algunos ajustes para mejor visualización de caracteres especiales
+ tcMemo = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo )
+ tcMemo_Esperado = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo_Esperado )
+ tcMemo_Salida = oFXU_LIB.mejorarPresentacionCaracteresEspeciales( tcMemo_Salida )
+
+ *-- Visualización de valores
+ THIS.messageout( ' Memo de entrada:' )
+ THIS.messageout( '[' + tcMemo + ']' )
+
+ THIS.messageout( REPLICATE('-',80) )
+
+ THIS.messageout( ' Memo esperado:' )
+ THIS.messageout( '[' + tcMemo_Esperado + ']' )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( '[' + tcMemo_Esperado + ']', '[' + tcMemo_Salida + ']', "Contenido del Memo de PROCEDURE" )
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_HacerElBackupDelArchivoIndicado
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcMemo, lcMemo_Salida, lcMemo_Esperado ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ *loObj
+
+ *-- TEST
+ loObj.doBackup()
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, @lcMemo, @lcMemo_Salida, @lcMemo_Esperado )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index abc9ea5..89de871 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -466,6 +466,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_DB2 )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_dbf_a_prg' )
+ CASE JUSTEXT(THIS.c_InputFile) = 'DBC'
+ THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_DC2 )
+ THIS.o_Conversor = CREATEOBJECT( 'c_conversor_dbc_a_prg' )
+
CASE JUSTEXT(THIS.c_InputFile) = THIS.c_VC2
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'VCX' )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_vcx' )
@@ -490,6 +494,10 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'DBF' )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_dfb' )
+ CASE JUSTEXT(THIS.c_InputFile) = THIS.c_DC2
+ THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'DBC' )
+ THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_dfc' )
+
OTHERWISE
ERROR 'El archivo [' + THIS.c_InputFile + '] no está soportado'
@@ -972,46 +980,72 @@ DEFINE CLASS c_conversor_base AS SESSION
*******************************************************************************************************************
PROCEDURE doBackup
- LOCAL lcNext_Bak, lcExt_X, lcExt_T
- lcNext_Bak = THIS.getNext_BAK( THIS.c_OutputFile )
- lcExt_X = JUSTEXT( THIS.c_OutputFile )
- lcExt_T = LEFT(lcExt_X,2) + 'T'
+ LPARAMETERS toEx, tlRelanzarError, tcBakFile_1, tcBakFile_2, tcBakFile_3
+
+ TRY
+ LOCAL lcNext_Bak, lcExt_1, lcExt_2, lcExt_3
+ STORE '' TO tcBakFile_1, tcBakFile_2, tcBakFile_3
+ lcNext_Bak = THIS.getNext_BAK( THIS.c_OutputFile )
+ lcExt_1 = JUSTEXT( THIS.c_OutputFile )
+ tcBakFile_1 = FORCEEXT(THIS.c_OutputFile, lcExt_1 + lcNext_Bak)
- DO CASE
- CASE JUSTEXT( THIS.c_OutputFile ) = lcExt_X
- *-- VCX, SCX, FRX, LBX, MNX
- IF FILE( FORCEEXT(THIS.c_OutputFile,lcExt_X) )
- THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,lcExt_X) + '/' + lcExt_T )
+ DO CASE
+ CASE lcExt_1 = 'DBF'
+ *-- DBF
+ lcExt_2 = 'FPT'
+ lcExt_3 = 'CDX'
+ tcBakFile_2 = FORCEEXT(THIS.c_OutputFile, lcExt_2 + lcNext_Bak)
+ tcBakFile_3 = FORCEEXT(THIS.c_OutputFile, lcExt_3 + lcNext_Bak)
- COPY FILE (FORCEEXT(THIS.c_OutputFile,lcExt_X)) TO (FORCEEXT(THIS.c_OutputFile, lcExt_X + lcNext_Bak))
+ CASE lcExt_1 = 'DBC'
+ *-- DBC
+ lcExt_2 = 'DCT'
+ lcExt_3 = 'DCX'
+ tcBakFile_2 = FORCEEXT(THIS.c_OutputFile, lcExt_2 + lcNext_Bak)
+ tcBakFile_3 = FORCEEXT(THIS.c_OutputFile, lcExt_3 + lcNext_Bak)
- IF FILE( FORCEEXT(THIS.c_OutputFile,lcExt_T) )
- COPY FILE (FORCEEXT(THIS.c_OutputFile,lcExt_T)) TO (FORCEEXT(THIS.c_OutputFile,lcExt_T + lcNext_Bak))
+ OTHERWISE
+ *-- PJX, VCX, SCX, FRX, LBX, MNX
+ lcExt_2 = LEFT(lcExt_1,2) + 'T'
+ tcBakFile_2 = FORCEEXT(THIS.c_OutputFile, lcExt_2 + lcNext_Bak)
+
+ ENDCASE
+
+ IF NOT EMPTY(lcExt_1) AND FILE( FORCEEXT(THIS.c_OutputFile, lcExt_1) )
+ IF EMPTY(lcExt_3)
+ THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 )
+ ELSE
+ THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 + '/' + lcExt_3 )
+ ENDIF
+
+ *COPY FILE ( FORCEEXT(THIS.c_OutputFile, lcExt_1) ) TO ( FORCEEXT(THIS.c_OutputFile, lcExt_1 + lcNext_Bak) )
+ RENAME ( FORCEEXT(THIS.c_OutputFile, lcExt_1) ) TO ( tcBakFile_1 )
+
+ IF NOT EMPTY(lcExt_2) AND FILE( FORCEEXT(THIS.c_OutputFile, lcExt_2) )
+ *COPY FILE ( FORCEEXT(THIS.c_OutputFile, lcExt_2) ) TO ( FORCEEXT(THIS.c_OutputFile, lcExt_2 + lcNext_Bak) )
+ RENAME ( FORCEEXT(THIS.c_OutputFile, lcExt_2) ) TO ( tcBakFile_2 )
+ ENDIF
+
+ IF NOT EMPTY(lcExt_3) AND FILE( FORCEEXT(THIS.c_OutputFile, lcExt_3) )
+ *COPY FILE ( FORCEEXT(THIS.c_OutputFile, lcExt_3) ) TO ( FORCEEXT(THIS.c_OutputFile, lcExt_3 + lcNext_Bak) )
+ RENAME ( FORCEEXT(THIS.c_OutputFile, lcExt_3) ) TO ( tcBakFile_3 )
ENDIF
ENDIF
- CASE JUSTEXT( THIS.c_OutputFile ) = 'DBF'
- *-- DBF
- lcExt_X = 'DBF'
- lcExt_T = 'FPT'
- IF FILE( FORCEEXT(THIS.c_OutputFile,lcExt_X) )
- THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,lcExt_X) + '/' + lcExt_T )
-
- COPY FILE (FORCEEXT(THIS.c_OutputFile,lcExt_X)) TO (FORCEEXT(THIS.c_OutputFile, lcExt_X + lcNext_Bak))
-
- IF FILE( FORCEEXT(THIS.c_OutputFile,lcExt_T) )
- COPY FILE (FORCEEXT(THIS.c_OutputFile,lcExt_T)) TO (FORCEEXT(THIS.c_OutputFile,lcExt_T + lcNext_Bak))
- ENDIF
-
- IF FILE( FORCEEXT(THIS.c_OutputFile,'CDX') )
- COPY FILE (FORCEEXT(THIS.c_OutputFile,'CDX')) TO (FORCEEXT(THIS.c_OutputFile,'CDX' + lcNext_Bak))
- ENDIF
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
ENDIF
- OTHERWISE
- ERROR 'Tipo de archivo [' + JUSTFNAME(THIS.c_OutputFile) + '] no soportado para backup!'
+ IF tlRelanzarError
+ THROW
+ ENDIF
- ENDCASE
+ FINALLY
+ FCLOSE(lnHandle)
+ ENDTRY
+
+ RETURN
ENDPROC
@@ -4708,22 +4742,23 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
DO CASE
CASE INLIST(lcFieldType, 'B') && Double
- STORE CAST( luValor AS &lcFieldType. (lnFieldPrec) ) TO ('loReg.' + laProps(I))
+ ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldPrec) ) )
CASE INLIST(lcFieldType, 'F', 'N', 'Y') && Float, Numeric, Currency
- STORE CAST( luValor AS &lcFieldType. (lnFieldLen, lnFieldDec) ) TO ('loReg.' + laProps(I))
+ ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldLen, lnFieldDec) ) )
- CASE INLIST(lcFieldType, 'W', 'G', 'M', 'Q', 'V') && Blob, General, Memo, Varbinary, Barchar
- STORE CAST( luValor AS &lcFieldType. ) TO ('loReg.' + laProps(I))
+ CASE INLIST(lcFieldType, 'W', 'G', 'M', 'Q', 'V', 'C') && Blob, General, Memo, Varbinary, Varchar, Character
+ ADDPROPERTY( loReg, laProps(I), luValor )
OTHERWISE && Demás tipos
- STORE CAST( luValor AS &lcFieldType. (lnFieldLen) ) TO ('loReg.' + laProps(I))
+ ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldLen) ) )
ENDCASE
ENDFOR
INSERT INTO TABLABIN FROM NAME loReg
+ loReg = NULL
ENDFOR
USE IN (SELECT("TABLABIN"))
@@ -4842,7 +4877,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
*-- Recorro las fracciones del valor
FOR I = I + 1 TO tnCodeLines
- .set_Line( @tcLine, @taCodeLines, I )
+ tcLine = taCodeLines(I)
IF C_DATA_F $ tcLine && Fin del valor
lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F )
@@ -4965,7 +5000,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
CASE loReg.ObjType == "1"
loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.TAG )
CASE loReg.ObjType == "25"
- loReg.TAG = SUBSTR(loReg.TAG,3)
+ loReg.TAG = SUBSTR(loReg.TAG,3) && Quito el ENTER agregado antes
OTHERWISE
loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.TAG )
ENDCASE
@@ -5669,9 +5704,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*ENDTEXT
*-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso
- lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + 'PROCEDURE ' + laMethods(I,1)
+ lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + C_PROCEDURE + ' ' + laMethods(I,1)
lcMethods = lcMethods + CR_LF + THIS.IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) )
- lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC'
+ lcMethods = lcMethods + CR_LF + C_TAB + C_ENDPROC
lcMethods = lcMethods + CR_LF
ENDFOR
@@ -6114,7 +6149,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
supgroup="<>" supvalchng="<>" supexpr="<>" >
ENDTEXT
- * <>tag="<>"
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<>>]]>
<>>]]>
@@ -6227,7 +6261,6 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
supgroup="<>" supvalchng="<>" supexpr="<>" <<>>
ENDTEXT
- * <>tag="<>"
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<>>]]>
<>>]]>
@@ -6340,11 +6373,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
supgroup="<>" supvalchng="<>" supexpr="<>" <<>>
ENDTEXT
- * <>tag="<>"
+ * NOTA: En el DataEnvironment el TAG2 es el TAG compilado, que se recompila con COMPILE REPORT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<>>]]>
<>><>]]>
- <>>]]>
+ <>
<>>]]>
<>