diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index 643d396..21b4f44 100644 Binary files a/foxbin2prg.pjt and b/foxbin2prg.pjt differ diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx index 73aed1e..2434764 100644 Binary files a/foxbin2prg.pjx and b/foxbin2prg.pjx differ diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 4667e95..809fc31 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -111,6 +111,8 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro #DEFINE C_ENDTEXT 'ENDTEXT' #DEFINE C_PROCEDURE 'PROCEDURE' #DEFINE C_ENDPROC 'ENDPROC' +#DEFINE C_WITH 'WITH' +#DEFINE C_WNDWITH 'ENDWITH' #DEFINE C_SRV_HEAD_I '*' #DEFINE C_SRV_HEAD_F '*' #DEFINE C_SRV_DATA_I '*' @@ -684,6 +686,7 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -1447,14 +1450,14 @@ DEFINE CLASS c_conversor_base AS SESSION FOR I = 1 TO OCCURS( '/>', tcValue ) TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><><', I, 1+4 )>> + <<>> <', I, 1+4 )>> ENDTEXT ENDFOR TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> - <><> + <<>> ENDTEXT CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I @@ -1508,6 +1511,72 @@ DEFINE CLASS c_conversor_base AS SESSION ENDFUNC + ******************************************************************************************************************* + PROCEDURE write_DBF_Metadata + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tc_FileName (v! IN ) Nombre del DBF a analizar + * tcDBC_Name (v! IN ) Nombre del DBC a asociar + * tdLastUpdate (v? IN ) Fecha de última actualización + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tc_FileName, tcDBC_Name, tdLastUpdate + + TRY + LOCAL lnHandle, lcStr, lnDataPos, lnFieldCount, loEx AS EXCEPTION + + IF NOT EMPTY(tcDBC_Name) + tn_HexFileType = 0 + lnHandle = FOPEN(tc_FileName,2) + + IF lnHandle = -1 + EXIT + ENDIF + + lcStr = FREAD(lnHandle,1) && File type + tn_HexFileType = EVALUATE( TRANSFORM(ASC(lcStr),'@0') ) + + IF EMPTY(tdLastUpdate) + lcStr = FREAD(lnHandle,3) && Last update (YYMMDD) + ELSE + lcStr = CHR( VAL( RIGHT( PADL( YEAR( tdLastUpdate ),4,'0'), 2 ) ) ) ; + + CHR( VAL( PADL( MONTH( tdLastUpdate ),2,'0' ) ) ) ; + + CHR( VAL( PADL( DAY( tdLastUpdate ),2,'0' ) ) ) && Last update (YYMMDD) + =FWRITE( lnHandle, PADR(lcStr,3,CHR(0)) ) + ENDIF + + lcStr = FREAD(lnHandle,4) && Number of records in file + lcStr = FREAD(lnHandle,2) && Position of first data record + lnDataPos = CTOBIN(lcStr,"2RS") + lnFieldCount = (lnDataPos - 296) / 32 + lcStr = FREAD(lnHandle,2) && Length of one data record, including delete flag + lcStr = FREAD(lnHandle,16) && Reserved + lcStr = FREAD(lnHandle,1) && Table flags: 0x01=Has CDX, 0x02=Has Memo, 0x04=Id DBC (flags acumulativos) + lcStr = FREAD(lnHandle,1) && Code page mark + lcStr = FREAD(lnHandle,2) && Reserved, contains 0x00 + lcStr = FREAD(lnHandle,32 * lnFieldCount) && Field subrecords (los salteo) + lcStr = FREAD(lnHandle,1) && Header Record Terminator (0x0D) + + IF FWRITE( lnHandle, PADR(tcDBC_Name,263,CHR(0)) ) = 0 + ERROR 'No se pudo actualizar el backlink [' + tcDBC_Name + '] de la tabla [' + tc_FileName + ']' + ENDIF + ENDIF + + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + FCLOSE(lnHandle) + ENDTRY + + RETURN lnHandle + ENDPROC + + ******************************************************************************************************************* PROCEDURE sortPropsAndValues * KNOWLEDGE BASE: @@ -2333,7 +2402,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> - + <<>> ENDTEXT ENDFOR @@ -2374,7 +2443,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> - + <<>> ENDTEXT ENDFOR @@ -2511,7 +2580,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base TEXT TO tcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> - + <<>> ENDTEXT ENDIF ENDFOR @@ -5131,10 +5200,11 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin LOCAL I, lnCodError, loEx AS EXCEPTION LOCAL loField AS CL_DBF_FIELD OF 'FOXBIN2PRG.PRG' LOCAL loIndex AS CL_DBF_INDEX OF 'FOXBIN2PRG.PRG' - LOCAL lcCreateTable, lcLongDec, lcFieldDef + LOCAL lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate + + STORE '' TO lcIndex, lcFieldDef lcCreateTable = 'CREATE TABLE "' + THIS.c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' (' - lcFieldDef = '' *-- Conformo los campos FOR EACH loField IN toTable._Fields FOXOBJECT @@ -5157,7 +5227,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin ENDIF lcLongDec = lcLongDec + loField._Decimals ENDIF - + IF NOT EMPTY(lcLongDec) lcLongDec = lcLongDec + ')' ENDIF @@ -5184,9 +5254,43 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin *STRTOFILE(lcCreateTable,'CreateTable.txt') &lcCreateTable. + *-- Regenero los índices + FOR EACH loIndex IN toTable._Indexes FOXOBJECT + lcIndex = 'INDEX ON ' + loIndex._Key + ' TAG ' + loIndex._TagName + + IF loIndex._TagType = 'BINARY' + lcIndex = lcIndex + ' BINARY' + ELSE + lcIndex = lcIndex + ' COLLATE "' + loIndex._Collate + '"' + + IF NOT EMPTY(loIndex._Filter) + lcIndex = lcIndex + ' FOR ' + loIndex._Filter + ENDIF + + lcIndex = lcIndex + ' ' + loIndex._Order + + IF loIndex._TagType <> 'REGULAR' + *-- Si es PRIMARY lo cambio a CANDIDATE y luego lo recodifico + lcIndex = lcIndex + ' ' + STRTRAN( loIndex._TagType, 'PRIMARY', 'CANDIDATE' ) + ENDIF + ENDIF + + *STRTOFILE( lcIndex, 'index_' + loIndex._TagName + '.txt' ) + &lcIndex. + ENDFOR + + + USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile))) + + ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' ) + THIS.write_DBF_Metadata( THIS.c_OutputFile, toTable._Database, ldLastUpdate ) + CATCH TO loEx - lnCodError = loEx.ERRORNO + lnCodError = loEx.ErrorNo + loEx.UserValue = 'lcIndex="' + TRANSFORM(lcIndex) + '"' + CR_LF ; + + 'lcFieldDef="' + TRANSFORM(lcFieldDef) + '"' + CR_LF ; + + 'lcCreateTable="' + TRANSFORM(lcCreateTable) + '"' IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON @@ -6421,18 +6525,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF '.' $ toRegObj.PARENT *-- Este caso: clase.objeto.objeto ==> se quita clase TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>ADD OBJECT '<>.<>' AS <> <<>> + <<>> ADD OBJECT '<>.<>' AS <> <<>> ENDTEXT ELSE *-- Este caso: objeto TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>ADD OBJECT '<>' AS <> <<>> + <<>> ADD OBJECT '<>' AS <> <<>> ENDTEXT ENDIF IF NOT EMPTY(lcMemo) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - WITH ; + <> ; <> ENDTEXT ENDIF @@ -6461,7 +6565,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> - + <<>> ENDTEXT CATCH TO loEx @@ -6491,9 +6595,9 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base FOR I = 1 TO lnMethodCount *-- Genero los métodos indentados *TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - * <><>PROCEDURE <> + * <<>> <>PROCEDURE <> * <> - * <>ENDPROC + * <<>> ENDPROC *ENDTEXT *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso @@ -6544,20 +6648,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Nombre del método TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> <> + <<>> <> <> ENDTEXT *-- Comentarios del método (si tiene) IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><>&& <> + <<>> && <> ENDTEXT ENDIF *-- Código del método *TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 * <> - * <>ENDPROC + * <<>> ENDPROC *ENDTEXT *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso @@ -6637,20 +6741,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes) FOR I = 1 TO ALEN(taPropsAndValues, 1) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> = <> + <<>> <> = <> ENDTEXT lnComment = ASCAN( taPropsAndComments, taPropsAndValues(I,1), 1, 0, 1, 8) IF lnComment > 0 AND NOT EMPTY(taPropsAndComments(lnComment,2)) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><>&& <> + <<>> && <> ENDTEXT ENDIF ENDFOR TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - + <<>> ENDTEXT ENDIF ENDWITH && THIS @@ -6688,7 +6792,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base lcPropsMethodsDefd = '' TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> + <<>> <> ENDTEXT FOR I = 1 TO tnPropsAndComments_Count @@ -6702,18 +6806,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base , 'p' ) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><>*<>: <> + <<>> *<>: <> ENDTEXT IF NOT EMPTY(taPropsAndComments(I,2)) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><><<'&'>><<'&'>> <> + <<>> <<'&'>><<'&'>> <> ENDTEXT ENDIF ENDFOR TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> + <<>> <> ENDTEXT ENDIF @@ -6746,7 +6850,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Comentario de la clase IF NOT EMPTY(toRegClass.RESERVED7) THEN TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><><<'&'+'&'>> <> + <<>> <<'&'+'&'>> <> ENDTEXT ENDIF ENDPROC @@ -6758,7 +6862,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF tnLastClass = 1 TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<'ENDDEFINE'>> - + <<>> ENDTEXT ENDIF ENDPROC @@ -6770,7 +6874,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- #INCLUDE IF NOT EMPTY(toReg.RESERVED8) THEN TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>#INCLUDE "<>" + <<>> #INCLUDE "<>" ENDTEXT ENDIF ENDPROC @@ -6782,11 +6886,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - + <<>> ENDTEXT TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+8 - <><> + <<>> <> Baseclass="<>" Timestamp="<>" Scale="<>" @@ -6824,7 +6928,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF NOT EMPTY(tcHiddenProp) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>HIDDEN <> + <<>> HIDDEN <> ENDTEXT ENDIF ENDPROC @@ -6851,7 +6955,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF NOT EMPTY(tcProtectedProp) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>PROTECTED <> + <<>> PROTECTED <> ENDTEXT ENDIF ENDPROC @@ -6871,7 +6975,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDTEXT TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>> + <<>> platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>> ENDTEXT TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 @@ -6943,13 +7047,13 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDTEXT TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>>]]> - <>>]]> - <>>]]> - <>>]]> - <>