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_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 + + + + + + + + + + + + + + + depto + + .T. + + + + + + +
"Depto.Caption"aaaaaaaaaa
+ + + 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 + + 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 + + + +
"Nombre:"
+
+ + + + + + 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 + '>', '', 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 + '>', '', 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 + '>', '', 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 + '>', '', 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 + '>', '', 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 + '>', '', 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 + '>', '', 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 + '>', '', 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 + '>', '', 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 + '>', '', 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 + '>', '', 1, 0 ) - THIS.Add_Property( '_' + lcPropName, lcValue ) + THIS.ADDPROPERTY( '_' + lcPropName, lcValue ) ENDCASE ENDFOR ENDIF