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 <>>]]> <>><>]]> - <>>]]> + <> <>>]]> <>