diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 1e10043..5000c69 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -107,6 +107,7 @@ * 19/09/2014 FDBOZZO v1.19.34 Arreglo bug: Si se ejecuta FoxBin2Prg desde ventana de comandos FoxPro para un proyecto y hay algún archivo abierto o cacheado, se produce un error al intentar capitalizar el archivo de entrada (Jim Nelson) * 26/09/2014 FDBOZZO v1.19.35 Mejora: Generar siempre el mismo Timestamp y UniqueID para los binarios minimizaría los cambios al regenerarlos (Marcio Gomez G.) * 08/10/2014 FDBOZZO v1.19.36 Arreglo bug: Al generar el mn2 el identificador queda vacío (bug introducido en v1.19.35) +* 19/11/2014 FDBOZZO v1.19.37 Arreglo bug: String is too long to fit (edyshor) * * *--------------------------------------------------------------------------------------------------- @@ -153,6 +154,7 @@ * 28/08/2014 Peter Hipp REPORTE BUG mnx v1.19.32: Si una opción tiene asociado un Procedure de 1 línea, no se mantiene como Procedure y se convierte a Command (solucionado en v1.19.33) * 19/09/2014 Jim Nelson REPORTE BUG v1.19.33: Si se ejecuta FoxBin2Prg desde ventana de comandos FoxPro para un proyecto y hay algún archivo abierto o cacheado, se produce un error (solucionado en v1.19.34) * 26/09/2014 Marcio Gomez G. MEJORA v1.19.34: Generar siempre el mismo Timestamp y UniqueID para los binarios minimizaría los cambios al regenerarlos (Agregado en v1.19.35) +* 19/11/2014 edyshor REPORTE BUG dbf v1.19.36: * * *--------------------------------------------------------------------------------------------------- @@ -530,6 +532,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -598,6 +601,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM n_ClassTimeStamp = 1130668032 && 2013/11/04 20:00:00 n_CFG_Actual = 0 n_ID = 0 + n_FileHandle = 0 o_Conversor = NULL o_Frm_Avance = NULL o_FSO = NULL @@ -11465,24 +11469,59 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg *-- Header loTable = CREATEOBJECT('CL_DBF_TABLE') - C_FB2PRG_CODE = C_FB2PRG_CODE + loTable.toText( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, .c_InputFile, lc_FileTypeDesc, @toFoxBin2Prg ) + + IF toFoxBin2Prg.DBF_Conversion_Support = 4 + *-- Exportación de estructura y datos (para Diff solamente) + ERASE (.c_OutputFile + '.TMP' ) + toFoxBin2Prg.n_FileHandle = FCREATE( .c_OutputFile + '.TMP' ) + + IF toFoxBin2Prg.n_FileHandle = -1 THEN + ERROR 102, (.c_OutputFile) + ENDIF + + FWRITE( toFoxBin2Prg.n_FileHandle, C_FB2PRG_CODE ) + loTable.toText( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, .c_InputFile, lc_FileTypeDesc, @toFoxBin2Prg ) + FCLOSE( toFoxBin2Prg.n_FileHandle ) + *fdb* + + *-- Genero el DB2 + IF .l_Test + toModulo = C_FB2PRG_CODE + ELSE + lnLen = 1 &&LEN( toFoxBin2Prg.get_PROGRAM_HEADER() ) + DO CASE + CASE FILE(.c_OutputFile) AND SUBSTR( FILETOSTR( .c_OutputFile ), lnLen ) == SUBSTR( C_FB2PRG_CODE, lnLen ) + *.writeLog( 'El archivo de salida [' + .c_OutputFile + '] no se sobreescribe por ser igual al generado.' ) + .writeLog( TEXTMERGE(C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC) ) + CASE toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) ; + AND toFoxBin2Prg.ChangeFileAttribute( .c_OutputFile, '-R' ) ; + AND STRTOFILE( C_FB2PRG_CODE, .c_OutputFile ) = 0 + *ERROR 'No se puede generar el archivo [' + .c_OutputFile + '] porque es ReadOnly' + ERROR (TEXTMERGE(C_CANT_GENERATE_FILE_BECAUSE_IT_IS_READONLY_LOC)) + ENDCASE + ENDIF - - *-- Genero el DB2 - IF .l_Test - toModulo = C_FB2PRG_CODE ELSE - lnLen = 1 &&LEN( toFoxBin2Prg.get_PROGRAM_HEADER() ) - DO CASE - CASE FILE(.c_OutputFile) AND SUBSTR( FILETOSTR( .c_OutputFile ), lnLen ) == SUBSTR( C_FB2PRG_CODE, lnLen ) - *.writeLog( 'El archivo de salida [' + .c_OutputFile + '] no se sobreescribe por ser igual al generado.' ) - .writeLog( TEXTMERGE(C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC) ) - CASE toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) ; - AND toFoxBin2Prg.ChangeFileAttribute( .c_OutputFile, '-R' ) ; - AND STRTOFILE( C_FB2PRG_CODE, .c_OutputFile ) = 0 - *ERROR 'No se puede generar el archivo [' + .c_OutputFile + '] porque es ReadOnly' - ERROR (TEXTMERGE(C_CANT_GENERATE_FILE_BECAUSE_IT_IS_READONLY_LOC)) - ENDCASE + C_FB2PRG_CODE = C_FB2PRG_CODE + loTable.toText( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, .c_InputFile, lc_FileTypeDesc, @toFoxBin2Prg ) + + + *-- Genero el DB2 + IF .l_Test + toModulo = C_FB2PRG_CODE + ELSE + lnLen = 1 &&LEN( toFoxBin2Prg.get_PROGRAM_HEADER() ) + DO CASE + CASE FILE(.c_OutputFile) AND SUBSTR( FILETOSTR( .c_OutputFile ), lnLen ) == SUBSTR( C_FB2PRG_CODE, lnLen ) + *.writeLog( 'El archivo de salida [' + .c_OutputFile + '] no se sobreescribe por ser igual al generado.' ) + .writeLog( TEXTMERGE(C_OUTPUT_FILE_IS_NOT_OVERWRITEN_LOC) ) + CASE toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) ; + AND toFoxBin2Prg.ChangeFileAttribute( .c_OutputFile, '-R' ) ; + AND STRTOFILE( C_FB2PRG_CODE, .c_OutputFile ) = 0 + *ERROR 'No se puede generar el archivo [' + .c_OutputFile + '] porque es ReadOnly' + ERROR (TEXTMERGE(C_CANT_GENERATE_FILE_BECAUSE_IT_IS_READONLY_LOC)) + ENDCASE + ENDIF + ENDIF *-- Hook para permitir ejecución externa (por ejemplo, para exportar datos) @@ -16284,8 +16323,10 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE *** DH 06/02/2014: added _Records loRecords = THIS._Records - lcText = lcText + loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition) - + *lcText = lcText + loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition) + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition, @toFoxBin2Prg) + lcText = '' ENDIF TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 @@ -16293,6 +16334,11 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE <<>> ENDTEXT + IF toFoxBin2Prg.DBF_Conversion_Support = 4 && BIN2PRG (DATA EXPORT FOR DIFF) + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + lcText = '' + ENDIF + CATCH TO loEx IF THIS.l_Debug AND _VFP.STARTMODE = 0 @@ -16887,21 +16933,29 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE * 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. + * toFoxBin2Prg (@! IN ) Referencia de toFoxBin2Prg *--------------------------------------------------------------------------------------------------- - LPARAMETERS taFields, tnField_Count, tc_DBF_Conversion_Condition + LPARAMETERS taFields, tnField_Count, tc_DBF_Conversion_Condition, toFoxBin2Prg EXTERNAL ARRAY taFields + #IF .F. + LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + #ENDIF + TRY - LOCAL lcText, loEx AS EXCEPTION ; + LOCAL lcText, loEx AS EXCEPTION, I ; , loRecord AS CL_DBF_RECORD OF 'FOXBIN2PRG.PRG' - lcText = '' + lcText = '' + I = 0 TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <<>> <> ENDTEXT + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + lcText = '' loRecord = CREATEOBJECT('CL_DBF_RECORD') IF EMPTY(tc_DBF_Conversion_Condition) @@ -16909,14 +16963,24 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE ENDIF SCAN FOR &tc_DBF_Conversion_Condition. - lcText = lcText + loRecord.toText(@taFields, tnField_Count) + I = I + 1 + lcText = loRecord.toText(@taFields, tnField_Count) + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + IF MOD(I,10000) = 0 THEN + FFLUSH( toFoxBin2Prg.n_FileHandle, .T. ) + ENDIF ENDSCAN + + lcText = '' TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> <<>> ENDTEXT + FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) + lcText = '' + CATCH TO loEx loEx.UserValue = loEx.UserValue + 'tc_DBF_Conversion_Condition = [' + TRANSFORM(tc_DBF_Conversion_Condition) + ']' + CR_LF