From 17e38434eea9f74c919119566c1a27d0e3859840 Mon Sep 17 00:00:00 2001 From: fernando Date: Mon, 6 Jan 2014 04:47:56 +0100 Subject: [PATCH] =?UTF-8?q?Changeset:=20130=20-=20mnx=20bug=20fix:=20Se=20?= =?UTF-8?q?genera=20llamada=20DO=20Procedure=20o=20Command=20cuando=20no?= =?UTF-8?q?=20hay=20procedure=20o=20Command=20para=20llamar=20(cuando=20se?= =?UTF-8?q?=20crea=20una=20opci=C3=B3n=20vac=C3=ADa)=20[Fidel=20charny]=20?= =?UTF-8?q?-=20Agregado=20soporte=20para=20tablas=20(DBFs)=20anteriores=20?= =?UTF-8?q?a=20VFP=209=20para=20generar=20el=20texto=20DB2,=20pero=20regen?= =?UTF-8?q?era=20en=20formato=20VFP=209!=20-=20dbf=20bug=20fix:=20DBFs=20v?= =?UTF-8?q?inculados=20a=20DBCs=20que=20usan=20nombres=20de=20campo=20larg?= =?UTF-8?q?os=20dan=20errores=20al=20regenerar=20-=20dbf=20bug=20fix:=20No?= =?UTF-8?q?=20se=20generaba=20toda=20la=20informaci=C3=B3n=20de=20las=20vi?= =?UTF-8?q?stas=20(views)=20de=20los=20DBCs=20-=20Encapsuladas=20funciones?= =?UTF-8?q?=20de=20acceso=20a=20bajo=20nivel=20de=20DBFs=20en=20nueva=20cl?= =?UTF-8?q?ase=20CL=5FDBF=5FUTILS=20-=20Limpieza=20de=20c=C3=B3digo=20y=20?= =?UTF-8?q?refactorizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Convert_VFP9_BIN_2_PRG.vbs | 66 ++- Convert_VFP9_PRG_2_BIN.vbs | 66 ++- README.txt | 2 +- TESTS/DATOS_READONLY/FB2P_DBF.DB2 | 250 ++++---- TESTS/DATOS_READONLY/fb2p_dbc.dbc | Bin 7647 -> 8968 bytes TESTS/DATOS_READONLY/fb2p_dbc.dct | Bin 29120 -> 133632 bytes TESTS/DATOS_READONLY/fb2p_dbc.dcx | Bin 5632 -> 5632 bytes TESTS/DATOS_READONLY/fb2p_dbf.cdx | Bin 6144 -> 18432 bytes TESTS/DATOS_READONLY/fb2p_dbf.dbf | Bin 456 -> 717 bytes TESTS/DATOS_READONLY/fb2p_depto.cdx | Bin 3072 -> 3072 bytes TESTS/DATOS_READONLY/fb2p_depto.dbf | Bin 360 -> 422 bytes foxbin2prg.pj2 | 8 +- foxbin2prg.pjt | Bin 311296 -> 325056 bytes foxbin2prg.pjx | Bin 1583 -> 1583 bytes foxbin2prg.prg | 876 ++++++++++++++++++++-------- 15 files changed, 879 insertions(+), 389 deletions(-) diff --git a/Convert_VFP9_BIN_2_PRG.vbs b/Convert_VFP9_BIN_2_PRG.vbs index 7e9e6b5..091edb4 100644 --- a/Convert_VFP9_BIN_2_PRG.vbs +++ b/Convert_VFP9_BIN_2_PRG.vbs @@ -2,25 +2,27 @@ ' Convert_VFP9_BIN_2_PRG.vbs - 03/01/2014 - Fernando D. Bozzo (fdbozzo@gmail.com) '--------------------------------------------------------------------------------------------------- ' ENGLISH: -' USE: Copy this file in the same directory of FoxBin2prg and create a shortcut -' on user's "SendTo" folder +' - Copy this file in the same directory of FoxBin2prg and create a shortcut +' on user's "SendTo" folder +' - Now you can select files or directories, right click and "SendTo" FoxBin2prg for batch conversion ' ' ESPAÑOL: -' USO: Copie este archivo en el mismo directorio que FoxBin2prg y cree un acceso directo -' en la carpeta "SendTo" del usuario +' - Copie este archivo en el mismo directorio que FoxBin2prg y cree un acceso directo +' en la carpeta "SendTo" del usuario +' - Ahora puede seleccionar archivos o directorios, pulsar click derecho y "Enviar a" FoxBin2prg para conversiones batch '--------------------------------------------------------------------------------------------------- Const ForReading = 1 Dim WSHShell, FileSystemObject Dim oVFP9, nExitCode, cEXETool, cCMD, nDebug, cConvertType, aExtensions(8), foxbin2prg_cfg -Dim i, x, str_cfg, aConf +Dim i, x, str_cfg, aConf, cErrMsg, cFlagGenerateLog, cFlagDontShowErrMsg, cFlagJustShowCall Set WSHShell = WScript.CreateObject("WScript.Shell") Set FileSystemObject = WScript.CreateObject("Scripting.FileSystemObject") Set oVFP9 = CreateObject("VisualFoxPro.Application.9") -cConvertType = "BIN2PRG" foxbin2prg_cfg = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg.cfg") nExitCode = 0 +cConvertType = "BIN2PRG" '<<< This is the only difference between the 2 scripts '--------------------------------------------------------------------------------------------------- -nDebug = 1 '0=OFF, 1=Create FoxBin2prg LOG, 2=Only show calls, 3=Only show calls of the LOG call +nDebug = 5 'Cumulative Flags: 0=OFF, 1=Create FoxBin2prg LOG, 2=Only show script calls, 4=Don't show FoxBin2prg error modal messages '--------------------------------------------------------------------------------------------------- If cConvertType = "BIN2PRG" Then @@ -52,11 +54,9 @@ Else arrFb2p_CFG = Split(strNextLine , ",") For i = 0 to Ubound(arrFb2p_CFG) If Left( arrFb2p_CFG(i), 10 ) = "extension:" Then - 'Wscript.Echo "CFG line: " & arrFb2p_CFG(i) aConf = Split( arrFb2p_CFG(i), ":" ) 'Obtengo la separación de "extensión:" y "ext:equiv" str_cfg = UCase( Trim( aConf(1) ) ) aConf = Split( str_cfg, "=" ) 'Obtengo la separación de extensión y equivalencia (vc2=vca) - 'Wscript.Echo "[" & aConf(0) & "] [" & aConf(1) & "]" For x = 1 TO 8 If aExtensions(x) = aConf(0) Then @@ -74,7 +74,17 @@ End if If WScript.Arguments.Count = 0 Then nExitCode = 1 - MsgBox "Sin parametros" + cErrMsg = "nDebug = " & nDebug + If GetBit(nDebug, 1) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 0 ON: (1) Create FoxBin2prg LOG" + End If + If GetBit(nDebug, 2) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 1 ON: (2) Only show script calls" + End If + If GetBit(nDebug, 3) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 2 ON: (4) Don't show FoxBin2prg error modal messages" + End If + MsgBox cErrMsg, 64, "No parameters - Debug Status" Else cEXETool = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg.exe") @@ -90,15 +100,11 @@ Private Sub scanDirs( tcArgument ) Dim omFolder, oFolder If FileSystemObject.FolderExists( tcArgument ) Then '-- Es un directorio - 'WScript.Echo "Argument: " & "[" & tcArgument & "]" Set omFolder = FileSystemObject.GetFolder( tcArgument ) - 'WScript.Echo "Dir: " & "[" & omFolder.Path & "]" For Each oFile IN omFolder.Files - 'WScript.Echo "File: " & "[" & oFile.Path & "]" evaluateFile( oFile.Path ) Next For Each oFolder IN omFolder.SubFolders - 'WScript.Echo "SubDir: " & "[" & oFolder.Name & "] [" & oFolder.Path & "]" scanDirs( oFolder.Path ) Next Else @@ -111,14 +117,27 @@ End Sub Private Sub evaluateFile( tcFile ) For x = 1 TO 8 If aExtensions(x) = UCase( FileSystemObject.GetExtensionName( tcFile ) ) Then - If nDebug = 1 OR nDebug = 3 Then - cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH '" & tcFile & "','0','0','0','0','1'" - Else - cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH " & chr(34) & tcFile & chr(34) + cFlagGenerateLog = "'0'" + cFlagDontShowErrMsg = "'0'" + cFlagShowCall = "'0'" + If GetBit(nDebug,1) Then + cFlagGenerateLog = "'1'" End If - If nDebug = 2 Or nDebug = 3 Then + If GetBit(nDebug,2) Then + cFlagDontShowErrMsg = "'1'" + End If + If GetBit(nDebug,3) Then + cFlagJustShowCall = "1" + End If + + If nDebug = 0 Or nDebug = 2 Then + cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH " & chr(34) & tcFile & chr(34) + Else + cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH '" & tcFile & "','0','0','0'," & cFlagDontShowErrMsg & "," & cFlagGenerateLog + End If + If cFlagJustShowCall = "1" Then MsgBox cCMD, 0, "PARAMETROS ENVIADOS" - Else 'nDebug = 0 Or nDebug = 2 + Else oVFP9.DoCmd( cCMD ) nExitCode = oVFP9.Eval("_SCREEN.ExitCode") End If @@ -126,3 +145,10 @@ Private Sub evaluateFile( tcFile ) End If Next End Sub + + +Function GetBit(lngValue, BitNum) + Dim BitMask + If BitNum < 32 Then BitMask = 2 ^ (BitNum - 1) Else BitMask = "&H80000000" + GetBit = CBool(lngValue AND BitMask) +End Function diff --git a/Convert_VFP9_PRG_2_BIN.vbs b/Convert_VFP9_PRG_2_BIN.vbs index 569d334..c3ee167 100644 --- a/Convert_VFP9_PRG_2_BIN.vbs +++ b/Convert_VFP9_PRG_2_BIN.vbs @@ -2,25 +2,27 @@ ' Convert_VFP9_PRG_2_BIN.vbs - 03/01/2014 - Fernando D. Bozzo (fdbozzo@gmail.com) '--------------------------------------------------------------------------------------------------- ' ENGLISH: -' USE: Copy this file in the same directory of FoxBin2prg and create a shortcut -' on user's "SendTo" folder +' - Copy this file in the same directory of FoxBin2prg and create a shortcut +' on user's "SendTo" folder +' - Now you can select files or directories, right click and "SendTo" FoxBin2prg for batch conversion ' ' ESPAÑOL: -' USO: Copie este archivo en el mismo directorio que FoxBin2prg y cree un acceso directo -' en la carpeta "SendTo" del usuario +' - Copie este archivo en el mismo directorio que FoxBin2prg y cree un acceso directo +' en la carpeta "SendTo" del usuario +' - Ahora puede seleccionar archivos o directorios, pulsar click derecho y "Enviar a" FoxBin2prg para conversiones batch '--------------------------------------------------------------------------------------------------- Const ForReading = 1 Dim WSHShell, FileSystemObject Dim oVFP9, nExitCode, cEXETool, cCMD, nDebug, cConvertType, aExtensions(8), foxbin2prg_cfg -Dim i, x, str_cfg, aConf +Dim i, x, str_cfg, aConf, cErrMsg, cFlagGenerateLog, cFlagDontShowErrMsg, cFlagJustShowCall Set WSHShell = WScript.CreateObject("WScript.Shell") Set FileSystemObject = WScript.CreateObject("Scripting.FileSystemObject") Set oVFP9 = CreateObject("VisualFoxPro.Application.9") -cConvertType = "PRG2BIN" foxbin2prg_cfg = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg.cfg") nExitCode = 0 +cConvertType = "PRG2BIN" '<<< This is the only difference between the 2 scripts '--------------------------------------------------------------------------------------------------- -nDebug = 1 '0=OFF, 1=Create FoxBin2prg LOG, 2=Only show calls, 3=Only show calls of the LOG call +nDebug = 5 'Cumulative Flags: 0=OFF, 1=Create FoxBin2prg LOG, 2=Only show script calls, 4=Don't show FoxBin2prg error modal messages '--------------------------------------------------------------------------------------------------- If cConvertType = "BIN2PRG" Then @@ -52,11 +54,9 @@ Else arrFb2p_CFG = Split(strNextLine , ",") For i = 0 to Ubound(arrFb2p_CFG) If Left( arrFb2p_CFG(i), 10 ) = "extension:" Then - 'Wscript.Echo "CFG line: " & arrFb2p_CFG(i) aConf = Split( arrFb2p_CFG(i), ":" ) 'Obtengo la separación de "extensión:" y "ext:equiv" str_cfg = UCase( Trim( aConf(1) ) ) aConf = Split( str_cfg, "=" ) 'Obtengo la separación de extensión y equivalencia (vc2=vca) - 'Wscript.Echo "[" & aConf(0) & "] [" & aConf(1) & "]" For x = 1 TO 8 If aExtensions(x) = aConf(0) Then @@ -74,7 +74,17 @@ End if If WScript.Arguments.Count = 0 Then nExitCode = 1 - MsgBox "Sin parametros" + cErrMsg = "nDebug = " & nDebug + If GetBit(nDebug, 1) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 0 ON: (1) Create FoxBin2prg LOG" + End If + If GetBit(nDebug, 2) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 1 ON: (2) Only show script calls" + End If + If GetBit(nDebug, 3) Then + cErrMsg = cErrMsg & Chr(13) & "Bit 2 ON: (4) Don't show FoxBin2prg error modal messages" + End If + MsgBox cErrMsg, 64, "No parameters - Debug Status" Else cEXETool = Replace(WScript.ScriptFullName, WScript.ScriptName, "foxbin2prg.exe") @@ -90,15 +100,11 @@ Private Sub scanDirs( tcArgument ) Dim omFolder, oFolder If FileSystemObject.FolderExists( tcArgument ) Then '-- Es un directorio - 'WScript.Echo "Argument: " & "[" & tcArgument & "]" Set omFolder = FileSystemObject.GetFolder( tcArgument ) - 'WScript.Echo "Dir: " & "[" & omFolder.Path & "]" For Each oFile IN omFolder.Files - 'WScript.Echo "File: " & "[" & oFile.Path & "]" evaluateFile( oFile.Path ) Next For Each oFolder IN omFolder.SubFolders - 'WScript.Echo "SubDir: " & "[" & oFolder.Name & "] [" & oFolder.Path & "]" scanDirs( oFolder.Path ) Next Else @@ -111,14 +117,27 @@ End Sub Private Sub evaluateFile( tcFile ) For x = 1 TO 8 If aExtensions(x) = UCase( FileSystemObject.GetExtensionName( tcFile ) ) Then - If nDebug = 1 OR nDebug = 3 Then - cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH '" & tcFile & "','0','0','0','0','1'" - Else - cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH " & chr(34) & tcFile & chr(34) + cFlagGenerateLog = "'0'" + cFlagDontShowErrMsg = "'0'" + cFlagShowCall = "'0'" + If GetBit(nDebug,1) Then + cFlagGenerateLog = "'1'" End If - If nDebug = 2 Or nDebug = 3 Then + If GetBit(nDebug,2) Then + cFlagDontShowErrMsg = "'1'" + End If + If GetBit(nDebug,3) Then + cFlagJustShowCall = "1" + End If + + If nDebug = 0 Or nDebug = 2 Then + cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH " & chr(34) & tcFile & chr(34) + Else + cCMD = "DO " & chr(34) & cEXETool & chr(34) & " WITH '" & tcFile & "','0','0','0'," & cFlagDontShowErrMsg & "," & cFlagGenerateLog + End If + If cFlagJustShowCall = "1" Then MsgBox cCMD, 0, "PARAMETROS ENVIADOS" - Else 'nDebug = 0 Or nDebug = 2 + Else oVFP9.DoCmd( cCMD ) nExitCode = oVFP9.Eval("_SCREEN.ExitCode") End If @@ -126,3 +145,10 @@ Private Sub evaluateFile( tcFile ) End If Next End Sub + + +Function GetBit(lngValue, BitNum) + Dim BitMask + If BitNum < 32 Then BitMask = 2 ^ (BitNum - 1) Else BitMask = "&H80000000" + GetBit = CBool(lngValue AND BitMask) +End Function diff --git a/README.txt b/README.txt index 39ea12d..ad331e8 100644 --- a/README.txt +++ b/README.txt @@ -1,4 +1,4 @@ -02/01/2014 FOXBIN2PRG VER.1.17 FOR VISUAL FOXPRO 9 BINARIES Fernando D. Bozzo (fdbozzo@gmail.com) +06/01/2014 FOXBIN2PRG VER.1.18 FOR VISUAL FOXPRO 9 BINARIES Fernando D. Bozzo (fdbozzo@gmail.com) ESPAÑOL -------------------------------------------------------------------------------------------- diff --git a/TESTS/DATOS_READONLY/FB2P_DBF.DB2 b/TESTS/DATOS_READONLY/FB2P_DBF.DB2 index 255906b..afc5d93 100644 --- a/TESTS/DATOS_READONLY/FB2P_DBF.DB2 +++ b/TESTS/DATOS_READONLY/FB2P_DBF.DB2 @@ -2,116 +2,117 @@ * (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! * (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! *-------------------------------------------------------------------------------------------------------------------------------------------------------- -*< FOXBIN2PRG: Version="1.14" SourceFile="C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_DBF.DBF" Generated="2013/12/11 19:43:58" /> (Para uso con Visual FoxPro 9.0) +*< FOXBIN2PRG: Version="1.18" SourceFile="C:\DESA\foxbin2prg\TESTS\DATOS_READONLY\fb2p_dbf.dbf" Generated="2014/01/05 19:10:49" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * - C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_DBF.FPT - 1252 - fb2p_dbc.dbc - 0x00000031 - Visual FoxPro, autoincrement enabled + + 1252 + 2014/01/05 + fb2p_dbc.dbc + 0x00000031 + Visual FoxPro, autoincrement enabled - NOMBRE - C - 30 - 0 - .F. - .F. - .NOT.EMPTY(nombre) - "El nombre está vacío" - "." - edad>10 - "Mensaje de error de la regla edad > 10" - NOMBRELARGODELDBF - __ri_insert_nombrelargodeldbf().AND.(ins_trg()) - __ri_update_nombrelargodeldbf().AND.(upd_trg()) - del_trg() - Comentario de la tabla "fb2p_dbf" - 0 - 0 + NOMBRE + C + 30 + 0 + .F. + .F. + .NOT.EMPTY(nombre) + "El nombre está vacío" + "." + edad>10 + "Mensaje de error de la regla edad > 10" + NOMBRELARGODELDBF + __ri_insert_nombrelargodeldbf().AND.(ins_trg()) + __ri_update_nombrelargodeldbf().AND.(upd_trg()) + del_trg() + Comentario de la tabla "fb2p_dbf" + 0 + 0 - EDAD - N - 3 - 0 - .F. - .F. - - - - - - - - - - - 0 - 0 + EDAD + N + 3 + 0 + .F. + .F. + + + + + + + + + + + 0 + 0 - ID - I - 4 - 0 - .F. - .F. - - - - - - - - - - - 10 - 2 + ID + I + 4 + 0 + .F. + .F. + + + + + + + + + + + 20 + 2 - BIGTEXT - M - 4 - 0 - .F. - .F. - - - - - - - - - - - 0 - 0 + BIGTEXT + M + 4 + 0 + .F. + .F. + + + + + + + + + + + 0 + 0 - DEPTO - C - 10 - 0 - .F. - .F. - - - - - - - - - - - 0 - 0 + DEPTO + C + 10 + 0 + .F. + .F. + + + + + + + + + + + 0 + 0 @@ -120,25 +121,52 @@ - ID - MACHINE - ID - .F. - + ID + PRINCIPAL + ID + + ASCENDING + MACHINE - I_NOMBRE - GENERAL - NOMBRE - .F. - + I_NOMBRE + NORMAL + NOMBRE + + ASCENDING + GENERAL - DEPTO - MACHINE - DEPTO - .F. - + DEPTO + NORMAL + DEPTO + + ASCENDING + MACHINE + + + EDAD_ND + NORMAL + EDAD + .NOT.DELETED() + ASCENDING + MACHINE + + + NOTDELETED + BINARIO + .NOT.DELETED() + + ASCENDING + MACHINE + + + EDAD + CANDIDATO + EDAD + + DESCENDING + MACHINE diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dbc b/TESTS/DATOS_READONLY/fb2p_dbc.dbc index 1fe1b2de5bee1ad3716f641527b9f0bce05f01da..08c5fa24c9c1465a5ae8e63cb925c07343ba3ea2 100644 GIT binary patch delta 391 zcmca_-QmV+z{kjHypffKg=q@gWNwzlOa<(lH?aI>WYpTchOK~wDT!^e9QR@-8IH+^ zxfcs7axj2_0vLdpTAM3*JVB}t^U4TFYv}-m*nrqGFD11CtSB$PBqcQ`wPf-~kqVvT zj37M>3<&)SxWK!UmykBwRW;^zK%uI_ICd+Xz iW?IHD`7rllVGafePyhoETVZo0k0&Fe!sf%gG6DeUofOyr diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dct b/TESTS/DATOS_READONLY/fb2p_dbc.dct index 8bb3886a7a9330c06a99a94e80c57ce44372eed5..bf41563e18df337b30c83a9c5057836a700b56db 100644 GIT binary patch literal 133632 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 E07*PZ%>V!Z diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.cdx b/TESTS/DATOS_READONLY/fb2p_dbf.cdx index 5a8f839a95aee91e6fd996425c938a8635d9693b..27f8a719a572024d8aa17a4d1a20dd958f315e1f 100644 GIT binary patch literal 18432 zcmeHO%Wl&^6usl|BZ?xWLa0TkA_8?$SXc#87N{bR+9^oIiK0Zj7ELM#$^wcINMx5! z;uH7^s_wktKf+9KavdoTXNRw@7s<8fjy31p=*;nW0w&CkJVau4!U1Up1n5$8xk(o} z1vm)~jN{{{7>@yp#Vym6aL|GWJ-AZ_dj$2n@T3ZRMvD7!%74T_$MaA9j_(D{m-V)P z_V4S3cNTcQSMxl-)oDT=$7@2!f`D|8j^sr9C43A?!(?!47?5Di^#8XQO902oOKAu& z3bJ4ptiqZbaC0UZ*u8ygdjxO;ws81I(Bml{=^z-L_<`T9ohoF`ME@Q5eEI48>wq9s zhLnl{C!zmWqNw^*DyD54;?JY#aa4{Dqg1!yq^vRU?(Lh`AKrh5Z5((WdhGv^4$_f5 z(SIAl!Iy8Bq>(bXRSYEk|FuxdKWhCaXPSm+8C}^myHxAKlIi0E<{6eC-}$%fSWvf24zSWPyIx zw_p(VL!JakmwF|*r2oH~_y2v_Hv3k4Wp{4ODg&eEqmy5a5$q!X?f>-zz#afOp&GIO zr&`&~a7nP|{QtAfx^s5c8E_FmPVN8E`p*vm$O+9zDCe)M9Q%KoAQ@E(2H5|nAc`zXfn>f#Q{ delta 154 zcmZpez}R50fr&+)nc+VaTx9(JpMim&Ux0;$nL#LkfvtgoM{%RzMMjQzKYw4RAXm@L zzgRg~#2DZ@UI2A4GqAG@F*7r7W@LKFxS5gXKeGfg1Bw!U1_pb39yT_Z5+O!(Ghns? I&3M5G0DCh$(*OVf diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.dbf b/TESTS/DATOS_READONLY/fb2p_dbf.dbf index 7f8640971c22793e37a9414267d5701ca133583a..3e9ddb1f442283d6be419982a6a4a3875ccf348c 100644 GIT binary patch literal 717 zcmXryV`ODzU|=}GXaXcr0W&iLgP*^zQ;;iI+?f$b$)PG?aCLEXfeQJ_0~tUqD8LgY z%fR5N1e9T6-~k!I1XJYX=^o-55dz}+ssRZWm;{t|aSaIZhp?TsfHW7HJa1Z(Q9*o4 zQnDTpqsfgVu7X=?kpdoIVk!g;4i`N`J!gnYpdKT9dd$SI>M_Qr$6Nxd9us_eETpjN NF~z6HQU*hh6aWm$G8zB? delta 19 acmX@hdV-nNke7#(VIpfDBiF`~5Jmtl^#p$a diff --git a/TESTS/DATOS_READONLY/fb2p_depto.cdx b/TESTS/DATOS_READONLY/fb2p_depto.cdx index 49e7ef2326cf299b823ecfc97dcfeb6e8e0ad3a2..cd8311d1266fe65c5eb47f485b37afb0bd0457ba 100644 GIT binary patch delta 42 scmZpWXpq>z#3jMV@E-~uGX7^^VBqKHU}0fm4A?06kdf6z&rr`90Cukr9RL6T delta 35 lcmZpWXpq>z#3jbS@E;0ZF#i9~z`)Nhz{0}3nUU!QBLE (Solo para binarios VFP 9 / Only for VFP 9 binaries) +*< FOXBIN2PRG: Version="1.18" SourceFile="C:\DESA\foxbin2prg\foxbin2prg.pjx" Generated="2014/01/06 04:40:58" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries) * LPARAMETERS tcDir @@ -25,8 +25,8 @@ _LegalCopyright = "Open Source - LICENCIA Creative Commons: Reconocimiento - Co _LegalTrademark = "Open Source" _ProductName = " FOXBIN2PRG" _MajorVer = "1" -_MinorVer = "17" -_Revision = " 152" +_MinorVer = "18" +_Revision = " 176" _LanguageID = "1034" _AutoIncrement = "1" * @@ -51,7 +51,7 @@ loProject = _VFP.Projects('foxbin2prg.pjx') WITH loProject.FILES .ADD('config\config.fpw') && *< FileMetadata: Type="T" Cpid="1252" Timestamp="1132857145" ID="1131721714" ObjRev="0" /> - .ADD('foxbin2prg.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="1143178164" ID="1130644423" ObjRev="544" /> + .ADD('foxbin2prg.prg') && *< FileMetadata: Type="P" Cpid="1252" Timestamp="1143350514" ID="1130644423" ObjRev="544" /> * .ITEM('__newproject.f2b').Remove() diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index 008199c8c0c9f9a77791fcce9af8737461c4b38d..e087fb781f987931e4f899fdaad4cca014dc3e1a 100644 GIT binary patch delta 27400 zcmcJ&2Ut|s7B;-j*=J_xy$d*C0jy~3eH;cvX~JMnaDWks2nyKJ#uAN2V)TUc0Zob~)!RT^hRY zmryUF&@YH+OhfQr(k7$#E+%g?cntx^*l+NlT|2zLlH|Wn?ONj-A@6GNFOzol3H-`? zSA4WlcXL37#hNxYJ=1Gz?LVf_96XaY1&1e$dn#TUN!`HScPFE;TNPUVrb6LeiKf&j^jFvJ zyN{ zc3k$OiA{cF&O$EJiwdooSv+By9N~y1D}sWqncD^yoX=@)@u%_Eu1M6Jd|9TJV1OnP zz?%%0y{ILEjMvN;{ONK4H8FzL^G8{8J8pWOwF9m>ZHmebp>7VSAi5k#_03mx4@xa& zWJizeGzE}3-(s>_j8@awEQ>KwOGw`oM2W`qe2c|st}36>ISChMC~ z5uL8;40206RQakU(@|0S*#3FW%%1=3{ITX1UkW{N?XvF_LY_zcpAz*&qW?8Lh2mR6 z>9xxWMTndP(}AnH7=?G5Aa!wsAX^d{^%oSn97@Pscj|@`s|W#RJUMvM@l3=s=_S;{ zM!6*#88RU2_yIRrjUFbVi?n*TQ85+*s*0EX@FSr(TtrC?_J*dgAl4Enq@hRD?`fGI zo*+fZ*JOTfg48`K+@&(eCFBFCVT^anl7>hT{FW@K&)7)Ox_zvDf)MmNYw3ind5Nrf zQIiiDb8^jj)_hY=firXA&?IsZrRE|KaeNhiI7{jl5{0VJld-^R$JC(b45tk;53F6CjSDU~FcNDSxWS%pRpB3Yqa1nenD30~xh2 z#8A7y1G<(Zk8otxoST&;x>Ta7J6>&@M2Lrq;)@i#J5#-=f;b(&hU{c?c2$sQ5LZHK zdqUVK0=4#ZWiBT-KiiartmIoV3bRc4F9~IvbbMlt6d}d&**VgPa&^F*|9mp~T^zLf zs6AAs+iww_Cqd2Ao%$mp@FCam(nbhD_JSW>N~Go%KYBCyGNY@yUHX{8cj;s5V6#8>yPX zB()`i>2e4~p%+A<9imVZQLvj)m;LENAYBSVxxVq}=nk5pzTm?2>51oM0}48-{d zL}#0LV9&J+syfyzUk)S0jIv_fq92Eo`GQQBB1G2`mN|fLyedWZy9uN#Txb_vfsh44 z7D!}4)kaAELI7QgBs~xOLW*!iAp@c@MQ}8s-G7!~)2)~-)TEr_L}AF2W^d3B)YL}_ z+aERVsxDZ*sv`!I@xJ2BL;}02<4Q{y;$4u0 zO}HZaix}V)OIE>(LxGySX|gFlCo?A_A;Am@qaMFLMtxHOWt%2gj0J`H7UR_1LZb

I(NbXDkL;Op(sGT3IYupO2o_VJ$!N(jW+AIu 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 delta 16461 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 diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx index 21383c3817acb4643ff9a87328fc59bae10e905e..7d3b79c35e3fb26101241103f1fe1d1a0882f4df 100644 GIT binary patch delta 83 zcmZ3_vz~{=fRB-FBg+mJHe*u*Q$zE~hgj?xt0uFtX-w8)ou&g8G+}@Ow-5ydHw7Rt WH35t10mb`)Si#T&sCV)kR%ZawJP+Ie delta 81 zcmZ3_vz~{=fRB-RBg+mJHbZj@Lo?IKhgj? * *--------------------------------------------------------------------------------------------------- * -* 23/11/2013 Luis Martínez REPORTE BUG: En algunos forms solo se generaba el dataenvironment (arreglado en v.1.5) -* 27/11/2013 Fidel Charny REPORTE BUG: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6) -* 02/12/2013 Fidel Charny REPORTE BUG: Se pierden algunas propiedades y no muestra picture si "Name" no es la última (arreglado en v.1.7) -* 03/12/2013 Fidel Charny REPORTE BUG: Se siguen perdiendo algunas propiedades por implementación defectuosa del arreglo anterior (arreglado en v.1.8) -* 03/12/2013 Fidel Charny REPORTE BUG: Se siguen perdiendo algunas propiedades por implementación defectuosa de una mejora anterior (arreglado en v.1.9) -* 06/12/2013 Fidel Charny REPORTE BUG: Cuando hay métodos que tienen el mismo nombre, aparecen mezclados en objetos a los que no corresponden (arreglado en v.1.10) -* 07/12/2013 Edgar Kummers REPORTE BUG: Cuando se parsea una clase con un _memberdata largo, se parsea mal y se corrompe el valor (arreglado en v.1.11) -* 08/12/2013 Fidel Charny REPORTE BUG: Cuando se convierten algunos reportes da "Error 1924, TOREG is not an object" (arreglado en v.1.13) -* 14/12/2013 Arturo Ramos REPORTE BUG: La regeneración de los forms (SCX) no respeta la propiedad AutoCenter, estando pero no funcionando. (arreglado en v.1.14) -* 14/12/2013 Fidel Charny REPORTE BUG: La regeneración de los forms (SCX) no regenera el último registro COMMENT (arreglado en v.1.14) -* 01/01/2014 Fidel Charny REPORTE BUG v1.16: El menú no siempre respeta la posición original LOCATION y a veces se genera mal el MNX (se arregla en v1.17) +* 23/11/2013 Luis Martínez REPORTE BUG scx v1.4: En algunos forms solo se generaba el dataenvironment (arreglado en v.1.5) +* 27/11/2013 Fidel Charny REPORTE BUG vcx v1.5: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6) +* 02/12/2013 Fidel Charny REPORTE BUG scx v1.6: Se pierden algunas propiedades y no muestra picture si "Name" no es la última (arreglado en v.1.7) +* 03/12/2013 Fidel Charny REPORTE BUG scx v1.7: Se siguen perdiendo algunas propiedades por implementación defectuosa del arreglo anterior (arreglado en v.1.8) +* 03/12/2013 Fidel Charny REPORTE BUG scx v1.8: Se siguen perdiendo algunas propiedades por implementación defectuosa de una mejora anterior (arreglado en v.1.9) +* 06/12/2013 Fidel Charny REPORTE BUG scx v1.9: Cuando hay métodos que tienen el mismo nombre, aparecen mezclados en objetos a los que no corresponden (arreglado en v.1.10) +* 07/12/2013 Edgar Kummers REPORTE BUG vcx v1.10: Cuando se parsea una clase con un _memberdata largo, se parsea mal y se corrompe el valor (arreglado en v.1.11) +* 08/12/2013 Fidel Charny REPORTE BUG frx v1.12: Cuando se convierten algunos reportes da "Error 1924, TOREG is not an object" (arreglado en v.1.13) +* 14/12/2013 Arturo Ramos REPORTE BUG scx v1.13: La regeneración de los forms (SCX) no respeta la propiedad AutoCenter, estando pero no funcionando. (arreglado en v.1.14) +* 14/12/2013 Fidel Charny REPORTE BUG scx v1.13: La regeneración de los forms (SCX) no regenera el último registro COMMENT (arreglado en v.1.14) +* 01/01/2014 Fidel Charny REPORTE BUG mnx v1.16: El menú no siempre respeta la posición original LOCATION y a veces se genera mal el MNX (se arregla en v1.17) +* 05/01/2014 Fidel Charny REPORTE BUG mnx v1.17: Se genera cláusula "DO" o llamada Command cuando no Procedure ni Command que llamar // Diferencia de Case en NAME (se arregla en v1.18) * * *--------------------------------------------------------------------------------------------------- @@ -350,7 +352,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM *-- - n_FB2PRG_Version = 1.17 + n_FB2PRG_Version = 1.18 *-- c_Foxbin2prg_FullPath = '' c_CurDir = '' @@ -1067,7 +1069,6 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; - + [] ; + [] ; + [] ; + [] ; @@ -1079,7 +1080,6 @@ DEFINE CLASS c_conversor_base AS SESSION + [] ; + [] ; + [] ; - + [] ; + [] ; + [] ; + [] ; @@ -1460,63 +1460,6 @@ DEFINE CLASS c_conversor_base AS SESSION ENDPROC - PROCEDURE getDBFmetadata - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) - * tc_FileName (v! IN ) Nombre del DBF a analizar - * tn_HexFileType (@? OUT) Tipo de archivo en hexadecimal (Está detallado en la ayuda de Fox) - * tl_FileHasCDX (@? OUT) Indica si el archivo tiene CDX asociado - * tl_FileHasMemo (@? OUT) Indica si el archivo tiene archivo MEMO asociado - * tl_FileIsDBC (@? OUT) Indica si el archivo es un DBC (base de datos) - * tcDBC_Name (@? OUT) Si tiene DBC, contiene el nombre del DBC asociado - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tc_FileName, tn_HexFileType, tl_FileHasCDX, tl_FileHasMemo, tl_FileIsDBC, tcDBC_Name - - TRY - LOCAL lnHandle, lcStr, lnDataPos, lnFieldCount, loEx AS EXCEPTION - tn_HexFileType = 0 - tcDBC_Name = '' - lnHandle = FOPEN(tc_FileName,0) - - IF lnHandle = -1 - EXIT - ENDIF - - lcStr = FREAD(lnHandle,1) && File type - tn_HexFileType = EVALUATE( TRANSFORM(ASC(lcStr),'@0') ) - lcStr = FREAD(lnHandle,3) && Last update (YYMMDD) - 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) - tl_FileHasCDX = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x01 ) > 0 ) - tl_FileHasMemo = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x02 ) > 0 ) - tl_FileIsDBC = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x04 ) > 0 ) - 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) - lcStr = FREAD(lnHandle,263) && Backlink (relative path of an associated database (.dbc) file) - tcDBC_Name = RTRIM(lcStr,0,CHR(0)) && DBC Name (si tiene) - - CATCH TO loEx - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - FINALLY - FCLOSE(lnHandle) - ENDTRY - - RETURN lnHandle - ENDPROC - - FUNCTION GetTimeStamp *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) @@ -2078,73 +2021,6 @@ DEFINE CLASS c_conversor_base AS SESSION ENDPROC - ******************************************************************************************************************* - 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 - *-- No se pudo actualizar el backlink [] de la tabla [] - ERROR C_BACKLINK_CANT_UPDATE_BL_LOC + ' [' + tcDBC_Name + '] ' + C_BACKLINK_OF_TABLE_LOC + ' [' + 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: @@ -5893,11 +5769,25 @@ 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, lcIndex, ldLastUpdate + LOCAL lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate, lcTempDBC + LOCAL loDBFUtils AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' + loDBFUtils = CREATEOBJECT('CL_DBF_UTILS') + + STORE 0 TO lnCodError STORE '' TO lcIndex, lcFieldDef + + ERASE (FORCEEXT(THIS.c_OutputFile, 'DBF')) + ERASE (FORCEEXT(THIS.c_OutputFile, 'FPT')) + ERASE (FORCEEXT(THIS.c_OutputFile, 'CDX')) - lcCreateTable = 'CREATE TABLE "' + THIS.c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' (' + IF EMPTY(toTable._Database) + lcCreateTable = 'CREATE TABLE "' + THIS.c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' (' + ELSE + lcTempDBC = FORCEPATH( '_FB2P', JUSTPATH(THIS.c_OutputFile) ) + CREATE DATABASE ( lcTempDBC ) + lcCreateTable = 'CREATE TABLE "' + THIS.c_OutputFile + '" CodePage=' + toTable._CodePage + ' (' + ENDIF *-- Conformo los campos FOR EACH loField IN toTable._Fields FOXOBJECT @@ -5932,7 +5822,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin *-- NoCPTran IF loField._NoCPTran = '.T.' - lcFieldDef = lcFieldDef + ' NOCPTRAN' + lcFieldDef = lcFieldDef + ' NOCPTRANS' ENDIF *-- AutoInc @@ -5944,7 +5834,6 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin ENDFOR lcCreateTable = lcCreateTable + SUBSTR(lcFieldDef,3) + ')' - *STRTOFILE(lcCreateTable,'CreateTable.txt') &lcCreateTable. *-- Regenero los índices @@ -5962,22 +5851,22 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin lcIndex = lcIndex + ' ' + loIndex._Order - IF loIndex._TagType <> 'REGULAR' + IF NOT INLIST(loIndex._TagType, 'NORMAL', '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))) + *-- La actualización de la fecha sirve para evitar diferencias al regenerar el DBF ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' ) - THIS.write_DBF_Metadata( THIS.c_OutputFile, toTable._Database, ldLastUpdate ) - + loDBFUtils.write_DBC_BackLink( THIS.c_OutputFile, toTable._Database, ldLastUpdate ) + CATCH TO loEx lnCodError = loEx.ERRORNO @@ -5992,6 +5881,14 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin THROW FINALLY + 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 ENDTRY @@ -8661,20 +8558,24 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg DODEFAULT( @toModulo, @toEx ) TRY - LOCAL lnCodError, laDatabases(1), lnDatabases_Count, laDatabases2(1), lnLen ; + LOCAL lnCodError, laDatabases(1), lnDatabases_Count, laDatabases2(1), lnLen, lc_FileTypeDesc ; , ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name LOCAL loTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' - STORE 0 TO lnCodError + LOCAL loDBFUtils AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' + STORE 0 TO lnCodError + loDBFUtils = CREATEOBJECT('CL_DBF_UTILS') + + loDBFUtils.getDBFmetadata( THIS.c_InputFile, @ln_HexFileType, @ll_FileHasCDX, @ll_FileHasMemo, @ll_FileIsDBC, @lc_DBC_Name ) + lc_FileTypeDesc = loDBFUtils.fileTypeDescription(ln_HexFileType) lnDatabases_Count = ADATABASES(laDatabases) - THIS.getDBFmetadata( THIS.c_InputFile, @ln_HexFileType, @ll_FileHasCDX, @ll_FileHasMemo, @ll_FileIsDBC, @lc_DBC_Name ) USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS TABLABIN C_FB2PRG_CODE = C_FB2PRG_CODE + toFoxbin2prg.get_PROGRAM_HEADER() *-- 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, THIS.c_InputFile ) + C_FB2PRG_CODE = C_FB2PRG_CODE + loTable.toText( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name, THIS.c_InputFile, lc_FileTypeDesc ) toFoxbin2prg.doBackup( .F., .T., '', '', '' ) @@ -8694,6 +8595,24 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg CATCH TO toEx + DO CASE + CASE toEx.ErrorNo = 13 && Alias not found + toEx.UserValue = 'WARNING!!' + CR_LF ; + + 'MAKE SURE YOU ARE NOT USING A TABLE ALIAS ON INDEX KEY EXPRESSIONS!! (ex: index on ' ; + + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.field tag keyname)' + CR_LF + CR_LF ; + + '¡¡ATENCIÓN!!' + CR_LF ; + + 'ASEGÚRESE DE QUE NO ESTÁ USANDO UN ALIAS DE TABLA EN LAS EXPRESIONES DE LOS ÍNDICES!! (ej: index on ' ; + + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.campo tag nombreclave)' + +*!* CASE toEx.ErrorNo = 1976 && Cannot resolve backlink +*!* toEx.UserValue = 'WARNING!!' + CR_LF ; +*!* + "MAY BE DATABASE FIELDS DOESN'T" ; +*!* + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.field tag keyname)' + CR_LF + CR_LF ; +*!* + '¡¡ATENCIÓN!!' + CR_LF ; +*!* + 'ASEGÚRESE DE QUE NO ESTÁ USANDO UN ALIAS DE TABLA EN LAS EXPRESIONES DE LOS ÍNDICES!! (ej: index on ' ; +*!* + UPPER(JUSTSTEM(THIS.c_InputFile)) + '.campo tag nombreclave)' + + ENDCASE IF THIS.l_Debug AND _VFP.STARTMODE = 0 SET STEP ON ENDIF @@ -8742,12 +8661,11 @@ DEFINE CLASS c_conversor_dbc_a_prg AS c_conversor_bin_a_prg #ENDIF TRY - LOCAL lnCodError, laDatabases(1), lnDatabases_Count, laDatabases2(1), lnLen ; - , ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name + LOCAL lnCodError, laDatabases(1), lnDatabases_Count, lnLen + STORE 0 TO lnCodError lnDatabases_Count = ADATABASES(laDatabases) - THIS.getDBFmetadata( THIS.c_InputFile, @ln_HexFileType, @ll_FileHasCDX, @ll_FileHasMemo, @ll_FileIsDBC, @lc_DBC_Name ) USE (THIS.c_InputFile) SHARED NOUPDATE ALIAS TABLABIN OPEN DATABASE (THIS.c_InputFile) SHARED NOUPDATE @@ -8899,47 +8817,6 @@ DEFINE CLASS CL_CUS_BASE AS CUSTOM ENDPROC - PROCEDURE fileTypeDescription - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) - * tn_HexFileType (@? IN ) Tipo de archivo en hexadecimal (Está detallado en la ayuda de Fox) - *--------------------------------------------------------------------------------------------------- - LPARAMETERS tn_HexFileType - LOCAL lcFileType - - DO CASE - CASE tn_HexFileType = 0x02 - lcFileType = 'FoxBASE / dBase II' - CASE tn_HexFileType = 0x03 - lcFileType = 'FoxBASE+ / FoxPro /dBase III PLUS / dBase IV, no memo' - CASE tn_HexFileType = 0x30 - lcFileType = 'Visual FoxPro' - CASE tn_HexFileType = 0x31 - lcFileType = 'Visual FoxPro, autoincrement enabled' - CASE tn_HexFileType = 0x32 - lcFileType = 'Visual FoxPro, Varchar, Varbinary, or Blob-enabled' - CASE tn_HexFileType = 0x43 - lcFileType = 'dBASE IV SQL table files, no memo' - CASE tn_HexFileType = 0x63 - lcFileType = 'dBASE IV SQL system files, no memo' - CASE tn_HexFileType = 0x83 - lcFileType = 'FoxBASE+/dBASE III PLUS, with memo' - CASE tn_HexFileType = 0x8B - lcFileType = 'dBASE IV with memo' - CASE tn_HexFileType = 0xCB - lcFileType = 'dBASE IV SQL table files, with memo' - CASE tn_HexFileType = 0xF5 - lcFileType = 'FoxPro 2.x (or earlier) with memo' - CASE tn_HexFileType = 0xFB - lcFileType = 'FoxBASE (?)' - OTHERWISE - lcFileType = 'Unknown' - ENDCASE - - RETURN lcFileType - ENDPROC - - PROCEDURE set_Line *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) @@ -8952,15 +8829,6 @@ DEFINE CLASS CL_CUS_BASE AS CUSTOM ENDPROC - PROCEDURE toText - *--------------------------------------------------------------------------------------------------- - * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) - * taArray (@? OUT) Array de conexiones - * tnArray_Count (@? OUT) Cantidad de conexiones - *--------------------------------------------------------------------------------------------------- - ENDPROC - - ENDDEFINE @@ -12207,8 +12075,8 @@ DEFINE CLASS CL_DBC_VIEW AS CL_DBC_BASE PROCEDURE INIT DODEFAULT() *-- - THIS.ADDOBJECT("_Fields", "CL_DBC_FIELDS_DB") - THIS.ADDOBJECT("_Indexes", "CL_DBC_INDEXES_DB") + THIS.ADDOBJECT("_Fields", "CL_DBC_FIELDS_VW") + THIS.ADDOBJECT("_Indexes", "CL_DBC_INDEXES_VW") THIS.ADDOBJECT("_Relations", "CL_DBC_RELATIONS") ENDPROC @@ -13096,16 +12964,15 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE PROCEDURE toText *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) - * tn_HexFileType (v! IN ) Tipo de archivo (en Hex) + * tc_FileTypeDesc (v! IN ) Tipo de archivo (en Hex) * tl_FileHasCDX (v! IN ) Indica si el archivo tiene CDX asociado * tl_FileHasMemo (v! IN ) Indica si el archivo tiene MEMO (FPT) asociado * tl_FileIsDBC (v! IN ) Indica si el archivo es un DBC * tc_DBC_Name (v! IN ) Nombre del DBC (si tiene) * tc_InputFile (v! IN ) Nombre del archivo de salida + * tc_FileTypeDesc (v! IN ) Descripción del Tipo de archivo *--------------------------------------------------------------------------------------------------- - LPARAMETERS tn_HexFileType, tl_FileHasCDX, tl_FileHasMemo, tl_FileIsDBC, tc_DBC_Name, tc_InputFile - - EXTERNAL ARRAY taFields + LPARAMETERS tn_HexFileType, tl_FileHasCDX, tl_FileHasMemo, tl_FileIsDBC, tc_DBC_Name, tc_InputFile, tc_FileTypeDesc TRY LOCAL lcText, loEx AS EXCEPTION @@ -13113,13 +12980,6 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE LOCAL loIndexes AS CL_DBF_INDEXES OF 'FOXBIN2PRG.PRG' lcText = '' - *FOR I = 1 TO AFIELDS(laFields) - * IF INLIST( laFields(I,2), 'M', 'Q', 'V', 'W' ) - * ll_FileHasMemo = .T. - * EXIT - * ENDIF - *ENDFOR - TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <> @@ -13128,7 +12988,7 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE <<>> <> <<>> <> <<>> <> - <<>> <> + <<>> <> ENDTEXT *-- Fields @@ -13647,10 +13507,10 @@ DEFINE CLASS CL_DBF_INDEX AS CL_CUS_BASE TEXT TO lcText TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<>> <<>> <> - <<>> <> + <<>> <> <<>> <> <<>> <> - <<>> <> + <<>> <> <<>> <> <<>> ENDTEXT @@ -14522,7 +14382,7 @@ DEFINE CLASS CL_MENU AS CL_MENU_COL_BASE loReg.CLEANTYPE = 1 loReg.ITEMNUM = STR(0,3) lcMenuType = ALLTRIM( GETWORDNUM( tcLine, 3 ) ) - loReg.ObjType = IIF( lcMenuType = '_MSYSMENU', 1, 5 ) + *loReg.ObjType = IIF( UPPER(lcMenuType) = '_MSYSMENU', 1, 5 ) lcExpr = ALLTRIM( STREXTRACT( C_FB2PRG_CODE, 'ON SELECTION MENU _MSYSMENU ', CR_LF ) ) @@ -14554,11 +14414,6 @@ DEFINE CLASS CL_MENU AS CL_MENU_COL_BASE loReg.SETUPTYPE = 1 loReg.CLEANTYPE = 1 loReg.ITEMNUM = STR(0,3) - *loReg.NAME = ALLTRIM( GETWORDNUM( tcLine, 3 ) ) - *IF RIGHT(loReg.NAME,5) == '_FB2P' && Originalmente era vacío y se la había puesto un nombre temporal. - * loReg.NAME = '' - *ENDIF - *loReg.LevelName = loReg.NAME loReg.SCHEME = 0 lcExpr = ALLTRIM( STREXTRACT( C_FB2PRG_CODE, 'ON SELECTION POPUP ALL ', CR_LF ) ) THIS.AnalizarSiExpresionEsComandoOProcedimiento( lcExpr, @lcProcName, @lcProcCode, @C_FB2PRG_CODE, -1, .F. ) @@ -14731,10 +14586,12 @@ DEFINE CLASS CL_MENU AS CL_MENU_COL_BASE DO CASE CASE loHeader.ObjType = 1 && Menu Bar (Sistema) - lcText = lcText + CR_LF + 'DEFINE MENU _MSYSMENU BAR' + *lcText = lcText + CR_LF + 'DEFINE MENU _MSYSMENU BAR' + lcText = lcText + CR_LF + 'DEFINE MENU ' + loBarPop.NAME + ' BAR' CASE loHeader.ObjType = 5 && Menu Bar (On top) - lcText = lcText + CR_LF + 'DEFINE MENU _ONTOP BAR' + *lcText = lcText + CR_LF + 'DEFINE MENU _ONTOP BAR' + lcText = lcText + CR_LF + 'DEFINE MENU ' + loBarPop.NAME + ' BAR' CASE loHeader.ObjType = 4 && Shortcut lcText = lcText + CR_LF + 'DEFINE POPUP ' + THIS.ITEM(1).ITEM(1).ITEM(1).oReg.NAME + ' SHORTCUT RELATIVE FROM MROW(),MCOL()' @@ -14994,7 +14851,8 @@ DEFINE CLASS CL_MENU_BARPOP AS CL_MENU_COL_BASE CASE LEFT( tcLine, 12 ) == 'DEFINE MENU ' loReg.OBJCODE = 1 - loReg.NAME = '_MSYSMENU' + loReg.NAME = STREXTRACT( tcLine, 'DEFINE MENU ', ' BAR' ) + *loReg.NAME = '_MSYSMENU' loReg.LevelName = loReg.NAME loReg.SCHEME = IIF( loReg.OBJCODE = 1, 3, 4 ) @@ -15768,9 +15626,13 @@ DEFINE CLASS CL_MENU_OPTION AS CL_MENU_COL_BASE DO CASE CASE toReg.OBJCODE = 67 && Command - lcText = lcText + ' ' + ALLTRIM(toReg.COMMAND) + IF NOT EMPTY(toReg.COMMAND) + lcText = lcText + ' ' + ALLTRIM(toReg.COMMAND) + ENDIF CASE toReg.OBJCODE = 80 && Procedure - lcText = lcText + ' DO <>' + IF NOT EMPTY(toReg.PROCEDURE) + lcText = lcText + ' DO <>' + ENDIF ENDCASE ENDIF ENDIF @@ -15859,9 +15721,13 @@ DEFINE CLASS CL_MENU_OPTION AS CL_MENU_COL_BASE DO CASE CASE toReg.OBJCODE = 67 && Command - lcText = lcText + ' ' + ALLTRIM(toReg.COMMAND) + IF NOT EMPTY(toReg.COMMAND) + lcText = lcText + ' ' + ALLTRIM(toReg.COMMAND) + ENDIF CASE toReg.OBJCODE = 80 && Procedure - lcText = lcText + ' DO <>' + IF NOT EMPTY(toReg.PROCEDURE) + lcText = lcText + ' DO <>' + ENDIF ENDCASE ENDIF ENDIF @@ -15888,3 +15754,547 @@ DEFINE CLASS CL_MENU_OPTION AS CL_MENU_COL_BASE ENDDEFINE +DEFINE CLASS CL_DBF_UTILS AS SESSION + _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] + + #IF .F. + LOCAL THIS AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' + #ENDIF + + l_Debug = .F. + c_Backlink_DBC_Name = '' + c_FileName = '' + n_FileSize = 0 + n_HeaderSize = 0 + c_LastUpdate = '' + l_FileHasCDX = .F. + l_FileIsDBC = .F. + l_FileHasMemo = .F. + n_CodePage = 0 + c_CodePageDesc = '' + n_DataRecordLength = 0 + n_HexFileType = 0 + n_FieldCount = 0 + n_NumberOfRecords = 0 + n_NumberOfRecordsReal = 0 + n_PosOfFirstDataRecord = 0 + Fields = NULL + + + PROCEDURE INIT + THIS.Fields = CREATEOBJECT("COLLECTION") + ENDPROC + + + PROCEDURE getDBFmetadata + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) + * tc_FileName (v! IN ) Nombre del DBF a analizar + * tn_HexFileType (@? OUT) Tipo de archivo en hexadecimal (Está detallado en la ayuda de Fox) + * tl_FileHasCDX (@? OUT) Indica si el archivo tiene CDX asociado + * tl_FileHasMemo (@? OUT) Indica si el archivo tiene archivo MEMO asociado + * tl_FileIsDBC (@? OUT) Indica si el archivo es un DBC (base de datos) + * tcDBC_Name (@? OUT) Si tiene DBC, contiene el nombre del DBC asociado + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tc_FileName, tn_HexFileType, tl_FileHasCDX, tl_FileHasMemo, tl_FileIsDBC, tcDBC_Name + + TRY + LOCAL lnHandle, lcStr, lnDataPos, lnFieldCount, lnVal, I, loEx AS EXCEPTION ; + , lnCodePage, lcCodePageDesc ; + , loField AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' + + tn_HexFileType = 0 + tcDBC_Name = '' + lnHandle = FOPEN(tc_FileName,0) + + IF lnHandle = -1 + EXIT + ENDIF + + * Bytes Description + *------------------------------------------------------ ----------- ------------------------------------------ + WITH THIS AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' + .c_FileName = tc_FileName + lcStr = FREAD(lnHandle,1) && 0 File type + tn_HexFileType = EVALUATE( TRANSFORM(ASC(lcStr),'@0') ) + .n_HexFileType = tn_HexFileType + lcStr = FREAD(lnHandle,3) && 1-3 Last update (YYMMDD) + .c_LastUpdate = PADL(ASC(LEFT(lcStr,1)),2,'0') + '/' + PADL(ASC(SUBSTR(lcStr,2,1)),2,'0') + '/' + PADL(ASC(RIGHT(lcStr,1)),2,'0') + lcStr = FREAD(lnHandle,4) && 4-7 Number of records in file + .n_NumberOfRecords = CTOBIN(lcStr,"4RS") + lcStr = FREAD(lnHandle,2) && 8-9 Position of first data record + .n_PosOfFirstDataRecord = CTOBIN(lcStr,"2RS") + .n_HeaderSize = INT(.n_PosOfFirstDataRecord + 1) + IF INLIST(tn_HexFileType, 0x30, 0x31, 0x32) THEN + .n_FieldCount = INT( (.n_PosOfFirstDataRecord - 296) / 32 ) && Visual FoxPro + ELSE + .n_FieldCount = INT( (.n_PosOfFirstDataRecord - 33) / 32 ) + ENDIF + lcStr = FREAD(lnHandle,2) && 10-11 Length of one data record, including delete flag + .n_DataRecordLength = CTOBIN(lcStr,"2RS") + lcStr = FREAD(lnHandle,16) && 16-27 Reserved + lcStr = FREAD(lnHandle,1) && 28 Table flags: 0x01=Has CDX, 0x02=Has Memo, 0x04=Id DBC (flags acumulativos) + .l_FileHasCDX = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x01 ) > 0 ) + .l_FileHasMemo = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x02 ) > 0 ) + .l_FileIsDBC = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x04 ) > 0 ) + lcStr = FREAD(lnHandle,1) && 29 Code page mark (0=, 2=850,3=1252) + lnVal = EVALUATE( TRANSFORM(ASC(lcStr),'@0') ) + .getCodePageInfo( lnVal, @lnCodePage, @lcCodePageDesc ) + .n_CodePage = lnCodePage + .c_CodePageDesc = lcCodePageDesc + lcStr = FREAD(lnHandle,2) && 30-31 Reserved, contains 0x00 + *lcStr = FREAD(lnHandle,32 * lnFieldCount) && 32-n Field subrecords (los salteo) + *--- + FOR I = 1 TO .n_FieldCount + loField = CREATEOBJECT("CL_DBF_UTILS_FIELD") + + WITH loField AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' + lcStr = FREAD(lnHandle,11) + .FieldName = RTRIM( lcStr, 0, CHR(0), ' ' ) + lcStr = FREAD(lnHandle,1) + .FieldType = lcStr + lcStr = FREAD(lnHandle,4) + .FieldDisplacementInRecord = CTOBIN(lcStr,"4RS") + lcStr = FREAD(lnHandle,1) + .FieldWidth = ASC(lcStr) + lcStr = FREAD(lnHandle,1) + .FieldDecimals = ASC(lcStr) + lcStr = FREAD(lnHandle,1) + .FieldFlags = ASC(lcStr) + lcStr = FREAD(lnHandle,4) + .NextValueForAutoInc = CTOBIN(lcStr,"4RS") + lcStr = FREAD(lnHandle,1) + .StepForAutoInc = ASC(lcStr) + lcStr = FREAD(lnHandle,8) + ENDWITH + + .Fields.Add(loField) + loField = NULL + ENDFOR + *--- + lcStr = FREAD(lnHandle,1) && n+1 Header Record Terminator (0x0D) + + IF INLIST(tn_HexFileType, 0x30, 0x31, 0x32) THEN + lcStr = FREAD(lnHandle,263) && n+2 to n+264 Backlink (relative path of an associated database (.dbc) file) + tcDBC_Name = RTRIM(lcStr,0,CHR(0)) && DBC Name (si tiene) + .c_Backlink_DBC_Name = tcDBC_Name + ENDIF + + .n_FileSize = FSEEK(lnHandle, 0, 2) + .n_NumberOfRecordsReal = INT( (.n_FileSize - .n_HeaderSize) / .n_DataRecordLength ) + ENDWITH + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + FCLOSE(lnHandle) + ENDTRY + + RETURN lnHandle + ENDPROC + + + PROCEDURE fileTypeDescription + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) + * tn_HexFileType (@? IN ) Tipo de archivo en hexadecimal (Está detallado en la ayuda de Fox) + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tn_HexFileType + LOCAL lcFileType + + DO CASE + CASE tn_HexFileType = 0x02 + lcFileType = 'FoxBASE / dBase II' + CASE tn_HexFileType = 0x03 + lcFileType = 'FoxBASE+ / FoxPro /dBase III PLUS / dBase IV, no memo' + CASE tn_HexFileType = 0x30 + lcFileType = 'Visual FoxPro' + CASE tn_HexFileType = 0x31 + lcFileType = 'Visual FoxPro, autoincrement enabled' + CASE tn_HexFileType = 0x32 + lcFileType = 'Visual FoxPro, Varchar, Varbinary, or Blob-enabled' + CASE tn_HexFileType = 0x43 + lcFileType = 'dBASE IV SQL table files, no memo' + CASE tn_HexFileType = 0x63 + lcFileType = 'dBASE IV SQL system files, no memo' + CASE tn_HexFileType = 0x83 + lcFileType = 'FoxBASE+/dBASE III PLUS, with memo' + CASE tn_HexFileType = 0x8B + lcFileType = 'dBASE IV with memo' + CASE tn_HexFileType = 0xCB + lcFileType = 'dBASE IV SQL table files, with memo' + CASE tn_HexFileType = 0xF5 + lcFileType = 'FoxPro 2.x (or earlier) with memo' + CASE tn_HexFileType = 0xFB + lcFileType = 'FoxBASE (?)' + OTHERWISE + lcFileType = 'Unknown' + ENDCASE + + RETURN lcFileType + ENDPROC + + + PROCEDURE getCodePageInfo + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) + * tnHexCodePage (v! IN ) Código de página en hexadecimal (Está detallado en la ayuda de Fox) + * tnCodePage (@? OUT) Código de página normal + * tcDescrip (@? OUT) Descripción del código de página + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tnHexCodePage, tnCodePage, tcDescrip + + LOCAL laCodePage(27,3), lnPos + *Code page Platform Code page identifier + laCodePage( 1,1) = 437 + laCodePage( 1,2) = 'U.S. MS-DOS' + laCodePage( 1,3) = 0x01 + + laCodePage( 2,1) = 620 + laCodePage( 2,2) = 'Mazovia (Polish) MS-DOS' + laCodePage( 2,3) = 0x69 + + laCodePage( 3,1) = 737 + laCodePage( 3,2) = 'Greek MS-DOS (437G)' + laCodePage( 3,3) = 0x6A + + laCodePage( 4,1) = 850 + laCodePage( 4,2) = 'International MS-DOS' + laCodePage( 4,3) = 0x02 + + laCodePage( 5,1) = 852 + laCodePage( 5,2) = 'Eastern European MS-DOS' + laCodePage( 5,3) = 0x64 + + laCodePage( 6,1) = 857 + laCodePage( 6,2) = 'Turkish MS-DOS' + laCodePage( 6,3) = 0x6B + + laCodePage( 7,1) = 861 + laCodePage( 7,2) = 'Icelandic MS-DOS' + laCodePage( 7,3) = 0x67 + + laCodePage( 8,1) = 865 + laCodePage( 8,2) = 'Nordic MS-DOS' + laCodePage( 8,3) = 0x66 + + laCodePage( 9,1) = 866 + laCodePage( 9,2) = 'Russian MS-DOS' + laCodePage( 9,3) = 0x65 + + laCodePage(10,1) = 874 + laCodePage(10,2) = 'Thai Windows' + laCodePage(10,3) = 0x7C + + laCodePage(12,1) = 895 + laCodePage(12,2) = 'Kamenicky (Czech) MS-DOS' + laCodePage(12,3) = 0x68 + + laCodePage(13,1) = 932 + laCodePage(13,2) = 'Japanese Windows' + laCodePage(13,3) = 0x7B + + laCodePage(14,1) = 936 + laCodePage(14,2) = 'Chinese Simplified (PRC, Singapore) Windows' + laCodePage(14,3) = 0x7A + + laCodePage(15,1) = 949 + laCodePage(15,2) = 'Korean Windows' + laCodePage(15,3) = 0x79 + + laCodePage(16,1) = 950 + laCodePage(16,2) = 'Traditional Chinese (Hong Kong SAR, Taiwan) Windows' + laCodePage(16,3) = 0x78 + + laCodePage(17,1) = 1250 + laCodePage(17,2) = 'Eastern European Windows' + laCodePage(17,3) = 0xC8 + + laCodePage(18,1) = 1251 + laCodePage(18,2) = 'Russian Windows' + laCodePage(18,3) = 0xC9 + + laCodePage(19,1) = 1252 + laCodePage(19,2) = 'Windows ANSI' + laCodePage(19,3) = 0x03 + + laCodePage(20,1) = 1253 + laCodePage(20,2) = 'Greek Windows' + laCodePage(20,3) = 0xCB + + laCodePage(21,1) = 1254 + laCodePage(21,2) = 'Turkish Windows' + laCodePage(21,3) = 0xCA + + laCodePage(22,1) = 1255 + laCodePage(22,2) = 'Hebrew Windows' + laCodePage(22,3) = 0x7D + + laCodePage(23,1) = 1256 + laCodePage(23,2) = 'Arabic Windows' + laCodePage(23,3) = 0x7E + + laCodePage(24,1) = 10000 + laCodePage(24,2) = 'Standard Macintosh' + laCodePage(24,3) = 0x04 + + laCodePage(25,1) = 10006 + laCodePage(25,2) = 'Greek Macintosh' + laCodePage(25,3) = 0x98 + + laCodePage(26,1) = 10007 + laCodePage(26,2) = 'Russian Macintosh' + laCodePage(26,3) = 0x96 + + laCodePage(27,1) = 10029 + laCodePage(27,2) = 'Macintosh EE' + laCodePage(27,3) = 0x97 + + lnPos = ASCAN( laCodePage, tnHexCodePage, 1, -1, 3, 8 ) + + IF lnPos > 0 + tnCodePage = laCodePage(lnPos,1) + tcDescrip = laCodePage(lnPos,2) + ELSE + tnCodePage = 0 + tcDescrip = '' + ENDIF + + RETURN + ENDPROC + + + PROCEDURE toText + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (!=Obligatorio | ?=Opcional) (@=Pasar por referencia | v=Pasar por valor) (IN/OUT) + *--------------------------------------------------------------------------------------------------- + LOCAL lcText, loField AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' + lcText = '' + + WITH THIS AS CL_DBF_UTILS OF 'FOXBIN2PRG.PRG' + TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + --------------------------------------------------- + FileName : <> + --------------------------------------------------- + Backlink_DBC_Name : <<.c_Backlink_DBC_Name>> + HexFileType : <> - <<.fileTypeDescription(.n_HexFileType)>> + FileSize : <<.n_FileSize>> bytes + LastUpdate : <<.c_LastUpdate>> + NumberOfRecords : <<.n_NumberOfRecords>> - REAL: <<.n_NumberOfRecordsReal>> + PosOfFirstDataRecord : <<.n_PosOfFirstDataRecord>> + FieldCount : <<.n_FieldCount>> + DataRecordLength : <<.n_DataRecordLength>> + FileHasCDX : <<.l_FileHasCDX>> + FileHasMemo : <<.l_FileHasMemo>> + FileIsDBC : <<.l_FileIsDBC>> + CodePage : <<.n_CodePage>> - <<.c_CodePageDesc>> + + --------------------------------------------------- + ENDTEXT + + *-- Fields + loField = THIS.Fields.Item(1) + lcText = lcText + CR_LF + loField.toText(.T.) + + FOR EACH loField AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' IN THIS.Fields + lcText = lcText + CR_LF + loField.toText() + ENDFOR + + TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 + + --------------------------------------------------- + Field flags Reference: + 0x01 System Column (not visible to user) + 0x02 Column can store null values + 0x04 Binary column (for CHAR and MEMO only) + 0x06 (0x02+0x04) When a field is NULL and binary (Integer, Currency, and Character/Memo fields) + 0x0C Column is autoincrementing + + ENDTEXT + + ENDWITH + + RETURN lcText + ENDPROC + + + PROCEDURE write_DBC_BackLink + *--------------------------------------------------------------------------------------------------- + * 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, ln_HexFileType, lcStr, lnDataPos, lnFieldCount, loEx AS EXCEPTION + + IF NOT EMPTY(tcDBC_Name) + ln_HexFileType = 0 + lnHandle = FOPEN(tc_FileName,2) + + IF lnHandle = -1 + EXIT + ENDIF + + lcStr = FREAD(lnHandle,1) && File type + ln_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 + + =FREAD(lnHandle,4) && Number of records in file + lcStr = FREAD(lnHandle,2) && Position of first data record + lnDataPos = CTOBIN(lcStr,"2RS") + IF INLIST(ln_HexFileType, 0x30, 0x31, 0x32) THEN + lnFieldCount = (lnDataPos - 296) / 32 + ELSE + EXIT && No DBC BackLink on older versions! + ENDIF + =FREAD(lnHandle,2) && Length of one data record, including delete flag + =FREAD(lnHandle,16) && Reserved + =FREAD(lnHandle,1) && Table flags: 0x01=Has CDX, 0x02=Has Memo, 0x04=Id DBC (flags acumulativos) + =FREAD(lnHandle,1) && Code page mark + =FREAD(lnHandle,2) && Reserved, contains 0x00 + =FREAD(lnHandle,32 * lnFieldCount) && Field subrecords (los salteo) + =FREAD(lnHandle,1) && Header Record Terminator (0x0D) + + IF INLIST(ln_HexFileType, 0x30, 0x31, 0x32) THEN + IF FWRITE( lnHandle, PADR(tcDBC_Name,263,CHR(0)) ) = 0 + *-- No se pudo actualizar el backlink [] de la tabla [] + ERROR C_BACKLINK_CANT_UPDATE_BL_LOC + ' [' + tcDBC_Name + '] ' + C_BACKLINK_OF_TABLE_LOC + ' [' + tc_FileName + ']' + ENDIF + 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 + + +ENDDEFINE + + +DEFINE CLASS CL_DBF_UTILS_FIELD AS CUSTOM + _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] + + #IF .F. + LOCAL THIS AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' + #ENDIF + + FieldName = '' + FieldType = '' + FieldWidth = 0 + FieldDecimals = 0 + FieldFlags = 0 + FieldDisplacementInRecord = 0 + AllowNulls = .F. + NoCodePageTranslation = .F. + FieldValidationExpression = '' + FieldValidationText = '' + FieldDefaultValue = '' + TableValidationExpression = '' + TableValidationText = '' + LongTableName = '' + InsertTriggerExpression = '' + UpdateTriggerExpression = '' + DeleteTriggerExpression = '' + TableComment = '' + NextValueForAutoInc = 0 + StepForAutoInc = '' + + + PROCEDURE toText + LPARAMETERS tlHeader + + LOCAL lcText + lcText = '' + + IF tlHeader + lcText = lcText + PADR('FieldName',10) + ' ' + PADR('Type',4) + ' ' + PADR('Len',3) + ' ' ; + + PADR('Dec',3) + ' ' + PADR('Flg',3) + ' ' + PADL('FDiR',4) + lcText = lcText + CR_LF + REPLICATE('-',10) + ' ' + REPLICATE('-',4) + ' ' + REPLICATE('-',3) + ' ' ; + + REPLICATE('-',3) + ' ' + REPLICATE('-',3) + ' ' + REPLICATE('-',4) + ELSE + WITH THIS AS CL_DBF_UTILS_FIELD OF 'FOXBIN2PRG.PRG' + lcText = lcText + PADR(.FieldName,10) + ' ' + PADC(.FieldType,4) + ' ' + PADL(.FieldWidth,3) + ' ' ; + + PADL(.FieldDecimals,3) + ' ' + PADC(.FieldFlags,3) + ' ' + PADL(.FieldDisplacementInRecord,4) + ENDWITH + ENDIF + + RETURN lcText + ENDPROC + + +ENDDEFINE + +