From 4ee81ae28ebc74acf7ed2d366df0c13538bcf63b Mon Sep 17 00:00:00 2001 From: fdbozzo Date: Sun, 29 May 2016 10:07:08 +0200 Subject: [PATCH] =?UTF-8?q?-=20Importaci=C3=B3n=20de=20Datos=20desde=20DB2?= =?UTF-8?q?=20con=20nueva=20opci=C3=B3n=20DBF=5FConversion=5FSupport:=208?= =?UTF-8?q?=20-=20Nuevo=20m=C3=A9todo=20get=5FDBF=5FConfiguration()=20que?= =?UTF-8?q?=20devuelve=20el=20objeto=20CFG=20de=20la=20tabla=20indicada=20?= =?UTF-8?q?-=20Nuevo=20m=C3=A9todo=20conversionSupportType()=20que=20devue?= =?UTF-8?q?lve=20el=20c=C3=B3digo=20de=20conversi=C3=B3n=20soportado=20par?= =?UTF-8?q?a=20el=20archivo=20indicado=20-=20Modificados=20los=20m=C3=A9to?= =?UTF-8?q?dos=20hasSupport=5FBin2Prg()=20y=20hasSupport=5FPrg2Bin()=20par?= =?UTF-8?q?a=20permitir=20indicar=20un=20nombre=20completo=20de=20archivo?= =?UTF-8?q?=20y=20no=20solo=20su=20extensi=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FoxBin2PRGVersionFile.txt | 6 +- TESTS/DATOS_READONLY/fb2p_free.cdx | Bin 7680 -> 7680 bytes .../{FB2P_FREE.DB2 => fb2p_free.db2} | 104 +++++- TESTS/DATOS_READONLY/fb2p_free.dbf | Bin 1652 -> 1901 bytes TESTS/DATOS_READONLY/fb2p_free.dbf.cfg | 3 + TESTS/DATOS_READONLY/fb2p_free.fpt | Bin 12196672 -> 15219392 bytes foxbin2prg.cfg.txt | 4 +- foxbin2prg.prg | 315 ++++++++++++------ 8 files changed, 312 insertions(+), 120 deletions(-) rename TESTS/DATOS_READONLY/{FB2P_FREE.DB2 => fb2p_free.db2} (74%) create mode 100644 TESTS/DATOS_READONLY/fb2p_free.dbf.cfg diff --git a/FoxBin2PRGVersionFile.txt b/FoxBin2PRGVersionFile.txt index 80ce8b8..721a181 100644 --- a/FoxBin2PRGVersionFile.txt +++ b/FoxBin2PRGVersionFile.txt @@ -3,7 +3,7 @@ Lparameters toUpdateInfo Local lcNote With toUpdateInfo .VersionNumber = 'v1.19.47' - .VersionDate = Date(2016,05,24) + .VersionDate = Date(2016,05,28) .SourceFileUrl = 'http://vfpxrepository.com/dl/thorupdate/Projects/FoxBin2Prg/FoxBin2Prg.Zip' .Link = 'http://vfpx.codeplex.com/wikipage?title=FoxBin2PRG' @@ -17,14 +17,14 @@ Demo video using FoxBin2Prg with PlasticSCM: http://youtu.be/sE4wQ50Itqg Change History ------------------------------------------------------------- -2016/05/24 v1.19.47 +2016/05/28 v1.19.47 - Bug Fix: When a filename "*" is specified with a type "*", an automatic regeneration of all binary files is made from text files (Alejandro Sosa) - BugFix: Added variable declaration (Doug Hennig) - BugFix: Fixed incorrectly named variable (Doug Hennig) - 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) +- Feature: Added support for appending data from DB2 to DBF with the new value DBF_Conversion_Support=8. 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/TESTS/DATOS_READONLY/fb2p_free.cdx b/TESTS/DATOS_READONLY/fb2p_free.cdx index a3f797b8e99fcc5e48d1b1b0669ba797aea9be90..e665b63373824b5189766f23630338299c0cb8cc 100644 GIT binary patch delta 136 zcmZp$X|NGsU}1m(UM_|QjGGymUNCO{!N|qI$hw)C>o4mhE*_DajQ^P#7}(jln32G^Xnfn}m3{gf=ts15L8GXJKPwV%ozvgZaQl!Oe`5Z^{bF X$tR>`6;)IeFfcHJ01InE4H5(Z^gSUi delta 135 zcmZp$X|NGsU}1m(7A}SdjGGymUNCO{!N|qI$g-K4>o4mh86N)ojLbkq?Cea;%#4g& z!W#weGqUMkJvoi((k3AuE}`9w{6J}Ydloh}CZ;`%JD3k_6x_|IUYv%2xe3THp#}*8 E0P&3^y#N3J diff --git a/TESTS/DATOS_READONLY/FB2P_FREE.DB2 b/TESTS/DATOS_READONLY/fb2p_free.db2 similarity index 74% rename from TESTS/DATOS_READONLY/FB2P_FREE.DB2 rename to TESTS/DATOS_READONLY/fb2p_free.db2 index df554e5..3a8659c 100644 --- a/TESTS/DATOS_READONLY/FB2P_FREE.DB2 +++ b/TESTS/DATOS_READONLY/fb2p_free.db2 @@ -8,7 +8,7 @@ 1252 - 2013/12/12 + 0x00000032Visual FoxPro, Varchar, Varbinary, or Blob-enabled @@ -371,7 +371,7 @@ - 30 + 505 @@ -381,12 +381,12 @@ - LOGICO - BINARY - LOGICO - + CARACTER + CANDIDATE + CARACTER + .NOT.EMPTY(caracter) ASCENDING - MACHINE + GENERAL ENTERO @@ -397,13 +397,93 @@ MACHINE - CARACTER - CANDIDATE - CARACTER - .NOT.EMPTY(caracter) + LOGICO + BINARY + LOGICO + ASCENDING - GENERAL + MACHINE + + + + + / / + / / : : + .F. + 0.00000 + 0.000000 + 0.000 + + 0.0000 + 0 + + + + + ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg + + 45 + + + axaxaxaxaXAXA + 1969/11/26 + 1969/11/26 22:10:06 + .T. + 123.45676 + 123.456786 + 123.456 + NgAuAEUAcwB0AGEAIABlAHMAIAB1AG4AYQAgAGYAcgBhAHMAZQAgAGMAbwBkAGkAZgBpAGMAYQBkAGEAIABlAG4AIABoAGUAeABhACAAeQAgAGMAbwBuACAAYwBhAHIAYQBjAHQAZQByAGUAcwAgAGUAcwBwAGUAYwBpAGEAbABlAHMALgAgAOEA6QDtAPMA+gDBAMkAzQDTANoAxADLAM8A1gDcAOQA6wDvAPYA/ADgAOgA7ADyAPkA8QDRAMcA5wBeAA== + 12345.6786 + 1234567896 + 6.notas TXT. áéíóúÄËÏÖÜÑñäëïöü. ^FinÇç + Ni5GcmFzZSBVVEYtOC4gw6HDqcOtw7PDusOEw4vDj8OWw5w= + var char 6.áéíóúÜÑ + yQBzAHQAYQAgAGUAcwAgAGwAYQAgAHMAZQDxAGEAbAAhAA== + Q2hhckJpbi02LsOhw6nDrcOzw7rDnMORICAgICAg + VkNoYXJCaW4tNi7DocOpw63Ds8O6w5zDkQ== + 35 + + + lalal.áéíóúÜÑ + 1969/11/27 + 1969/11/27 22:10:07 + .T. + 123.45677 + 123.456787 + 123.457 + NwAuAEUAcwB0AGEAIABlAHMAIAB1AG4AYQAgAGYAcgBhAHMAZQAgAGMAbwBkAGkAZgBpAGMAYQBkAGEAIABlAG4AIABoAGUAeABhACAAeQAgAGMAbwBuACAAYwBhAHIAYQBjAHQAZQByAGUAcwAgAGUAcwBwAGUAYwBpAGEAbABlAHMALgAgAOEA6QDtAPMA+gDBAMkAzQDTANoAxADLAM8A1gDcAOQA6wDvAPYA/ADgAOgA7ADyAPkA8QDRAMcA5wBeAA== + 12345.6787 + 1234567897 + 7.notas TXT. áéíóúÄËÏÖÜÑñäëïöü. ^FinÇç + Ny5GcmFzZSBVVEYtOC4gw6HDqcOtw7PDusOEw4vDj8OWw5w= + var char 7.áéíóúÜÑ + yQB4AGkAdABvAHMAIADaAG4AaQBjAG8AcwAhACAAOgApAA== + Q2hhckJpbi03LsOhw6nDrcOzw7rDnMORICAgICAg + VkNoYXJCaW4tNy7DocOpw63Ds8O6w5zDkQ== + 30 + + + pepepepepEPE + 1969/11/25 + 1969/11/25 22:10:05 + .T. + 123.45675 + 123.456785 + 123.455 + NQAuAEUAcwB0AGEAIABlAHMAIAB1AG4AYQAgAGYAcgBhAHMAZQAgAGMAbwBkAGkAZgBpAGMAYQBkAGEAIABlAG4AIABoAGUAeABhACAAeQAgAGMAbwBuACAAYwBhAHIAYQBjAHQAZQByAGUAcwAgAGUAcwBwAGUAYwBpAGEAbABlAHMALgAgAOEA6QDtAPMA+gDBAMkAzQDTANoAxADLAM8A1gDcAOQA6wDvAPYA/ADgAOgA7ADyAPkA8QDRAMcA5wBeAA== + 12345.6785 + 1234567895 + 5.notas TXT. áéíóúÄËÏÖÜÑñäëïöü. ^FinÇç + NS5GcmFzZSBVVEYtOC4gw6HDqcOtw7PDusOEw4vDj8OWw5w= + var char 5.áéíóúÜÑ + yQBzAHQAYQAgAGUAcwAgAGwAYQAgAHMAZQDxAGEAbAAhAA== + Q2hhckJpbi01LsOhw6nDrcOzw7rDnMORICAgICAg + VkNoYXJCaW4tNS7DocOpw63Ds8O6w5zDkQ== + 40 + + +
diff --git a/TESTS/DATOS_READONLY/fb2p_free.dbf b/TESTS/DATOS_READONLY/fb2p_free.dbf index c05a76f829d1d1a6bcad75345da761f8e91940a4..27e8b183e615f8cfcb96993af592dbda503061f4 100644 GIT binary patch literal 1901 zcmd^;&ui0Q7{}lBhZdcn^C1492Ig>=c5O9Dhd(e$lP=gM8q>N>SgAU%5%f|$Y{i_&RVLn-K{pqbR7WRW)b+Y_x+lnv(znh3ocOx_R+IxW*U zsUbzMyiwFOIp+Y5(3cR4`1QQ3$%as%NAjacew7dzvl$MbI%eyBhlcS_(9?tzPb2wN zLdt?s5mikvM#%AV(0iL4RL2*fqm^$W?ZM>@yFVJBR-8v_=EL`u=mQ{0kC5W6{b_sZ zD8GW<*QBeticm6jRg;MN)9&A$!4}13M@73_t0}eW#0*LOLZypDS#L>Lc4;Jdc>KzaM;Z;N#elbY@?2Kg;o1-ag{o@{9Mv zWb4aQ>*;IVi0gf5R$W4kPb$;ZnQ^9MDv4~8vF=+Btar7tmEZe5-^oNjQs#o1LEDQ_H+>8s(O#*zN4)FT* zqqlwFoCloygvokb@bgazc?a-i)VMW(bM3(|Jj36_1?M`02g?q4uMK`_++Ff9xrMs{ z&Q1V)XaV34ca5I)fwLZP_6s1lxZwRuA@UaBUr}S%0M51tKU`l0XFG!j%MN(I4c-bH mRDsnF#@$JfiCIw_uErkh_Ey_8^je(mzREw{kOaoc?)VEzm|Beh delta 450 zcmaFM_l1Ymh@XRrc_XVI6Ql0t5GE@|&cqxb^l|iYoIHU=eDVTTR=ee^4zh$ijMaN& zeK*d*(8yTN#MI2(!cqYQpj?d?ObnuDquCjNfE$P}F-`N#0g5FiCQdeFm*-ihC~JhhEyO+fguOXE(Y>G0$Di>iVR99Zc;D;x=MtDKO38?l)&|X0v;*)py#0M#+ncK1?X@KrpnB_Acm8H1i zRWYH5nx&?aF4at9lapiGIM|GTH0a2T<73oNQJc)L?*)2HGdcB7f4DQBd(Qd&&N=s- zd+*u9hc5XZzFlLnicifI5lQnl-nRUrcxtTXf)&LpXXM0*|66dO<}bqR<IgTCm8{)j~!9)}GY1|S{@ z7>Gn9AsHzcgj5X15DdjI495thAsrdWL>97*H!i?IYtu?)-c8dhK>R$(<>#~XMPYw#A{##*dH1=hoZ4XDIM=-7nK*n%o- z#XH!BYSiFeyodMk0k&fYcH%?q!bkWRyRip*@d@@}KMtT4pW+}6!HYV4=CznUzh?WC3pA4`b_X-`A+xt`LSod687u; z`}a5di?mRh8R-i@w0Ii*MtiRN1$(R4YqykuecR)QTsT;-_>eoS*KE*6d73Oqdap{& z>WQ=F>ZO%hoL?wOr|6ND+9+SQv*NV)&`;DBQUZo8-=j3)+s4uS4LfdLpRocuhMLCn}`m>^m z7r2Pk+i|OQT?t*6U#A)S`@NKJSDHJ0eNw3i3h~VG?=<$@H@kki*%ThQbcLKz0@utA zU~Jx)Y&F3)Kpj(DGFt)(q&pl=m&-;x;U8nSQV-0n2#Tq_>Yv8m)4Va;wCQoCP5$1c z8?_yZ9(zIyR76h?P==XKCF)B86xDnxu|9cK^$86F5RU{5L?V)4Z#S zjuA*hIx>)nEN}IR?A5nDyU)0l@Y=|;{;Vm>Q+9T!9_JG}<$qhjspja@dwg4r7t;DO zzTx1KQn%fuy35^aimmbTwdT7G^){ZI@z);mmt^vTl1YD0Dt&b8G%dpV=Y-vj36&m3 zc(_U0%H9%nOvkJ%?;gR=ax=ts?290Myp8X zQM!n#t;;H8c}1;Dv`b-o{}OVu=uzI>_<&uIc@8sxlOktVq#_vD;hlB;r4ewG_jFGuB~%%}(& z)V7)AhiNlO56@=$^-Zz0owWRdd|N=r)`M~6_{q}^^*7F6X}WWd*o>UwlA{+Zg1Q>7 WvR~ii|281CZ_>XU(0=;=D1HOi7!4o* delta 815 zcmWl~*H_H}007|It^5)pn_RMIA$yj+_ufK?2D*_wF0x7Xy!PI7@zlTKt$(0%oWq09 z!*{;=#&}R)*N~bP3OAI7LZO1hug2g{Qf)jfB^HFMgK!f6PbP&_nh=miQ_^Whb24Z_ zOIndhYueD3cC@Dh9qB}8vgksDu5=@t?)0E1z35FJ`qGd73}7IG$RU@(3}GmF3}ZMW z7|AF`GlsE@V>}a>NInHjVlq>h$~2}kgPF`?HglNEJm#~2g)Cw*OIXS>ma~GDtYS55 zSj#%rvw@8ivWd-Xp@^+)V>`v{U?(M%Qbswu*v%d)h*HU3_EE)t4seh|9Oei|ImU5L z5aT4LI88NYILkTCbAgLo;xbpL;VQLU<2pCE$t`Ykhr8V4J`Z?EoJTz72~T;(b6)V0 zSG?v8Z+XXiKJbxGeC7*Z`9>WHzVjmygn#}G60zU8$(fN*R#|zpup&EJ70u4eNH47{ Ti5BN%q?Z(z6%|(0WJdl0Gug%9 diff --git a/foxbin2prg.cfg.txt b/foxbin2prg.cfg.txt index da907ad..338f943 100644 --- a/foxbin2prg.cfg.txt +++ b/foxbin2prg.cfg.txt @@ -1,5 +1,5 @@ **************************************************************************************************** -* FOXBIN2PRG v1.19.43 +* FOXBIN2PRG v1.19.47 * CONFIGURATION FILE / ARCHIVO DE CONFIGURACIÓN **************************************************************************************************** @@ -34,7 +34,7 @@ * LBX_Conversion_Support: 2 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge) * MNX_Conversion_Support: 2 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge) * DBC_Conversion_Support: 2 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge) -* DBF_Conversion_Support: 1 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge), 4=Generate TXT with DATA for DIFF (No Bidirectional!) +* DBF_Conversion_Support: 1 && 0=No support, 1=Generate TXT only (Diff), 2=Generate TXT and BIN (Merge/Only Structure!), 4=Generate TXT with DATA (Diff), 8=Export and Import DATA (Merge/Structure & Data) * >>DBF_Conversion_Support NOTE: >> EN: FoxBin2Prg support bi-directional convertion of DBFs, but does not keep data. Use with care. * >> ES: FoxBin2Prg tiene soporte bi-direccional para convertir DBF, pero no mantiene los datos. Usar con cuidado. * DBF_Conversion_Included: * && If DBF_Conversion_Support:4, you can specify multiple filemasks: www,fb2p_free.dbf / Si DBF_Conversion_Support:4, se pueden indicar múltiples máscaras de archivo: www,fb2p_free.dbf diff --git a/foxbin2prg.prg b/foxbin2prg.prg index c63a786..96f56be 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) -* 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) +* 25/05/2016 FDBOZZO v1.19.47 Mejora DBF-Data: Permitir importar datos de los DB2 a los DBF con el nuevo valor DBF_Conversion_Support=8. Todos los tipos de datos excepto General. (Walter Nicholls) * * *--------------------------------------------------------------------------------------------------- @@ -2120,7 +2120,7 @@ DEFINE CLASS c_foxbin2prg AS Session CASE LEFT( laConfig(I), 23 ) == LOWER('DBF_Conversion_Support:') lcValue = ALLTRIM( SUBSTR( laConfig(I), 24 ) ) - IF INLIST( lcValue, '0', '1', '2', '4' ) THEN + IF INLIST( lcValue, '0', '1', '2', '4', '8' ) THEN lo_CFG.DBF_Conversion_Support = INT( VAL( lcValue ) ) .writeLog( C_TAB + JUSTFNAME(lcConfigFile) + ' > DBF_Conversion_Support: ' + TRANSFORM(lo_CFG.DBF_Conversion_Support) ) ENDIF @@ -2355,6 +2355,67 @@ DEFINE CLASS c_foxbin2prg AS Session ENDFUNC + PROCEDURE get_DBF_Configuration(tc_InputFile as String, to_out_DBF_CFG as Object, tlGenerateLog as Boolean) as Integer + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) + * tc_InputFile (@! IN ) Ruta al archivo con Extensión para comprobar si tiene soporte de conversión + * to_out_DBF_CFG (@? OUT) Objeto CFG del DBF indicado, con las propiedades que contenga el CFG y sus valores + * RETORNO (v? OUT) Devuelve 0 si no existe el archivo CFG y 1 si lo encuentra + *--------------------------------------------------------------------------------------------------- + #IF .F. + LOCAL to_out_DBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' + #ENDIF + + LOCAL lcTableCFG, lnFileCount, laDirFile(1,5), I, lcConfigItem + lcTableCFG = tc_InputFile + '.CFG' + lnFileCount = ADIR(laDirFile, lcTableCFG) + + IF lnFileCount = 1 + to_out_DBF_CFG = CREATEOBJECT("CL_DBF_CFG") + + IF tlGenerateLog THEN + THIS.writeLog() + THIS.writeLog(' > Found DBF configuration file: ' + lcTableCFG) + ENDIF + + 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, 21 ) == LOWER('DBF_Conversion_Order:') + to_out_DBF_CFG.DBF_Conversion_Order = ALLTRIM( SUBSTR( laConfig(I), 22 ) ) + IF tlGenerateLog THEN + THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Order: ' + to_out_DBF_CFG.DBF_Conversion_Order ) + ENDIF + + CASE LEFT( lcConfigItem, 25 ) == LOWER('DBF_Conversion_Condition:') + to_out_DBF_CFG.DBF_Conversion_Condition = ALLTRIM( SUBSTR( laConfig(I), 26 ) ) + IF tlGenerateLog THEN + THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Condition: ' + to_out_DBF_CFG.DBF_Conversion_Condition ) + ENDIF + + CASE LEFT( lcConfigItem, 23 ) == LOWER('DBF_Conversion_Support:') + to_out_DBF_CFG.DBF_Conversion_Support = INT( VAL( SUBSTR( laConfig(I), 24 ) ) ) + IF tlGenerateLog THEN + THIS.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' > DBF_Conversion_Support: ' + TRANSFORM(to_out_DBF_CFG.DBF_Conversion_Support) ) + ENDIF + + ENDCASE + ENDFOR + + IF tlGenerateLog THEN + THIS.writeLog() + ENDIF + + ENDIF + + RETURN lnFileCount + ENDPROC + + PROCEDURE get_Ext2FromExt *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -2388,72 +2449,135 @@ DEFINE CLASS c_foxbin2prg AS Session ENDPROC - PROCEDURE hasSupport_Bin2Prg + PROCEDURE hasSupport_Bin2Prg(tcFileName as String, tcDir as String) as Boolean *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcExt (@! IN ) Extensión para comprobar si tiene soporte de conversión + * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión * tcDir (@? IN ) Directorio del que devolver su configuración * RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcExt, tcDir - - LOCAL llhasSupport - tcExt = UPPER(JUSTEXT('.' + tcExt)) + LOCAL llhasSupport, lcExt, lcDir ; + , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF NOT EMPTY(tcDir) - .evaluateConfiguration( '', '', '', '', '', '', '', '', tcDir, 'D' ) + loDBF_CFG = NULL + lcExt = UPPER(JUSTEXT('.' + tcFileName)) + + IF '\' $ tcFileName AND lcExt == 'DBF' THEN + lcDir = JUSTPATH(tcFileName) + .get_DBF_Configuration(tcFileName, @loDBF_CFG) + ELSE + lcDir = tcDir ENDIF - llhasSupport = ICASE( tcExt == 'PJX', .PJX_Conversion_Support > 0 ; - , tcExt == 'VCX', .VCX_Conversion_Support > 0 ; - , tcExt == 'SCX', .SCX_Conversion_Support > 0 ; - , tcExt == 'FRX', .FRX_Conversion_Support > 0 ; - , tcExt == 'LBX', .LBX_Conversion_Support > 0 ; - , tcExt == 'MNX', .MNX_Conversion_Support > 0 ; - , tcExt == 'DBF', .DBF_Conversion_Support > 0 ; - , tcExt == 'DBC', .DBC_Conversion_Support > 0 ; + IF NOT EMPTY(lcDir) + .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) + ENDIF + + llhasSupport = ICASE( lcExt == 'PJX', .PJX_Conversion_Support > 0 ; + , lcExt == 'VCX', .VCX_Conversion_Support > 0 ; + , lcExt == 'SCX', .SCX_Conversion_Support > 0 ; + , lcExt == 'FRX', .FRX_Conversion_Support > 0 ; + , lcExt == 'LBX', .LBX_Conversion_Support > 0 ; + , lcExt == 'MNX', .MNX_Conversion_Support > 0 ; + , lcExt == 'DBF', .DBF_Conversion_Support > 0 OR NOT ISNULL(loDBF_CFG) ; + , lcExt == 'DBC', .DBC_Conversion_Support > 0 ; , .F. ) ENDWITH && THIS - RELEASE tcExt RETURN llhasSupport ENDPROC - PROCEDURE hasSupport_Prg2Bin + PROCEDURE hasSupport_Prg2Bin(tcFileName as String, tcDir as String) as Boolean *--------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) - * tcExt (@! IN ) Extensión para comprobar si tiene soporte de conversión + * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión * tcDir (@? IN ) Directorio del que devolver su configuración * RETORNO (v? OUT) .T. si tiene soporte de conversión, .F. si no lo tiene *--------------------------------------------------------------------------------------------------- - LPARAMETERS tcExt, tcDir - - LOCAL llhasSupport - tcExt = UPPER(JUSTEXT('.' + tcExt)) + LOCAL llhasSupport, lcExt, lcDir ; + , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - IF NOT EMPTY(tcDir) - .evaluateConfiguration( '', '', '', '', '', '', '', '', tcDir, 'D' ) + loDBF_CFG = NULL + lcExt = UPPER(JUSTEXT('.' + tcFileName)) + + IF '\' $ tcFileName AND lcExt == .c_DB2 THEN + lcDir = JUSTPATH(tcFileName) + .get_DBF_Configuration(tcFileName, @loDBF_CFG) + ELSE + lcDir = tcDir ENDIF - llhasSupport = ICASE( tcExt == .c_PJ2, .PJX_Conversion_Support = 2 ; - , tcExt == .c_VC2, .VCX_Conversion_Support = 2 ; - , tcExt == .c_SC2, .SCX_Conversion_Support = 2 ; - , tcExt == .c_FR2, .FRX_Conversion_Support = 2 ; - , tcExt == .c_LB2, .LBX_Conversion_Support = 2 ; - , tcExt == .c_MN2, .MNX_Conversion_Support = 2 ; - , tcExt == .c_DB2, .DBF_Conversion_Support = 2 ; - , tcExt == .c_DC2, .DBC_Conversion_Support = 2 ; + IF NOT EMPTY(lcDir) + .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) + ENDIF + + llhasSupport = ICASE( lcExt == .c_PJ2, .PJX_Conversion_Support = 2 ; + , lcExt == .c_VC2, .VCX_Conversion_Support = 2 ; + , lcExt == .c_SC2, .SCX_Conversion_Support = 2 ; + , lcExt == .c_FR2, .FRX_Conversion_Support = 2 ; + , lcExt == .c_LB2, .LBX_Conversion_Support = 2 ; + , lcExt == .c_MN2, .MNX_Conversion_Support = 2 ; + , lcExt == .c_DB2, INLIST(.DBF_Conversion_Support, 2, 8) OR NOT ISNULL(loDBF_CFG) AND loDBF_CFG.DBF_Conversion_Support = 8 ; + , lcExt == .c_DC2, .DBC_Conversion_Support = 2 ; , .F. ) ENDWITH && THIS - RELEASE tcExt RETURN llhasSupport ENDPROC + PROCEDURE conversionSupportType(tcFileName as String, tlGenerarLog as Boolean) as Integer + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) + * tcFilename (@! IN ) Extensión para comprobar si el archivo tiene soporte de conversión + * RETORNO (v? OUT) Devuelve el código de soporte + *--------------------------------------------------------------------------------------------------- + LOCAL lnSupportType, lcExt, lcDir, lcFilename ; + , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' + + TRY + WITH THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' + loDBF_CFG = NULL + lcExt = UPPER(JUSTEXT('.' + tcFileName)) + + IF '\' $ tcFileName AND INLIST(lcExt, .c_DB2, 'DBF') THEN + lcFilename = FORCEEXT(tcFileName, 'DBF') + lcDir = JUSTPATH(lcFileName) + .get_DBF_Configuration(lcFileName, @loDBF_CFG, tlGenerarLog) + ELSE + lcDir = SYS(5) + CURDIR() + ENDIF + + IF NOT EMPTY(lcDir) + .evaluateConfiguration( '', '', '', '', '', '', '', '', lcDir, 'D' ) + ENDIF + + lnSupportType = ICASE( ; + INLIST(lcExt, .c_PJ2, 'PJX'), .PJX_Conversion_Support ; + , INLIST(lcExt, .c_VC2, 'VCX'), .VCX_Conversion_Support ; + , INLIST(lcExt, .c_SC2, 'SCX'), .SCX_Conversion_Support ; + , INLIST(lcExt, .c_FR2, 'FRX'), .FRX_Conversion_Support ; + , INLIST(lcExt, .c_LB2, 'LBX'), .LBX_Conversion_Support ; + , INLIST(lcExt, .c_MN2, 'MNX'), .MNX_Conversion_Support ; + , INLIST(lcExt, .c_DB2, 'DBF'), ICASE( ISNULL(loDBF_CFG) OR loDBF_CFG.DBF_Conversion_Support = 0, .DBF_Conversion_Support, loDBF_CFG.DBF_Conversion_Support ) ; + , INLIST(lcExt, .c_DC2, 'DBC'), .DBC_Conversion_Support ; + , 0 ) + + lnSupportType = INT(lnSupportType) + ENDWITH && THIS + + FINALLY + STORE NULL TO loDBF_CFG + RELEASE loDBF_CFG + ENDTRY + + RETURN lnSupportType + ENDPROC + + PROCEDURE execute *-------------------------------------------------------------------------------------------------------------- * PARÁMETROS: (v=Pasar por valor | @=Pasar por referencia) (!=Obligatorio | ?=Opcional) (IN/OUT) @@ -3553,7 +3677,7 @@ DEFINE CLASS c_foxbin2prg AS Session .changeFileAttribute( FORCEEXT( .c_InputFile, .c_LB2 ), lcForceAttribs ) CASE lcExtension = 'DBF' - IF NOT INLIST(.DBF_Conversion_Support, 1, 2, 4) + IF NOT INLIST(.DBF_Conversion_Support, 1, 2, 4, 8) ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) ENDIF .c_OutputFile = FORCEEXT( .c_InputFile, .c_DB2 ) @@ -3622,7 +3746,9 @@ DEFINE CLASS c_foxbin2prg AS Session .changeFileAttribute( FORCEEXT( .c_InputFile, 'LBT' ), lcForceAttribs ) CASE lcExtension = .c_DB2 - IF .DBF_Conversion_Support <> 2 AND ADIR(laDirFile, FORCEEXT(.c_InputFile, 'DBF') + '.CFG') = 0 THEN + IF INLIST(.DBF_Conversion_Support, 2, 8) OR ADIR(laDirFile, FORCEEXT(.c_InputFile, 'DBF') + '.CFG') = 1 THEN + *-- Soporte txt-2-bin habilitado + ELSE ERROR (TEXTMERGE(loLang.C_FILE_NAME_IS_NOT_SUPPORTED_LOC)) ENDIF .c_OutputFile = FORCEEXT( .c_InputFile, 'DBF' ) @@ -11910,8 +12036,9 @@ 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, lcTableCFG, lnFileCount, llImportData, laConfig(1), lcConfigItem, lc_DBF_Conversion_Support ; - , lcTempDBC + , lnIDInputFile, lnFileCount, laConfig(1), lcConfigItem, lc_DBF_Conversion_Support ; + , lcTempDBC, llImportData ; + , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' STORE 0 TO lnCodError, lnCodeLines WITH THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' @@ -11927,39 +12054,15 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin 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) + lnFileCount = toFoxBin2Prg.get_DBF_Configuration( FORCEEXT(.c_InputFile, 'DBF'), @loDBF_CFG, .T. ) 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 + DO CASE + CASE toFoxBin2Prg.DBF_Conversion_Support = 8 && TXT2BIN (DATA IMPORT) 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 + CASE INLIST(toFoxBin2Prg.DBF_Conversion_Support, 1, 2, 4) AND lnFileCount = 1 + llImportData = (loDBF_CFG.DBF_Conversion_Support = 8) + ENDCASE C_FB2PRG_CODE = FILETOSTR( .c_InputFile ) lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) @@ -12015,7 +12118,8 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin ERASE (FORCEEXT(lcTempDBC,'DCX')) ENDIF - RELEASE I + STORE NULL TO loDBF_CFG + RELEASE loDBF_CFG ENDTRY @@ -22933,9 +23037,10 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE #ENDIF TRY - LOCAL lcText, lcTableCFG, lcIndexKey, lcIndexFile, laConfig(1), lcValue, lcConfigItem ; + LOCAL lcText, lcIndexKey, lcIndexFile, laConfig(1), lcValue, lcConfigItem ; , lc_DBF_Conversion_Order, lc_DBF_Conversion_Condition, llExportData, laDirFile(1,5), lnFileCount ; , loEx AS EXCEPTION ; + , loDBF_CFG AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' ; , loRecords AS CL_DBF_RECORDS OF 'FOXBIN2PRG.PRG' ; , loFields AS CL_DBF_FIELDS OF 'FOXBIN2PRG.PRG' ; , loIndexes AS CL_DBF_INDEXES OF 'FOXBIN2PRG.PRG' @@ -22968,37 +23073,18 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE lcText = lcText + loIndexes.toText( '', '', tc_InputFile, @toFoxBin2Prg ) *-- If table CFG exists, use it for DBF-specific configuration. FDBOZZO. 2014/06/15 - lcTableCFG = tc_InputFile + '.CFG' - lnFileCount = ADIR(laDirFile, lcTableCFG) + lnFileCount = toFoxBin2Prg.get_DBF_Configuration( FORCEEXT(tc_InputFile, 'DBF'), @loDBF_CFG, .T. ) - IF toFoxBin2Prg.DBF_Conversion_Support = 4 ; && BIN2PRG (DATA EXPORT FOR DIFF) - OR toFoxBin2Prg.DBF_Conversion_Support = 1 AND lnFileCount = 1 THEN - llExportData = .T. - ENDIF + DO CASE + CASE INLIST(toFoxBin2Prg.DBF_Conversion_Support, 4, 8) ; && BIN2TXT (DATA EXPORT FOR DIFF) + OR INLIST(toFoxBin2Prg.DBF_Conversion_Support, 1, 2) AND lnFileCount = 1 + *-- ASUNCIÓN: Si hay un archivo DBF.CFG, es porque se quiere exportar datos, si no, no debe crearse el DBF.CFG + llExportData = .T. + ENDCASE IF llExportData THEN IF 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, 21 ) == LOWER('DBF_Conversion_Order:') - lc_DBF_Conversion_Order = ALLTRIM( SUBSTR( laConfig(I), 22 ) ) - toFoxBin2Prg.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' -> DBF_Conversion_Order: ' + lc_DBF_Conversion_Order ) - - CASE LEFT( lcConfigItem, 25 ) == LOWER('DBF_Conversion_Condition:') - lc_DBF_Conversion_Condition = ALLTRIM( SUBSTR( laConfig(I), 26 ) ) - toFoxBin2Prg.writeLog(' ' + JUSTFNAME(lcTableCFG) + ' -> DBF_Conversion_Condition: ' + lc_DBF_Conversion_Condition ) - - ENDCASE - ENDFOR + lc_DBF_Conversion_Order = loDBF_CFG.DBF_Conversion_Order IF NOT EMPTY(lc_DBF_Conversion_Order) lcIndexFile = FORCEEXT(tc_InputFile,'IDX') @@ -23007,8 +23093,10 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE ENDIF ENDIF + ENDIF - *** DH 06/02/2014: added _Records + *** DH 06/02/2014: added _Records + IF llExportData loRecords = THIS._Records FWRITE( toFoxBin2Prg.n_FileHandle, lcText ) loRecords.toText(@laFields, lnFieldCount, lc_DBF_Conversion_Condition, @toFoxBin2Prg) @@ -23032,12 +23120,13 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE THROW FINALLY - STORE NULL TO loIndexes, loFields, loRecords - RELEASE loFields, loIndexes, loRecords IF NOT EMPTY(lcIndexFile) AND FILE(lcIndexFile) SET INDEX TO ERASE (lcIndexFile) ENDIF + + STORE NULL TO loIndexes, loFields, loRecords, loDBF_CFG + RELEASE loFields, loIndexes, loRecords, loDBF_CFG ENDTRY RETURN lcText @@ -23895,7 +23984,7 @@ DEFINE CLASS CL_DBF_RECORD AS CL_CUS_BASE ENDCASE - IF lcFieldType == 'G' OR lcFieldType == 'I' AND NOT EMPTY(loField._AutoInc_Step) + IF lcFieldType == 'G' OR lcFieldType == 'I' AND NOT EMPTY(INT(VAL(loField._AutoInc_Step))) *-- Saltar campos General o Integer con AutoInc ELSE REPLACE (lcFieldName) WITH (luValue) @@ -27838,3 +27927,23 @@ DEFINE CLASS CL_LANG AS Custom ENDPROC ENDDEFINE + + + +DEFINE CLASS CL_DBF_CFG AS CUSTOM + _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] + + #IF .F. + LOCAL THIS AS CL_DBF_CFG OF 'FOXBIN2PRG.PRG' + #ENDIF + + + *-- Configuration class. By default asumes master value, except when overriding one. + DBF_Conversion_Order = '' + DBF_Conversion_Condition = '' + DBF_Conversion_Support = 0 +ENDDEFINE