From 474e7001a9072bc518169dff58b4ff8e4af69f58 Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Fri, 27 May 2016 17:05:19 +0200 Subject: [PATCH] Agregado soporte para importar datos de los DB2 a los DBF. Todos los tipos de datos excepto General. --- FoxBin2PRGVersionFile.txt | 1 + foxbin2prg.exe | Bin 608220 -> 617056 bytes foxbin2prg.prg | 495 ++++++++++++++++++++++++++++++++------ 3 files changed, 427 insertions(+), 69 deletions(-) diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt index fdcb68e..80ce8b8 100644 --- a/FoxBin2PRGVersionFile.txt +++ b/FoxBin2PRGVersionFile.txt @@ -24,6 +24,7 @@ Change History ------------------------------------------------------------- - 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) 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/foxbin2prg.exe b/foxbin2prg.exe index c46a8c7cf04f022a75babe9c5e1d5003416debb6..d13472455593287244ef3c6ef00e3f62dedaa73e 100644 GIT binary patch delta 26094 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 Jf2)C!{vX{xK3f0) delta 22509 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 diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 4dffad3..c63a786 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) -* 29/07/2015 FDBOZZO v1.19.46 Mejora DBF-Data: Permitir exportar e importar datos de los DBF (Walter Nicholls) +* 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) * * *--------------------------------------------------------------------------------------------------- @@ -3622,7 +3622,7 @@ DEFINE CLASS c_foxbin2prg AS Session .changeFileAttribute( FORCEEXT( .c_InputFile, 'LBT' ), lcForceAttribs ) CASE lcExtension = .c_DB2 - IF .DBF_Conversion_Support <> 2 + IF .DBF_Conversion_Support <> 2 AND ADIR(laDirFile, FORCEEXT(.c_InputFile, 'DBF') + '.CFG') = 0 THEN ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) ENDIF .c_OutputFile = FORCEEXT( .c_InputFile, 'DBF' ) @@ -11887,6 +11887,8 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin + [] ; + [] ; + [] ; + + [] ; + + [] ; + [] c_Type = 'DB2' @@ -11908,7 +11910,8 @@ 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 + , lnIDInputFile, lcTableCFG, lnFileCount, llImportData, laConfig(1), lcConfigItem, lc_DBF_Conversion_Support ; + , lcTempDBC STORE 0 TO lnCodError, lnCodeLines WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' @@ -11923,12 +11926,47 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin EXIT && Si se indicó no procesar, se sale aquí. (Modo de simulación) 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) + 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 + 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 + C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) toFoxBin2Prg.doBackup( .F., .T., '', '', '' ) - *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte + *-- Identifico el inicio/fin de bloque, campos e índices de la tabla .identifyCodeBlocks( @laCodeLines, lnCodeLines, @laLineasExclusion, lnBloquesExclusion, @toTable ) DO CASE @@ -11944,7 +11982,16 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin ENDIF toFoxBin2Prg.updateProcessedFile( lnIDInputFile ) - .writeBinaryFile( @toTable, @toFoxBin2Prg ) + .writeBinaryFile_STRUCTURE( @toTable, @toFoxBin2Prg ) + + IF llImportData AND lnCodeLines > 1 AND toTable._I > 1 THEN + *-- Identifico los registros de la tabla y los agrego + I = toTable._I - 1 + toTable.analyzeCodeBlock( C_TABLE_I, @laCodeLines, @I, lnCodeLines ) + ENDIF + + .writeBinaryFile_INDEXES( @toTable, @toFoxBin2Prg ) + ENDWITH && THIS @@ -11959,6 +12006,17 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin FINALLY USE IN (SELECT("TABLABIN")) + USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile))) + + IF NOT EMPTY(lcTempDBC) + CLOSE DATABASES + ERASE (FORCEEXT(lcTempDBC,'DBC')) + ERASE (FORCEEXT(lcTempDBC,'DCT')) + ERASE (FORCEEXT(lcTempDBC,'DCX')) + ENDIF + + RELEASE I + ENDTRY RETURN lnCodError @@ -11966,7 +12024,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin - PROCEDURE writeBinaryFile + PROCEDURE writeBinaryFile_STRUCTURE LPARAMETERS toTable, toFoxBin2Prg *-- ----------------------------------------------------------------------------------------------------------- #IF .F. @@ -11977,9 +12035,8 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin TRY LOCAL I, lnCodError, loEx AS EXCEPTION ; , loField AS CL_DBF_FIELD OF 'FOXBIN2PRG.PRG' ; - , loIndex AS CL_DBF_INDEX OF 'FOXBIN2PRG.PRG' ; , loDBFUtils AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' ; - , lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate, lcTempDBC, lnDataSessionID, lnSelect + , lcCreateTable, lcLongDec, lcFieldDef, lcIndex, lcTempDBC, lnDataSessionID, lnSelect WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' STORE NULL TO loField, loIndex, loDBFUtils @@ -12009,6 +12066,8 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin lcCreateTable = 'CREATE TABLE "' + .c_OutputFile + '" CodePage=' + toTable._CodePage + ' (' ENDIF + toTable._TableName = .c_OutputFile + *-- Conformo los campos FOR EACH loField IN toTable._Fields FOXOBJECT lcLongDec = '' @@ -12070,6 +12129,53 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin SELECT (lnSelect) ENDIF + ENDWITH && THIS + + + CATCH TO loEx + lnCodError = loEx.ERRORNO + toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) + loEx.USERVALUE = 'lcFieldDef="' + TRANSFORM(lcFieldDef) + '"' + CR_LF ; + + 'lcCreateTable="' + TRANSFORM(lcCreateTable) + '"' + + IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + STORE NULL TO loField, loDBFUtils + RELEASE I, loField, loDBFUtils ; + , lcCreateTable, lcLongDec, lcFieldDef, lcTempDBC, lnDataSessionID, lnSelect + + ENDTRY + + RETURN lnCodError + ENDPROC + + + + PROCEDURE writeBinaryFile_INDEXES + LPARAMETERS toTable, toFoxBin2Prg + *-- ----------------------------------------------------------------------------------------------------------- + #IF .F. + LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' + LOCAL toFoxBin2Prg AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL I, lnCodError, loEx AS EXCEPTION ; + , loIndex AS CL_DBF_INDEX OF 'FOXBIN2PRG.PRG' ; + , loDBFUtils AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' ; + , ldLastUpdate + + WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' + STORE NULL TO loIndex + STORE 0 TO lnCodError + STORE '' TO lcIndex + loDBFUtils = CREATEOBJECT('CL_DBF_UTILS') + *-- Regenero los índices FOR EACH loIndex IN toTable._Indexes FOXOBJECT lcIndex = 'INDEX ON ' + loIndex._Key + ' TAG ' + loIndex._TagName @@ -12113,9 +12219,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin CATCH TO loEx lnCodError = loEx.ERRORNO toFoxBin2Prg.updateProcessedFile( 0, '', '', 'E1' ) - loEx.USERVALUE = 'lcIndex="' + TRANSFORM(lcIndex) + '"' + CR_LF ; - + 'lcFieldDef="' + TRANSFORM(lcFieldDef) + '"' + CR_LF ; - + 'lcCreateTable="' + TRANSFORM(lcCreateTable) + '"' + loEx.USERVALUE = 'lcIndex="' + TRANSFORM(lcIndex) + '"' IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 SET STEP ON @@ -12124,18 +12228,8 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin THROW FINALLY - USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile))) - STORE NULL TO loField, loIndex, loDBFUtils - - IF NOT EMPTY(lcTempDBC) - CLOSE DATABASES - ERASE (FORCEEXT(lcTempDBC,'DBC')) - ERASE (FORCEEXT(lcTempDBC,'DCT')) - ERASE (FORCEEXT(lcTempDBC,'DCX')) - ENDIF - - RELEASE I, loField, loIndex, loDBFUtils ; - , lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate, lcTempDBC, lnDataSessionID, lnSelect + STORE NULL TO loIndex + RELEASE I, loIndex, lcIndex, ldLastUpdate ENDTRY @@ -12184,6 +12278,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin CASE NOT llBloqueTable_Completed AND toTable.analyzeCodeBlock( @lcLine, @taCodeLines, @I, tnCodeLines ) llBloqueTable_Completed = .T. + EXIT ENDCASE ENDFOR @@ -22694,14 +22789,18 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE + [] ; + [] ; + [] ; + + [] ; + + [] ; + [] *-- Modulo _Version = 0 _SourceFile = '' + _I = 0 *-- Table Info + _TableName = '' _CodePage = 0 _Database = '' _FileType = '' @@ -22736,10 +22835,12 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE LPARAMETERS tcLine, taCodeLines, I, tnCodeLines TRY - LOCAL llBloqueEncontrado, lcPropName, lcValue, loEx AS EXCEPTION ; + LOCAL llBloqueEncontrado, lcPropName, lcValue, llFieldsEvaluated, llIndexesEvaluated ; + , loEx AS EXCEPTION ; , loFields AS CL_DBF_FIELDS OF 'FOXBIN2PRG.PRG' ; - , loIndexes AS CL_DBF_INDEXES OF 'FOXBIN2PRG.PRG' - STORE NULL TO loIndexes, loFields + , loIndexes AS CL_DBF_INDEXES OF 'FOXBIN2PRG.PRG' ; + , loRecords AS CL_DBF_RECORDS OF 'FOXBIN2PRG.PRG' + STORE NULL TO loIndexes, loFields, loRecords STORE '' TO lcPropName, lcValue IF LEFT(tcLine, LEN(C_TABLE_I)) == C_TABLE_I @@ -22756,13 +22857,28 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE CASE C_TABLE_F $ tcLine && Fin EXIT - CASE C_FIELDS_I $ tcLine + CASE NOT llFieldsEvaluated AND C_FIELDS_I $ tcLine loFields = ._Fields loFields.analyzeCodeBlock( @tcLine, @taCodeLines, @I, tnCodeLines ) + llFieldsEvaluated = .T. - CASE C_INDEXES_I $ tcLine + CASE NOT llIndexesEvaluated AND C_INDEXES_I $ tcLine loIndexes = ._Indexes loIndexes.analyzeCodeBlock( @tcLine, @taCodeLines, @I, tnCodeLines ) + llIndexesEvaluated = .T. + + CASE C_RECORDS_I $ tcLine + IF llFieldsEvaluated + * Pensado para poder llamar a este método 2 veces: + * > La 1ra.para evaluar Campos e Indices, y poder crear la estructura de la tabla + * al finalizar este paso. + * > La 2da.para cargar los registros, luego de que se haya creado la tabla, + * así se van volcando directamente y no se guardan en memoria. + EXIT + ENDIF + + loRecords = ._Records + loRecords.analyzeCodeBlock( @tcLine, @taCodeLines, @I, tnCodeLines, ._Fields ) OTHERWISE && Otro valor *-- Estructura a reconocer: @@ -22772,6 +22888,8 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE .ADDPROPERTY( '_' + lcPropName, lcValue ) ENDCASE ENDFOR + + ._I = I ENDWITH && THIS ENDIF @@ -22787,8 +22905,8 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE THROW FINALLY - STORE NULL TO loIndexes, loFields - RELEASE lcPropName, lcValue, loFields, loIndexes + STORE NULL TO loIndexes, loFields, loRecords + RELEASE lcPropName, lcValue, loFields, loIndexes, loRecords ENDTRY @@ -23510,9 +23628,74 @@ DEFINE CLASS CL_DBF_RECORDS AS CL_COL_BASE * taCodeLines (@! IN ) Array de líneas del programa analizado * I (@! IN/OUT) Número de línea en análisis * tnCodeLines (@! IN ) Cantidad de líneas del programa analizado + * toFields (@! IN ) Estructura de los campos *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcLine, taCodeLines, I, tnCodeLines - *** DH 06/02/2014: not implemented + LPARAMETERS tcLine, taCodeLines, I, tnCodeLines, toFields + + #IF .F. + LOCAL toFields AS CL_DBF_FIELDS OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL llBloqueEncontrado, lcPropName, lcValue, lcAlias, loEx AS EXCEPTION ; + , loRecord AS CL_DBF_RECORD OF 'FOXBIN2PRG.PRG' ; + , loRecordData as Object + STORE NULL TO loIndex + STORE '' TO lcPropName, lcValue, lcAlias + + IF LEFT(tcLine, LEN(C_RECORDS_I)) == C_RECORDS_I + llBloqueEncontrado = .T. + + WITH THIS AS CL_DBF_RECORDSS OF 'FOXBIN2PRG.PRG' + lcAlias = ALIAS() + CURSORSETPROP("Buffering", 3) + loRecord = NULL + loRecord = CREATEOBJECT("CL_DBF_RECORD") + + FOR I = I + 1 TO tnCodeLines + .set_Line( @tcLine, @taCodeLines, I ) + + DO CASE + CASE EMPTY( tcLine ) + LOOP + + CASE C_RECORDS_F $ tcLine && Fin + EXIT + + CASE '] ; + + [] PROCEDURE analyzeCodeBlock @@ -23612,9 +23798,132 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE * taCodeLines (@! IN ) Array de líneas del programa analizado * I (@! IN/OUT) Número de línea en análisis * tnCodeLines (@! IN ) Cantidad de líneas del programa analizado + * toFields (@! IN ) Estructura de los campos *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcLine, taCodeLines, I, tnCodeLines - *** DH 06/02/2014: not implemented + LPARAMETERS tcLine, taCodeLines, I, tnCodeLines, toFields + + #IF .F. + LOCAL toFields AS CL_DBF_FIELDS OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL llBloqueEncontrado, lcFieldName, lcValue, luValue, loEx AS EXCEPTION ; + , loField as CL_DBF_FIELD OF 'FOXBIN2PRG.PRG' + STORE '' TO lcFieldName, lcValue + + IF 'VALOR + lcFieldName = STREXTRACT( tcLine, '<', '>', 1, 0 ) + lcValue = STREXTRACT( tcLine, '<' + lcFieldName + '>', '', 1, 0 ) + loField = toFields.Item(lcFieldName) + + lcFieldType = loField._Type + llNoCPTran = CAST( loField._NoCPTran as Logical) + + DO CASE + CASE lcFieldType == 'L' + luValue = CAST(lcValue as Logical) + + CASE lcFieldType == 'G' + luValue = '' + + CASE lcFieldType == 'W' + luValue = STRCONV(lcValue,14) + + CASE lcFieldType == 'Q' + luValue = STRCONV(lcValue,14) + + CASE lcFieldType == 'V' + IF llNoCPTran + *-- If NoCPTran, then must encode in b64binary + luValue = STRCONV(lcValue,14) + ELSE + luValue = .Decode(lcValue) + ENDIF + + CASE lcFieldType == 'M' + IF llNoCPTran + *-- If NoCPTran, then must encode in b64binary + luValue = STRCONV(lcValue,14) + ELSE + luValue = .Decode(RTRIM(lcValue)) + ENDIF + + CASE lcFieldType == 'D' + luValue = CAST(lcValue as Date) + + CASE lcFieldType == 'T' + luValue = CAST(lcValue as DateTime) + + CASE lcFieldType == 'Y' + luValue = CAST(lcValue as Currency) + + CASE lcFieldType == 'I' + luValue = CAST(lcValue as Integer) + + CASE lcFieldType == 'B' + luValue = CAST(lcValue as Double) + + CASE lcFieldType == 'F' + luValue = CAST(lcValue as Float) + + CASE lcFieldType == 'N' + luValue = CAST(lcValue as Numeric) + + OTHERWISE && Asume 'C' + IF llNoCPTran + *-- If NoCPTran, then must encode in b64binary + luValue = STRCONV(lcValue,14) + ELSE + luValue = .Decode(RTRIM(lcValue)) + ENDIF + + ENDCASE + + IF lcFieldType == 'G' OR lcFieldType == 'I' AND NOT EMPTY(loField._AutoInc_Step) + *-- Saltar campos General o Integer con AutoInc + ELSE + REPLACE (lcFieldName) WITH (luValue) + ENDIF + + ENDCASE + ENDFOR + ENDWITH && THIS + ENDIF + + CATCH TO loEx + IF loEx.ERRORNO = 1470 && Incorrect property name. + loEx.USERVALUE = 'I=' + TRANSFORM(I) + ', tcLine=' + TRANSFORM(tcLine) + ', lcFieldName=[' + TRANSFORM(lcFieldName) + '], Value=[' + TRANSFORM(lcValue) + ']' + ENDIF + + IF THIS.n_Debug > 0 AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + STORE NULL TO loField + RELEASE loField + + ENDTRY + + RETURN llBloqueEncontrado ENDPROC @@ -23629,7 +23938,7 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE EXTERNAL ARRAY taFields TRY - LOCAL I, lcText, loEx AS EXCEPTION, lcField, luValue, lcFieldType + LOCAL I, lcText, loEx AS EXCEPTION, lcField, luValue, lcFieldType, llNoCPTran lcText = '' WITH THIS AS CL_DBF_RECORD OF 'FOXBIN2PRG.PRG' @@ -23641,29 +23950,54 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE FOR I = 1 TO tnField_Count lcField = taFields[I, 1] lcFieldType = taFields[I, 2] + llNoCPTran = taFields[I, 6] - *** FDBOZZO 2014/07/15: Added field restrictions on binary and general fields - DO CASE - CASE lcFieldType == 'G' - luValue = 'GENERAL FIELD NOT SUPPORTED' - CASE lcFieldType == 'W' - luValue = 'BLOB FIELD NOT SUPPORTED' - CASE lcFieldType == 'Q' - luValue = 'VARBINARY FIELD NOT SUPPORTED' - OTHERWISE + IF lcFieldType == 'G' + *-- Saltar campos de tipo General + ELSE luValue = EVALUATE(lcField) - ENDCASE - DO CASE - CASE taFields[I, 2] $ 'CMV' - luValue = TRIM(luValue) - IF .Encode(luValue) <> luValue - luValue = '' - ENDIF &&.Encode(luValue) <> luValue - ENDCASE - TEXT TO lcText TEXTMERGE NOSHOW flags 1+2 PRETEXT 1+2 additive - <<>> <<'<' + lcField + '>'>><><<''>> - ENDTEXT + DO CASE + CASE lcFieldType $ 'GWQVCM' AND luValue == '' ; && Vacío + OR lcFieldType $ 'DT' AND luValue == {} ; + OR lcFieldType $ 'YIBFN' AND luValue == 0 + + CASE lcFieldType == 'W' + luValue = STRCONV(luValue,13) + + CASE lcFieldType == 'Q' + luValue = STRCONV(luValue,13) + + CASE lcFieldType == 'V' + IF llNoCPTran THEN + *-- If NoCPTran, then must encode in b64binary + luValue = STRCONV(luValue,13) + ELSE + luValue = .Encode(luValue) + ENDIF + + CASE lcFieldType $ 'C' + IF llNoCPTran THEN + *-- If NoCPTran, then must encode in b64binary + luValue = STRCONV(luValue,13) + ELSE + luValue = .Encode(RTRIM(luValue)) + ENDIF + + CASE lcFieldType $ 'M' + IF llNoCPTran THEN + *-- If NoCPTran, then must encode in b64binary + luValue = STRCONV(luValue,13) + ELSE + luValue = .Encode(RTRIM(luValue)) + ENDIF + + ENDCASE + + TEXT TO lcText TEXTMERGE NOSHOW flags 1+2 PRETEXT 1+2 additive + <<>> <<'<' + lcField + '>'>><><<''>> + ENDTEXT + ENDIF NEXT TEXT TO lcText TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 additive @@ -23684,17 +24018,40 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE ENDPROC PROCEDURE Encode - LPARAMETERS tcString + LPARAMETERS tcString, tl_isCDATA LOCAL lcString - lcString = STRTRAN(tcString, '&', '&') - lcString = STRTRAN(lcString, '>', '>') - lcString = STRTRAN(lcString, '<', '<') - lcString = STRTRAN(lcString, '"', '"') - lcString = STRTRAN(lcString, "'", ''') - lcString = STRTRAN(lcString, '/', '/') - lcString = STRTRAN(lcString, CHR(13), ' ') - lcString = STRTRAN(lcString, CHR(10), ' ') - lcString = STRTRAN(lcString, CHR(9), ' ') + IF tl_isCDATA THEN + lcString = STRTRAN(tcString, ']]>', ']]]]>') + ELSE + lcString = STRTRAN(tcString, '&', '&') + lcString = STRTRAN(lcString, '>', '>') + lcString = STRTRAN(lcString, '<', '<') + lcString = STRTRAN(lcString, '"', '"') + lcString = STRTRAN(lcString, "'", ''') + lcString = STRTRAN(lcString, '/', '/') + lcString = STRTRAN(lcString, CHR(13), ' ') + lcString = STRTRAN(lcString, CHR(10), ' ') + lcString = STRTRAN(lcString, CHR(9), ' ') + ENDIF + RETURN lcString + ENDPROC + + PROCEDURE Decode + LPARAMETERS tcString, tl_isCDATA + LOCAL lcString + IF tl_isCDATA THEN + lcString = STRTRAN(tcString, ']]]]>', ']]>') + ELSE + lcString = STRTRAN(tcString, ' ', CHR(9)) + lcString = STRTRAN(lcString, ' ', CHR(10)) + lcString = STRTRAN(lcString, ' ', CHR(13)) + lcString = STRTRAN(lcString, '/', '/') + lcString = STRTRAN(lcString, ''', "'") + lcString = STRTRAN(lcString, '"', '"') + lcString = STRTRAN(lcString, '<', '<') + lcString = STRTRAN(lcString, '>', '>') + lcString = STRTRAN(lcString, '&', '&') + ENDIF RETURN lcString ENDPROC