diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index 47b2dbe..37026d6 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -14035,21 +14035,40 @@ DEFINE CLASS c_conversor_dbc_a_prg AS c_conversor_bin_a_prg
#ENDIF
TRY
- LOCAL lnCodError, laDatabases(1), lnDatabases_Count, lnLen
+ LOCAL lnCodError, laDatabases(1), lnDatabases_Count, lcEventsFile
STORE 0 TO lnCodError
WITH THIS AS c_conversor_dbc_a_prg OF 'FOXBIN2PRG.PRG'
lnDatabases_Count = ADATABASES(laDatabases)
-
USE (.c_InputFile) SHARED AGAIN NOUPDATE ALIAS TABLABIN
+ toDatabase = CREATEOBJECT('CL_DBC')
+ toDatabase._DBC = .c_InputFile
+ toDatabase.read_DBC_Header()
+
+ *-- Verifico si hay archivo de eventos, y si hay uno definido pero no existe el archivo,
+ *-- creo uno temporalmente para poder abrir la BDD y luego lo elimino.
+ IF toDatabase._DBCEvents AND NOT EMPTY(toDatabase._DBCEventFilename) THEN
+ *-- El archivo de eventos puede tener path relativo o absoluto
+ IF LEFT(toDatabase._DBCEventFilename,1) = '.' THEN
+ lcEventsFile = ADDBS( JUSTPATH(.c_InputFile) ) + toDatabase._DBCEventFilename
+ ELSE
+ lcEventsFile = toDatabase._DBCEventFilename
+ ENDIF
+ IF FILE(lcEventsFile) THEN
+ lcEventsFile = ''
+ ELSE
+ STRTOFILE( '', lcEventsFile )
+ ENDIF
+ ENDIF
+
OPEN DATABASE (.c_InputFile) SHARED NOUPDATE
+
.AvanceDelProceso( 'Analyzing DBC metadata...', 1, 2, 1 )
C_FB2PRG_CODE = C_FB2PRG_CODE + toFoxBin2Prg.get_PROGRAM_HEADER()
*-- Header
- toDatabase = CREATEOBJECT('CL_DBC')
C_FB2PRG_CODE = C_FB2PRG_CODE + toDatabase.toText(@toFoxBin2Prg)
@@ -14075,8 +14094,12 @@ DEFINE CLASS c_conversor_dbc_a_prg AS c_conversor_bin_a_prg
FINALLY
USE IN (SELECT("TABLABIN"))
CLOSE DATABASES
+ IF NOT EMPTY(lcEventsFile) THEN
+ ERASE (lcEventsFile)
+ ERASE (FORCEEXT(lcEventsFile,'FXP'))
+ ENDIF
RELEASE toDatabase, toEx, toFoxBin2Prg ;
- , lnCodError, laDatabases, lnDatabases_Count, lnLen
+ , lnCodError, laDatabases, lnDatabases_Count
ENDTRY
RETURN
@@ -15150,6 +15173,7 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
_MEMBERDATA = [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -15165,12 +15189,15 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ [] ;
+ [] ;
+ []
__ObjectID = 0
+ _DBC = ''
_Name = ''
@@ -15968,6 +15995,68 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
ENDPROC
+ PROCEDURE readNext_DBC_HeaderDataRecord
+ LPARAMETERS tcHeader, tnPos, tnLen, tnID, tcDataType, tcPropName, teData
+
+ LOCAL lnOffset, llRetorno
+
+ TRY
+ WITH THIS AS CL_DBC_BASE OF 'FOXBIN2PRG.PRG'
+ tnPos = EVL(tnPos,1)
+
+ IF tnPos >= LEN(tcHeader) THEN
+ EXIT
+ ENDIF
+
+ tnLen = CTOBIN( SUBSTR(tcHeader, tnPos, 4), '4RS' )
+ tnID = ASC( SUBSTR(tcHeader, tnPos + 4 + 2, 1) )
+ tcDataType = .getDBCPropertyValueTypeByPropertyID(tnID)
+ lnOffset = IIF(tcDataType = 'C', 1, 0)
+ tcPropName = .getDBCPropertyNameByID(tnID, .T.)
+ teData = SUBSTR(tcHeader, tnPos + 4 + 2 + 1, tnLen - 4 - 2 - 1 - lnOffset)
+
+ DO CASE
+ CASE tcDataType = 'B'
+ teData = ASC(teData)
+
+ CASE tcDataType = 'L'
+ teData = ( CTOBIN( teData, "1S" ) = 1 )
+
+ CASE tcDataType = 'N'
+ teData = CTOBIN( teData, "4S" )
+
+ ENDCASE
+
+ tnPos = tnPos + tnLen
+ llRetorno = .T.
+ ENDWITH
+ ENDTRY
+
+ RETURN llRetorno
+ ENDPROC
+
+
+ PROCEDURE read_DBC_Header
+ LOCAL lnLen, lnID, leData, lcHeader, lnPos, lcPropName, lcDataType, lnOffset
+
+ TRY
+ WITH THIS AS CL_DBC_BASE OF 'FOXBIN2PRG.PRG'
+ GO TOP IN TABLABIN
+ lcHeader = TABLABIN.property
+ ._Name = UPPER( JUSTFNAME( DBF("TABLABIN") ) )
+
+ DO WHILE .T.
+ IF NOT .readNext_DBC_HeaderDataRecord( @lcHeader, @lnPos, @lnLen, @lnID, @lcDataType, @lcPropName, @leData )
+ EXIT
+ ENDIF
+ .AddProperty( '_' + lcPropName, leData )
+ ENDDO
+
+ ENDWITH
+ ENDTRY
+ ENDPROC
+
+
PROCEDURE setNextID
LPARAMETERS tnLastID
tnLastID = tnLastID + 1
@@ -17148,6 +17237,29 @@ DEFINE CLASS CL_DBC_FIELDS_DB AS CL_DBC_COL_BASE
IF lnField_Count > 0
TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>>
+ <<>>
+ <<>>
+ ENDTEXT
+
+ SET TEXTMERGE TO MEMVAR lcText ADDITIVE NOSHOW
+ SET TEXTMERGE ON
+
+ FOR X = 1 TO lnField_Count
+ \ <>
+ ENDFOR
+
+ SET TEXTMERGE OFF
+ SET TEXTMERGE TO
+
+ SELECT LOWER(TB.objectName) FROM TABLABIN TB ;
+ INNER JOIN TABLABIN TB2 ON STR(TB.ParentID)+TB.ObjectType = STR(TB2.ObjectID)+PADR('Field',10) ;
+ AND TB2.objectName = PADR(LOWER(tcTable),128) ;
+ ORDER BY 1 ASC ;
+ INTO ARRAY laFields
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>>
<<>>
<<>>
ENDTEXT
@@ -18194,6 +18306,29 @@ DEFINE CLASS CL_DBC_FIELDS_VW AS CL_DBC_COL_BASE
IF lnField_Count > 0
TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>>
+ <<>>
+ <<>>
+ ENDTEXT
+
+ SET TEXTMERGE TO MEMVAR lcText ADDITIVE NOSHOW
+ SET TEXTMERGE ON
+
+ FOR X = 1 TO lnField_Count
+ \ <>
+ ENDFOR
+
+ SET TEXTMERGE OFF
+ SET TEXTMERGE TO
+
+ SELECT LOWER(TB.objectName) FROM TABLABIN TB ;
+ INNER JOIN TABLABIN TB2 ON STR(TB.ParentID)+TB.ObjectType = STR(TB2.ObjectID)+PADR('Field',10) ;
+ AND TB2.objectName = PADR(LOWER(tcView),128) ;
+ ORDER BY 1 ASC ;
+ INTO ARRAY laFields
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>>
<<>>
<<>>
ENDTEXT