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/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/foxbin2prg.prg b/foxbin2prg.prg
index ea6c7dd..9111f14 100644
--- a/foxbin2prg.prg
+++ b/foxbin2prg.prg
@@ -226,10 +226,10 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#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"'
+ + '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:"
@@ -241,15 +241,15 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#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'
-
+
#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"'
+ + '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:"
@@ -262,7 +262,7 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro
#DEFINE C_BACKLINK_CANT_UPDATE_BL_LOC 'Could not update backlink'
#DEFINE C_BACKLINK_OF_TABLE_LOC 'of table'
-#ENDIF
+#ENDIF
*******************************************************************************************************************
PUBLIC goCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG'
@@ -370,7 +370,21 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
PROCEDURE Ejecutar
- LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug, tcDontShowProgress
+ *--------------------------------------------------------------------------------------------------------------
+ * 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 ;
@@ -431,10 +445,14 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
*-- Evaluación de FileSpec de entrada
DO CASE
CASE '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile )
- MESSAGEBOX( ASTERISK_EXT_NOT_ALLOWED_LOC, 0+48+4096, 'FOXBIN2PRG: ERROR!!', 10000 )
+ 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
+ *-- 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'
@@ -465,12 +483,12 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
ENDIF
IF FILE( lcFile )
- lnResp = THIS.Convertir( lcFile )
+ lnResp = THIS.Convertir( lcFile, toModulo, toEx, tlRelanzarError )
ENDIF
ENDFOR
OTHERWISE
- *-- Un archivo individual
+ *-- UN ARCHIVO INDIVIDUAL
IF FILE(tc_InputFile)
CD (JUSTPATH(tc_InputFile))
THIS.c_LogFile = tc_InputFile + '.LOG'
@@ -482,23 +500,28 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
THIS.writeLog( THIS.c_Foxbin2prg_FullPath + ' - FileSpec: ' + EVL(tc_InputFile,'') )
ENDIF
- lnResp = THIS.Convertir( tc_InputFile )
+ lnResp = THIS.Convertir( tc_InputFile, toModulo, toEx, tlRelanzarError )
ENDIF
ENDCASE
ENDCASE
- CATCH TO loEx
+ CATCH TO toEx
IF llExisteConfig
- THIS.writeLog( 'ERROR: ' + TRANSFORM(loEx.ERRORNO) + ', ' + loEx.MESSAGE + CR_LF ;
- + loEx.PROCEDURE + ', line ' + TRANSFORM(loEx.LINENO) + CR_LF ;
- + loEx.DETAILS )
+ 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
- THIS.o_Frm_Avance.HIDE()
- THIS.o_Frm_Avance.RELEASE()
- STORE NULL TO THIS.o_Frm_Avance
+ 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
@@ -506,6 +529,13 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM
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
@@ -814,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
@@ -9042,9 +9073,11 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
+ + [] ;
+ [] ;
+ [] ;
+ [] ;
@@ -9055,31 +9088,32 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
+ [] ;
+ []
- *PROTECTED __ObjectID, __ObjectType
+
__ObjectID = 0
_Name = ''
- FUNCTION Add_Property
+ FUNCTION add_Property
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tcPropertyName (v! IN ) Nombre de la propiedad a agregar o modificar
+ * teValue (v! IN ) Valor de la propiedad
+ *---------------------------------------------------------------------------------------------------
LPARAMETERS tcPropertyName, teValue
-
+
LOCAL lnPropertyID, tcDataType, leValue, llRetorno, lnDataLen
lnPropertyID = THIS.getDBCPropertyIDByName( SUBSTR(tcPropertyName,2) )
-
- *IF LOWER(tcPropertyName) = '_displogin'
- * SET STEP ON
- *ENDIF
-
+
IF lnPropertyID = -1
IF PCOUNT()=1
- llRetorno = THIS.AddProperty( tcPropertyName )
+ llRetorno = THIS.ADDPROPERTY( tcPropertyName )
ELSE
- llRetorno = THIS.AddProperty( tcPropertyName, teValue )
+ llRetorno = THIS.ADDPROPERTY( tcPropertyName, teValue )
ENDIF
ELSE
tcDataType = THIS.getDBCPropertyValueTypeByPropertyID( lnPropertyID )
lnDataLen = LEN(teValue)
-
+
DO CASE
CASE tcDataType = 'L'
IF lnDataLen = 0
@@ -9104,18 +9138,132 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
ENDCASE
- *IF LOWER(tcPropertyName) = '_isunique' AND VARTYPE(leValue)<>'N'
- * SET STEP ON
- *ENDIF
-
-
- llRetorno = THIS.AddProperty( tcPropertyName, leValue )
+ llRetorno = THIS.ADDPROPERTY( tcPropertyName, leValue )
ENDIF
-
+
RETURN llRetorno
ENDFUNC
+ PROCEDURE getAllPropertiesFromObjectname
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tcName (v! IN ) Nombre del objeto
+ * tcType (v! IN ) Tipo de objeto (Table, Index, Field, View, Relation)
+ * taProperties (@! OUT) Array con las propiedades encontradas y sus valores
+ * tnProperty_Count (@! OUT) Cantidad de propiedades encontradas
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tcName, tcType, taProperties, tnProperty_Count
+
+ EXTERNAL ARRAY taProperties && STRUCTURE: PropName,RecordLen,DataIDLen,DataID,DataType,Data
+
+ TRY
+ LOCAL lcValue, leValue, lnSelect, laProperty(1,1), lnRecordLen, lcBinRecord, lnPropertyID ;
+ , lnLastPos, lnLenCCode, lcDataType, lcPropName, lcDBF, lnLenData, lnLenHeader
+ tnProperty_Count = 0
+ lnSelect = SELECT()
+ leValue = ''
+ tcName = PROPER(RTRIM(tcName))
+ tcType = PROPER(RTRIM(tcType))
+ tcProperty = PROPER(RTRIM(tcProperty))
+ lcDBF = DBF()
+
+ SELECT 0
+ USE (lcDBF) AGAIN SHARED NOUPDATE ALIAS C_TABLABIN2
+
+ IF INLIST( tcType, 'Index', 'Field' )
+ SELECT TB.Property FROM C_TABLABIN2 TB ;
+ INNER JOIN C_TABLABIN2 TB2 ON STR(TB.ParentID)+TB.ObjectType+LOWER(TB.objectName) = STR(TB2.ObjectID)+PADR(tcType,10)+PADR(LOWER(JUSTEXT(tcName)),128) ;
+ AND TB2.objectName = PADR(LOWER(JUSTSTEM(tcName)),128) ;
+ INTO ARRAY laProperty
+
+ ELSE
+ SELECT TB.Property FROM C_TABLABIN2 TB ;
+ INNER JOIN C_TABLABIN2 TB2 ON STR(TB.ParentID)+TB.ObjectType+LOWER(TB.objectName) = STR(TB2.ObjectID)+PADR(tcType,10)+PADR(LOWER(tcName),128) ;
+ INTO ARRAY laProperty
+
+ ENDIF
+
+ IF _TALLY > 0
+ IF EMPTY(laProperty(1,1))
+ EXIT
+ ENDIF
+
+ lnLastPos = 1
+
+ DO WHILE lnLastPos < LEN(laProperty(1,1))
+ tnProperty_Count = tnProperty_Count + 1
+ DIMENSION taProperties( tnProperty_Count,6 )
+
+ lnRecordLen = CTOBIN( SUBSTR(laProperty(1,1), lnLastPos, 4), "4RS" )
+ lcBinRecord = SUBSTR(laProperty(1,1), lnLastPos, lnRecordLen)
+ lnLenCCode = CTOBIN( SUBSTR(lcBinRecord, 4+1, 2), "2RS" )
+ lnPropertyID = ASC( SUBSTR(lcBinRecord, 4+2+1, lnLenCCode) )
+ lcPropName = THIS.getDBCPropertyNameByID( lnPropertyID )
+ lcDataType = THIS.getDBCPropertyValueTypeByPropertyID( lnPropertyID )
+ lnLenHeader = 4 + 2 + lnLenCCode
+ lcValue = SUBSTR(lcBinRecord, lnLenHeader + 1)
+
+ DO CASE
+ CASE lcDataType = 'B'
+ IF lnLenHeader = lnRecordLen
+ leValue = 0
+ ELSE
+ leValue = ASC( lcValue )
+ ENDIF
+
+ CASE lcDataType = 'L'
+ IF lnLenHeader = lnRecordLen
+ leValue = .F.
+ ELSE
+ leValue = ( CTOBIN( lcValue, "1S" ) = 1 )
+ ENDIF
+
+ CASE lcDataType = 'N'
+ IF lnLenHeader = lnRecordLen
+ leValue = 0
+ ELSE
+ leValue = CTOBIN( lcValue, "4S" )
+ ENDIF
+
+ OTHERWISE && Asume 'C'
+ IF lnLenHeader = lnRecordLen
+ leValue = ''
+ ELSE
+ leValue = LEFT( lcValue, AT( CHR(0), lcValue ) - 1 )
+ ENDIF
+ ENDCASE
+
+ taProperties( tnProperty_Count,1 ) = lcPropName
+ taProperties( tnProperty_Count,2 ) = lnRecordLen
+ taProperties( tnProperty_Count,3 ) = lnLenCCode
+ taProperties( tnProperty_Count,4 ) = lnPropertyID
+ taProperties( tnProperty_Count,5 ) = lcDataType
+ taProperties( tnProperty_Count,6 ) = leValue
+
+ lnLastPos = lnLastPos + lnRecordLen
+ ENDDO
+ ELSE
+ ERROR 1562, (tcName)
+ ENDIF
+
+
+ CATCH TO loEx
+ IF THIS.l_Debug AND _VFP.STARTMODE = 0
+ SET STEP ON
+ ENDIF
+
+ THROW
+
+ FINALLY
+ USE IN (SELECT("C_TABLABIN2"))
+ SELECT (lnSelect)
+ ENDTRY
+
+ RETURN leValue
+ ENDPROC
+
+
PROCEDURE getDBCPropertyIDByName
*---------------------------------------------------------------------------------------------------
* PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
@@ -9269,6 +9417,158 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
ENDPROC
+ PROCEDURE getDBCPropertyNameByID
+ *---------------------------------------------------------------------------------------------------
+ * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
+ * tcPropertyID (v! IN ) Nombre de la propiedad
+ * tlRethrowError (v? IN ) Indica si se debe relanzar el error o solo devolver -1
+ *---------------------------------------------------------------------------------------------------
+ LPARAMETERS tnPropertyID, tlRethrowError
+ LOCAL lcPropertyName
+
+ DO CASE
+ CASE tnPropertyID = 0
+ lcPropertyName = 'null'
+ CASE tnPropertyID = 1
+ lcPropertyName = 'path'
+ CASE tnPropertyID = 2
+ lcPropertyName = 'class'
+ CASE tnPropertyID = 7
+ lcPropertyName = 'comment'
+ CASE tnPropertyID = 9
+ lcPropertyName = 'ruleexpression'
+ CASE tnPropertyID = 10
+ lcPropertyName = 'ruletext'
+ CASE tnPropertyID = 11
+ lcPropertyName = 'defaultvalue'
+ CASE tnPropertyID = 12
+ lcPropertyName = 'parameterlist'
+ CASE tnPropertyID = 13
+ lcPropertyName = 'childtag'
+ CASE tnPropertyID = 14
+ lcPropertyName = 'inserttrigger'
+ CASE tnPropertyID = 15
+ lcPropertyName = 'updatetrigger'
+ CASE tnPropertyID = 16
+ lcPropertyName = 'deletetrigger'
+ CASE tnPropertyID = 17
+ lcPropertyName = 'isunique'
+ CASE tnPropertyID = 18
+ lcPropertyName = 'parenttable'
+ CASE tnPropertyID = 19
+ lcPropertyName = 'parenttag'
+ CASE tnPropertyID = 20
+ lcPropertyName = 'primarykey'
+ CASE tnPropertyID = 24
+ lcPropertyName = 'version'
+ CASE tnPropertyID = 28
+ lcPropertyName = 'batchupdatecount'
+ CASE tnPropertyID = 29
+ lcPropertyName = 'datasource'
+ CASE tnPropertyID = 32
+ lcPropertyName = 'connectname'
+ CASE tnPropertyID = 35
+ lcPropertyName = 'updatename'
+ CASE tnPropertyID = 36
+ lcPropertyName = 'fetchmemo'
+ CASE tnPropertyID = 37
+ lcPropertyName = 'fetchsize'
+ CASE tnPropertyID = 38
+ lcPropertyName = 'keyfield'
+ CASE tnPropertyID = 39
+ lcPropertyName = 'maxrecords'
+ CASE tnPropertyID = 40
+ lcPropertyName = 'shareconnection'
+ CASE tnPropertyID = 41
+ lcPropertyName = 'sourcetype'
+ CASE tnPropertyID = 42
+ lcPropertyName = 'sql'
+ CASE tnPropertyID = 43
+ lcPropertyName = 'tables'
+ CASE tnPropertyID = 44
+ lcPropertyName = 'sendupdates'
+ CASE tnPropertyID = 45
+ lcPropertyName = 'updatablefield'
+ CASE tnPropertyID = 46
+ lcPropertyName = 'updatetype'
+ CASE tnPropertyID = 47
+ lcPropertyName = 'usememosize'
+ CASE tnPropertyID = 48
+ lcPropertyName = 'wheretype'
+ CASE tnPropertyID = 50
+ lcPropertyName = 'displayclass' && Undocumented
+ CASE tnPropertyID = 51
+ lcPropertyName = 'displayclasslibrary' && Undocumented
+ CASE tnPropertyID = 54
+ lcPropertyName = 'inputmask' && Undocumented
+ CASE tnPropertyID = 55
+ lcPropertyName = 'format' && Undocumented
+ CASE tnPropertyID = 56
+ lcPropertyName = 'caption'
+ CASE tnPropertyID = 64
+ lcPropertyName = 'asynchronous'
+ CASE tnPropertyID = 65
+ lcPropertyName = 'batchmode'
+ CASE tnPropertyID = 66
+ lcPropertyName = 'connectstring'
+ CASE tnPropertyID = 67
+ lcPropertyName = 'connecttimeout'
+ CASE tnPropertyID = 68
+ lcPropertyName = 'displogin'
+ CASE tnPropertyID = 69
+ lcPropertyName = 'dispwarnings'
+ CASE tnPropertyID = 70
+ lcPropertyName = 'idletimeout'
+ CASE tnPropertyID = 71
+ lcPropertyName = 'querytimeout'
+ CASE tnPropertyID = 72
+ lcPropertyName = 'password'
+ CASE tnPropertyID = 73
+ lcPropertyName = 'transactions'
+ CASE tnPropertyID = 74
+ lcPropertyName = 'userid'
+ CASE tnPropertyID = 75
+ lcPropertyName = 'waittime'
+ CASE tnPropertyID = 76
+ lcPropertyName = 'timestamp'
+ CASE tnPropertyID = 77
+ lcPropertyName = 'datatype'
+ CASE tnPropertyID = 78
+ lcPropertyName = 'packetsize' && Undocumented
+ CASE tnPropertyID = 79
+ lcPropertyName = 'database' && Undocumented
+ CASE tnPropertyID = 80
+ lcPropertyName = 'prepared' && Undocumented
+ CASE tnPropertyID = 81
+ lcPropertyName = 'comparememo' && Undocumented
+ CASE tnPropertyID = 82
+ lcPropertyName = 'fetchasneeded' && Undocumented
+ CASE tnPropertyID = 83
+ lcPropertyName = 'offline' && Undocumented
+ CASE tnPropertyID = 84
+ lcPropertyName = 'recordcount' && Undocumented
+ CASE tnPropertyID = 85
+ lcPropertyName = 'undocumented_view_prop_85' && Undocumented
+ CASE tnPropertyID = 86
+ lcPropertyName = 'dbcevents' && Undocumented
+ CASE tnPropertyID = 87
+ lcPropertyName = 'dbceventfilename' && Undocumented
+ CASE tnPropertyID = 88
+ lcPropertyName = 'allowsimultaneousfetch' && Undocumented
+ CASE tnPropertyID = 89
+ lcPropertyName = 'disconnectrollback' && Undocumented
+ OTHERWISE
+ IF tlRethrowError
+ ERROR 1559, (TRANSFORM(tnPropertyID))
+ ELSE
+ lcPropertyName = ''
+ ENDIF
+ ENDCASE
+
+ RETURN lcPropertyName
+ ENDPROC
+
+
PROCEDURE getDBCPropertyValueTypeByPropertyID
*---------------------------------------------------------------------------------------------------
* PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT)
@@ -9288,8 +9588,12 @@ DEFINE CLASS CL_DBC_BASE AS CL_CUS_BASE
CASE INLIST(tnPropertyID,24,28,37,39,47,67,70,71,75,76,78,84,85)
lcValueType = 'N'
- OTHERWISE
+ CASE INLIST(tnPropertyID,0,1,7,9,10,11,12,13,14,15,16,18,19,20,29,30,32,35) ;
+ OR INLIST(tnPropertyID,42,43,49,50,51,54,55,56,66,67,72,74,77,79,87)
lcValueType = 'C'
+
+ OTHERWISE
+ ERROR 'Propiedad [' + TRANSFORM(tnPropertyID) + '] no reconocida.'
ENDCASE
RETURN lcValueType
@@ -9691,7 +9995,7 @@ DEFINE CLASS CL_DBC AS CL_DBC_BASE
* ID
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.add_Property( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -9723,25 +10027,25 @@ DEFINE CLASS CL_DBC AS CL_DBC_BASE
*---------------------------------------------------------------------------------------------------
LPARAMETERS tcLine, taCodeLines, I, tnCodeLines
- IF LEFT(tcLine, LEN(C_STORED_PROC_I)) == C_STORED_PROC_I
- LOCAL lcValue
- lcValue = ''
- llBloqueEncontrado = .T.
+ IF LEFT(tcLine, LEN(C_STORED_PROC_I)) == C_STORED_PROC_I
+ LOCAL lcValue
+ lcValue = ''
+ llBloqueEncontrado = .T.
- FOR I = I + 1 TO tnCodeLines
- THIS.set_Line( @tcLine, @taCodeLines, I )
+ FOR I = I + 1 TO tnCodeLines
+ THIS.set_Line( @tcLine, @taCodeLines, I )
- DO CASE
- CASE C_STORED_PROC_F $ tcLine && Fin
- EXIT
+ DO CASE
+ CASE C_STORED_PROC_F $ tcLine && Fin
+ EXIT
- OTHERWISE && Línea de Stored Procedure
- lcValue = lcValue + CR_LF + taCodeLines(I)
- ENDCASE
- ENDFOR
+ OTHERWISE && Línea de Stored Procedure
+ lcValue = lcValue + CR_LF + taCodeLines(I)
+ ENDCASE
+ ENDFOR
- THIS.AddProperty( '_StoredProcedures', SUBSTR(lcValue,3) )
- ENDIF
+ THIS.ADDPROPERTY( '_StoredProcedures', SUBSTR(lcValue,3) )
+ ENDIF
ENDPROC
@@ -9774,12 +10078,12 @@ DEFINE CLASS CL_DBC AS CL_DBC_BASE
lcMemoWithProperties = THIS.getBinMemoFromProperties()
UPDATE TABLABIN ;
SET Property = lcMemoWithProperties ;
- WHERE STR(ParentID) + ObjectType + LOWER(ObjectName) = STR(1) + PADR('Database',10) + PADR(LOWER('Database'),128)
+ WHERE STR(ParentID) + ObjectType + LOWER(objectName) = STR(1) + PADR('Database',10) + PADR(LOWER('Database'),128)
IF NOT EMPTY(THIS._StoredProcedures)
UPDATE TABLABIN ;
- SET Code = THIS._StoredProcedures ;
- WHERE STR(ParentID) + ObjectType + LOWER(ObjectName) = STR(1) + PADR('Database',10) + PADR(LOWER('StoredProceduresSource'),128)
+ SET CODE = THIS._StoredProcedures ;
+ WHERE STR(ParentID) + ObjectType + LOWER(objectName) = STR(1) + PADR('Database',10) + PADR(LOWER('StoredProceduresSource'),128)
ENDIF
loTables.updateDBC( tc_OutputFile, @tnLastID, tnParentID )
@@ -9836,10 +10140,10 @@ DEFINE CLASS CL_DBC AS CL_DBC_BASE
*-- Views
loViews = THIS._Views
lcText = lcText + loViews.toText()
-
- SELECT Code ;
+
+ SELECT CODE ;
FROM TABLABIN ;
- WHERE STR(ParentID) + ObjectType + LOWER(ObjectName) = STR(1) + PADR('Database',10) + PADR(LOWER('StoredProceduresSource'),128) ;
+ WHERE STR(ParentID) + ObjectType + LOWER(objectName) = STR(1) + PADR('Database',10) + PADR(LOWER('StoredProceduresSource'),128) ;
INTO ARRAY laCode
THIS._StoredProcedures = laCode(1,1)
@@ -10081,7 +10385,7 @@ DEFINE CLASS CL_DBC_CONNECTION AS CL_DBC_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.add_Property( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -10398,7 +10702,7 @@ DEFINE CLASS CL_DBC_TABLE AS CL_DBC_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.add_Property( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -10706,7 +11010,7 @@ DEFINE CLASS CL_DBC_FIELD_DB AS CL_DBC_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.add_Property( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -10973,7 +11277,7 @@ DEFINE CLASS CL_DBC_INDEX_DB AS CL_DBC_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.add_Property( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -11303,7 +11607,7 @@ DEFINE CLASS CL_DBC_VIEW AS CL_DBC_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.add_Property( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -11667,7 +11971,7 @@ DEFINE CLASS CL_DBC_FIELD_VW AS CL_DBC_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.add_Property( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -11942,7 +12246,7 @@ DEFINE CLASS CL_DBC_RELATION AS CL_DBC_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.add_Property( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -12115,7 +12419,7 @@ DEFINE CLASS CL_DBF_TABLE AS CL_CUS_BASE
* ID
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.ADDPROPERTY( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -12402,7 +12706,7 @@ DEFINE CLASS CL_DBF_FIELD AS CL_CUS_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.ADDPROPERTY( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF
@@ -12652,7 +12956,7 @@ DEFINE CLASS CL_DBF_INDEX AS CL_CUS_BASE
* NOMBRE
lcPropName = STREXTRACT( tcLine, '<', '>', 1, 0 )
lcValue = STREXTRACT( tcLine, '<' + lcPropName + '>', '' + lcPropName + '>', 1, 0 )
- THIS.Add_Property( '_' + lcPropName, lcValue )
+ THIS.ADDPROPERTY( '_' + lcPropName, lcValue )
ENDCASE
ENDFOR
ENDIF