diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dbc b/TESTS/DATOS_READONLY/fb2p_dbc.dbc
index 48ab70e..a4601f4 100644
Binary files a/TESTS/DATOS_READONLY/fb2p_dbc.dbc and b/TESTS/DATOS_READONLY/fb2p_dbc.dbc differ
diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dct b/TESTS/DATOS_READONLY/fb2p_dbc.dct
index c97a1e3..fb6793d 100644
Binary files a/TESTS/DATOS_READONLY/fb2p_dbc.dct and b/TESTS/DATOS_READONLY/fb2p_dbc.dct differ
diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dcx b/TESTS/DATOS_READONLY/fb2p_dbc.dcx
index 7656b25..2580acb 100644
Binary files a/TESTS/DATOS_READONLY/fb2p_dbc.dcx and b/TESTS/DATOS_READONLY/fb2p_dbc.dcx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.fpt b/TESTS/DATOS_READONLY/fb2p_dbf.fpt
new file mode 100644
index 0000000..601fa8d
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbf.fpt differ
diff --git a/TESTS/DATOS_READONLY/fb2p_depto.cdx b/TESTS/DATOS_READONLY/fb2p_depto.cdx
new file mode 100644
index 0000000..49e7ef2
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_depto.cdx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_depto.dbf b/TESTS/DATOS_READONLY/fb2p_depto.dbf
new file mode 100644
index 0000000..d946bdf
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_depto.dbf differ
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index cbf644f..9ea25c8 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -981,7 +981,7 @@ DEFINE CLASS c_conversor_base AS SESSION
*******************************************************************************************************************
PROCEDURE doBackup
LPARAMETERS toEx, tlRelanzarError, tcBakFile_1, tcBakFile_2, tcBakFile_3
-
+
TRY
LOCAL lcNext_Bak, lcExt_1, lcExt_2, lcExt_3
STORE '' TO tcBakFile_1, tcBakFile_2, tcBakFile_3
@@ -5064,6 +5064,14 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -6067,7 +6075,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
LPARAMETERS toReg
TRY
- LOCAL lc_TAG_REPORTE
+ LOCAL lc_TAG_REPORTE, loEx as Exception
lc_TAG_REPORTE_I = '<' + C_TAG_REPORTE + ' '
lc_TAG_REPORTE_F = '' + C_TAG_REPORTE + '>'
@@ -6179,7 +6187,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
LPARAMETERS toReg
TRY
- LOCAL lc_TAG_REPORTE
+ LOCAL lc_TAG_REPORTE, loEx as Exception
lc_TAG_REPORTE_I = '<' + C_TAG_REPORTE + ' '
lc_TAG_REPORTE_F = '' + C_TAG_REPORTE + '>'
@@ -6291,7 +6299,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
LPARAMETERS toReg
TRY
- LOCAL lc_TAG_REPORTE
+ LOCAL lc_TAG_REPORTE, loEx as Exception
lc_TAG_REPORTE_I = '<' + C_TAG_REPORTE + ' '
lc_TAG_REPORTE_F = '' + C_TAG_REPORTE + '>'
@@ -6403,7 +6411,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
PROCEDURE write_DBF_HEADER
LPARAMETERS tn_HexFileType, tl_FileHasCDX, tl_FileHasMemo, tl_FileIsDBC, tc_DBC_Name
TRY
- LOCAL laFields(1,18)
+ LOCAL laFields(1,18), loEx as Exception
*FOR I = 1 TO AFIELDS(laFields)
* IF INLIST( laFields(I,2), 'M', 'Q', 'V', 'W' )
@@ -6444,7 +6452,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*******************************************************************************************************************
PROCEDURE write_DBF_FIELDS
TRY
- LOCAL I, laFields(1,18)
+ LOCAL I, laFields(1,18), loEx as Exception
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
@@ -6497,7 +6505,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*******************************************************************************************************************
PROCEDURE write_DBF_INDEXES
TRY
- LOCAL I
+ LOCAL I, loEx as Exception
IF TAGCOUNT() > 0
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
@@ -6537,6 +6545,380 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDPROC
+ *******************************************************************************************************************
+ PROCEDURE write_DBC_HEADER
+ TRY
+ LOCAL I, lcText, lcDBC, loEx as Exception
+ lcText = ''
+ lcDBC = JUSTSTEM(DBC())
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+
+ *-----------------------------------------------------------------------------------
+ *-- DATABASE INFO
+ *-----------------------------------------------------------------------------------
+ ENDTEXT
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+
+ ENDTEXT
+
+ C_FB2PRG_CODE = C_FB2PRG_CODE + lcText
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DBC_CONNECTIONS
+ LPARAMETERS taConnections, tnConnection_Count
+
+ EXTERNAL ARRAY taConnections
+
+ TRY
+ LOCAL I, lcText, lcDBC, loEx as Exception
+ lcText = ''
+ lcDBC = JUSTSTEM(DBC())
+
+ DIMENSION taConnections(1)
+ tnConnection_Count = ADBOBJECTS( taConnections,"CONNECTION" )
+ ASORT( taConnections, 1, -1, 0, 1 )
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+
+ *-----------------------------------------------------------------------------------
+ *-- CONNECTIONS INFO
+ *-----------------------------------------------------------------------------------
+ ENDTEXT
+
+ FOR I = 1 TO tnConnection_Count
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+
+ ENDTEXT
+ ENDFOR
+
+ C_FB2PRG_CODE = C_FB2PRG_CODE + lcText
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DBC_TABLES
+ LPARAMETERS taTables, tnTable_Count
+
+ EXTERNAL ARRAY taTables
+
+ TRY
+ LOCAL I, X, lcText, lcDBC, lnField_Count, laFields(1), loEx as Exception
+ STORE 0 TO I, X, tnTable_Count, lnField_Count
+ lcText = ''
+ lcDBC = JUSTSTEM(DBC())
+
+ DIMENSION taTables(1)
+ tnTable_Count = ADBOBJECTS( taTables,"TABLE" )
+ ASORT( taTables, 1, -1, 0, 1 )
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+
+ *-----------------------------------------------------------------------------------
+ *-- TABLES INFO
+ *-----------------------------------------------------------------------------------
+ ENDTEXT
+
+ FOR I = 1 TO tnTable_Count
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ ENDTEXT
+
+ _TALLY = 0
+ SELECT LOWER(TB.objectname) FROM TABLABIN TB ;
+ INNER JOIN TABLABIN TB2 ON STR(TB.parentid)+PADR('Table',10) = STR(TB2.objectid)+TB2.objecttype ;
+ WHERE STR(TB2.parentid)+TB2.objecttype+TB2.objectname = STR(1)+PADR('Table',10)+PADR(LOWER(taTables(I)),128) ;
+ INTO ARRAY laFields
+ lnField_Count = _TALLY
+
+ IF lnField_Count > 0
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>> *-- FIELDS
+ <<>>
+ ENDTEXT
+
+ FOR X = 1 TO lnField_Count
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ ENDTEXT
+ ENDFOR
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>>
+ ENDTEXT
+ ENDIF
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ ENDTEXT
+ ENDFOR
+
+ C_FB2PRG_CODE = C_FB2PRG_CODE + lcText
+
+ CATCH TO loEx
+ IF BETWEEN(I, 1, tnTable_Count)
+ loEx.UserValue = loEx.UserValue + CR_LF + "taTables(" + TRANSFORM(I) + ") = " + RTRIM(taTables(I))
+ ENDIF
+ IF BETWEEN(X, 1, lnField_Count)
+ loEx.UserValue = loEx.UserValue + CR_LF + "laFields(" + TRANSFORM(X) + ") = " + RTRIM(laFields(I))
+ ENDIF
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ FINALLY
+ USE IN (SELECT("TB"))
+ USE IN (SELECT("TB2"))
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DBC_VIEWS
+ LPARAMETERS taViews, tnView_Count
+
+ EXTERNAL ARRAY taViews
+
+ TRY
+ LOCAL I, lcText, lcDBC, lnField_Count, laFields(1), loEx as Exception
+ STORE 0 TO I, X, tnView_Count, lnField_Count
+ lcText = ''
+ lcDBC = JUSTSTEM(DBC())
+
+ DIMENSION taViews(1)
+ tnView_Count = ADBOBJECTS( taViews,"VIEW" )
+ ASORT( taViews, 1, -1, 0, 1 )
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+
+ *-----------------------------------------------------------------------------------
+ *-- VIEWS INFO
+ *-----------------------------------------------------------------------------------
+ ENDTEXT
+
+ FOR I = 1 TO tnView_Count
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ ENDTEXT
+
+ _TALLY = 0
+ SELECT LOWER(TB.objectname) FROM TABLABIN TB ;
+ INNER JOIN TABLABIN TB2 ON STR(TB.parentid)+PADR('View',10) = STR(TB2.objectid)+TB2.objecttype ;
+ WHERE STR(TB2.parentid)+TB2.objecttype+TB2.objectname = STR(1)+PADR('View',10)+PADR(LOWER(taViews(I)),128) ;
+ INTO ARRAY laFields
+ lnField_Count = _TALLY
+
+ IF lnField_Count > 0
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>> *-- FIELDS
+ <<>>
+ ENDTEXT
+
+ FOR X = 1 TO lnField_Count
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ ENDTEXT
+ ENDFOR
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+ <<>>
+ ENDTEXT
+ ENDIF
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+ ENDTEXT
+ ENDFOR
+
+ C_FB2PRG_CODE = C_FB2PRG_CODE + lcText
+
+ CATCH TO loEx
+ IF BETWEEN(I, 1, tnTable_Count)
+ loEx.UserValue = loEx.UserValue + CR_LF + "taViews(" + TRANSFORM(I) + ") = " + RTRIM(taViews(I))
+ ENDIF
+ IF BETWEEN(X, 1, lnField_Count)
+ loEx.UserValue = loEx.UserValue + CR_LF + "laFields(" + TRANSFORM(X) + ") = " + RTRIM(laFields(I))
+ ENDIF
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE write_DBC_RELATIONS
+ LPARAMETERS taRelations, tnRelation_Count
+
+ EXTERNAL ARRAY taRelations
+
+ TRY
+ LOCAL I, lcText, lcDBC, loEx as Exception
+ lcText = ''
+ lcDBC = JUSTSTEM(DBC())
+
+ DIMENSION taRelations(1,5)
+ tnRelation_Count = ADBOBJECTS( taRelations,"RELATION" )
+ ASORT( taRelations, 2, -1, 0, 1 )
+ ASORT( taRelations, 1, -1, 0, 1 )
+
+ FOR I = 1 TO tnRelation_Count
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
+
+
+ *-----------------------------------------------------------------------------------
+ *-- RELATIONS INFO (REF.INTEGRITY: "C"=cascade, "R"=restrict, "I"=ignore)
+ *-----------------------------------------------------------------------------------
+ <<>>
+ ENDTEXT
+
+ TEXT TO lcText ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2+8
+
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+ <<>> <>
+
+ ENDTEXT
+ ENDFOR
+
+ C_FB2PRG_CODE = C_FB2PRG_CODE + lcText
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
*******************************************************************************************************************
PROCEDURE write_DefinicionObjetosOLE
*-- Crea la definición del tag *< OLE: /> con la información de todos los objetos OLE
@@ -7408,15 +7790,6 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg
*-- Indexes
THIS.write_DBF_INDEXES()
- USE IN (SELECT("TABLABIN"))
-
- FOR I = 1 TO ADATABASES(laDatabases2)
- IF ASCAN( laDatabases, laDatabases2(I) ) = 0
- SET DATABASE TO (laDatabases2(I))
- CLOSE DATABASES
- EXIT
- ENDIF
- ENDFOR
*-- Genero el DB2
IF THIS.l_Test
@@ -7438,6 +7811,15 @@ DEFINE CLASS c_conversor_dbf_a_prg AS c_conversor_bin_a_prg
FINALLY
USE IN (SELECT("TABLABIN"))
+ *-- Cierro DBC
+ FOR I = 1 TO ADATABASES(laDatabases2)
+ IF ASCAN( laDatabases, laDatabases2(I) ) = 0
+ SET DATABASE TO (laDatabases2(I))
+ CLOSE DATABASES
+ EXIT
+ ENDIF
+ ENDFOR
+
ENDTRY
RETURN
@@ -7468,29 +7850,27 @@ DEFINE CLASS c_conversor_dbc_a_prg AS c_conversor_bin_a_prg
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
THIS.write_PROGRAM_HEADER()
*-- Header
- THIS.write_DBF_HEADER( ln_HexFileType, ll_FileHasCDX, ll_FileHasMemo, ll_FileIsDBC, lc_DBC_Name )
+ THIS.write_DBC_HEADER()
- *-- Fields
- THIS.write_DBF_FIELDS()
+ *-- Connections
+ THIS.write_DBC_CONNECTIONS()
- *-- Indexes
- THIS.write_DBF_INDEXES()
+ *-- Tables
+ THIS.write_DBC_TABLES()
- USE IN (SELECT("TABLABIN"))
+ *-- Views
+ THIS.write_DBC_VIEWS()
- FOR I = 1 TO ADATABASES(laDatabases2)
- IF ASCAN( laDatabases, laDatabases2(I) ) = 0
- SET DATABASE TO (laDatabases2(I))
- CLOSE DATABASES
- EXIT
- ENDIF
- ENDFOR
+ *-- Relations
+ THIS.write_DBC_RELATIONS()
- *-- Genero el DB2
+
+ *-- Genero el DC2
IF THIS.l_Test
toModulo = C_FB2PRG_CODE
ELSE
@@ -7509,6 +7889,7 @@ DEFINE CLASS c_conversor_dbc_a_prg AS c_conversor_bin_a_prg
FINALLY
USE IN (SELECT("TABLABIN"))
+ CLOSE DATABASES
ENDTRY
@@ -8088,8 +8469,8 @@ DEFINE CLASS CL_PROJECT AS COLLECTION
ENDIF
&lcAsignacion.
ENDPROC
-
-
+
+
************************************************************************************************
PROCEDURE parseNullTerminatedValue
LPARAMETERS tcDevInfo, tnPos, tnLen