diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__doBackup.PRG b/TESTS/(name_conflict)_ut__foxbin2prg__c_conversor_base__doBackup.PRG
similarity index 100%
rename from TESTS/ut__foxbin2prg__c_conversor_base__doBackup.PRG
rename to TESTS/(name_conflict)_ut__foxbin2prg__c_conversor_base__doBackup.PRG
diff --git a/TESTS/DATOS_READONLY/FB2P_DBC.DC2 b/TESTS/DATOS_READONLY/FB2P_DBC.DC2
new file mode 100644
index 0000000..c3d3542
--- /dev/null
+++ b/TESTS/DATOS_READONLY/FB2P_DBC.DC2
@@ -0,0 +1,1013 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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.15" SourceFile="C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_DBC.DBC" Generated="2013/12/17 16:01:00" /> (Para uso con Visual FoxPro 9.0)
+*
+
+
+ FB2P_DBC
+ Comentario de los eventos o de la BDD???
+ 11
+ .T.
+
+
+
+
+ REMOTE_CONNECTION_DBF
+
+ Visual FoxPro Tables
+ foxuser_fdb
+
+ .F.
+ .T.
+ 15
+ .F.
+ 1
+ .F.
+ 0
+ 4096
+
+ 0
+ 1
+
+ 100
+
+
+ REMOTE_CONNECTION_ORACLE
+
+
+
+ DRIVER={Oracle en OraClient11g_home1};SERVER=CARTERA;UID=STROSNC;PWD=STROSNC;DBQ=CARTERA;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;MLD=0;ODA=
+ .F.
+ .T.
+ 15
+ .F.
+ 3
+ .F.
+ 10
+ 8192
+
+ 180
+ 1
+
+ 100
+
+
+
+
+
+
+
+ FB2P_DEPTO
+ Comentario de "fb2p_depto"
+ fb2p_depto.dbf
+ __ri_delete_fb2p_depto()
+
+
+ depto
+ fb2p_depto_record_rule_validation()
+ fb2p_depto_record_rule_validation_message()
+
+
+
+ depto
+ "Depto.Caption"
+ depto_field_comment
+ depto_field_def_value
+ cl_optiongroup
+ c:\desa\foxbin2prg\tests\datos_readonly\fb2p_test.vcx
+ Disp.Format
+ InputMask
+ depto_field_validation_rule()
+ depto_field_validation_message()
+
+
+ descrip
+ aaaaaaaaaa
+
+
+
+
+
+
+
+
+
+
+
+
+
+ depto
+
+ .T.
+
+
+
+
+
+
+
+
+
+ NOMBRELARGODELDBF
+ Comentario de la tabla "fb2p_dbf"
+ fb2p_dbf.dbf
+ del_trg()
+ __ri_insert_nombrelargodeldbf().AND.(ins_trg())
+ __ri_update_nombrelargodeldbf().AND.(upd_trg())
+ id
+ edad>10
+ "Mensaje de error de la regla edad > 10"
+
+
+
+ nombre
+ "Nombre:"
+ Comentario de "Nombre"
+ "."
+
+
+ A
+ !XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+ .NOT.EMPTY(nombre)
+ "El nombre está vacío"
+
+
+ edad
+
+
+
+
+
+
+
+
+
+
+
+ id
+
+
+
+
+
+
+
+
+
+
+
+ bigtext
+
+
+
+
+
+
+
+
+
+
+
+ depto
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id
+
+ .T.
+
+
+ i_nombre
+
+ .F.
+
+
+ depto
+
+ .F.
+
+
+
+
+
+ Relation 1
+ NOMBRELARGODELDBF
+ FB2P_DEPTO
+ DEPTO
+ DEPTO
+ ICR
+
+
+
+
+
+
+
+
+
+
+ RV_DB_DEBUG_SETUP
+
+ STROSNC.DB_DEBUG_SETUP
+ SELECT Db_debug_setup.PK_NAME, Db_debug_setup.ENABLED, Db_debug_setup.EVALUACION, Db_debug_setup.PK_METODO, Db_debug_setup.NIVELDEBUG, Db_debug_setup.F_DESDE, Db_debug_setup.F_HASTA, Db_debug_setup.DIRECCION_IP, Db_debug_setup.USUARIO FROM STROSNC.DB_DEBUG_SETUP Db_debug_setup ORDER BY Db_debug_setup.PK_NAME, Db_debug_setup.PK_METODO
+ .T.
+ 1
+ .T.
+ remote_connection_Oracle
+ .T.
+ .T.
+ 100
+ -1
+ .F.
+
+ .T.
+
+
+ .F.
+ .T.
+ 2
+ 1
+ 255
+ 3
+
+
+
+ pk_name
+
+
+
+
+
+
+
+
+
+
+
+ enabled
+
+
+
+
+
+
+
+
+
+
+
+ evaluacion
+
+
+
+
+
+
+
+
+
+
+
+ pk_metodo
+
+
+
+
+
+
+
+
+
+
+
+ niveldebug
+
+
+
+
+
+
+
+
+
+
+
+ f_desde
+
+
+
+
+
+
+
+
+
+
+
+ f_hasta
+
+
+
+
+
+
+
+
+
+
+
+ direccion_ip
+
+
+
+
+
+
+
+
+
+
+
+ usuario
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VISTA_LOCAL
+
+ fb2p_dbc!nombrelargodeldbf
+ SELECT Fb2p_depto.descrip, Nombrelargodeldbf.nombre, Nombrelargodeldbf.edad, Nombrelargodeldbf.id, Nombrelargodeldbf.depto FROM fb2p_dbc!fb2p_depto INNER JOIN fb2p_dbc!nombrelargodeldbf ON Fb2p_depto.depto = Nombrelargodeldbf.depto
+ .F.
+ 1
+ .T.
+
+ .F.
+ .T.
+ 100
+ -1
+ .T.
+
+ .F.
+
+
+ .T.
+ .F.
+ 1
+ 1
+ 255
+ 3
+
+
+
+ descrip
+
+
+
+
+
+
+
+
+
+
+
+ nombre
+
+
+
+
+
+
+
+
+
+
+
+ edad
+
+
+
+
+
+
+
+
+
+
+
+ id
+
+
+
+
+
+
+
+
+
+
+
+ depto
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VW_ORA_CONVENIOS
+
+ CONVENIOS
+ SELECT CONVENIOS.ID_CONVENIO,CONVENIOS.NOMBRE_CONVENIO,CONVENIOS.HISTORICO FROM CONVENIOS
+ .F.
+ 1
+ .T.
+ remote_connection_Oracle
+ .F.
+ .T.
+ 100
+ -1
+ .T.
+
+ .F.
+
+
+ .F.
+ .T.
+ 2
+ 1
+ 255
+ 3
+
+
+
+ id_convenio
+
+
+
+
+
+
+
+
+
+
+
+ nombre_convenio
+
+
+
+
+
+
+
+
+
+
+
+ historico
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VW_ORA_DUAL
+
+ DUAL
+ SELECT DUAL.DUMMY FROM DUAL
+ .F.
+ 1
+ .T.
+ REMOTE_CONNECTION_ORACLE
+ .F.
+ .T.
+ 100
+ -1
+ .T.
+
+ .F.
+
+
+ .F.
+ .T.
+ 2
+ 1
+ 255
+ 3
+
+
+
+ dummy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+ =TABLEUPDATE()
+ ENDIF
+ ENDIF not already deleted
+ ENDIF
+ UNLOCK RECORD (RECNO())
+ llRetVal=pnerror=0
+RETURN llRetVal
+
+procedure RIUPDATE
+lparameters tcFieldName,tcNewValue,tcCascadeParent
+local llRetVal
+llRetVal=.t.
+ IF ISRLOCKED() OR !RLOCK()
+ llRetVal=.F.
+ ELSE
+ IF EVAL(tcFieldName)<>tcNewValue
+ PRIVATE pcCascadeParent
+ pcCascadeParent=upper(iif(type("tcCascadeParent")<>"C","",tcCascadeParent))
+ REPLACE (tcFieldName) WITH tcNewValue
+ IF CURSORGETPROP('BUFFERING') > 1
+ =TABLEUPDATE()
+ ENDIF
+ ENDIF values don't already match
+ ENDIF it's locked already, or I was able to lock it
+ UNLOCK RECORD (RECNO())
+ llRetVal=pnerror=0
+return llRetVal
+
+procedure rierror
+parameters tnErrNo,tcMessage,tcCode,tcProgram
+local lnErrorRows,lnXX
+lnErrorRows=alen(gaErrors,1)
+if type('gaErrors[lnErrorRows,1]')<>"L"
+ dimension gaErrors[lnErrorRows+1,alen(gaErrors,2)]
+ lnErrorRows=lnErrorRows+1
+endif
+gaErrors[lnErrorRows,1]=tnErrNo
+gaErrors[lnErrorRows,2]=tcMessage
+gaErrors[lnErrorRows,3]=tcCode
+gaErrors[lnErrorRows,4]=""
+lnXX=1
+do while !empty(program(lnXX))
+ gaErrors[lnErrorRows,4]=gaErrors[lnErrorRows,4]+","+;
+ program(lnXX)
+ lnXX=lnXX+1
+enddo
+gaErrors[lnErrorRows,5]=pcParentDBF
+gaErrors[lnErrorRows,6]=pnParentRec
+gaErrors[lnErrorRows,7]=pcParentID
+gaErrors[lnErrorRows,8]=pcParentExpr
+gaErrors[lnErrorRows,9]=pcChildDBF
+gaErrors[lnErrorRows,10]=pnChildRec
+gaErrors[lnErrorRows,11]=pcChildID
+gaErrors[lnErrorRows,12]=pcChildExpr
+return tnErrNo
+
+
+PROCEDURE riopen
+PARAMETERS tcTable,tcOrder
+
+LOCAL lcCurWkArea,lcNewWkArea,lnInUseSpot,lnOccurs,lnOccurance
+lnInUseSpot=0
+lnOccurs = OCCURS(UPPER(tcTable)+"*",UPPER(pcRIcursors))
+FOR lnOccurance = 1 TO lnOccurs
+ lnInUseSpot=ATC(tcTable+"*",pcRIcursors,lnOccurance)
+ IF ISDIGIT(SUBSTR(pcRIcursors,lnInUseSpot-1,1)) OR;
+ EMPTY(SUBSTR(pcRIcursors,lnInUseSpot-1,1))
+ EXIT
+ ENDIF
+ lnInUseSpot=0
+ENDFOR
+
+IF lnInUseSpot=0
+ lcCurWkArea=select()
+ SELECT 0
+ lcNewWkArea=select()
+ IF NOT EMPTY(tcOrder)
+ USE (tcTable) AGAIN ORDER (tcOrder) ;
+ ALIAS ("__ri"+LTRIM(STR(SELECT()))) share
+ ELSE
+ USE (tcTable) AGAIN ALIAS ("__ri"+LTRIM(STR(SELECT()))) share
+ ENDIF
+ if pnerror=0
+ pcRIcursors=pcRIcursors+upper(tcTable)+"?"+STR(SELECT(),5)
+ else
+ lcNewWkArea=0
+ endif something bad happened while attempting to open the file
+ELSE
+ lcNewWkArea=val(substr(pcRIcursors,lnInUseSpot+len(tcTable)+1,5))
+ pcRIcursors = strtran(pcRIcursors,upper(tcTable)+"*"+str(lcNewWkArea,5),;
+ upper(tcTable)+"?"+str(lcNewWkArea,5))
+ IF NOT EMPTY(tcOrder)
+ SET ORDER TO (tcOrder) IN (lcNewWkArea)
+ ENDIF sent an order
+ if pnerror<>0
+ lcNewWkArea=0
+ endif something bad happened while setting order
+ENDIF
+RETURN (lcNewWkArea)
+
+
+PROCEDURE riend
+PARAMETERS tlSuccess
+local lnXX,lnSpot,lcWorkArea
+IF tlSuccess
+ END TRANSACTION
+ELSE
+ SET DELETED OFF
+ ROLLBACK
+ SET DELETED ON
+ENDIF
+IF EMPTY(pcRIolderror)
+ ON ERROR
+ELSE
+ ON ERROR &pcRIolderror.
+ENDIF
+FOR lnXX=1 TO occurs("*",pcRIcursors)
+ lnSpot=atc("*",pcRIcursors,lnXX)+1
+ USE IN (VAL(substr(pcRIcursors,lnSpot,5)))
+ENDFOR
+IF pcOldCompat = "ON"
+ SET COMPATIBLE ON
+ENDIF
+IF pcOldDele="OFF"
+ SET DELETED OFF
+ENDIF
+IF pcOldExact="ON"
+ SET EXACT ON
+ENDIF
+IF pcOldTalk="ON"
+ SET TALK ON
+ENDIF
+do case
+ case empty(pcOldDBC)
+ set data to
+ case pcOldDBC<>DBC()
+ set data to (pcOldDBC)
+endcase
+RETURN .T.
+
+
+PROCEDURE rireuse
+* rireuse.prg
+PARAMETERS tcTableName,tcWkArea
+pcRIcursors = strtran(pcRIcursors,upper(tcTableName)+"?"+str(tcWkArea,5),;
+ upper(tcTableName)+"*"+str(tcWkArea,5))
+RETURN .t.
+
+********************************************************************************
+** "Referential integrity delete trigger for" fb2p_depto
+PROCEDURE __RI_DELETE_fb2p_depto
+LOCAL llRetVal
+llRetVal = .t.
+PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID
+PRIVATE pcParentExpr,pcChildExpr
+STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr
+STORE 0 TO pnParentRec,pnChildRec
+IF _triggerlevel=1
+ BEGIN TRANSACTION
+ PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,;
+ pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC
+ pcOldTalk=SET("TALK")
+ SET TALK OFF
+ pcOldDele=SET("DELETED")
+ pcOldExact=SET("EXACT")
+ pcOldCompat=SET("COMPATIBLE")
+ SET COMPATIBLE OFF
+ SET DELETED ON
+ SET EXACT OFF
+ pcRIcursors=""
+ pcRIwkareas=""
+ pcRIolderror=ON("error")
+ pnerror=0
+ ON ERROR pnerror=rierror(ERROR(),message(),message(1),program())
+ IF TYPE('gaErrors(1)')<>"U"
+ release gaErrors
+ ENDIF
+ PUBLIC gaErrors(1,12)
+ pcOldDBC=DBC()
+ SET DATA TO ("FB2P_DBC")
+ENDIF first trigger
+LOCAL lcParentID && parent's value to be sought in child
+LOCAL lcChildWkArea && child work area handle returned by riopen
+LOCAL lcParentWkArea
+LOCAL llDelHeaderarea
+LOCAL lcStartArea
+lcStartArea=select()
+llRetVal=.t.
+lcParentWkArea=select()
+SELECT (lcParentWkArea)
+pcParentDBF=dbf()
+pnParentRec=recno()
+STORE DEPTO TO lcParentID,pcParentID
+pcParentExpr="DEPTO"
+lcChildWkArea=riopen("nombrelargodeldbf","depto")
+IF lcChildWkArea<=0
+ IF _triggerlevel=1
+ DO riend WITH .F.
+ ENDIF at the end of the highest trigger level
+ RETURN .F.
+ENDIF not able to open the child work area
+pcChildDBF=dbf(lcChildWkArea)
+SELECT (lcChildWkArea)
+SEEK lcParentID
+SCAN WHILE DEPTO=lcParentID AND llRetVal
+ pnChildRec=recno()
+ pcChildID=DEPTO
+ pcChildExpr="DEPTO"
+ llRetVal=ridelete()
+ENDSCAN get all of the nombrelargodeldbf records
+=rireuse("nombrelargodeldbf",lcChildWkArea)
+IF NOT llRetVal
+ IF _triggerlevel=1
+ DO riend WITH llRetVal
+ ENDIF at the end of the highest trigger level
+ SELECT (lcStartArea)
+ RETURN llRetVal
+ENDIF
+IF _triggerlevel=1
+ do riend with llRetVal
+ENDIF at the end of the highest trigger level
+SELECT (lcStartArea)
+RETURN llRetVal
+** "End of Referential integrity Delete trigger for" fb2p_depto
+********************************************************************************
+
+********************************************************************************
+procedure __RI_UPDATE_nombrelargodeldbf
+** "Referential integrity update trigger for" nombrelargodeldbf
+LOCAL llRetVal
+llRetVal = .t.
+PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID
+PRIVATE pcParentExpr,pcChildExpr
+STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr
+STORE 0 TO pnParentRec,pnChildRec
+IF _triggerlevel=1
+ BEGIN TRANSACTION
+ PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,;
+ pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC
+ pcOldTalk=SET("TALK")
+ SET TALK OFF
+ pcOldDele=SET("DELETED")
+ pcOldExact=SET("EXACT")
+ pcOldCompat=SET("COMPATIBLE")
+ SET COMPATIBLE OFF
+ SET DELETED ON
+ SET EXACT OFF
+ pcRIcursors=""
+ pcRIwkareas=""
+ pcRIolderror=ON("error")
+ pnerror=0
+ ON ERROR pnerror=rierror(ERROR(),message(),message(1),program())
+ IF TYPE('gaErrors(1)')<>"U"
+ release gaErrors
+ ENDIF
+ PUBLIC gaErrors(1,12)
+ pcOldDBC=DBC()
+ SET DATA TO ("FB2P_DBC")
+ENDIF first trigger
+LOCAL lcParentID && parent's value to be sought in child
+LOCAL lcOldParentID && previous parent id value
+LOCAL lcChildWkArea && child work area handle returned by riopen
+LOCAL lcChildID && child's value to be sought in parent
+LOCAL lcOldChildID && old child id value
+LOCAL lcParentWkArea && parentwork area handle returned by riopen
+LOCAL lcStartArea
+lcStartArea=select()
+llRetVal=.t.
+lcChildWkArea=select()
+IF _triggerlevel=1 or type("pccascadeparent")#"C" or (NOT pccascadeparent=="FB2P_DEPTO")
+ SELECT (lcChildWkArea)
+ lcChildID=DEPTO
+ lcOldChildID=oldval("DEPTO")
+ pcChildDBF=dbf(lcChildWkArea)
+ pnChildRec=recno(lcChildWkArea)
+ pcChildID=lcOldChildID
+ pcChildExpr="DEPTO"
+ if isnull(lcChildID) or isnull(lcOldChildID) or lcChildID <> lcOldChildID
+ lcParentWkArea=riopen("fb2p_depto","depto")
+ IF lcParentWkArea<=0
+ IF _triggerlevel=1
+ DO riend WITH .F.
+ ENDIF at the end of the highest trigger level
+ SELECT (lcStartArea)
+ RETURN .F.
+ ENDIF not able to open the child work area
+ pcParentDBF=dbf(lcParentWkArea)
+ llRetVal=SEEK(lcChildID,lcParentWkArea)
+ pnParentRec=recno(lcParentWkArea)
+ if llRetVal and not (isrlocked(pnParentRec, lcParentWkArea) or ;
+ isflocked(lcParentWkArea))
+ if rlock(lcParentWkArea)
+ unlock record pnParentRec in (lcParentWkArea)
+ else
+ =rireuse("tparen",lcParentWkArea)
+ pnError = rierror(-1,"Insert restrict rule violated.","","")
+ IF _triggerlevel=1
+ DO riend WITH llRetVal
+ ENDIF at the end of the highest trigger level
+ SELECT (lcStartArea)
+ RETURN llRetVal
+ endif
+ endif
+ =rireuse("fb2p_depto",lcParentWkArea)
+ IF NOT llRetVal
+ pnError = rierror(-1,"Insert restrict rule violated.","","")
+ IF _triggerlevel=1
+ DO riend WITH llRetVal
+ ENDIF at the end of the highest trigger level
+ SELECT (lcStartArea)
+ RETURN llRetVal
+ ENDIF no parent
+ ENDIF this value was changed
+ENDIF not part of a cascade from "fb2p_depto"
+lcParentWkArea=lcChildWkArea
+IF _triggerlevel=1
+ do riend with llRetVal
+ENDIF at the end of the highest trigger level
+SELECT (lcStartArea)
+RETURN llRetVal
+** "End of Referential integrity Update trigger for" nombrelargodeldbf
+********************************************************************************
+
+********************************************************************************
+** "Referential integrity insert trigger for" nombrelargodeldbf
+PROCEDURE __RI_INSERT_nombrelargodeldbf
+LOCAL llRetVal
+llRetVal = .t.
+PRIVATE pcParentDBF,pnParentRec,pcChildDBF,pnChildRec,pcParentID,pcChildID
+PRIVATE pcParentExpr,pcChildExpr
+STORE "" TO pcParentDBF,pcChildDBF,pcParentID,pcChildID,pcParentExpr,pcChildExpr
+STORE 0 TO pnParentRec,pnChildRec
+IF _triggerlevel=1
+ BEGIN TRANSACTION
+ PRIVATE pcRIcursors,pcRIwkareas,pcRIolderror,pnerror,;
+ pcOldDele,pcOldExact,pcOldTalk,pcOldCompat,PcOldDBC
+ pcOldTalk=SET("TALK")
+ SET TALK OFF
+ pcOldDele=SET("DELETED")
+ pcOldExact=SET("EXACT")
+ pcOldCompat=SET("COMPATIBLE")
+ SET COMPATIBLE OFF
+ SET DELETED ON
+ SET EXACT OFF
+ pcRIcursors=""
+ pcRIwkareas=""
+ pcRIolderror=ON("error")
+ pnerror=0
+ ON ERROR pnerror=rierror(ERROR(),message(),message(1),program())
+ IF TYPE('gaErrors(1)')<>"U"
+ release gaErrors
+ ENDIF
+ PUBLIC gaErrors(1,12)
+ pcOldDBC=DBC()
+ SET DATA TO ("FB2P_DBC")
+ENDIF first trigger
+LOCAL lcChildID && child's value to be sought in parent
+LOCAL lcParentWkArea && parentwork area handle returned by riopen
+LOCAL lcChildWkArea && child's work area
+LOCAL lcStartArea
+lcStartArea=select()
+llRetVal=.t.
+lcChildWkArea=SELECT()
+SELECT (lcChildWkArea)
+lcChildID=DEPTO
+pcChildDBF=dbf(lcChildWkArea)
+pnChildRec=recno(lcChildWkArea)
+pcChildID=lcChildID
+pcChildExpr="DEPTO"
+lcParentWkArea=riopen("fb2p_depto","depto")
+IF lcParentWkArea<=0
+ IF _triggerlevel=1
+ DO riend WITH .F.
+ ENDIF at the end of the highest trigger level
+ SELECT (lcStartArea)
+ RETURN .F.
+ENDIF not able to open the child work area
+pcParentDBF=dbf(lcParentWkArea)
+llRetVal=SEEK(lcChildID,lcParentWkArea)
+pnParentRec=recno(lcParentWkArea)
+if llRetVal and not (isrlocked(pnParentRec, lcParentWkArea) or ;
+ isflocked(lcParentWkArea))
+ if rlock(lcParentWkArea)
+ unlock record pnParentRec in (lcParentWkArea)
+ else
+ =rireuse("tparen",lcParentWkArea)
+ pnError = rierror(-1,"Insert restrict rule violated.","","")
+ IF _triggerlevel=1
+ DO riend WITH llRetVal
+ ENDIF at the end of the highest trigger level
+ SELECT (lcStartArea)
+ RETURN llRetVal
+ endif
+endif
+=rireuse("fb2p_depto",lcParentWkArea)
+IF NOT llRetVal
+ pnError = rierror(-1,"Insert restrict rule violated.","","")
+ IF _triggerlevel=1
+ DO riend WITH llRetVal
+ ENDIF at the end of the highest trigger level
+ SELECT (lcStartArea)
+ RETURN llRetVal
+ENDIF
+IF _triggerlevel=1
+ do riend with llRetVal
+ENDIF at the end of the highest trigger level
+SELECT (lcStartArea)
+RETURN llRetVal
+** "End of Referential integrity insert trigger for" nombrelargodeldbf
+********************************************************************************
+**__RI_FOOTER!@ Do NOT REMOVE or MODIFY this line!!!! @!__RI_FOOTER**
+
+ ]]>
+
\ No newline at end of file
diff --git a/TESTS/DATOS_READONLY/FB2P_DBF.DB2 b/TESTS/DATOS_READONLY/FB2P_DBF.DB2
new file mode 100644
index 0000000..255906b
--- /dev/null
+++ b/TESTS/DATOS_READONLY/FB2P_DBF.DB2
@@ -0,0 +1,145 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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)
+*
+
+
+ C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_DBF.FPT
+ 1252
+ 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
+
+
+ EDAD
+ N
+ 3
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ ID
+ I
+ 4
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 10
+ 2
+
+
+ BIGTEXT
+ M
+ 4
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ DEPTO
+ C
+ 10
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+
+
+ C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_DBF.CDX
+
+
+
+ ID
+ MACHINE
+ ID
+ .F.
+
+
+
+ I_NOMBRE
+ GENERAL
+ NOMBRE
+ .F.
+
+
+
+ DEPTO
+ MACHINE
+ DEPTO
+ .F.
+
+
+
+
+
diff --git a/TESTS/DATOS_READONLY/FB2P_FREE.DB2 b/TESTS/DATOS_READONLY/FB2P_FREE.DB2
new file mode 100644
index 0000000..9d2fc7f
--- /dev/null
+++ b/TESTS/DATOS_READONLY/FB2P_FREE.DB2
@@ -0,0 +1,409 @@
+*--------------------------------------------------------------------------------------------------------------------------------------------------------
+* (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_FREE.DBF" Generated="2013/12/11 21:33:10" /> (Para uso con Visual FoxPro 9.0)
+*
+
+
+ C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_FREE.FPT
+ 1252
+ 2013/12/11
+
+ 0x00000032
+ Visual FoxPro, Varchar, Varbinary, or Blob-enabled
+
+
+
+ CARACTER
+ C
+ 30
+ 0
+ .T.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ FECHA
+ D
+ 8
+ 0
+ .T.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ FECHORA
+ T
+ 8
+ 0
+ .T.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ LOGICO
+ L
+ 1
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ DOBLE
+ B
+ 8
+ 5
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ FLOTANTE
+ F
+ 10
+ 6
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ NUMERICO
+ N
+ 12
+ 3
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ BLOB
+ W
+ 4
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ MONEDA
+ Y
+ 8
+ 4
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ GENERAL
+ G
+ 4
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ ENTERO
+ I
+ 4
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ NOTAS
+ M
+ 4
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ VAR_BINARY
+ Q
+ 35
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ VAR_CHAR
+ V
+ 36
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ NOTASBIN
+ M
+ 4
+ 0
+ .F.
+ .T.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ CARC_BIN
+ C
+ 30
+ 0
+ .F.
+ .T.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ VARCHARBIN
+ V
+ 37
+ 0
+ .F.
+ .T.
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+
+
+ ID_AUTOINC
+ I
+ 4
+ 0
+ .F.
+ .F.
+
+
+
+
+
+
+
+
+
+
+ 30
+ 5
+
+
+
+
+ C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_FREE.CDX
+
+
+
+ LOGICO
+ BINARY
+ LOGICO
+
+ ASCENDING
+ MACHINE
+
+
+ ENTERO
+ REGULAR
+ ENTERO
+
+ DESCENDING
+ MACHINE
+
+
+ CARACTER
+ CANDIDATE
+ CARACTER
+ .NOT.EMPTY(caracter)
+ ASCENDING
+ GENERAL
+
+
+
+
diff --git a/TESTS/DATOS_READONLY/eventsfile.prg b/TESTS/DATOS_READONLY/eventsfile.prg
new file mode 100644
index 0000000..d9c245e
--- /dev/null
+++ b/TESTS/DATOS_READONLY/eventsfile.prg
@@ -0,0 +1,2 @@
+LPARAMETERS p1, p2, p3, p4, p5
+RETURN
diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dbc b/TESTS/DATOS_READONLY/fb2p_dbc.dbc
index c72c78c..1fe1b2d 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 078324e..8bb3886 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 2580acb..28b66e7 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.cdx b/TESTS/DATOS_READONLY/fb2p_dbf.cdx
new file mode 100644
index 0000000..5a8f839
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbf.cdx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.dbf b/TESTS/DATOS_READONLY/fb2p_dbf.dbf
new file mode 100644
index 0000000..7f86409
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbf.dbf 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/TESTS/DATOS_READONLY/fb2p_free.cdx b/TESTS/DATOS_READONLY/fb2p_free.cdx
new file mode 100644
index 0000000..b5004ca
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_free.cdx differ
diff --git a/TESTS/DATOS_READONLY/fb2p_free.dbf b/TESTS/DATOS_READONLY/fb2p_free.dbf
new file mode 100644
index 0000000..72cf766
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_free.dbf differ
diff --git a/TESTS/DATOS_READONLY/fb2p_free.fpt b/TESTS/DATOS_READONLY/fb2p_free.fpt
new file mode 100644
index 0000000..601fa8d
Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_free.fpt differ
diff --git a/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbc.prg b/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbc.prg
new file mode 100644
index 0000000..3b245ad
--- /dev/null
+++ b/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbc.prg
@@ -0,0 +1,148 @@
+DEFINE CLASS ft__foxbin2prg__c_conversor_prg_a_dbc AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ft__foxbin2prg__c_conversor_prg_a_dbc OF ft__foxbin2prg__c_conversor_prg_a_dbc.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ *LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ *THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG")
+ *loObj = THIS.icObj
+ *loObj.l_Test = .F.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+
+ IF ISNULL(toEx)
+ *-- Validaciones en método
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ IF NOT INLIST( toEx.ERRORNO, 1098, 2071 ) && Error del usuario (ERROR y THROW)
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+ ENDIF
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+
+ THIS.messageout( '' )
+ THIS.messageout( REPLICATE('*',80) )
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_FB2P_DBC_DC2_YRegenerarEl_DBC_ConTodosSusObjetos
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ;
+ , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X, lcDC2, lcDC3 ;
+ , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lc_File = 'FB2P_DBC.DBC'
+ lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' )
+ lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' )
+ lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) )
+
+ oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') )
+ oFXU_LIB.copiarArchivosParaTest( 'EVENTSFILE.PRG' )
+
+ *-- Genero el DC2
+ loCnv.Ejecutar( FORCEEXT(lc_File,'DBC'), '', '', '', '1', '0', '1',.F.,.F.,.T. )
+ *-- Regenero el DBC
+ loCnv.Ejecutar( FORCEEXT(lc_File,'DC2'), '', '', '', '1', '0', '1',.F.,.F.,.T. )
+ *-- Renombro el DC2 a DC3 (ORIGINAL)
+ RENAME (FORCEEXT(lc_OutputFile,'DC2')) TO (FORCEEXT(lc_OutputFile,'DC3'))
+ *-- Genero el DC2 desde el DBC regenerado
+ *WAIT WINDOW TIMEOUT 2 && Para forzar una diferencia de 2 segundos entre el DC2 y el DC3
+ loCnv.Ejecutar( FORCEEXT(lc_File,'DBC'), '', '', '', '1', '0', '1',.F.,.F.,.T. )
+ *-- Comparo los DC2 y DC3
+ lcDC2 = STREXTRACT( FILETOSTR( FORCEEXT(lc_File,'DC2') ), '', '' )
+ lcDC3 = STREXTRACT( FILETOSTR( FORCEEXT(lc_File,'DC3') ), '', '' )
+
+
+ *-- Visualización de valores
+ THIS.messageout( 'Bytes DC3: ' + TRANSFORM(LEN(lcDC3)) )
+ THIS.messageout( 'Bytes DC2: ' + TRANSFORM(LEN(lcDC2)) )
+
+
+ *-- Evaluación de valores
+ this.assertequals( lcDC2, lcDC3, '[Comparación DC2 y DC3]' )
+
+
+ CATCH TO loEx
+ THIS.Evaluate_results( loEx, lnCodError_Esperado )
+
+ FINALLY
+ USE IN (SELECT("ARCHIVOBIN_IN"))
+ USE IN (SELECT("TABLABIN"))
+ ENDTRY
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbf.prg b/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbf.prg
new file mode 100644
index 0000000..1cc0ea2
--- /dev/null
+++ b/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbf.prg
@@ -0,0 +1,367 @@
+DEFINE CLASS ft__foxbin2prg__c_conversor_prg_a_dbf AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS ft__foxbin2prg__c_conversor_prg_a_dbf OF ft__foxbin2prg__c_conversor_prg_a_dbf.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ *LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ *THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG")
+ *loObj = THIS.icObj
+ *loObj.l_Test = .F.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+
+ IF ISNULL(toEx)
+ *-- Validaciones en método
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ IF NOT INLIST( toEx.ERRORNO, 1098, 2071 ) && Error del usuario (ERROR y THROW)
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+ ENDIF
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+
+ THIS.messageout( '' )
+ THIS.messageout( REPLICATE('*',80) )
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_FB2P_FREE_DB2_YValidarQueGenereUn_DBF_ConTodosLosCamposYLasMismasDefinicionesYOrden
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ;
+ , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X ;
+ , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lc_File = 'FB2P_FREE.DB2'
+ lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' )
+ lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' )
+ lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) )
+
+ oFXU_LIB.copiarArchivosParaTest( lc_File )
+
+ loCnv.Ejecutar( lc_File, '', '', '', '1', '0', '1',.F.,.F.,.T. )
+
+ SELECT 0
+ USE (FORCEEXT(lc_InputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
+ SELECT 0
+ USE (FORCEEXT(lc_OutputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS TABLABIN
+ lnFields_OUT = AFIELDS( laCampos_OUT, 'TABLABIN' )
+ lnFields_IN = AFIELDS( laCampos_IN, 'ARCHIVOBIN_IN' )
+
+
+ *-- Visualización de valores
+ THIS.messageout( 'Cantidad de campos: ' + TRANSFORM(lnFields_OUT) )
+ THIS.messageout( '' )
+ THIS.messageout( PADR('Nombre',12) + ' ' + PADC('Tipo',4) + ' ' + PADL('Long',4) + ' ' + PADL('Dec',4) )
+ THIS.messageout( PADR('----------',12) + ' ' + PADC('----',4) + ' ' + PADL('----',4) + ' ' + PADL('---',4) )
+
+ FOR I = 1 TO lnFields_IN
+ THIS.messageout( PADR(laCampos_IN(I,1),12) + ' ' + PADC(laCampos_IN(I,2),4) + ' ' + PADL(laCampos_IN(I,3),4) + ' ' + PADL(laCampos_IN(I,4),4) )
+ ENDFOR
+
+ THIS.messageout( PADR('----------',12) + ' ' + PADC('----',4) + ' ' + PADL('----',4) + ' ' + PADL('---',4) )
+
+
+ *-- Evaluación de valores
+ this.assertequals( lnFields_OUT, lnFields_IN, '[Cantidad de campos IN y OUT]' )
+
+ FOR I = 1 TO lnFields_IN
+ FOR X = 1 TO 18
+ THIS.assertequals( laCampos_IN(I,X), laCampos_OUT(I,X), '[Comparando estructura del campo ' + laCampos_IN(I,1) + ']' )
+ ENDFOR
+ ENDFOR
+
+ CATCH TO loEx
+ THIS.Evaluate_results( loEx, lnCodError_Esperado )
+
+ FINALLY
+ USE IN (SELECT("ARCHIVOBIN_IN"))
+ USE IN (SELECT("TABLABIN"))
+ ENDTRY
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_FB2P_FREE_DB2_YValidarQueGenereUn_DBF_ConLosMismosIndices
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ;
+ , laIndices_IN(1,18), laIndices_OUT(1,18), lnIndices_OUT, lnIndices_IN, I, X ;
+ , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lc_File = 'FB2P_FREE.DB2'
+ lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' )
+ lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' )
+ lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) )
+
+ oFXU_LIB.copiarArchivosParaTest( lc_File )
+
+ loCnv.Ejecutar( lc_File, '', '', '', '1', '0', '1',.F.,.F.,.T. )
+
+ SELECT 0
+ USE (FORCEEXT(lc_InputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
+ SELECT 0
+ USE (FORCEEXT(lc_OutputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS TABLABIN
+ lnIndices_IN = ATAGINFO( laIndices_IN, '', 'ARCHIVOBIN_IN' )
+ lnIndices_OUT = ATAGINFO( laIndices_OUT, '', 'TABLABIN' )
+
+
+ *-- Visualización de valores
+ THIS.messageout( 'Cantidad de índices para [' + DBF("TABLABIN") + ']: ' + TRANSFORM(lnIndices_OUT) )
+ THIS.messageout( '' )
+ THIS.messageout( PADR('Tag',12) + ' ' + PADR('Tipo',12) + ' ' + PADR('Clave',30) + ' ' + PADR('Filtro',30) + ' ' + PADR('Order',12) + ' ' + PADR('Collate',12) )
+ THIS.messageout( PADR('----------',12) + ' ' + PADR('----------',12) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------',12) + ' ' + PADR('----------',12) )
+
+ FOR I = 1 TO lnIndices_OUT
+ THIS.messageout( PADR(laIndices_OUT(I,1),12) + ' ' + PADR(laIndices_OUT(I,2),12) + ' ' + PADR(laIndices_OUT(I,3),30) + ' ' + PADR(laIndices_OUT(I,4),30) ;
+ + ' ' + PADR(laIndices_OUT(I,5),12) + ' ' + PADR(laIndices_OUT(I,6),12) )
+ ENDFOR
+
+ THIS.messageout( PADR('----------',12) + ' ' + PADR('----------',12) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------',12) + ' ' + PADR('----------',12) )
+
+
+ *-- Evaluación de valores
+ this.assertequals( lnIndices_OUT, lnIndices_IN, '[Cantidad de campos IN y OUT]' )
+
+ FOR I = 1 TO lnIndices_IN
+ FOR X = 1 TO 6
+ THIS.assertequals( laIndices_IN(I,X), laIndices_OUT(I,X), '[Comparando estructura del indice ' + laIndices_IN(I,1) + ']' )
+ ENDFOR
+ ENDFOR
+
+ CATCH TO loEx
+ THIS.Evaluate_results( loEx, lnCodError_Esperado )
+
+ FINALLY
+ USE IN (SELECT("ARCHIVOBIN_IN"))
+ USE IN (SELECT("TABLABIN"))
+ ENDTRY
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaTabla_FB2P_FREE_DBF_YValidarQueGenereUn_DB2yDBF_ConTodosLosCamposYLasMismasDefinicionesYOrden
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ;
+ , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X ;
+ , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lc_File = 'FB2P_FREE.DB2'
+ lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' )
+ lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' )
+ lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) )
+
+ oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') )
+
+ loCnv.Ejecutar( FORCEEXT(lc_File,'DBF'), '', '', '', '1', '0', '1',.F.,.F.,.T. )
+ loCnv.Ejecutar( FORCEEXT(lc_File,'DB2'), '', '', '', '1', '0', '1',.F.,.F.,.T. )
+
+ SELECT 0
+ USE (FORCEEXT(lc_InputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
+ SELECT 0
+ USE (FORCEEXT(lc_OutputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS TABLABIN
+ lnFields_OUT = AFIELDS( laCampos_OUT, 'TABLABIN' )
+ lnFields_IN = AFIELDS( laCampos_IN, 'ARCHIVOBIN_IN' )
+
+
+ *-- Visualización de valores
+ THIS.messageout( 'Cantidad de campos: ' + TRANSFORM(lnFields_OUT) )
+ THIS.messageout( '' )
+ THIS.messageout( PADR('Nombre',12) + ' ' + PADC('Tipo',4) + ' ' + PADL('Long',4) + ' ' + PADL('Dec',4) )
+ THIS.messageout( PADR('----------',12) + ' ' + PADC('----',4) + ' ' + PADL('----',4) + ' ' + PADL('---',4) )
+
+ FOR I = 1 TO lnFields_IN
+ THIS.messageout( PADR(laCampos_IN(I,1),12) + ' ' + PADC(laCampos_IN(I,2),4) + ' ' + PADL(laCampos_IN(I,3),4) + ' ' + PADL(laCampos_IN(I,4),4) )
+ ENDFOR
+
+ THIS.messageout( PADR('----------',12) + ' ' + PADC('----',4) + ' ' + PADL('----',4) + ' ' + PADL('---',4) )
+
+
+ *-- Evaluación de valores
+ this.assertequals( lnFields_OUT, lnFields_IN, '[Cantidad de campos IN y OUT]' )
+
+ FOR I = 1 TO lnFields_IN
+ FOR X = 1 TO 18
+ THIS.assertequals( laCampos_IN(I,X), laCampos_OUT(I,X), '[Comparando estructura del campo ' + laCampos_IN(I,1) + ']' )
+ ENDFOR
+ ENDFOR
+
+ CATCH TO loEx
+ THIS.Evaluate_results( loEx, lnCodError_Esperado )
+
+ FINALLY
+ USE IN (SELECT("ARCHIVOBIN_IN"))
+ USE IN (SELECT("TABLABIN"))
+ ENDTRY
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaTabla_FB2P_FREE_DBF_YValidarQueGenereUn_DB2yDBF_ConLosMismosIndices
+ LOCAL lnCodError, lnCodError_Esperado ;
+ , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ;
+ , laIndices_IN(1,18), laIndices_OUT(1,18), lnIndices_OUT, lnIndices_IN, I, X ;
+ , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ;
+ , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ;
+ , loEx AS EXCEPTION
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ TRY
+ loEx = NULL
+ loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG")
+
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ lc_File = 'FB2P_FREE.DB2'
+ lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' )
+ lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' )
+ lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) )
+
+ oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') )
+
+ loCnv.Ejecutar( FORCEEXT(lc_File,'DBF'), '', '', '', '1', '0', '1',.F.,.F.,.T. )
+ loCnv.Ejecutar( FORCEEXT(lc_File,'DB2'), '', '', '', '1', '0', '1',.F.,.F.,.T. )
+
+ SELECT 0
+ USE (FORCEEXT(lc_InputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
+ SELECT 0
+ USE (FORCEEXT(lc_OutputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS TABLABIN
+ lnIndices_IN = ATAGINFO( laIndices_IN, '', 'ARCHIVOBIN_IN' )
+ lnIndices_OUT = ATAGINFO( laIndices_OUT, '', 'TABLABIN' )
+
+
+ *-- Visualización de valores
+ THIS.messageout( 'Cantidad de índices para [' + DBF("TABLABIN") + ']: ' + TRANSFORM(lnIndices_OUT) )
+ THIS.messageout( '' )
+ THIS.messageout( PADR('Tag',12) + ' ' + PADR('Tipo',12) + ' ' + PADR('Clave',30) + ' ' + PADR('Filtro',30) + ' ' + PADR('Order',12) + ' ' + PADR('Collate',12) )
+ THIS.messageout( PADR('----------',12) + ' ' + PADR('----------',12) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------',12) + ' ' + PADR('----------',12) )
+
+ FOR I = 1 TO lnIndices_OUT
+ THIS.messageout( PADR(laIndices_OUT(I,1),12) + ' ' + PADR(laIndices_OUT(I,2),12) + ' ' + PADR(laIndices_OUT(I,3),30) + ' ' + PADR(laIndices_OUT(I,4),30) ;
+ + ' ' + PADR(laIndices_OUT(I,5),12) + ' ' + PADR(laIndices_OUT(I,6),12) )
+ ENDFOR
+
+ THIS.messageout( PADR('----------',12) + ' ' + PADR('----------',12) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------',12) + ' ' + PADR('----------',12) )
+
+
+ *-- Evaluación de valores
+ this.assertequals( lnIndices_OUT, lnIndices_IN, '[Cantidad de campos IN y OUT]' )
+
+ FOR I = 1 TO lnIndices_IN
+ FOR X = 1 TO 6
+ THIS.assertequals( laIndices_IN(I,X), laIndices_OUT(I,X), '[Comparando estructura del indice ' + laIndices_IN(I,1) + ']' )
+ ENDFOR
+ ENDFOR
+
+ CATCH TO loEx
+ THIS.Evaluate_results( loEx, lnCodError_Esperado )
+
+ FINALLY
+ USE IN (SELECT("ARCHIVOBIN_IN"))
+ USE IN (SELECT("TABLABIN"))
+ ENDTRY
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg
index caffe54..5ff7d49 100644
--- a/TESTS/ut__foxbin2prg.prg
+++ b/TESTS/ut__foxbin2prg.prg
@@ -298,7 +298,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. )
SELECT 0
- USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN
+ USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
SCAN ALL FOR NOT DELETED()
*-- DATOS ESPERADOS
@@ -318,7 +318,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
LOCATE FOR UNIQUEID==lcUniqueID
IF NOT FOUND()
- ERROR 'No se encontró el registro #' + TRANSFORM(RECNO('ARCHIBOBIN_IN')) + ' con UniqueID "' + lcUniqueID + '" en el archivo "' + lc_OutputFile + '"'
+ ERROR 'No se encontró el registro #' + TRANSFORM(RECNO('ARCHIVOBIN_IN')) + ' con UniqueID "' + lcUniqueID + '" en el archivo "' + lc_OutputFile + '"'
ENDIF
SCATTER MEMO NAME loReg
@@ -332,7 +332,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
FINALLY
- USE IN (SELECT("ARCHIBOBIN_IN"))
+ USE IN (SELECT("ARCHIVOBIN_IN"))
ENDTRY
ENDFUNC
@@ -372,7 +372,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. )
SELECT 0
- USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN
+ USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
SCAN ALL FOR NOT DELETED()
*-- DATOS ESPERADOS
@@ -392,7 +392,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
LOCATE FOR UNIQUEID==lcUniqueID
IF NOT FOUND()
- ERROR 'No se encontró el registro #' + TRANSFORM(RECNO('ARCHIBOBIN_IN')) + ' con UniqueID "' + lcUniqueID + '" en el archivo "' + lc_OutputFile + '"'
+ ERROR 'No se encontró el registro #' + TRANSFORM(RECNO('ARCHIVOBIN_IN')) + ' con UniqueID "' + lcUniqueID + '" en el archivo "' + lc_OutputFile + '"'
ENDIF
SCATTER MEMO NAME loReg
@@ -406,7 +406,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
FINALLY
- USE IN (SELECT("ARCHIBOBIN_IN"))
+ USE IN (SELECT("ARCHIVOBIN_IN"))
ENDTRY
ENDFUNC
@@ -444,7 +444,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. )
SELECT 0
- USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN
+ USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
SCAN ALL FOR NOT DELETED() AND ( UNIQUEID==PADR('Form',10) OR PLATFORM==PADR("WINDOWS",8) )
*-- DATOS ESPERADOS
@@ -485,7 +485,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
FINALLY
- USE IN (SELECT("ARCHIBOBIN_IN"))
+ USE IN (SELECT("ARCHIVOBIN_IN"))
USE IN (SELECT("TABLABIN"))
ENDTRY
@@ -526,7 +526,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. )
SELECT 0
- USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN
+ USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
SCAN ALL FOR NOT DELETED() AND ( UNIQUEID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) )
*-- DATOS ESPERADOS
@@ -567,7 +567,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
FINALLY
- USE IN (SELECT("ARCHIBOBIN_IN"))
+ USE IN (SELECT("ARCHIVOBIN_IN"))
USE IN (SELECT("TABLABIN"))
ENDTRY
@@ -608,7 +608,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. )
SELECT 0
- USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN
+ USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
SCAN ALL FOR NOT DELETED() AND ( UNIQUEID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) )
*-- DATOS ESPERADOS
@@ -649,7 +649,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado )
FINALLY
- USE IN (SELECT("ARCHIBOBIN_IN"))
+ USE IN (SELECT("ARCHIVOBIN_IN"))
USE IN (SELECT("TABLABIN"))
ENDTRY
@@ -690,7 +690,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. )
SELECT 0
- USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN
+ USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN
SCAN ALL FOR NOT DELETED() AND ( UNIQUEID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) )
*-- DATOS ESPERADOS
@@ -732,7 +732,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg
, loReg_Esperado, loReg, lcTipoBinario )
FINALLY
- USE IN (SELECT("ARCHIBOBIN_IN"))
+ USE IN (SELECT("ARCHIVOBIN_IN"))
USE IN (SELECT("TABLABIN"))
ENDTRY
diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__doBackup.prg b/TESTS/ut__foxbin2prg__c_conversor_base__doBackup.prg
new file mode 100644
index 0000000..d2166a3
--- /dev/null
+++ b/TESTS/ut__foxbin2prg__c_conversor_base__doBackup.prg
@@ -0,0 +1,122 @@
+DEFINE CLASS foxbin2prg__c_conversor_base__doBackup AS FxuTestCase OF FxuTestCase.prg
+
+ #IF .F.
+ LOCAL THIS AS foxbin2prg__c_conversor_base__doBackup OF foxbin2prg__c_conversor_base__doBackup.PRG
+ #ENDIF
+
+ #DEFINE C_FB2P_VALUE_I ''
+ #DEFINE C_FB2P_VALUE_F ''
+ #DEFINE CR_LF CHR(13) + CHR(10)
+ #DEFINE C_CR CHR(13)
+ #DEFINE C_LF CHR(10)
+ #DEFINE C_TAB CHR(9)
+ #DEFINE C_PROC 'PROCEDURE'
+ #DEFINE C_ENDPROC 'ENDPROC'
+ #DEFINE C_TEXT 'TEXT'
+ #DEFINE C_ENDTEXT 'ENDTEXT'
+ #DEFINE C_IF_F '#IF .F.'
+ #DEFINE C_ENDIF '#ENDIF'
+ #DEFINE C_DEFINE_CLASS 'DEFINE CLASS'
+ #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE'
+ icObj = NULL
+
+
+ *******************************************************************************************************************************************
+ FUNCTION SETUP
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG"
+ SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG')
+ oFXU_LIB.setup_comun()
+
+ THIS.icObj = NEWOBJECT("c_conversor_bin_a_prg", "FOXBIN2PRG.PRG")
+ loObj = THIS.icObj
+ loObj.l_Test = .T.
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION TearDown
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ THIS.icObj = NULL
+
+ IF VARTYPE(oFXU_LIB) = "O"
+ oFXU_LIB.teardown_comun()
+ oFXU_LIB = NULL
+ ENDIF
+ RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Evaluate_results
+ LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, tcBackFile_1, tcBackFile_2, tcBackFile_3
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+
+ IF PCOUNT() = 0
+ THIS.messageout( "* Support method, not a valid test." )
+ RETURN .T.
+ ENDIF
+
+ IF ISNULL(toEx)
+ *-- Visualización de valores
+ THIS.messageout( 'BackFile_1: ' + TRANSFORM(tcBackFile_1) )
+ THIS.messageout( 'BackFile_2: ' + TRANSFORM(tcBackFile_2) )
+ THIS.messageout( 'BackFile_3: ' + TRANSFORM(tcBackFile_3) )
+
+
+ *-- Evaluación de valores
+ THIS.assertequals( .T., FILE(tcBackFile_1), "Existencia del archivo " + tcBackFile_1 )
+ THIS.assertequals( .T., FILE(tcBackFile_2), "Existencia del archivo " + tcBackFile_2 )
+ IF NOT EMPTY(tcBackFile_3)
+ THIS.assertequals( .T., FILE(tcBackFile_3), "Existencia del archivo " + tcBackFile_3 )
+ ENDIF
+
+ ELSE
+ *-- Evaluación de errores
+ THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) )
+ THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) )
+ THIS.messageout( TRANSFORM(toEx.LINECONTENTS) )
+
+ THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' )
+ ENDIF
+ ENDFUNC
+
+
+ *******************************************************************************************************************************************
+ FUNCTION Deberia_HacerElBackupDelArchivoIndicado
+
+ #IF .F.
+ PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG'
+ #ENDIF
+
+ LOCAL lnCodError, lcMenError, lnCodError_Esperado ;
+ , lcMemo, lcMemo_Salida, lcMemo_Esperado, lcBackFile_1, lcBackFile_2, lcBackFile_3 ;
+ , loEx AS EXCEPTION
+ LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG"
+ loObj = THIS.icObj
+ loEx = NULL
+ loObj.c_OutputFile = FORCEPATH( 'fb2p_dbc.dbc', oFXU_LIB.cPathDatosTest )
+
+ *-- DATOS DE ENTRADA
+ STORE 0 TO lnCodError
+ COPY FILE ( FORCEPATH( 'FB2P_DBC.D??', oFXU_LIB.cPathDatosReadOnly ) ) TO ( FORCEPATH( 'FB2P_DBC.D??', oFXU_LIB.cPathDatosTest ) )
+
+ *-- TEST
+ loObj.doBackup( @loEx, .F., @lcBackFile_1, @lcBackFile_2, @lcBackFile_3 )
+
+ THIS.Evaluate_results( loEx, lnCodError_Esperado, lcBackFile_1, lcBackFile_2, lcBackFile_3 )
+
+ ENDFUNC
+
+
+ENDDEFINE
diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt
index 334fdf1..dd274b8 100644
Binary files a/foxbin2prg.pjt and b/foxbin2prg.pjt differ
diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx
index 61c69a9..73aed1e 100644
Binary files a/foxbin2prg.pjx and b/foxbin2prg.pjx differ
diff --git a/foxbin2prg.prg b/foxbin2prg.prg
index 05a9b36..9111f14 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -36,7 +36,7 @@
* DO FOXBIN2PRG.PRG WITH "\FILE.PJ2" && Genera "\FILE.PJX" (PRG TO BIN CONVERSION)
*
*---------------------------------------------------------------------------------------------------
-* Historial de cambios y notas importantes
+*
* 04/11/2013 FDBOZZO v1.0 Creación inicial de las clases y soporte de los archivos VCX/SCX/PJX
* 22/11/2013 FDBOZZO v1.1 Corrección de bugs
* 23/11/2013 FDBOZZO v1.2 Corrección de bugs, limpieza de código y refactorización
@@ -52,9 +52,11 @@
* 07/12/2013 FDBOZZO v1.12 Agregado soporte preliminar de conversión de reportes y etiquetas (FRX/LBX)
* 08/12/2013 FDBOZZO v1.13 Arreglo bug "Error 1924, TOREG is not an object"
* 15/12/2013 FDBOZZO v1.14 Arreglo de bug AutoCenter y registro COMMENT en regeneración de forms
+* 08/12/2013 FDBOZZO v1.15 Agregado soporte preliminar de conversión de tablas, índices y bases de datos (DBF,CDX,DBC)
+*
*
*---------------------------------------------------------------------------------------------------
-* TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS)
+*
* 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)
@@ -65,6 +67,7 @@
* 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 REPORRE BUG: La regeneración de los forms (SCX) no regenera el último registro COMMENT (arreglado en v.1.14)
+*
*
*---------------------------------------------------------------------------------------------------
* TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES:
@@ -113,6 +116,8 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#DEFINE C_ENDTEXT 'ENDTEXT'
#DEFINE C_PROCEDURE 'PROCEDURE'
#DEFINE C_ENDPROC 'ENDPROC'
+#DEFINE C_WITH 'WITH'
+#DEFINE C_WNDWITH 'ENDWITH'
#DEFINE C_SRV_HEAD_I '*'
#DEFINE C_SRV_HEAD_F '*'
#DEFINE C_SRV_DATA_I '*'
@@ -146,6 +151,45 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#DEFINE C_TAG_REPORTE 'Reportes'
#DEFINE C_TAG_REPORTE_I '<' + C_TAG_REPORTE + '>'
#DEFINE C_TAG_REPORTE_F '' + C_TAG_REPORTE + '>'
+#DEFINE C_DBF_HEAD_I ''
+#DEFINE C_LEN_DBF_HEAD_I LEN(C_DBF_HEAD_I)
+#DEFINE C_LEN_DBF_HEAD_F LEN(C_DBF_HEAD_F)
+#DEFINE C_CDX_I ''
+#DEFINE C_CDX_F ''
+#DEFINE C_LEN_CDX_I LEN(C_CDX_I)
+#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_STORED_PROC_I ''
+#DEFINE C_TABLE_I ''
+#DEFINE C_TABLES_I ''
+#DEFINE C_TABLES_F ''
+#DEFINE C_VIEW_I ''
+#DEFINE C_VIEW_F ''
+#DEFINE C_VIEWS_I ''
+#DEFINE C_VIEWS_F ''
+#DEFINE C_FIELD_I ''
+#DEFINE C_FIELD_F ''
+#DEFINE C_FIELDS_I ''
+#DEFINE C_FIELDS_F ''
+#DEFINE C_CONNECTION_I ''
+#DEFINE C_CONNECTION_F ''
+#DEFINE C_CONNECTIONS_I ''
+#DEFINE C_CONNECTIONS_F ''
+#DEFINE C_RELATION_I ''
+#DEFINE C_RELATION_F ''
+#DEFINE C_RELATIONS_I ''
+#DEFINE C_RELATIONS_F ''
+#DEFINE C_INDEX_I ''
+#DEFINE C_INDEX_F ''
+#DEFINE C_INDEXES_I ''
+#DEFINE C_INDEXES_F ''
+*--
#DEFINE C_TAB CHR(9)
#DEFINE C_CR CHR(13)
#DEFINE C_LF CHR(10)
@@ -175,146 +219,56 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#DEFINE SERVERINSTANCE_MULTIUSE 3 && Multi-use server
*-- Fin / End
-TRY
- LOCAL lcSys16, I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), lcConfigFile, lcExt ;
- , llExisteConfig, llShowProgress, lcConfData, lnFileCount ;
- , loEx AS EXCEPTION
+*******************************************************************************************************************
+*-- INTERNACIONALIZACIÓN / INTERNATIONALIZATION
+*******************************************************************************************************************
+#IF .T. &&VERSION(3) == "34" && Español (Spanish) [NO FUNCIONA MÁS ESTO :( ]
+ #DEFINE C_FOXBIN2PRG_JUST_VFP_9_LOC '¡FOXBIN2PRG es solo para Visual FoxPro 9.0!'
+ #DEFINE C_FOXBIN2PRG_WARN_CAPTION_LOC 'FOXBIN2PRG: ¡ATENCIÓN!'
+ #DEFINE FOXBIN2PRG_INFO_SINTAX_LOC 'FOXBIN2PRG [cType_ND cTextName_ND cGenText_ND cNoMostrarErrores cDebug]' + CR_LF + CR_LF ;
+ + 'Ejemplo para generar los TXT de todos los VCX de "c:\desa\clases", sin mostrar ventana de error y generando archivo LOG: ' + CR_LF ;
+ + ' FOXBIN2PRG "c:\desa\clases\*.vcx" "0" "0" "0" "1" "1"' + CR_LF + CR_LF ;
+ + 'Ejemplo para generar los VCX de todos los TXT de "c:\desa\clases", sin mostrar ventana de error y sin LOG: ' + CR_LF ;
+ + ' FOXBIN2PRG "c:\desa\clases\*.vc2" "0" "0" "0" "1" "0"'
+ #DEFINE ASTERISK_EXT_NOT_ALLOWED_LOC 'No se admiten extensiones * o ? porque es peligroso (se pueden pisar binarios con archivo xx2 vacíos).'
+ #DEFINE C_PROCESSING_LOC 'Procesando archivo '
+ #DEFINE C_FILE_DOESNT_EXIST_LOC "El archivo no existe:"
+ #DEFINE C_SOURCEFILE_LOC "Archivo origen: "
+ #DEFINE C_PROCESS_PROGRESS_LOC "Avance del proceso: "
+ #DEFINE C_CONVERTER_UNLOAD_LOC "Descarga del conversor"
+ #DEFINE C_CONVERTING_FILE_LOC "Convirtiendo archivo "
+ #DEFINE C_BACKUP_OF_LOC "Backup de: "
+ #DEFINE C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC 'Operación no reconocida. Solo re reconoce SETNAME y GETNAME.'
+ #DEFINE C_BACKLINK_CANT_UPDATE_BL_LOC 'No se pudo actualizar el backlink'
+ #DEFINE C_BACKLINK_OF_TABLE_LOC 'de la tabla'
- PUBLIC goFrm_Avance AS frm_avance OF 'FOXBIN2PRG.PRG' ;
- , goCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
- lnResp = 0
+#ELSE && English
+ #DEFINE C_FOXBIN2PRG_JUST_VFP_9_LOC 'FOXBIN2PRG is only for Visual FoxPro 9.0!'
+ #DEFINE C_FOXBIN2PRG_WARN_CAPTION_LOC 'FOXBIN2PRG: WARNING!'
+ #DEFINE FOXBIN2PRG_INFO_SINTAX_LOC 'FOXBIN2PRG [cType_NA cTextName_NA cGenText_NA cDontShowErrors cDebug]' + CR_LF + CR_LF ;
+ + 'Example to generate TXT of all VCX of "c:\desa\clases", without showing error window and generating LOG file: ' + CR_LF ;
+ + ' FOXBIN2PRG "c:\desa\clases\*.vcx" "0" "0" "0" "1" "1"' + CR_LF + CR_LF ;
+ + 'Example to generate TXT of all VCX of "c:\desa\clases", without showing error window and without LOG file: ' + CR_LF ;
+ + ' FOXBIN2PRG "c:\desa\clases\*.vc2" "0" "0" "0" "1" "0"'
+ #DEFINE ASTERISK_EXT_NOT_ALLOWED_LOC '* and ? extensions are not allowed because is dangerous (binaries can be overwriten with xx2 empty files)'
+ #DEFINE C_PROCESSING_LOC 'Processing file '
+ #DEFINE C_FILE_DOESNT_EXIST_LOC "File doesn't exist:"
+ #DEFINE C_SOURCEFILE_LOC "Source file: "
+ #DEFINE C_PROCESS_PROGRESS_LOC "Process Progress: "
+ #DEFINE C_CONVERTER_UNLOAD_LOC "Converter unload"
+ #DEFINE C_CONVERTING_FILE_LOC "Converting file "
+ #DEFINE C_BACKUP_OF_LOC "Backup of: "
+ #DEFINE C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC 'Operation not recognized. Only SETNAME and GETNAME allowed.'
+ #DEFINE C_BACKLINK_CANT_UPDATE_BL_LOC 'Could not update backlink'
+ #DEFINE C_BACKLINK_OF_TABLE_LOC 'of table'
- SET DELETED ON
- SET DATE YMD
- SET HOURS TO 24
- SET CENTURY ON
- SET SAFETY OFF
- SET TABLEPROMPT OFF
+#ENDIF
+*******************************************************************************************************************
- IF _VFP.STARTMODE > 0
- SET ESCAPE OFF
- ENDIF
-
- DO CASE
- CASE VERSION(5) < 900
- lnResp = 1
- MESSAGEBOX( 'FOXBIN2PRG es solo para Visual FoxPro 9.0!', 0+64+4096, 'FOXBIN2PRG: SINTAXIS INFO', 60000 )
-
- CASE EMPTY(tc_InputFile)
- lnResp = 1
- MESSAGEBOX( 'FOXBIN2PRG [cType_NA cTextName_NA cGenText_NA cDontShowErrors cDebug]' + CR_LF + CR_LF ;
- + 'Ejemplo para generar los TXT de todos los VCX de c:\desa\clases, sin mostrar ventana de error y generando LOG: ' + CR_LF ;
- + ' FOXBIN2PRG "c:\desa\clases\*.vcx" "0" "0" "0" "1" "1"' + CR_LF + CR_LF ;
- + 'Ejemplo para generar los VCX de todos los TXT de c:\desa\clases, sin mostrar ventana de error y sin LOG: ' + CR_LF ;
- + ' FOXBIN2PRG "c:\desa\clases\*.vc2" "0" "0" "0" "1" "0"' ;
- , 0+64+4096, 'FOXBIN2PRG: SINTAXIS INFO', 60000 )
- OTHERWISE
- lcSys16 = SYS(16)
- lcPath = SET("Path")
- *SET PATH TO (JUSTPATH(lcSys16))
- SET PATH TO
- llShowProgress = NOT (TRANSFORM(tcDontShowProgress)=='1')
- goCnv = CREATEOBJECT("c_foxbin2prg")
- goCnv.l_Debug = (TRANSFORM(tcDebug)=='1')
- goCnv.l_ShowErrors = NOT (TRANSFORM(tcDontShowErrors) == '1')
-
- IF llShowProgress
- goFrm_Avance = CREATEOBJECT("frm_avance")
- ENDIF
-
- *-- Configuración
- lcConfigFile = FORCEEXT( lcSys16, 'CFG' )
- llExisteConfig = FILE( lcConfigFile )
-
- IF llExisteConfig
- FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcConfigFile ), 1+4 )
- IF LOWER( LEFT( laConfig(I), 10 ) ) == 'extension:'
- lcConfData = ALLTRIM( SUBSTR( laConfig(I), 11 ) )
- lcExt = 'c_' + ALLTRIM( GETWORDNUM( lcConfData, 1, '=' ) )
- IF PEMSTATUS( goCnv, lcExt, 5 )
- goCnv.ADDPROPERTY( lcExt, UPPER( ALLTRIM( GETWORDNUM( lcConfData, 2, '=' ) ) ) )
- ENDIF
- ENDIF
- ENDFOR
- ENDIF
-
-
- *-- Evaluación de FileSpec de entrada
- DO CASE
- CASE '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile )
- MESSAGEBOX( 'No se admiten extensiones * o ? porque es peligroso (se pueden pisar binarios con archivo xx2 vacíos).' ;
- , 0+48+4096, 'FOXBIN2PRG: ERROR!!', 10000 )
-
- CASE '*' $ JUSTSTEM( tc_InputFile )
- *-- Se quieren todos los archivos de una extensión
- lcFileSpec = FULLPATH( tc_InputFile )
- CD (JUSTPATH(lcFileSpec))
- goCnv.c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG'
-
- IF goCnv.l_Debug
- IF FILE( goCnv.c_LogFile )
- ERASE ( goCnv.c_LogFile )
- ENDIF
- goCnv.writeLog( lcSys16 + ' - FileSpec: ' + EVL(tc_InputFile,'') )
- IF llExisteConfig
- goCnv.writeLog( 'ConfigFile: ' + lcConfigFile )
- ENDIF
- ENDIF
-
- lnFileCount = ADIR( laFiles, lcFileSpec )
-
- IF llShowProgress
- goFrm_Avance.nMAX_VALUE = lnFileCount
- ENDIF
-
- FOR I = 1 TO lnFileCount
- lcFile = FORCEPATH( laFiles(I,1), JUSTPATH( lcFileSpec ) )
- goFrm_Avance.lbl_TAREA.CAPTION = 'Procesando archivo ' + lcFile + '...'
- goFrm_Avance.nVALUE = I
-
- IF llShowProgress
- goFrm_Avance.SHOW()
- ENDIF
-
- IF FILE( lcFile )
- lnResp = goCnv.Convertir( lcFile )
- ENDIF
- ENDFOR
-
- OTHERWISE
- *-- Un archivo individual
- IF FILE(tc_InputFile)
- CD (JUSTPATH(tc_InputFile))
- goCnv.c_LogFile = tc_InputFile + '.LOG'
-
- IF goCnv.l_Debug
- IF FILE( goCnv.c_LogFile )
- ERASE ( goCnv.c_LogFile )
- ENDIF
- goCnv.writeLog( lcSys16 + ' - FileSpec: ' + EVL(tc_InputFile,'') )
- ENDIF
-
- lnResp = goCnv.Convertir( tc_InputFile )
- ENDIF
- ENDCASE
-
- ENDCASE
-
-CATCH TO loEx
- IF llExisteConfig
- goCnv.writeLog( 'ERROR: ' + TRANSFORM(loEx.ERRORNO) + ', ' + loEx.MESSAGE + CR_LF ;
- + loEx.PROCEDURE + ', line ' + TRANSFORM(loEx.LINENO) + CR_LF ;
- + loEx.DETAILS )
- ENDIF
-
-FINALLY
- goFrm_Avance.HIDE()
- goFrm_Avance.RELEASE()
- STORE NULL TO goCnv, goFrm_Avance
- RELEASE goCnv, goFrm_Avance
- CD (JUSTPATH(lcSys16))
- SET PATH TO (lcPath)
-ENDTRY
+PUBLIC goCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
+LOCAL lnResp
+goCnv = CREATEOBJECT("c_foxbin2prg")
+lnResp = goCnv.ejecutar( tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug, tcDontShowProgress )
IF _VFP.STARTMODE > 0
QUIT
@@ -329,46 +283,56 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
LOCAL THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
#ENDIF
_MEMBERDATA = [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ []
+ *--
+ n_FB2PRG_Version = 1.15
+ *--
+ c_Foxbin2prg_FullPath = ''
c_CurDir = ''
c_InputFile = ''
c_LogFile = ''
c_OutputFile = ''
+ lFileMode = .F.
l_Debug = .F.
l_Test = .F.
l_ShowErrors = .F.
+ l_ShowProgress = .T.
l_MethodSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias
l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias
l_ReportSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias
- lFileMode = .F.
nClassTimeStamp = ''
- n_FB2PRG_Version = 1.14
o_Conversor = NULL
+ o_Frm_Avance = NULL
c_VC2 = 'VC2'
c_SC2 = 'SC2'
c_PJ2 = 'PJ2'
@@ -380,7 +344,6 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
c_DC2 = 'DC2'
- *******************************************************************************************************************
PROCEDURE INIT
SET DELETED ON
SET DATE YMD
@@ -388,10 +351,11 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
SET CENTURY ON
SET SAFETY OFF
SET TABLEPROMPT OFF
+ THIS.c_Foxbin2prg_FullPath = SUBSTR( SYS(16), AT( 'C_FOXBIN2PRG.INIT', SYS(16) ) + LEN('C_FOXBIN2PRG.INIT') + 1 )
+ THIS.c_CurDir = SYS(5) + CURDIR()
ENDPROC
- *******************************************************************************************************************
PROCEDURE DESTROY
TRY
LOCAL lcFileCDX
@@ -405,19 +369,183 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
ENDPROC
- *******************************************************************************************************************
+ PROCEDURE Ejecutar
+ *--------------------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tc_InputFile (!v IN ) Nombre del archivo de entrada
+ * tcType_na (?v IN ) NO DISPONIBLE. Se mantiene por compatibilidad con SourceSafe
+ * tcTextName_na (?v IN ) NO DISPONIBLE. Se mantiene por compatibilidad con SourceSafe
+ * tlGenText_na (?v IN ) NO DISPONIBLE. Se mantiene por compatibilidad con SourceSafe
+ * tcDontShowErrors (?v IN ) '1' para no mostrar mensajes de error (MESSAGEBOX)
+ * tcDebug (?v IN ) '1' para habilitar modo debug (SOLO DESARROLLO)
+ * tcDontShowProgress (?v IN ) '1' para inhabilitar la barra de progreso
+ * toModulo (?@ OUT) Referencia de objeto del módulo generado (para Unit Testing)
+ * toEx (?@ OUT) Objeto con información del error
+ * tlRelanzarError (?v IN ) Indica si el error debe relanzarse o no
+ *--------------------------------------------------------------------------------------------------------------
+ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug, tcDontShowProgress ;
+ , toModulo, toEx AS EXCEPTION, tlRelanzarError
+
+ TRY
+ LOCAL I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), lcConfigFile, lcExt ;
+ , llExisteConfig, lcConfData, lnFileCount ;
+ , loEx AS EXCEPTION
+
+ lnResp = 0
+
+ SET DELETED ON
+ SET DATE YMD
+ SET HOURS TO 24
+ SET CENTURY ON
+ SET SAFETY OFF
+ SET TABLEPROMPT OFF
+
+ IF _VFP.STARTMODE > 0
+ SET ESCAPE OFF
+ ENDIF
+
+ DO CASE
+ CASE VERSION(5) < 900
+ *-- '¡FOXBIN2PRG es solo para Visual FoxPro 9.0!'
+ MESSAGEBOX( C_FOXBIN2PRG_JUST_VFP_9_LOC, 0+64+4096, C_FOXBIN2PRG_WARN_CAPTION_LOC, 60000 )
+ lnResp = 1
+
+ CASE EMPTY(tc_InputFile)
+ *-- (Ejemplo de sintaxis y uso)
+ MESSAGEBOX( FOXBIN2PRG_INFO_SINTAX_LOC, 0+64+4096, 'FOXBIN2PRG: SINTAXIS INFO', 60000 )
+ lnResp = 1
+
+ OTHERWISE
+ *-- Ejecución normal
+ THIS.l_ShowProgress = NOT (TRANSFORM(tcDontShowProgress)=='1')
+ THIS.l_ShowErrors = NOT (TRANSFORM(tcDontShowErrors) == '1')
+ THIS.l_Debug = (TRANSFORM(tcDebug)=='1')
+
+ IF THIS.l_ShowProgress
+ THIS.o_Frm_Avance = CREATEOBJECT("frm_avance")
+ ENDIF
+
+ *-- Configuración
+ lcConfigFile = FORCEEXT( THIS.c_Foxbin2prg_FullPath, 'CFG' )
+ llExisteConfig = FILE( lcConfigFile )
+
+ IF llExisteConfig
+ FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcConfigFile ), 1+4 )
+ IF LOWER( LEFT( laConfig(I), 10 ) ) == 'extension:'
+ lcConfData = ALLTRIM( SUBSTR( laConfig(I), 11 ) )
+ lcExt = 'c_' + ALLTRIM( GETWORDNUM( lcConfData, 1, '=' ) )
+ IF PEMSTATUS( THIS, lcExt, 5 )
+ THIS.ADDPROPERTY( lcExt, UPPER( ALLTRIM( GETWORDNUM( lcConfData, 2, '=' ) ) ) )
+ ENDIF
+ ENDIF
+ ENDFOR
+ ENDIF
+
+
+ *-- Evaluación de FileSpec de entrada
+ DO CASE
+ CASE '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile )
+ IF THIS.l_ShowErrors
+ MESSAGEBOX( ASTERISK_EXT_NOT_ALLOWED_LOC, 0+48+4096, 'FOXBIN2PRG: ERROR!!', 10000 )
+ ELSE
+ ERROR ASTERISK_EXT_NOT_ALLOWED_LOC
+ ENDIF
+
+ CASE '*' $ JUSTSTEM( tc_InputFile )
+ *-- SE QUIEREN TODOS LOS ARCHIVOS DE UNA EXTENSIÓN
+ lcFileSpec = FULLPATH( tc_InputFile )
+ CD (JUSTPATH(lcFileSpec))
+ THIS.c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG'
+
+ IF THIS.l_Debug
+ IF FILE( THIS.c_LogFile )
+ ERASE ( THIS.c_LogFile )
+ ENDIF
+ THIS.writeLog( THIS.c_Foxbin2prg_FullPath + ' - FileSpec: ' + EVL(tc_InputFile,'') )
+ IF llExisteConfig
+ THIS.writeLog( 'ConfigFile: ' + lcConfigFile )
+ ENDIF
+ ENDIF
+
+ lnFileCount = ADIR( laFiles, lcFileSpec )
+
+ IF THIS.l_ShowProgress
+ THIS.o_Frm_Avance.nMAX_VALUE = lnFileCount
+ ENDIF
+
+ FOR I = 1 TO lnFileCount
+ lcFile = FORCEPATH( laFiles(I,1), JUSTPATH( lcFileSpec ) )
+ THIS.o_Frm_Avance.lbl_TAREA.CAPTION = C_PROCESSING_LOC + lcFile + '...'
+ THIS.o_Frm_Avance.nVALUE = I
+
+ IF THIS.l_ShowProgress
+ THIS.o_Frm_Avance.SHOW()
+ ENDIF
+
+ IF FILE( lcFile )
+ lnResp = THIS.Convertir( lcFile, toModulo, toEx, tlRelanzarError )
+ ENDIF
+ ENDFOR
+
+ OTHERWISE
+ *-- UN ARCHIVO INDIVIDUAL
+ IF FILE(tc_InputFile)
+ CD (JUSTPATH(tc_InputFile))
+ THIS.c_LogFile = tc_InputFile + '.LOG'
+
+ IF THIS.l_Debug
+ IF FILE( THIS.c_LogFile )
+ ERASE ( THIS.c_LogFile )
+ ENDIF
+ THIS.writeLog( THIS.c_Foxbin2prg_FullPath + ' - FileSpec: ' + EVL(tc_InputFile,'') )
+ ENDIF
+
+ lnResp = THIS.Convertir( tc_InputFile, toModulo, toEx, tlRelanzarError )
+ ENDIF
+ ENDCASE
+
+ ENDCASE
+
+ CATCH TO toEx
+ IF llExisteConfig
+ THIS.writeLog( 'ERROR: ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CR_LF ;
+ + toEx.PROCEDURE + ', line ' + TRANSFORM(toEx.LINENO) + CR_LF ;
+ + toEx.DETAILS )
+ ENDIF
+ IF tlRelanzarError
+ THROW
+ ENDIF
+
+ FINALLY
+ IF VARTYPE(THIS.o_Frm_Avance) = "O"
+ THIS.o_Frm_Avance.HIDE()
+ THIS.o_Frm_Avance.RELEASE()
+ STORE NULL TO THIS.o_Frm_Avance
+ ENDIF
+ CD (JUSTPATH(THIS.c_CurDir))
+ *SET PATH TO (lcPath)
+ ENDTRY
+ ENDPROC
+
+
PROCEDURE Convertir
+ *--------------------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tc_InputFile (!v IN ) Nombre del archivo de entrada
+ * toModulo (?@ OUT) Referencia de objeto del módulo generado (para Unit Testing)
+ * toEx (?@ OUT) Objeto con información del error
+ * tlRelanzarError (?v IN ) Indica si el error debe relanzarse o no
+ *--------------------------------------------------------------------------------------------------------------
LPARAMETERS tc_InputFile, toModulo, toEx AS EXCEPTION, tlRelanzarError
TRY
LOCAL lnCodError, lcErrorInfo
lnCodError = 0
THIS.c_InputFile = FULLPATH( tc_InputFile )
- THIS.c_CurDir = JUSTPATH( THIS.c_InputFile )
THIS.o_Conversor = NULL
IF NOT FILE(THIS.c_InputFile)
- ERROR 'El archivo [' + THIS.c_InputFile + '] no existe'
+ ERROR C_FILE_DOESNT_EXIST_LOC + ' [' + THIS.c_InputFile + ']'
ENDIF
IF FILE( THIS.c_InputFile + '.ERR' )
@@ -448,6 +576,14 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_LB2 )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_frx_a_prg' )
+ CASE JUSTEXT(THIS.c_InputFile) = 'DBF'
+ THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_DB2 )
+ THIS.o_Conversor = CREATEOBJECT( 'c_conversor_dbf_a_prg' )
+
+ CASE JUSTEXT(THIS.c_InputFile) = 'DBC'
+ THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_DC2 )
+ THIS.o_Conversor = CREATEOBJECT( 'c_conversor_dbc_a_prg' )
+
CASE JUSTEXT(THIS.c_InputFile) = THIS.c_VC2
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'VCX' )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_vcx' )
@@ -468,6 +604,14 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'LBX' )
THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_frx' )
+ CASE JUSTEXT(THIS.c_InputFile) = THIS.c_DB2
+ THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'DBF' )
+ THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_dbf' )
+
+ CASE JUSTEXT(THIS.c_InputFile) = THIS.c_DC2
+ THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'DBC' )
+ THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_dbc' )
+
OTHERWISE
ERROR 'El archivo [' + THIS.c_InputFile + '] no está soportado'
@@ -488,7 +632,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
CATCH TO toEx
lnCodError = toEx.ERRORNO
- lcErrorInfo = THIS.Exception2Str(toEx) + CR_LF + CR_LF + 'Fuente: ' + THIS.c_InputFile
+ lcErrorInfo = THIS.Exception2Str(toEx) + CR_LF + CR_LF + C_SOURCEFILE_LOC + THIS.c_InputFile
TRY
STRTOFILE( lcErrorInfo, THIS.c_InputFile + '.ERR' )
@@ -549,7 +693,7 @@ DEFINE CLASS frm_avance AS FORM
DOCREATE = .T.
AUTOCENTER = .T.
BORDERSTYLE = 2
- CAPTION = "Avance del proceso"
+ CAPTION = C_PROCESS_PROGRESS_LOC
CONTROLBOX = .F.
BACKCOLOR = RGB(255,255,255)
nMAX_VALUE = 100
@@ -611,40 +755,42 @@ DEFINE CLASS c_conversor_base AS SESSION
LOCAL THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG'
#ENDIF
_MEMBERDATA = [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ []
@@ -683,7 +829,7 @@ DEFINE CLASS c_conversor_base AS SESSION
C_FB2PRG_CODE = ''
USE IN (SELECT("TABLABIN"))
- THIS.writeLog( 'Descarga del conversor' )
+ THIS.writeLog( C_CONVERTER_UNLOAD_LOC )
ENDPROC
@@ -698,6 +844,7 @@ DEFINE CLASS c_conversor_base AS SESSION
* Este es un
valor especial
*
*--------------------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
* tcPropName (!v IN ) Nombre de la propiedad
* tcValue (!v IN ) Valor (o inicio del valor) de la propiedad
* taProps (!@ IN ) El array con las líneas del código donde buscar
@@ -845,7 +992,7 @@ DEFINE CLASS c_conversor_base AS SESSION
PROCEDURE Convertir
LPARAMETERS toModulo, toEx AS EXCEPTION
THIS.writeLog( '' )
- THIS.writeLog( 'Convirtiendo archivo ' + THIS.c_OutputFile + '...' )
+ THIS.writeLog( C_CONVERTING_FILE_LOC + THIS.c_OutputFile + '...' )
ENDPROC
@@ -982,9 +1129,9 @@ DEFINE CLASS c_conversor_base AS SESSION
IF NOT EMPTY(lcExt_1) AND FILE( FORCEEXT(THIS.c_OutputFile, lcExt_1) )
IF EMPTY(lcExt_3)
- THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 )
+ THIS.writeLog( C_BACKUP_OF_LOC + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 )
ELSE
- THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 + '/' + lcExt_3 )
+ THIS.writeLog( C_BACKUP_OF_LOC + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 + '/' + lcExt_3 )
ENDIF
*COPY FILE ( FORCEEXT(THIS.c_OutputFile, lcExt_1) ) TO ( FORCEEXT(THIS.c_OutputFile, lcExt_1 + lcNext_Bak) )
@@ -1087,6 +1234,64 @@ 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(tnTimeStamp)
*-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME
@@ -1297,14 +1502,14 @@ DEFINE CLASS c_conversor_base AS SESSION
FOR I = 1 TO OCCURS( '/>', tcValue )
TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><><', I, 1+4 )>>
+ <<>> <', I, 1+4 )>>
ENDTEXT
ENDFOR
TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
<>
- <><>
+ <<>>
ENDTEXT
CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I
@@ -1375,7 +1580,7 @@ DEFINE CLASS c_conversor_base AS SESSION
CASE tcOperation == 'GETNAME'
lcPropName = SUBSTR(tcPropName,5)
CASE NOT tcOperation == 'SETNAME'
- ERROR 'Operación no reconocida. Solo re reconoce SETNAME y GETNAME.'
+ ERROR C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC
CASE lcPropName == 'ButtonCount'
lcPropName = 'A005' + lcPropName
CASE lcPropName == 'ColumnCount'
@@ -1621,11 +1826,78 @@ DEFINE CLASS c_conversor_base AS SESSION
lnPropType = 2 && User property
lcPropName = 'A998' + lcPropName
ENDCASE
-
+
RETURN lcPropName
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:
@@ -1650,7 +1922,7 @@ DEFINE CLASS c_conversor_base AS SESSION
DIMENSION laPropsAndValues( tnPropsAndValues_Count, lnArrayCols )
ACOPY( taPropsAndValues, laPropsAndValues )
- WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG'
+ WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG'
IF m.tnSortType >= 1
* CON SORT:
* - A las que no tienen '.' les pongo 'A' por delante, y al resto 'B' por delante para que queden al final
@@ -1688,7 +1960,7 @@ DEFINE CLASS c_conversor_base AS SESSION
FOR I = 1 TO m.tnPropsAndValues_Count
*taPropsAndValues(I,1) = SUBSTR( laPropsAndValues(I,1), 2 ) && Quitar el carácter agregado
-
+
*-- Quitar caracteres agregados antes del SORT
IF '.' $ laPropsAndValues(I,1)
IF m.tnSortType = 2
@@ -1704,7 +1976,7 @@ DEFINE CLASS c_conversor_base AS SESSION
taPropsAndValues(I,1) = SUBSTR( laPropsAndValues(I,1), 2 )
ENDIF
ENDIF
-
+
taPropsAndValues(I,2) = laPropsAndValues(I,2)
IF lnArrayCols >= 3
@@ -1811,43 +2083,43 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
LOCAL THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG'
#ENDIF
_MEMBERDATA = [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ []
@@ -2482,7 +2754,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<>
-
+ <<>>
ENDTEXT
ENDFOR
@@ -2523,7 +2795,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<>
-
+ <<>>
ENDTEXT
ENDFOR
@@ -2591,10 +2863,10 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
USE (THIS.c_InputFile) AGAIN SHARED ALIAS _TABLABIN
COPY STRUCTURE EXTENDED TO ( FORCEPATH( '_FRX_STRUC.DBF', ADDBS( SYS(2023) ) ) )
**** CONTINUAR SI ES NECESARIO - SIN USO POR AHORA
-
+
CATCH TO loEx
THROW
-
+
FINALLY
USE IN (SELECT("_TABLABIN"))
SELECT (lnSelect)
@@ -2660,7 +2932,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
TEXT TO tcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
<>
-
+ <<>>
ENDTEXT
ENDIF
ENDFOR
@@ -2837,7 +3109,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base
+ ', línea ' + TRANSFORM(I) + ' del archivo ' + THIS.c_InputFile
ELSE
ERROR 'Error de anidamiento de estructuras. Se esperaba ENDPROC y se encontró ENDDEFINE en la clase ' ;
- + toClase._Nombre + ' (' + toObjeto._Nombre + '.' + loProcedure._Nombre + ')' ;
+ + toClase._Nombre + ' (' + toObjeto._Nombre + '.' + loProcedure._Nombre + ')' ;
+ ', línea ' + TRANSFORM(I) + ' del archivo ' + THIS.c_InputFile
ENDIF
ENDCASE
@@ -3580,7 +3852,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
LOCAL THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG'
#ENDIF
_MEMBERDATA = [] ;
- + [] ;
+ + [] ;
+ []
@@ -3600,10 +3872,10 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin
lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
THIS.doBackup( .F., .T. )
-
+
*-- Creo la librería
THIS.createClasslib()
-
+
*-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF
THIS.identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion )
@@ -3844,7 +4116,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin
LOCAL THIS AS c_conversor_prg_a_scx OF 'FOXBIN2PRG.PRG'
#ENDIF
_MEMBERDATA = [] ;
- + [] ;
+ + [] ;
+ []
@@ -4110,22 +4382,22 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin
LOCAL THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG'
#ENDIF
_MEMBERDATA = [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ []
*******************************************************************************************************************
PROCEDURE Convertir
- LPARAMETERS toModulo, toEx AS EXCEPTION
- DODEFAULT( @toModulo, @toEx )
+ LPARAMETERS toProject, toEx AS EXCEPTION
+ DODEFAULT( @toProject, @toEx )
#IF .F.
LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG'
@@ -4824,22 +5096,25 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
LOCAL THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG'
#ENDIF
_MEMBERDATA = [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ []
*******************************************************************************************************************
PROCEDURE Convertir
- LPARAMETERS toModulo, toEx AS EXCEPTION
- DODEFAULT( @toModulo, @toEx )
+ LPARAMETERS toReport, toEx AS EXCEPTION
+ DODEFAULT( @toReport, @toEx )
+
+ #IF .F.
+ LOCAL toReport AS CL_REPORT 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
@@ -4853,9 +5128,9 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
THIS.createReport()
*-- 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, @toReport )
- THIS.escribirArchivoBin( @loReport )
+ THIS.escribirArchivoBin( @toReport )
CATCH TO loEx
@@ -4902,25 +5177,26 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
lnFieldLen = laFieldTypes(lnNumCampo,3)
lnFieldDec = laFieldTypes(lnNumCampo,4)
luValor = EVALUATE('loReg.' + laProps(I))
-
+
DO CASE
CASE INLIST(lcFieldType, 'B') && Double
- STORE CAST( luValor AS &lcFieldType. (lnFieldPrec) ) TO ('loReg.' + laProps(I))
+ ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldPrec) ) )
CASE INLIST(lcFieldType, 'F', 'N', 'Y') && Float, Numeric, Currency
- STORE CAST( luValor AS &lcFieldType. (lnFieldLen, lnFieldDec) ) TO ('loReg.' + laProps(I))
+ ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldLen, lnFieldDec) ) )
- CASE INLIST(lcFieldType, 'W', 'G', 'M', 'Q', 'V') && Blob, General, Memo, Varbinary, Barchar
- STORE CAST( luValor AS &lcFieldType. ) TO ('loReg.' + laProps(I))
+ CASE INLIST(lcFieldType, 'W', 'G', 'M', 'Q', 'V', 'C') && Blob, General, Memo, Varbinary, Varchar, Character
+ ADDPROPERTY( loReg, laProps(I), luValor )
OTHERWISE && Demás tipos
- STORE CAST( luValor AS &lcFieldType. (lnFieldLen) ) TO ('loReg.' + laProps(I))
+ ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldLen) ) )
ENDCASE
-
+
ENDFOR
-
+
INSERT INTO TABLABIN FROM NAME loReg
+ loReg = NULL
ENDFOR
USE IN (SELECT("TABLABIN"))
@@ -5023,7 +5299,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
#ENDIF
TRY
- LOCAL llBloqueEncontrado, lcValue, loEx as Exception
+ LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION
IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I
llBloqueEncontrado = .T.
@@ -5033,14 +5309,14 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
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
- .set_Line( @tcLine, @taCodeLines, I )
-
+ tcLine = taCodeLines(I)
+
IF C_DATA_F $ tcLine && Fin del valor
lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F )
ADDPROPERTY( toReg, tcPropName, lcValue )
@@ -5050,12 +5326,12 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
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) + ']'
+ IF loEx.ERRORNO = 1470 && Incorrect property name.
+ loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']'
ENDIF
IF THIS.l_Debug AND _VFP.STARTMODE = 0
@@ -5103,7 +5379,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
ADDPROPERTY( toReg, laProps(X), lcValue )
ENDIF
ENDFOR
-
+
ENDIF
CATCH TO loEx
@@ -5153,18 +5429,18 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
LOOP && Saltear comentarios
CASE .analizarBloque_platform( toReport, @tcLine, @taCodeLines, @I, @tnCodeLines, @loReg )
-
+
CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'picture' )
CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'tag' )
*-- ARREGLO ALGUNOS VALORES CAMBIADOS AL TEXTUALIZAR
DO CASE
CASE loReg.ObjType == "1"
- loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.tag )
+ loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.TAG )
CASE loReg.ObjType == "25"
- loReg.TAG = SUBSTR(loReg.TAG,3)
+ loReg.TAG = SUBSTR(loReg.TAG,3) && Quito el ENTER agregado antes
OTHERWISE
- loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.tag )
+ loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.TAG )
ENDCASE
CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'tag2' )
@@ -5185,7 +5461,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
ENDWITH && THIS
I = I - 1
- toReport.Add( loReg )
+ toReport.ADD( loReg )
ENDIF
CATCH TO loEx
@@ -5201,7 +5477,400 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
ENDPROC
-ENDDEFINE
+ENDDEFINE && CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin
+
+
+*******************************************************************************************************************
+DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
+ #IF .F.
+ LOCAL THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+ _MEMBERDATA = [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + []
+
+
+ *******************************************************************************************************************
+ PROCEDURE Convertir
+ LPARAMETERS toTable, toEx AS EXCEPTION
+ DODEFAULT( @toTable, @toEx )
+
+ #IF .F.
+ LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
+ , laBloquesExclusion(1,2), lnBloquesExclusion, I
+ STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version
+ STORE '' TO lcLine, lcSourceFile
+ STORE NULL TO loReg, toModulo
+
+ C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile )
+ lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
+
+ THIS.doBackup( .F., .T. )
+
+ *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte
+ THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toTable )
+
+ THIS.escribirArchivoBin( @toTable )
+
+
+ CATCH TO loEx
+ lnCodError = loEx.ERRORNO
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN lnCodError
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE escribirArchivoBin
+ LPARAMETERS toTable
+ *-- -----------------------------------------------------------------------------------------------------------
+ #IF .F.
+ LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ 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
+
+ STORE '' TO lcIndex, lcFieldDef
+
+ lcCreateTable = 'CREATE TABLE "' + THIS.c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' ('
+
+ *-- Conformo los campos
+ FOR EACH loField IN toTable._Fields FOXOBJECT
+ lcLongDec = ''
+
+ *-- 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
+
+ IF NOT EMPTY(lcLongDec)
+ lcLongDec = lcLongDec + ')'
+ ENDIF
+
+ lcFieldDef = lcFieldDef + lcLongDec
+
+ *-- Null
+ lcFieldDef = lcFieldDef + IIF( loField._Null = '.T.', ' NULL', ' NOT NULL' )
+
+ *-- NoCPTran
+ IF loField._NoCPTran = '.T.'
+ lcFieldDef = lcFieldDef + ' NOCPTRAN'
+ ENDIF
+
+ *-- AutoInc
+ IF loField._AutoInc_NextVal <> '0'
+ lcFieldDef = lcFieldDef + ' AUTOINC NEXTVAL ' + loField._AutoInc_NextVal + ' STEP ' + loField._AutoInc_Step
+ ENDIF
+
+ loField = NULL
+ ENDFOR
+
+ lcCreateTable = lcCreateTable + SUBSTR(lcFieldDef,3) + ')'
+ *STRTOFILE(lcCreateTable,'CreateTable.txt')
+ &lcCreateTable.
+
+ *-- 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)))
+
+ ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' )
+ THIS.write_DBF_Metadata( THIS.c_OutputFile, toTable._Database, ldLastUpdate )
+
+
+ CATCH TO loEx
+ lnCodError = loEx.ERRORNO
+ loEx.USERVALUE = 'lcIndex="' + TRANSFORM(lcIndex) + '"' + CR_LF ;
+ + 'lcFieldDef="' + TRANSFORM(lcFieldDef) + '"' + CR_LF ;
+ + 'lcCreateTable="' + TRANSFORM(lcCreateTable) + '"'
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ FINALLY
+
+ ENDTRY
+
+ RETURN lnCodError
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE identificarBloquesDeCodigo
+ *--------------------------------------------------------------------------------------------------------------
+ * taCodeLines (!@ IN ) El array con las líneas del código donde buscar
+ * tnCodeLines (!@ IN ) Cantidad de líneas de código
+ * taBloquesExclusion (?@ IN ) Sin uso
+ * 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.
+ LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed
+ STORE 0 TO I
+
+ THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile))
+
+ IF tnCodeLines > 1
+ toTable = NULL
+ toTable = CREATEOBJECT('CL_DBF_TABLE')
+
+ WITH THIS
+ FOR I = 1 TO tnCodeLines
+ .set_Line( @lcLine, @taCodeLines, I )
+
+ IF .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios
+ LOOP
+ ENDIF
+
+ DO CASE
+ CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toTable, @lcLine, @taCodeLines, @I, tnCodeLines )
+ llFoxBin2Prg_Completed = .T.
+
+ CASE NOT llBloqueTable_Completed AND toTable.analizarBloque( @lcLine, @taCodeLines, @I, tnCodeLines )
+ llBloqueTable_Completed = .T.
+
+ ENDCASE
+ ENDFOR
+ ENDWITH && THIS
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ENDDEFINE && CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin
+
+
+*******************************************************************************************************************
+DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin
+ #IF .F.
+ LOCAL THIS AS c_conversor_prg_a_dbc OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+ _MEMBERDATA = [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + []
+
+
+ *******************************************************************************************************************
+ PROCEDURE Convertir
+ LPARAMETERS toDatabase, toEx AS EXCEPTION
+ DODEFAULT( @toDatabase, @toEx )
+
+ #IF .F.
+ LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ;
+ , laBloquesExclusion(1,2), lnBloquesExclusion, I
+ STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version
+ STORE '' TO lcLine, lcSourceFile
+ STORE NULL TO loReg, toModulo
+
+ C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile )
+ lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE )
+
+ THIS.doBackup( .F., .T. )
+
+ *-- Creo la tabla
+ *THIS.createTable()
+
+ *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte
+ THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toDatabase )
+
+ THIS.escribirArchivoBin( @toDatabase )
+
+
+ CATCH TO loEx
+ lnCodError = loEx.ERRORNO
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN lnCodError
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE escribirArchivoBin
+ LPARAMETERS toDatabase
+ *-- -----------------------------------------------------------------------------------------------------------
+ #IF .F.
+ LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL lnCodError, lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate
+ lnCodError = 0
+ STORE '' TO lcIndex, lcFieldDef
+
+ toDatabase.updateDBC( THIS.c_OutputFile )
+
+ *USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile)))
+
+
+ CATCH TO loEx
+ lnCodError = loEx.ERRORNO
+
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN lnCodError
+ ENDPROC
+
+
+ *******************************************************************************************************************
+ PROCEDURE identificarBloquesDeCodigo
+ *--------------------------------------------------------------------------------------------------------------
+ * taCodeLines (!@ IN ) El array con las líneas del código donde buscar
+ * tnCodeLines (!@ IN ) Cantidad de líneas de código
+ * taBloquesExclusion (?@ IN ) Sin uso
+ * tnBloquesExclusion (?@ IN ) Sin uso
+ * toDatabase (?@ OUT) Objeto con toda la información de la base de datos analizada
+ *
+ * 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 toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG'
+ #ENDIF
+
+ TRY
+ LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueDatabase_Completed
+ STORE 0 TO I
+
+ THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile))
+
+ IF tnCodeLines > 1
+ toDatabase = NULL
+ toDatabase = CREATEOBJECT('CL_DBC')
+
+ WITH THIS
+ FOR I = 1 TO tnCodeLines
+ .set_Line( @lcLine, @taCodeLines, I )
+
+ IF .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios
+ LOOP
+ ENDIF
+
+ DO CASE
+ CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toDatabase, @lcLine, @taCodeLines, @I, tnCodeLines )
+ llFoxBin2Prg_Completed = .T.
+
+ CASE NOT llBloqueDatabase_Completed AND toDatabase.analizarBloque( @lcLine, @taCodeLines, @I, tnCodeLines )
+ llBloqueDatabase_Completed = .T.
+
+ ENDCASE
+ ENDFOR
+ ENDWITH && THIS
+ ENDIF
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ ENDTRY
+
+ RETURN
+ ENDPROC
+
+
+ENDDEFINE && CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin
*******************************************************************************************************************
@@ -5210,35 +5879,47 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
LOCAL THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG'
#ENDIF
_MEMBERDATA = [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
- + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ + [] ;
+ []
@@ -5538,7 +6219,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF VARTYPE(tcIndentation) # 'C'
tcIndentation = ''
ENDIF
-
+
*-- Quito las líneas en blanco luego del final del ENDPROC
X = 0
FOR I = lnFin TO 1 STEP -1
@@ -5550,7 +6231,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDIF
X = X + 1
ENDFOR
-
+
IF X > 0
lnFin = lnFin - X
DIMENSION laLineas(lnFin)
@@ -5790,18 +6471,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF '.' $ toRegObj.PARENT
*-- Este caso: clase.objeto.objeto ==> se quita clase
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>ADD OBJECT '<>.<>' AS <> <<>>
+ <<>> ADD OBJECT '<>.<>' AS <> <<>>
ENDTEXT
ELSE
*-- Este caso: objeto
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>ADD OBJECT '<>' AS <> <<>>
+ <<>> ADD OBJECT '<>' AS <> <<>>
ENDTEXT
ENDIF
IF NOT EMPTY(lcMemo)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- WITH ;
+ <> ;
<>
ENDTEXT
ENDIF
@@ -5830,7 +6511,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
<>
-
+ <<>>
ENDTEXT
CATCH TO loEx
@@ -5860,18 +6541,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
FOR I = 1 TO lnMethodCount
*-- Genero los métodos indentados
*TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- * <><>PROCEDURE <>
+ * <<>> <>PROCEDURE <>
* <>
- * <>ENDPROC
+ * <<>> ENDPROC
*ENDTEXT
*-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso
- lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + 'PROCEDURE ' + laMethods(I,1)
+ lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + C_PROCEDURE + ' ' + laMethods(I,1)
lcMethods = lcMethods + CR_LF + THIS.IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) )
- lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC'
+ lcMethods = lcMethods + CR_LF + C_TAB + C_ENDPROC
lcMethods = lcMethods + CR_LF
ENDFOR
-
+
C_FB2PRG_CODE = C_FB2PRG_CODE + lcMethods
ENDIF
@@ -5913,20 +6594,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Nombre del método
TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><> <>
+ <<>> <> <>
ENDTEXT
*-- Comentarios del método (si tiene)
IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2))
TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <><>&& <>
+ <<>> && <>
ENDTEXT
ENDIF
*-- Código del método
*TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
* <>
- * <>ENDPROC
+ * <<>> ENDPROC
*ENDTEXT
*-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso
@@ -6006,20 +6687,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes)
FOR I = 1 TO ALEN(taPropsAndValues, 1)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><> = <>
+ <<>> <> = <>
ENDTEXT
lnComment = ASCAN( taPropsAndComments, taPropsAndValues(I,1), 1, 0, 1, 8)
IF lnComment > 0 AND NOT EMPTY(taPropsAndComments(lnComment,2))
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <><>&& <>
+ <<>> && <>
ENDTEXT
ENDIF
ENDFOR
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
-
+ <<>>
ENDTEXT
ENDIF
ENDWITH && THIS
@@ -6057,7 +6738,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
lcPropsMethodsDefd = ''
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><>
+ <<>> <>
ENDTEXT
FOR I = 1 TO tnPropsAndComments_Count
@@ -6071,18 +6752,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
, 'p' )
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><>*<>: <>
+ <<>> *<>: <>
ENDTEXT
IF NOT EMPTY(taPropsAndComments(I,2))
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <><><<'&'>><<'&'>> <>
+ <<>> <<'&'>><<'&'>> <>
ENDTEXT
ENDIF
ENDFOR
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <><>
+ <<>> <>
ENDTEXT
ENDIF
@@ -6115,7 +6796,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Comentario de la clase
IF NOT EMPTY(toRegClass.RESERVED7) THEN
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
- <><><<'&'+'&'>> <>
+ <<>> <<'&'+'&'>> <>
ENDTEXT
ENDIF
ENDPROC
@@ -6127,7 +6808,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF tnLastClass = 1
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
<<'ENDDEFINE'>>
-
+ <<>>
ENDTEXT
ENDIF
ENDPROC
@@ -6139,7 +6820,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- #INCLUDE
IF NOT EMPTY(toReg.RESERVED8) THEN
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>#INCLUDE "<>"
+ <<>> #INCLUDE "<>"
ENDTEXT
ENDIF
ENDPROC
@@ -6151,11 +6832,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
*-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
-
+ <<>>
ENDTEXT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+8
- <><>
+ <<>> <>
Baseclass="<>"
Timestamp="<>"
Scale="<>"
@@ -6193,7 +6874,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF NOT EMPTY(tcHiddenProp)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>HIDDEN <>
+ <<>> HIDDEN <>
ENDTEXT
ENDIF
ENDPROC
@@ -6220,7 +6901,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
IF NOT EMPTY(tcProtectedProp)
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>PROTECTED <>
+ <<>> PROTECTED <>
ENDTEXT
ENDIF
ENDPROC
@@ -6231,7 +6912,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 + '>'
@@ -6240,7 +6921,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
ENDTEXT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>>
+ <<>> platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>>
ENDTEXT
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2
@@ -6311,15 +6992,14 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base
supgroup="<>" supvalchng="<>" supexpr="<>" >
ENDTEXT
- * <>tag="<>"
TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2
- <>>]]>
- <>>]]>
- <>>]]>
- <>>]]>
- <>