From f7a2e9103d0360712feff13108464a413cf9effb Mon Sep 17 00:00:00 2001 From: fernando Date: Thu, 12 Dec 2013 17:36:47 +0100 Subject: [PATCH] Changeset: 80 Changeset: 80 Desarrollo ofi DBC --- TESTS/DATOS_READONLY/fb2p_dbc.dbc | Bin 6657 -> 6657 bytes TESTS/DATOS_READONLY/fb2p_dbc.dct | Bin 27456 -> 51392 bytes foxbin2prg.pjt | Bin 207438 -> 176451 bytes foxbin2prg.pjx | Bin 1713 -> 1713 bytes foxbin2prg.prg | 638 +++++++++--------------------- 5 files changed, 176 insertions(+), 462 deletions(-) diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dbc b/TESTS/DATOS_READONLY/fb2p_dbc.dbc index a4601f4c70512d175aabd2238ff605b90de8196c..852a0fa8832d7b6f02a8889b95645cffb1096f08 100644 GIT binary patch delta 170 zcmWN?y$V5b90uU`yiS(m``co20S0mhCb!@Y z|Fb-U`k?OD;<4D=Uy^$-+_LTQ=qd1xBZf1-8|4P71jY%%L(q(H3jGqs5E>_q3#gSc zE}^e$4Gq)A9n{De_t3+2g8EtG1*+zZSLp1zLA|{34rL3*2efiMp-$2Gf><)Xp^57Q Hwabe?n&Ud6 delta 170 zcmWN?J&r+P7zN;a&fJK&nDIAgR2HBhcA&BaI}i~Ok;%kQsUnU>WHOPrpd>dk8kNcx zEMOX2Q23tanO3J&zmkZ@j{YAR^}-9AV8K)18~?rV;I|`OL8ZXBM|chDZ`?x9r12Np zz8im_#)okOJzQ&Okuol!TG}{=?yea$&KM_9Icpq2H`h1R$r-<(%%^b(om~T{l{fYw O7K}Y;=juYu;^_qyzBKg! diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dct b/TESTS/DATOS_READONLY/fb2p_dbc.dct index fb6793da75293156738e9073a668cba4690e0669..39e2f700166d8bb116bf7abb05059d9a9413080f 100644 GIT binary patch delta 2424 zcmdT_O>7%g5T4z2?AT3ItQ6Wq8kVGyn^1mI5>N^z+1hIw>e`m$p9U2i|7?RLCk}QR zfk0ZfNaTV*)(TZf2sk5E6m7+cLrz7A3tW(BB~TBD8xp+~;WpuWUa!|1yAl;A)*A2k z-pqVE`#hg#`zLO@F7y)#V?;FnmG?GR7u~wR3l8tt)t%eBBG18b8Q#ldb?>3!8>a`c z9*4a$f-hVjj1s+%pv_0M?`JkBb&=s zl}L6~5&dES@fl}BAn^&&8E6cWEgHx)+52)Gu3+GOyM6~WT| zd(tE2W%yM3;a+g8c$~c!=l= z;E!PvaBP@J2fjt*r?;_qauO>P@;qz_xG_zX1EvWWYv{e#`n419oV_`u?-nIatMxhc z(Cgcrc73I$g;p+V-=42&FP&F)rvmR*LDjD3xAjo2#_7)Gd0u-jQ`4N8i`v#}HO&Rv zdKGur);ZkIsr>Xkz2BMS)L1+kkb}v%EO!31gC2J{CdJVj2|2!K*T*r@>SbWFGXc#u zL-w5LV@j}RqO*PC<6`S_RFySuC&9jd zQ$PnnGk?x1;DPe{sgG5Xu6zAaR>$cM9wt}(vETO~MB`+#;>lo;9g10#aR=qp|AVp* zFFxadW>fdq?BstF?POaEHr;h;LAANN6=riYO<2U1_}otxTV4r!TW6-X zm&{Dxo*GT{^(IVZea5)$#b~BB8TGhp3gUf8e|I)D!o8s1NCyOU8KdXZ*62Bi-n|C= zM{D%30U@}Ej(LpH6U2HRc(OHmidg%Be`t-K53&9Y_(*H?Xjq>DPPazSO{^~g&oE-v UKO83BG8X(y$LM)%wC;`l14U9y9{>OV delta 360 zcmZ9HJxc>Y5Qg8mi~8D_(w9llEnkVgQGr}VcBv*X6L?1bfZOzNmB zCRxu{P4lihZ(i~(+aC$=WdRc$m>~%p*cb!m=u2dee#VUzdW&4sPbYzG`XRZXXQ$bt zUlEUfoCa>`n%vOuXMqR$2YI8PF9JVwPjG+{AGG{yhmpM diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index 21b4f440845514bbc477c43265c59e63d09a0dea..643d3960c81a0a1f8bdd4fe129b760559b3d10db 100644 GIT binary patch delta 21600 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 delta 73 zcmdnUyOEd0fR~4RBg+mJHX|bg15>lfhgfQ~jSNjpO^g_zz%4{U!A$`OOifHcLN!4A R2Z$An3@uGJXR>-Q0stca4ZQ#W diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 396a56f..9b02d75 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -156,6 +156,8 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro #DEFINE C_LEN_CDX_F LEN(C_CDX_F) #DEFINE C_LEN_INDEX_I LEN(C_INDEX_I) #DEFINE C_LEN_INDEX_F LEN(C_INDEX_F) +#DEFINE C_DATABASE_I '' +#DEFINE C_DATABASE_F '' #DEFINE C_TABLE_I '' #DEFINE C_TABLE_F '
' #DEFINE C_TABLES_I '' @@ -5308,7 +5310,6 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE identificarBloquesDeCodigo - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toTable *-------------------------------------------------------------------------------------------------------------- * taCodeLines (!@ IN ) El array con las líneas del código donde buscar * tnCodeLines (!@ IN ) Cantidad de líneas de código @@ -5316,6 +5317,7 @@ DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin * tnBloquesExclusion (?@ IN ) Sin uso * toTable (?@ OUT) Objeto con toda la información de la tabla analizada *-------------------------------------------------------------------------------------------------------------- + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toTable EXTERNAL ARRAY taCodeLines, taBloquesExclusion #IF .F. @@ -5386,13 +5388,16 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE Convertir - LPARAMETERS toModulo, toEx AS EXCEPTION - DODEFAULT( @toModulo, @toEx ) + LPARAMETERS toDatabase, toEx AS EXCEPTION + DODEFAULT( @toDatabase, @toEx ) + + #IF .F. + LOCAL toDatabase AS CL_DATABASE OF 'FOXBIN2PRG.PRG' + #ENDIF TRY LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I ; - , loReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + , laBloquesExclusion(1,2), lnBloquesExclusion, I STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version STORE '' TO lcLine, lcSourceFile STORE NULL TO loReg, toModulo @@ -5406,9 +5411,9 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin *THIS.createTable() *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @loReport ) + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toDatabase ) - THIS.escribirArchivoBin( @loReport ) + THIS.escribirArchivoBin( @toDatabase ) CATCH TO loEx @@ -5428,62 +5433,102 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE escribirArchivoBin - LPARAMETERS toReport + LPARAMETERS toDatabase *-- ----------------------------------------------------------------------------------------------------------- #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + LOCAL toDatabase AS CL_DATABASE OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL loReg, I, lcFieldType, lnFieldLen, lnFieldDec, lnNumCampo, laFieldTypes(1,18) ; - , luValor, lnCodError, loEx AS EXCEPTION - SELECT TABLABIN - AFIELDS( laFieldTypes ) + LOCAL loConnection AS CL_DBC_CONNECTION OF 'FOXBIN2PRG.PRG' + LOCAL loTable AS CL_DBC_TABLE OF 'FOXBIN2PRG.PRG' + LOCAL loView AS CL_DBC_VIEW OF 'FOXBIN2PRG.PRG' + LOCAL loRelation AS CL_DBC_RELATION OF 'FOXBIN2PRG.PRG' + LOCAL lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate + + STORE '' TO lcIndex, lcFieldDef - *-- Agrego los registros - FOR EACH loReg IN toReport FOXOBJECT + lcCreateTable = 'CREATE TABLE "' + THIS.c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' (' - *-- Ajuste de los tipos de dato - FOR I = 1 TO AMEMBERS(laProps, loReg, 0) - lnNumCampo = ASCAN( laFieldTypes, laProps(I), 1, -1, 1, 1+2+4+8 ) + *-- Conformo los campos + EXIT + + toDatabase.DBWriteObjects( THIS.c_OutputFile ) + + FOR EACH loConnection IN toDatabase._Connections FOXOBJECT + lcLongDec = '' - IF lnNumCampo = 0 - ERROR 'No se encontró el campo [' + laProps(I) + '] en la estructura del archivo ' + DBF("TABLABIN") + *-- Nombre, Tipo + lcFieldDef = lcFieldDef + ', ' + loField._Name + ' ' + loField._Type + + *-- Longitud + IF INLIST( loField._Type, 'C', 'N', 'F', 'Q', 'V' ) + lcLongDec = lcLongDec + '(' + loField._Width + ENDIF + + *-- Decimales + IF INLIST( loField._Type, 'B', 'N', 'F' ) AND loField._Decimals > '0' + IF EMPTY(lcLongDec) + lcLongDec = lcLongDec + '(' + ELSE + lcLongDec = lcLongDec + ',' ENDIF + lcLongDec = lcLongDec + loField._Decimals + ENDIF - lcFieldType = laFieldTypes(lnNumCampo,2) - lnFieldLen = laFieldTypes(lnNumCampo,3) - lnFieldDec = laFieldTypes(lnNumCampo,4) - luValor = EVALUATE('loReg.' + laProps(I)) + IF NOT EMPTY(lcLongDec) + lcLongDec = lcLongDec + ')' + ENDIF - DO CASE - CASE INLIST(lcFieldType, 'B') && Double - ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldPrec) ) ) + lcFieldDef = lcFieldDef + lcLongDec - CASE INLIST(lcFieldType, 'F', 'N', 'Y') && Float, Numeric, Currency - ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldLen, lnFieldDec) ) ) + *-- Null + lcFieldDef = lcFieldDef + IIF( loField._Null = '.T.', ' NULL', ' NOT NULL' ) - CASE INLIST(lcFieldType, 'W', 'G', 'M', 'Q', 'V', 'C') && Blob, General, Memo, Varbinary, Varchar, Character - ADDPROPERTY( loReg, laProps(I), luValor ) + *-- NoCPTran + IF loField._NoCPTran = '.T.' + lcFieldDef = lcFieldDef + ' NOCPTRAN' + ENDIF - OTHERWISE && Demás tipos - ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldLen) ) ) + *-- AutoInc + IF loField._AutoInc_NextVal <> '0' + lcFieldDef = lcFieldDef + ' AUTOINC NEXTVAL ' + loField._AutoInc_NextVal + ' STEP ' + loField._AutoInc_Step + ENDIF - ENDCASE - - ENDFOR - - INSERT INTO TABLABIN FROM NAME loReg - loReg = NULL + loField = NULL ENDFOR - USE IN (SELECT("TABLABIN")) + lcCreateTable = lcCreateTable + SUBSTR(lcFieldDef,3) + ')' + *STRTOFILE(lcCreateTable,'CreateTable.txt') + &lcCreateTable. - IF THIS.c_Type = 'FRX' - COMPILE REPORT (THIS.c_OutputFile) - ELSE - COMPILE LABEL (THIS.c_OutputFile) - ENDIF + *-- 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))) CATCH TO loEx @@ -5506,7 +5551,6 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin ******************************************************************************************************************* PROCEDURE identificarBloquesDeCodigo - LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toReport *-------------------------------------------------------------------------------------------------------------- * taCodeLines (!@ IN ) El array con las líneas del código donde buscar * tnCodeLines (!@ IN ) Cantidad de líneas de código @@ -5517,21 +5561,22 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin * NOTA: * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. *-------------------------------------------------------------------------------------------------------------- + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toDatabase EXTERNAL ARRAY taCodeLines, taBloquesExclusion #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + LOCAL toDatabase AS CL_DATABASE OF 'FOXBIN2PRG.PRG' #ENDIF TRY - LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed + LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueDatabase_Completed STORE 0 TO I THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile)) IF tnCodeLines > 1 - toReport = NULL - toReport = CREATEOBJECT('CL_REPORT') + toDatabase = NULL + toDatabase = CREATEOBJECT('CL_DATABASE') WITH THIS FOR I = 1 TO tnCodeLines @@ -5542,10 +5587,11 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin ENDIF DO CASE - CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toReport, @lcLine, @taCodeLines, @I, tnCodeLines ) + CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toDatabase, @lcLine, @taCodeLines, @I, tnCodeLines ) llFoxBin2Prg_Completed = .T. - CASE .analizarBloque_DATABASE( toReport, @lcLine, @taCodeLines, @I, tnCodeLines ) + CASE NOT llBloqueDatabase_Completed AND toDatabase.analizarBloque( @lcLine, @taCodeLines, @I, tnCodeLines ) + llBloqueDatabase_Completed = .T. ENDCASE ENDFOR @@ -5565,369 +5611,6 @@ DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin ENDPROC - ************************************************************************************************ - PROCEDURE add_Table - LPARAMETERS tcName - tcName = RTRIM(tcName) - THIS._Tables.ADD( CREATEOBJECT("CL_TABLE"), tcName ) - RETURN THIS._Tables( tcName ) - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_DATABASE - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName - - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION - - IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I - llBloqueEncontrado = .T. - - IF C_DATA_F $ tcLine - lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - ENDIF - - *-- Tomo la primera parte del valor - lcValue = STREXTRACT( tcLine, C_DATA_I ) - - *-- Recorro las fracciones del valor - FOR I = I + 1 TO tnCodeLines - tcLine = taCodeLines(I) - - IF C_DATA_F $ tcLine && Fin del valor - lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - - ELSE && Otra fracción del valor - lcValue = lcValue + CR_LF + tcLine - ENDIF - ENDFOR - - ENDIF - - CATCH TO loEx - IF loEx.ERRORNO = 1470 && Incorrect property name. - loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' - ENDIF - - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_TABLES - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName - - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION - - IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I - llBloqueEncontrado = .T. - - IF C_DATA_F $ tcLine - lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - ENDIF - - *-- Tomo la primera parte del valor - lcValue = STREXTRACT( tcLine, C_DATA_I ) - - *-- Recorro las fracciones del valor - FOR I = I + 1 TO tnCodeLines - tcLine = taCodeLines(I) - - IF C_DATA_F $ tcLine && Fin del valor - lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - - ELSE && Otra fracción del valor - lcValue = lcValue + CR_LF + tcLine - ENDIF - ENDFOR - - ENDIF - - CATCH TO loEx - IF loEx.ERRORNO = 1470 && Incorrect property name. - loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' - ENDIF - - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_TABLE_FIELDS - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName - - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION - - IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I - llBloqueEncontrado = .T. - - IF C_DATA_F $ tcLine - lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - ENDIF - - *-- Tomo la primera parte del valor - lcValue = STREXTRACT( tcLine, C_DATA_I ) - - *-- Recorro las fracciones del valor - FOR I = I + 1 TO tnCodeLines - tcLine = taCodeLines(I) - - IF C_DATA_F $ tcLine && Fin del valor - lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - - ELSE && Otra fracción del valor - lcValue = lcValue + CR_LF + tcLine - ENDIF - ENDFOR - - ENDIF - - CATCH TO loEx - IF loEx.ERRORNO = 1470 && Incorrect property name. - loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' - ENDIF - - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_VIEWS - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName - - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION - - IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I - llBloqueEncontrado = .T. - - IF C_DATA_F $ tcLine - lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - ENDIF - - *-- Tomo la primera parte del valor - lcValue = STREXTRACT( tcLine, C_DATA_I ) - - *-- Recorro las fracciones del valor - FOR I = I + 1 TO tnCodeLines - tcLine = taCodeLines(I) - - IF C_DATA_F $ tcLine && Fin del valor - lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - - ELSE && Otra fracción del valor - lcValue = lcValue + CR_LF + tcLine - ENDIF - ENDFOR - - ENDIF - - CATCH TO loEx - IF loEx.ERRORNO = 1470 && Incorrect property name. - loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' - ENDIF - - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_CONNECTIONS - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName - - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION - - IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I - llBloqueEncontrado = .T. - - IF C_DATA_F $ tcLine - lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - ENDIF - - *-- Tomo la primera parte del valor - lcValue = STREXTRACT( tcLine, C_DATA_I ) - - *-- Recorro las fracciones del valor - FOR I = I + 1 TO tnCodeLines - tcLine = taCodeLines(I) - - IF C_DATA_F $ tcLine && Fin del valor - lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - - ELSE && Otra fracción del valor - lcValue = lcValue + CR_LF + tcLine - ENDIF - ENDFOR - - ENDIF - - CATCH TO loEx - IF loEx.ERRORNO = 1470 && Incorrect property name. - loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' - ENDIF - - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC - - - ******************************************************************************************************************* - PROCEDURE analizarBloque_RELATIONS - *------------------------------------------------------ - *-- Analiza el bloque - *------------------------------------------------------ - LPARAMETERS toReport, tcLine, taCodeLines, I, tnCodeLines, toReg, tcPropName - - #IF .F. - LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' - #ENDIF - - TRY - LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION - - IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I - llBloqueEncontrado = .T. - - IF C_DATA_F $ tcLine - lcValue = STREXTRACT( tcLine, C_DATA_I, C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - ENDIF - - *-- Tomo la primera parte del valor - lcValue = STREXTRACT( tcLine, C_DATA_I ) - - *-- Recorro las fracciones del valor - FOR I = I + 1 TO tnCodeLines - tcLine = taCodeLines(I) - - IF C_DATA_F $ tcLine && Fin del valor - lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F ) - ADDPROPERTY( toReg, tcPropName, lcValue ) - EXIT - - ELSE && Otra fracción del valor - lcValue = lcValue + CR_LF + tcLine - ENDIF - ENDFOR - - ENDIF - - CATCH TO loEx - IF loEx.ERRORNO = 1470 && Incorrect property name. - loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' - ENDIF - - IF THIS.l_Debug AND _VFP.STARTMODE = 0 - SET STEP ON - ENDIF - - THROW - - ENDTRY - - RETURN llBloqueEncontrado - ENDPROC - - ENDDEFINE && CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin @@ -9560,6 +9243,7 @@ DEFINE CLASS CL_DATABASE AS CL_CUS_BASE _MEMBERDATA = [] ; + [] ; + + [] ; + [] ; + [] ; + [] ; @@ -9585,7 +9269,7 @@ DEFINE CLASS CL_DATABASE AS CL_CUS_BASE _DBCEvents = .F. _DBCEventFilename = '' - *-- Fields and Indexes + *-- Sub-objects _Connections = NULL _Tables = NULL _Views = NULL @@ -9596,8 +9280,10 @@ DEFINE CLASS CL_DATABASE AS CL_CUS_BASE PROCEDURE INIT DODEFAULT() *-- - THIS._Fields = CREATEOBJECT("CL_DBF_FIELDS") - THIS._Indexes = CREATEOBJECT("CL_DBF_INDEXES") + THIS._Connections = CREATEOBJECT("CL_DBC_CONNECTIONS") + THIS._Tables = CREATEOBJECT("CL_DBC_TABLES") + THIS._Views = CREATEOBJECT("CL_DBC_VIEWS") + THIS._Relations = CREATEOBJECT("CL_DBC_RELATIONS") ENDPROC @@ -9606,12 +9292,14 @@ DEFINE CLASS CL_DATABASE AS CL_CUS_BASE LPARAMETERS tcLine, taCodeLines, I, tnCodeLines TRY - LOCAL loFields AS CL_DBF_FIELDS OF 'FOXBIN2PRG.PRG' - LOCAL loIndexes AS CL_DBF_INDEXES OF 'FOXBIN2PRG.PRG' + LOCAL loConnections AS CL_DBC_CONNECTIONS OF 'FOXBIN2PRG.PRG' + LOCAL loTables AS CL_DBC_TABLES OF 'FOXBIN2PRG.PRG' + LOCAL loViews AS CL_DBC_VIEWS OF 'FOXBIN2PRG.PRG' + LOCAL loRelations AS CL_DBC_RELATIONS OF 'FOXBIN2PRG.PRG' LOCAL llBloqueEncontrado, lcPropName, lcValue, loEx AS EXCEPTION STORE '' TO lcPropName, lcValue - IF LEFT(tcLine, LEN(C_TABLE_I)) == C_TABLE_I + IF LEFT(tcLine, LEN(C_DATABASE_I)) == C_DATABASE_I llBloqueEncontrado = .T. FOR I = I + 1 TO tnCodeLines @@ -9621,16 +9309,24 @@ DEFINE CLASS CL_DATABASE AS CL_CUS_BASE CASE EMPTY( tcLine ) LOOP - CASE C_TABLE_F $ tcLine && Fin + CASE C_DATABASE_F $ tcLine && Fin EXIT - CASE C_FIELDS_I $ tcLine - loFields = THIS._Fields - loFields.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) + CASE C_CONNECTIONS_I $ tcLine + loConnections = THIS._Connections + loConnections.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) - CASE C_INDEXES_I $ tcLine - loIndexes = THIS._Indexes - loIndexes.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) + CASE C_TABLES_I $ tcLine + loTables = THIS._Tables + loTables.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) + + CASE C_VIEWS_I $ tcLine + loViews = THIS._Views + loViews.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) + + CASE C_RELATIONS_I $ tcLine + loRelations = THIS._Relations + loRelations.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) OTHERWISE && Otro valor *-- Estructura a reconocer: @@ -9659,6 +9355,20 @@ DEFINE CLASS CL_DATABASE AS CL_CUS_BASE ENDPROC + ******************************************************************************************************************* + PROCEDURE DBSETPROP( cName, cType, cProperty, ePropertyValue ) + LPARAMETERS tcLine, taCodeLines, I, tnCodeLines + + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE DBWriteObjects + LPARAMETERS tc_OutputFile + + ENDPROC + + ENDDEFINE @@ -9863,7 +9573,7 @@ DEFINE CLASS CL_DBC_TABLES AS CL_COL_BASE CASE C_TABLE_I $ tcLine loTable = CREATEOBJECT("CL_DBC_TABLE") loTable.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) - THIS.ADD( loConnection, loConnection._Name ) + THIS.ADD( loTable, loTable._Name ) OTHERWISE && Otro valor *-- No hay otros valores @@ -9922,6 +9632,17 @@ DEFINE CLASS CL_DBC_TABLE AS CL_CUS_BASE _RuleExpression = '' _RuleText = '' + *-- Sub-objects + _Fields = NULL + + + ************************************************************************************************ + PROCEDURE INIT + DODEFAULT() + *-- + THIS._Fields = CREATEOBJECT("CL_DBC_FIELDS_DB") + ENDPROC + ******************************************************************************************************************* PROCEDURE analizarBloque @@ -9946,7 +9667,7 @@ DEFINE CLASS CL_DBC_TABLE AS CL_CUS_BASE EXIT CASE C_FIELDS_I $ tcLine - loFields = THIS._Fields + loFields = THIS._Fields loFields.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) OTHERWISE && Propiedad de TABLE @@ -10149,7 +9870,7 @@ DEFINE CLASS CL_DBC_VIEWS AS CL_COL_BASE LOCAL llBloqueEncontrado, lcPropName, lcValue, loEx AS EXCEPTION STORE '' TO lcPropName, lcValue - IF LEFT(tcLine, LEN(C_VIEW_I)) == C_VIEW_I + IF LEFT(tcLine, LEN(C_VIEWS_I)) == C_VIEWS_I llBloqueEncontrado = .T. FOR I = I + 1 TO tnCodeLines @@ -10159,13 +9880,13 @@ DEFINE CLASS CL_DBC_VIEWS AS CL_COL_BASE CASE EMPTY( tcLine ) LOOP - CASE C_VIEW_F $ tcLine && Fin + CASE C_VIEWS_F $ tcLine && Fin EXIT CASE C_VIEW_I $ tcLine loView = CREATEOBJECT("CL_DBC_VIEW") loView.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) - THIS.ADD( loConnection, loConnection._Name ) + THIS.ADD( loView, loView._Name ) OTHERWISE && Otro valor *-- No hay otros valores @@ -10252,6 +9973,17 @@ DEFINE CLASS CL_DBC_VIEW AS CL_CUS_BASE _UseMemoSize = '' _WhereType = '' + *-- Sub-objects + _Fields = NULL + + + ************************************************************************************************ + PROCEDURE INIT + DODEFAULT() + *-- + THIS._Fields = CREATEOBJECT("CL_DBC_FIELDS_VW") + ENDPROC + ******************************************************************************************************************* PROCEDURE analizarBloque @@ -10504,7 +10236,7 @@ DEFINE CLASS CL_DBC_RELATIONS AS CL_COL_BASE CASE C_RELATION_I $ tcLine loRelation = CREATEOBJECT("CL_DBC_RELATION") loRelation.analizarBloque( @tcLine, @taCodeLines, @I, tnCodeLines ) - THIS.ADD( loField, loField._Name ) + THIS.ADD( loRelation, loRelation._ChildTable + loRelation._ParentTable ) OTHERWISE && Otro valor *-- No hay otros valores @@ -10539,39 +10271,21 @@ DEFINE CLASS CL_DBC_RELATION AS CL_CUS_BASE #ENDIF _MEMBERDATA = [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] ; + [] *-- Info - _Name = '' - _Caption = '' - _Comment = '' - _DataType = '' - _DefaultValue = '' - _DisplayClass = '' - _DisplayClassLibrary = '' - _Format = '' - _InputMask = '' - _KeyField = '' - _RuleExpression = '' - _RuleText = '' - _Updatable = '' - _UpdateName = '' + _ChildTable = '' + _ParentTable = '' + _ChildIndex = '' + _ParentIndex = '' + _RefIntegrity = '' *******************************************************************************************************************