diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__doBackup.PRG b/TESTS/(name_conflict)_ut__foxbin2prg__c_conversor_base__doBackup.PRG similarity index 100% rename from TESTS/ut__foxbin2prg__c_conversor_base__doBackup.PRG rename to TESTS/(name_conflict)_ut__foxbin2prg__c_conversor_base__doBackup.PRG diff --git a/TESTS/DATOS_READONLY/FB2P_DBC.DC2 b/TESTS/DATOS_READONLY/FB2P_DBC.DC2 new file mode 100644 index 0000000..c3d3542 --- /dev/null +++ b/TESTS/DATOS_READONLY/FB2P_DBC.DC2 @@ -0,0 +1,1013 @@ +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!! +* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!! +*-------------------------------------------------------------------------------------------------------------------------------------------------------- +*< FOXBIN2PRG: Version="1.15" SourceFile="C:\DESA\FOXBIN2PRG\TESTS\DATOS_READONLY\FB2P_DBC.DBC" Generated="2013/12/17 16:01:00" /> (Para uso con Visual FoxPro 9.0) +* + + + FB2P_DBC + Comentario de los eventos o de la BDD??? + 11 + .T. + + + + + REMOTE_CONNECTION_DBF + + Visual FoxPro Tables + foxuser_fdb + + .F. + .T. + 15 + .F. + 1 + .F. + 0 + 4096 + + 0 + 1 + + 100 + + + REMOTE_CONNECTION_ORACLE + + + + DRIVER={Oracle en OraClient11g_home1};SERVER=CARTERA;UID=STROSNC;PWD=STROSNC;DBQ=CARTERA;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;MLD=0;ODA= + .F. + .T. + 15 + .F. + 3 + .F. + 10 + 8192 + + 180 + 1 + + 100 + + + + + + + + FB2P_DEPTO + Comentario de "fb2p_depto" + fb2p_depto.dbf + __ri_delete_fb2p_depto() + + + depto + fb2p_depto_record_rule_validation() + fb2p_depto_record_rule_validation_message() + + + + depto + + depto_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/DATOS_READONLY/eventsfile.prg b/TESTS/DATOS_READONLY/eventsfile.prg new file mode 100644 index 0000000..d9c245e --- /dev/null +++ b/TESTS/DATOS_READONLY/eventsfile.prg @@ -0,0 +1,2 @@ +LPARAMETERS p1, p2, p3, p4, p5 +RETURN diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dbc b/TESTS/DATOS_READONLY/fb2p_dbc.dbc index c72c78c..1fe1b2d 100644 Binary files a/TESTS/DATOS_READONLY/fb2p_dbc.dbc and b/TESTS/DATOS_READONLY/fb2p_dbc.dbc differ diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dct b/TESTS/DATOS_READONLY/fb2p_dbc.dct index 078324e..8bb3886 100644 Binary files a/TESTS/DATOS_READONLY/fb2p_dbc.dct and b/TESTS/DATOS_READONLY/fb2p_dbc.dct differ diff --git a/TESTS/DATOS_READONLY/fb2p_dbc.dcx b/TESTS/DATOS_READONLY/fb2p_dbc.dcx index 2580acb..28b66e7 100644 Binary files a/TESTS/DATOS_READONLY/fb2p_dbc.dcx and b/TESTS/DATOS_READONLY/fb2p_dbc.dcx differ diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.cdx b/TESTS/DATOS_READONLY/fb2p_dbf.cdx new file mode 100644 index 0000000..5a8f839 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbf.cdx differ diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.dbf b/TESTS/DATOS_READONLY/fb2p_dbf.dbf new file mode 100644 index 0000000..7f86409 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbf.dbf differ diff --git a/TESTS/DATOS_READONLY/fb2p_dbf.fpt b/TESTS/DATOS_READONLY/fb2p_dbf.fpt new file mode 100644 index 0000000..601fa8d Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_dbf.fpt differ diff --git a/TESTS/DATOS_READONLY/fb2p_depto.cdx b/TESTS/DATOS_READONLY/fb2p_depto.cdx new file mode 100644 index 0000000..49e7ef2 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_depto.cdx differ diff --git a/TESTS/DATOS_READONLY/fb2p_depto.dbf b/TESTS/DATOS_READONLY/fb2p_depto.dbf new file mode 100644 index 0000000..d946bdf Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_depto.dbf differ diff --git a/TESTS/DATOS_READONLY/fb2p_free.cdx b/TESTS/DATOS_READONLY/fb2p_free.cdx new file mode 100644 index 0000000..b5004ca Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_free.cdx differ diff --git a/TESTS/DATOS_READONLY/fb2p_free.dbf b/TESTS/DATOS_READONLY/fb2p_free.dbf new file mode 100644 index 0000000..72cf766 Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_free.dbf differ diff --git a/TESTS/DATOS_READONLY/fb2p_free.fpt b/TESTS/DATOS_READONLY/fb2p_free.fpt new file mode 100644 index 0000000..601fa8d Binary files /dev/null and b/TESTS/DATOS_READONLY/fb2p_free.fpt differ diff --git a/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbc.prg b/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbc.prg new file mode 100644 index 0000000..3b245ad --- /dev/null +++ b/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbc.prg @@ -0,0 +1,148 @@ +DEFINE CLASS ft__foxbin2prg__c_conversor_prg_a_dbc AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ft__foxbin2prg__c_conversor_prg_a_dbc OF ft__foxbin2prg__c_conversor_prg_a_dbc.PRG + #ENDIF + + #DEFINE C_FB2P_VALUE_I '' + #DEFINE C_FB2P_VALUE_F '' + #DEFINE CR_LF CHR(13) + CHR(10) + #DEFINE C_CR CHR(13) + #DEFINE C_LF CHR(10) + #DEFINE C_TAB CHR(9) + #DEFINE C_PROC 'PROCEDURE' + #DEFINE C_ENDPROC 'ENDPROC' + #DEFINE C_TEXT 'TEXT' + #DEFINE C_ENDTEXT 'ENDTEXT' + #DEFINE C_IF_F '#IF .F.' + #DEFINE C_ENDIF '#ENDIF' + #DEFINE C_DEFINE_CLASS 'DEFINE CLASS' + #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE' + icObj = NULL + + + ******************************************************************************************************************************************* + FUNCTION SETUP + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + *LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG') + oFXU_LIB.setup_comun() + + *THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG") + *loObj = THIS.icObj + *loObj.l_Test = .F. + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION TearDown + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + THIS.icObj = NULL + + IF VARTYPE(oFXU_LIB) = "O" + oFXU_LIB.teardown_comun() + oFXU_LIB = NULL + ENDIF + RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Evaluate_results + LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado + + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + + IF ISNULL(toEx) + *-- Validaciones en método + ELSE + *-- Evaluación de errores + THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) ) + THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) ) + IF NOT INLIST( toEx.ERRORNO, 1098, 2071 ) && Error del usuario (ERROR y THROW) + THIS.messageout( TRANSFORM(toEx.LINECONTENTS) ) + ENDIF + + THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' ) + ENDIF + + THIS.messageout( '' ) + THIS.messageout( REPLICATE('*',80) ) + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_FB2P_DBC_DC2_YRegenerarEl_DBC_ConTodosSusObjetos + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X, lcDC2, lcDC3 ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ; + , loEx AS EXCEPTION + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + TRY + loEx = NULL + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'FB2P_DBC.DBC' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') ) + oFXU_LIB.copiarArchivosParaTest( 'EVENTSFILE.PRG' ) + + *-- Genero el DC2 + loCnv.Ejecutar( FORCEEXT(lc_File,'DBC'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Regenero el DBC + loCnv.Ejecutar( FORCEEXT(lc_File,'DC2'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Renombro el DC2 a DC3 (ORIGINAL) + RENAME (FORCEEXT(lc_OutputFile,'DC2')) TO (FORCEEXT(lc_OutputFile,'DC3')) + *-- Genero el DC2 desde el DBC regenerado + *WAIT WINDOW TIMEOUT 2 && Para forzar una diferencia de 2 segundos entre el DC2 y el DC3 + loCnv.Ejecutar( FORCEEXT(lc_File,'DBC'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + *-- Comparo los DC2 y DC3 + lcDC2 = STREXTRACT( FILETOSTR( FORCEEXT(lc_File,'DC2') ), '', '' ) + lcDC3 = STREXTRACT( FILETOSTR( FORCEEXT(lc_File,'DC3') ), '', '' ) + + + *-- Visualización de valores + THIS.messageout( 'Bytes DC3: ' + TRANSFORM(LEN(lcDC3)) ) + THIS.messageout( 'Bytes DC2: ' + TRANSFORM(LEN(lcDC2)) ) + + + *-- Evaluación de valores + this.assertequals( lcDC2, lcDC3, '[Comparación DC2 y DC3]' ) + + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + +ENDDEFINE diff --git a/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbf.prg b/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbf.prg new file mode 100644 index 0000000..1cc0ea2 --- /dev/null +++ b/TESTS/ft__foxbin2prg__c_conversor_prg_a_dbf.prg @@ -0,0 +1,367 @@ +DEFINE CLASS ft__foxbin2prg__c_conversor_prg_a_dbf AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS ft__foxbin2prg__c_conversor_prg_a_dbf OF ft__foxbin2prg__c_conversor_prg_a_dbf.PRG + #ENDIF + + #DEFINE C_FB2P_VALUE_I '' + #DEFINE C_FB2P_VALUE_F '' + #DEFINE CR_LF CHR(13) + CHR(10) + #DEFINE C_CR CHR(13) + #DEFINE C_LF CHR(10) + #DEFINE C_TAB CHR(9) + #DEFINE C_PROC 'PROCEDURE' + #DEFINE C_ENDPROC 'ENDPROC' + #DEFINE C_TEXT 'TEXT' + #DEFINE C_ENDTEXT 'ENDTEXT' + #DEFINE C_IF_F '#IF .F.' + #DEFINE C_ENDIF '#ENDIF' + #DEFINE C_DEFINE_CLASS 'DEFINE CLASS' + #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE' + icObj = NULL + + + ******************************************************************************************************************************************* + FUNCTION SETUP + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + *LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG') + oFXU_LIB.setup_comun() + + *THIS.icObj = NEWOBJECT("c_conversor_base", "FOXBIN2PRG.PRG") + *loObj = THIS.icObj + *loObj.l_Test = .F. + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION TearDown + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + THIS.icObj = NULL + + IF VARTYPE(oFXU_LIB) = "O" + oFXU_LIB.teardown_comun() + oFXU_LIB = NULL + ENDIF + RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Evaluate_results + LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado + + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + + IF ISNULL(toEx) + *-- Validaciones en método + ELSE + *-- Evaluación de errores + THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) ) + THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) ) + IF NOT INLIST( toEx.ERRORNO, 1098, 2071 ) && Error del usuario (ERROR y THROW) + THIS.messageout( TRANSFORM(toEx.LINECONTENTS) ) + ENDIF + + THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' ) + ENDIF + + THIS.messageout( '' ) + THIS.messageout( REPLICATE('*',80) ) + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_FB2P_FREE_DB2_YValidarQueGenereUn_DBF_ConTodosLosCamposYLasMismasDefinicionesYOrden + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ; + , loEx AS EXCEPTION + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + TRY + loEx = NULL + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'FB2P_FREE.DB2' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( lc_File ) + + loCnv.Ejecutar( lc_File, '', '', '', '1', '0', '1',.F.,.F.,.T. ) + + SELECT 0 + USE (FORCEEXT(lc_InputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN + SELECT 0 + USE (FORCEEXT(lc_OutputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS TABLABIN + lnFields_OUT = AFIELDS( laCampos_OUT, 'TABLABIN' ) + lnFields_IN = AFIELDS( laCampos_IN, 'ARCHIVOBIN_IN' ) + + + *-- Visualización de valores + THIS.messageout( 'Cantidad de campos: ' + TRANSFORM(lnFields_OUT) ) + THIS.messageout( '' ) + THIS.messageout( PADR('Nombre',12) + ' ' + PADC('Tipo',4) + ' ' + PADL('Long',4) + ' ' + PADL('Dec',4) ) + THIS.messageout( PADR('----------',12) + ' ' + PADC('----',4) + ' ' + PADL('----',4) + ' ' + PADL('---',4) ) + + FOR I = 1 TO lnFields_IN + THIS.messageout( PADR(laCampos_IN(I,1),12) + ' ' + PADC(laCampos_IN(I,2),4) + ' ' + PADL(laCampos_IN(I,3),4) + ' ' + PADL(laCampos_IN(I,4),4) ) + ENDFOR + + THIS.messageout( PADR('----------',12) + ' ' + PADC('----',4) + ' ' + PADL('----',4) + ' ' + PADL('---',4) ) + + + *-- Evaluación de valores + this.assertequals( lnFields_OUT, lnFields_IN, '[Cantidad de campos IN y OUT]' ) + + FOR I = 1 TO lnFields_IN + FOR X = 1 TO 18 + THIS.assertequals( laCampos_IN(I,X), laCampos_OUT(I,X), '[Comparando estructura del campo ' + laCampos_IN(I,1) + ']' ) + ENDFOR + ENDFOR + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaElArchivo_FB2P_FREE_DB2_YValidarQueGenereUn_DBF_ConLosMismosIndices + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laIndices_IN(1,18), laIndices_OUT(1,18), lnIndices_OUT, lnIndices_IN, I, X ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ; + , loEx AS EXCEPTION + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + TRY + loEx = NULL + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'FB2P_FREE.DB2' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( lc_File ) + + loCnv.Ejecutar( lc_File, '', '', '', '1', '0', '1',.F.,.F.,.T. ) + + SELECT 0 + USE (FORCEEXT(lc_InputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN + SELECT 0 + USE (FORCEEXT(lc_OutputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS TABLABIN + lnIndices_IN = ATAGINFO( laIndices_IN, '', 'ARCHIVOBIN_IN' ) + lnIndices_OUT = ATAGINFO( laIndices_OUT, '', 'TABLABIN' ) + + + *-- Visualización de valores + THIS.messageout( 'Cantidad de índices para [' + DBF("TABLABIN") + ']: ' + TRANSFORM(lnIndices_OUT) ) + THIS.messageout( '' ) + THIS.messageout( PADR('Tag',12) + ' ' + PADR('Tipo',12) + ' ' + PADR('Clave',30) + ' ' + PADR('Filtro',30) + ' ' + PADR('Order',12) + ' ' + PADR('Collate',12) ) + THIS.messageout( PADR('----------',12) + ' ' + PADR('----------',12) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------',12) + ' ' + PADR('----------',12) ) + + FOR I = 1 TO lnIndices_OUT + THIS.messageout( PADR(laIndices_OUT(I,1),12) + ' ' + PADR(laIndices_OUT(I,2),12) + ' ' + PADR(laIndices_OUT(I,3),30) + ' ' + PADR(laIndices_OUT(I,4),30) ; + + ' ' + PADR(laIndices_OUT(I,5),12) + ' ' + PADR(laIndices_OUT(I,6),12) ) + ENDFOR + + THIS.messageout( PADR('----------',12) + ' ' + PADR('----------',12) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------',12) + ' ' + PADR('----------',12) ) + + + *-- Evaluación de valores + this.assertequals( lnIndices_OUT, lnIndices_IN, '[Cantidad de campos IN y OUT]' ) + + FOR I = 1 TO lnIndices_IN + FOR X = 1 TO 6 + THIS.assertequals( laIndices_IN(I,X), laIndices_OUT(I,X), '[Comparando estructura del indice ' + laIndices_IN(I,1) + ']' ) + ENDFOR + ENDFOR + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaTabla_FB2P_FREE_DBF_YValidarQueGenereUn_DB2yDBF_ConTodosLosCamposYLasMismasDefinicionesYOrden + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laCampos_IN(1,18), laCampos_OUT(1,18), lnFields_OUT, lnFields_IN, I, X ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ; + , loEx AS EXCEPTION + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + TRY + loEx = NULL + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'FB2P_FREE.DB2' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') ) + + loCnv.Ejecutar( FORCEEXT(lc_File,'DBF'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + loCnv.Ejecutar( FORCEEXT(lc_File,'DB2'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + + SELECT 0 + USE (FORCEEXT(lc_InputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN + SELECT 0 + USE (FORCEEXT(lc_OutputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS TABLABIN + lnFields_OUT = AFIELDS( laCampos_OUT, 'TABLABIN' ) + lnFields_IN = AFIELDS( laCampos_IN, 'ARCHIVOBIN_IN' ) + + + *-- Visualización de valores + THIS.messageout( 'Cantidad de campos: ' + TRANSFORM(lnFields_OUT) ) + THIS.messageout( '' ) + THIS.messageout( PADR('Nombre',12) + ' ' + PADC('Tipo',4) + ' ' + PADL('Long',4) + ' ' + PADL('Dec',4) ) + THIS.messageout( PADR('----------',12) + ' ' + PADC('----',4) + ' ' + PADL('----',4) + ' ' + PADL('---',4) ) + + FOR I = 1 TO lnFields_IN + THIS.messageout( PADR(laCampos_IN(I,1),12) + ' ' + PADC(laCampos_IN(I,2),4) + ' ' + PADL(laCampos_IN(I,3),4) + ' ' + PADL(laCampos_IN(I,4),4) ) + ENDFOR + + THIS.messageout( PADR('----------',12) + ' ' + PADC('----',4) + ' ' + PADL('----',4) + ' ' + PADL('---',4) ) + + + *-- Evaluación de valores + this.assertequals( lnFields_OUT, lnFields_IN, '[Cantidad de campos IN y OUT]' ) + + FOR I = 1 TO lnFields_IN + FOR X = 1 TO 18 + THIS.assertequals( laCampos_IN(I,X), laCampos_OUT(I,X), '[Comparando estructura del campo ' + laCampos_IN(I,1) + ']' ) + ENDFOR + ENDFOR + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_Ejecutar_FOXBIN2PRG_ParaLaTabla_FB2P_FREE_DBF_YValidarQueGenereUn_DB2yDBF_ConLosMismosIndices + LOCAL lnCodError, lnCodError_Esperado ; + , lc_File, lc_InputFile, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado, loReg, lcTipoBinario ; + , laIndices_IN(1,18), laIndices_OUT(1,18), lnIndices_OUT, lnIndices_IN, I, X ; + , loModulo AS CL_CLASE OF "FOXBIN2PRG.PRG" ; + , loCnv AS c_foxbin2prg OF "FOXBIN2PRG.PRG" ; + , loEx AS EXCEPTION + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + TRY + loEx = NULL + loCnv = NEWOBJECT("c_foxbin2prg", "FOXBIN2PRG.PRG") + + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + lc_File = 'FB2P_FREE.DB2' + lc_InputFile = FORCEPATH( lc_File, 'TESTS\DATOS_READONLY' ) + lc_OutputFile = FORCEPATH( lc_File, 'TESTS\DATOS_TEST' ) + lcTipoBinario = UPPER( JUSTEXT( lc_OutputFile ) ) + + oFXU_LIB.copiarArchivosParaTest( FORCEEXT(lc_File,'*') ) + + loCnv.Ejecutar( FORCEEXT(lc_File,'DBF'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + loCnv.Ejecutar( FORCEEXT(lc_File,'DB2'), '', '', '', '1', '0', '1',.F.,.F.,.T. ) + + SELECT 0 + USE (FORCEEXT(lc_InputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN + SELECT 0 + USE (FORCEEXT(lc_OutputFile,'DBF')) SHARED AGAIN NOUPDATE ALIAS TABLABIN + lnIndices_IN = ATAGINFO( laIndices_IN, '', 'ARCHIVOBIN_IN' ) + lnIndices_OUT = ATAGINFO( laIndices_OUT, '', 'TABLABIN' ) + + + *-- Visualización de valores + THIS.messageout( 'Cantidad de índices para [' + DBF("TABLABIN") + ']: ' + TRANSFORM(lnIndices_OUT) ) + THIS.messageout( '' ) + THIS.messageout( PADR('Tag',12) + ' ' + PADR('Tipo',12) + ' ' + PADR('Clave',30) + ' ' + PADR('Filtro',30) + ' ' + PADR('Order',12) + ' ' + PADR('Collate',12) ) + THIS.messageout( PADR('----------',12) + ' ' + PADR('----------',12) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------',12) + ' ' + PADR('----------',12) ) + + FOR I = 1 TO lnIndices_OUT + THIS.messageout( PADR(laIndices_OUT(I,1),12) + ' ' + PADR(laIndices_OUT(I,2),12) + ' ' + PADR(laIndices_OUT(I,3),30) + ' ' + PADR(laIndices_OUT(I,4),30) ; + + ' ' + PADR(laIndices_OUT(I,5),12) + ' ' + PADR(laIndices_OUT(I,6),12) ) + ENDFOR + + THIS.messageout( PADR('----------',12) + ' ' + PADR('----------',12) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------------------------',30) + ' ' + PADR('----------',12) + ' ' + PADR('----------',12) ) + + + *-- Evaluación de valores + this.assertequals( lnIndices_OUT, lnIndices_IN, '[Cantidad de campos IN y OUT]' ) + + FOR I = 1 TO lnIndices_IN + FOR X = 1 TO 6 + THIS.assertequals( laIndices_IN(I,X), laIndices_OUT(I,X), '[Comparando estructura del indice ' + laIndices_IN(I,1) + ']' ) + ENDFOR + ENDFOR + + CATCH TO loEx + THIS.Evaluate_results( loEx, lnCodError_Esperado ) + + FINALLY + USE IN (SELECT("ARCHIVOBIN_IN")) + USE IN (SELECT("TABLABIN")) + ENDTRY + + ENDFUNC + + +ENDDEFINE diff --git a/TESTS/ut__foxbin2prg.prg b/TESTS/ut__foxbin2prg.prg index caffe54..5ff7d49 100644 --- a/TESTS/ut__foxbin2prg.prg +++ b/TESTS/ut__foxbin2prg.prg @@ -298,7 +298,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) SELECT 0 - USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN + USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN SCAN ALL FOR NOT DELETED() *-- DATOS ESPERADOS @@ -318,7 +318,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg LOCATE FOR UNIQUEID==lcUniqueID IF NOT FOUND() - ERROR 'No se encontró el registro #' + TRANSFORM(RECNO('ARCHIBOBIN_IN')) + ' con UniqueID "' + lcUniqueID + '" en el archivo "' + lc_OutputFile + '"' + ERROR 'No se encontró el registro #' + TRANSFORM(RECNO('ARCHIVOBIN_IN')) + ' con UniqueID "' + lcUniqueID + '" en el archivo "' + lc_OutputFile + '"' ENDIF SCATTER MEMO NAME loReg @@ -332,7 +332,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) FINALLY - USE IN (SELECT("ARCHIBOBIN_IN")) + USE IN (SELECT("ARCHIVOBIN_IN")) ENDTRY ENDFUNC @@ -372,7 +372,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) SELECT 0 - USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN + USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN SCAN ALL FOR NOT DELETED() *-- DATOS ESPERADOS @@ -392,7 +392,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg LOCATE FOR UNIQUEID==lcUniqueID IF NOT FOUND() - ERROR 'No se encontró el registro #' + TRANSFORM(RECNO('ARCHIBOBIN_IN')) + ' con UniqueID "' + lcUniqueID + '" en el archivo "' + lc_OutputFile + '"' + ERROR 'No se encontró el registro #' + TRANSFORM(RECNO('ARCHIVOBIN_IN')) + ' con UniqueID "' + lcUniqueID + '" en el archivo "' + lc_OutputFile + '"' ENDIF SCATTER MEMO NAME loReg @@ -406,7 +406,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) FINALLY - USE IN (SELECT("ARCHIBOBIN_IN")) + USE IN (SELECT("ARCHIVOBIN_IN")) ENDTRY ENDFUNC @@ -444,7 +444,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) SELECT 0 - USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN + USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN SCAN ALL FOR NOT DELETED() AND ( UNIQUEID==PADR('Form',10) OR PLATFORM==PADR("WINDOWS",8) ) *-- DATOS ESPERADOS @@ -485,7 +485,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) FINALLY - USE IN (SELECT("ARCHIBOBIN_IN")) + USE IN (SELECT("ARCHIVOBIN_IN")) USE IN (SELECT("TABLABIN")) ENDTRY @@ -526,7 +526,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) SELECT 0 - USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN + USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN SCAN ALL FOR NOT DELETED() AND ( UNIQUEID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) ) *-- DATOS ESPERADOS @@ -567,7 +567,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) FINALLY - USE IN (SELECT("ARCHIBOBIN_IN")) + USE IN (SELECT("ARCHIVOBIN_IN")) USE IN (SELECT("TABLABIN")) ENDTRY @@ -608,7 +608,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) SELECT 0 - USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN + USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN SCAN ALL FOR NOT DELETED() AND ( UNIQUEID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) ) *-- DATOS ESPERADOS @@ -649,7 +649,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg THIS.Evaluate_results( loEx, lnCodError_Esperado, lc_OutputFile, lcParent, lcClass, lcObjName, loReg_Esperado ) FINALLY - USE IN (SELECT("ARCHIBOBIN_IN")) + USE IN (SELECT("ARCHIVOBIN_IN")) USE IN (SELECT("TABLABIN")) ENDTRY @@ -690,7 +690,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg loCnv.Convertir( FORCEEXT(lc_OutputFile, LEFT( JUSTEXT(lc_File),2 ) + '2' ), .F., .F., .T. ) SELECT 0 - USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIBOBIN_IN + USE (lc_InputFile) SHARED AGAIN NOUPDATE ALIAS ARCHIVOBIN_IN SCAN ALL FOR NOT DELETED() AND ( UNIQUEID==PADR('Class',10) OR PLATFORM==PADR("WINDOWS",8) ) *-- DATOS ESPERADOS @@ -732,7 +732,7 @@ DEFINE CLASS ut__foxbin2prg AS FxuTestCase OF FxuTestCase.prg , loReg_Esperado, loReg, lcTipoBinario ) FINALLY - USE IN (SELECT("ARCHIBOBIN_IN")) + USE IN (SELECT("ARCHIVOBIN_IN")) USE IN (SELECT("TABLABIN")) ENDTRY diff --git a/TESTS/ut__foxbin2prg__c_conversor_base__doBackup.prg b/TESTS/ut__foxbin2prg__c_conversor_base__doBackup.prg new file mode 100644 index 0000000..d2166a3 --- /dev/null +++ b/TESTS/ut__foxbin2prg__c_conversor_base__doBackup.prg @@ -0,0 +1,122 @@ +DEFINE CLASS foxbin2prg__c_conversor_base__doBackup AS FxuTestCase OF FxuTestCase.prg + + #IF .F. + LOCAL THIS AS foxbin2prg__c_conversor_base__doBackup OF foxbin2prg__c_conversor_base__doBackup.PRG + #ENDIF + + #DEFINE C_FB2P_VALUE_I '' + #DEFINE C_FB2P_VALUE_F '' + #DEFINE CR_LF CHR(13) + CHR(10) + #DEFINE C_CR CHR(13) + #DEFINE C_LF CHR(10) + #DEFINE C_TAB CHR(9) + #DEFINE C_PROC 'PROCEDURE' + #DEFINE C_ENDPROC 'ENDPROC' + #DEFINE C_TEXT 'TEXT' + #DEFINE C_ENDTEXT 'ENDTEXT' + #DEFINE C_IF_F '#IF .F.' + #DEFINE C_ENDIF '#ENDIF' + #DEFINE C_DEFINE_CLASS 'DEFINE CLASS' + #DEFINE C_ENDDEFINE_CLASS 'ENDDEFINE' + icObj = NULL + + + ******************************************************************************************************************************************* + FUNCTION SETUP + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + LOCAL loObj AS c_conversor_base OF "FOXBIN2PRG.PRG" + SET PROCEDURE TO 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + oFXU_LIB = CREATEOBJECT('CL_FXU_CONFIG') + oFXU_LIB.setup_comun() + + THIS.icObj = NEWOBJECT("c_conversor_bin_a_prg", "FOXBIN2PRG.PRG") + loObj = THIS.icObj + loObj.l_Test = .T. + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION TearDown + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + THIS.icObj = NULL + + IF VARTYPE(oFXU_LIB) = "O" + oFXU_LIB.teardown_comun() + oFXU_LIB = NULL + ENDIF + RELEASE PROCEDURE 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Evaluate_results + LPARAMETERS toEx AS EXCEPTION, tnCodError_Esperado, tcBackFile_1, tcBackFile_2, tcBackFile_3 + + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + + IF PCOUNT() = 0 + THIS.messageout( "* Support method, not a valid test." ) + RETURN .T. + ENDIF + + IF ISNULL(toEx) + *-- Visualización de valores + THIS.messageout( 'BackFile_1: ' + TRANSFORM(tcBackFile_1) ) + THIS.messageout( 'BackFile_2: ' + TRANSFORM(tcBackFile_2) ) + THIS.messageout( 'BackFile_3: ' + TRANSFORM(tcBackFile_3) ) + + + *-- Evaluación de valores + THIS.assertequals( .T., FILE(tcBackFile_1), "Existencia del archivo " + tcBackFile_1 ) + THIS.assertequals( .T., FILE(tcBackFile_2), "Existencia del archivo " + tcBackFile_2 ) + IF NOT EMPTY(tcBackFile_3) + THIS.assertequals( .T., FILE(tcBackFile_3), "Existencia del archivo " + tcBackFile_3 ) + ENDIF + + ELSE + *-- Evaluación de errores + THIS.messageout( "Error " + TRANSFORM(toEx.ERRORNO) + ', ' + TRANSFORM(toEx.MESSAGE) ) + THIS.messageout( toEx.PROCEDURE + ', ' + TRANSFORM(toEx.LINENO) ) + THIS.messageout( TRANSFORM(toEx.LINECONTENTS) ) + + THIS.assertequals( tnCodError_Esperado, toEx.ERRORNO, 'Error' ) + ENDIF + ENDFUNC + + + ******************************************************************************************************************************************* + FUNCTION Deberia_HacerElBackupDelArchivoIndicado + + #IF .F. + PUBLIC oFXU_LIB AS CL_FXU_CONFIG OF 'TESTS\fxu_lib_objetos_y_funciones_de_soporte.PRG' + #ENDIF + + LOCAL lnCodError, lcMenError, lnCodError_Esperado ; + , lcMemo, lcMemo_Salida, lcMemo_Esperado, lcBackFile_1, lcBackFile_2, lcBackFile_3 ; + , loEx AS EXCEPTION + LOCAL loObj AS c_conversor_bin_a_prg OF "FOXBIN2PRG.PRG" + loObj = THIS.icObj + loEx = NULL + loObj.c_OutputFile = FORCEPATH( 'fb2p_dbc.dbc', oFXU_LIB.cPathDatosTest ) + + *-- DATOS DE ENTRADA + STORE 0 TO lnCodError + COPY FILE ( FORCEPATH( 'FB2P_DBC.D??', oFXU_LIB.cPathDatosReadOnly ) ) TO ( FORCEPATH( 'FB2P_DBC.D??', oFXU_LIB.cPathDatosTest ) ) + + *-- TEST + loObj.doBackup( @loEx, .F., @lcBackFile_1, @lcBackFile_2, @lcBackFile_3 ) + + THIS.Evaluate_results( loEx, lnCodError_Esperado, lcBackFile_1, lcBackFile_2, lcBackFile_3 ) + + ENDFUNC + + +ENDDEFINE diff --git a/foxbin2prg.pjt b/foxbin2prg.pjt index 334fdf1..dd274b8 100644 Binary files a/foxbin2prg.pjt and b/foxbin2prg.pjt differ diff --git a/foxbin2prg.pjx b/foxbin2prg.pjx index 61c69a9..73aed1e 100644 Binary files a/foxbin2prg.pjx and b/foxbin2prg.pjx differ diff --git a/foxbin2prg.prg b/foxbin2prg.prg index 05a9b36..9111f14 100644 --- a/foxbin2prg.prg +++ b/foxbin2prg.prg @@ -36,7 +36,7 @@ * DO FOXBIN2PRG.PRG WITH "\FILE.PJ2" && Genera "\FILE.PJX" (PRG TO BIN CONVERSION) * *--------------------------------------------------------------------------------------------------- -* Historial de cambios y notas importantes +* * 04/11/2013 FDBOZZO v1.0 Creación inicial de las clases y soporte de los archivos VCX/SCX/PJX * 22/11/2013 FDBOZZO v1.1 Corrección de bugs * 23/11/2013 FDBOZZO v1.2 Corrección de bugs, limpieza de código y refactorización @@ -52,9 +52,11 @@ * 07/12/2013 FDBOZZO v1.12 Agregado soporte preliminar de conversión de reportes y etiquetas (FRX/LBX) * 08/12/2013 FDBOZZO v1.13 Arreglo bug "Error 1924, TOREG is not an object" * 15/12/2013 FDBOZZO v1.14 Arreglo de bug AutoCenter y registro COMMENT en regeneración de forms +* 08/12/2013 FDBOZZO v1.15 Agregado soporte preliminar de conversión de tablas, índices y bases de datos (DBF,CDX,DBC) +* * *--------------------------------------------------------------------------------------------------- -* TESTEO Y REPORTE DE BUGS (AGRADECIMIENTOS) +* * 23/11/2013 Luis Martínez REPORTE BUG: En algunos forms solo se generaba el dataenvironment (arreglado en v.1.5) * 27/11/2013 Fidel Charny REPORTE BUG: Error en el guardado de ciertas propiedades de array (arreglado en v.1.6) * 02/12/2013 Fidel Charny REPORTE BUG: Se pierden algunas propiedades y no muestra picture si "Name" no es la última (arreglado en v.1.7) @@ -65,6 +67,7 @@ * 08/12/2013 Fidel Charny REPORTE BUG: Cuando se convierten algunos reportes da "Error 1924, TOREG is not an object" (arreglado en v.1.13) * 14/12/2013 Arturo Ramos REPORTE BUG: La regeneración de los forms (SCX) no respeta la propiedad AutoCenter, estando pero no funcionando. (arreglado en v.1.14) * 14/12/2013 Fidel Charny REPORRE BUG: La regeneración de los forms (SCX) no regenera el último registro COMMENT (arreglado en v.1.14) +* * *--------------------------------------------------------------------------------------------------- * TRAMIENTOS ESPECIALES DE ASIGNACIONES DE PROPIEDADES: @@ -113,6 +116,8 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro #DEFINE C_ENDTEXT 'ENDTEXT' #DEFINE C_PROCEDURE 'PROCEDURE' #DEFINE C_ENDPROC 'ENDPROC' +#DEFINE C_WITH 'WITH' +#DEFINE C_WNDWITH 'ENDWITH' #DEFINE C_SRV_HEAD_I '*' #DEFINE C_SRV_HEAD_F '*' #DEFINE C_SRV_DATA_I '*' @@ -146,6 +151,45 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro #DEFINE C_TAG_REPORTE 'Reportes' #DEFINE C_TAG_REPORTE_I '<' + C_TAG_REPORTE + '>' #DEFINE C_TAG_REPORTE_F '' +#DEFINE C_DBF_HEAD_I '' +#DEFINE C_LEN_DBF_HEAD_I LEN(C_DBF_HEAD_I) +#DEFINE C_LEN_DBF_HEAD_F LEN(C_DBF_HEAD_F) +#DEFINE C_CDX_I '' +#DEFINE C_CDX_F '' +#DEFINE C_LEN_CDX_I LEN(C_CDX_I) +#DEFINE C_LEN_CDX_F LEN(C_CDX_F) +#DEFINE C_LEN_INDEX_I LEN(C_INDEX_I) +#DEFINE C_LEN_INDEX_F LEN(C_INDEX_F) +#DEFINE C_DATABASE_I '' +#DEFINE C_DATABASE_F '' +#DEFINE C_STORED_PROC_I '' +#DEFINE C_TABLE_I '' +#DEFINE C_TABLE_F '
' +#DEFINE C_TABLES_I '' +#DEFINE C_TABLES_F '' +#DEFINE C_VIEW_I '' +#DEFINE C_VIEW_F '' +#DEFINE C_VIEWS_I '' +#DEFINE C_VIEWS_F '' +#DEFINE C_FIELD_I '' +#DEFINE C_FIELD_F '' +#DEFINE C_FIELDS_I '' +#DEFINE C_FIELDS_F '' +#DEFINE C_CONNECTION_I '' +#DEFINE C_CONNECTION_F '' +#DEFINE C_CONNECTIONS_I '' +#DEFINE C_CONNECTIONS_F '' +#DEFINE C_RELATION_I '' +#DEFINE C_RELATION_F '' +#DEFINE C_RELATIONS_I '' +#DEFINE C_RELATIONS_F '' +#DEFINE C_INDEX_I '' +#DEFINE C_INDEX_F '' +#DEFINE C_INDEXES_I '' +#DEFINE C_INDEXES_F '' +*-- #DEFINE C_TAB CHR(9) #DEFINE C_CR CHR(13) #DEFINE C_LF CHR(10) @@ -175,146 +219,56 @@ LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErro #DEFINE SERVERINSTANCE_MULTIUSE 3 && Multi-use server *-- Fin / End -TRY - LOCAL lcSys16, I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), lcConfigFile, lcExt ; - , llExisteConfig, llShowProgress, lcConfData, lnFileCount ; - , loEx AS EXCEPTION +******************************************************************************************************************* +*-- INTERNACIONALIZACIÓN / INTERNATIONALIZATION +******************************************************************************************************************* +#IF .T. &&VERSION(3) == "34" && Español (Spanish) [NO FUNCIONA MÁS ESTO :( ] + #DEFINE C_FOXBIN2PRG_JUST_VFP_9_LOC '¡FOXBIN2PRG es solo para Visual FoxPro 9.0!' + #DEFINE C_FOXBIN2PRG_WARN_CAPTION_LOC 'FOXBIN2PRG: ¡ATENCIÓN!' + #DEFINE FOXBIN2PRG_INFO_SINTAX_LOC 'FOXBIN2PRG [cType_ND cTextName_ND cGenText_ND cNoMostrarErrores cDebug]' + CR_LF + CR_LF ; + + 'Ejemplo para generar los TXT de todos los VCX de "c:\desa\clases", sin mostrar ventana de error y generando archivo LOG: ' + CR_LF ; + + ' FOXBIN2PRG "c:\desa\clases\*.vcx" "0" "0" "0" "1" "1"' + CR_LF + CR_LF ; + + 'Ejemplo para generar los VCX de todos los TXT de "c:\desa\clases", sin mostrar ventana de error y sin LOG: ' + CR_LF ; + + ' FOXBIN2PRG "c:\desa\clases\*.vc2" "0" "0" "0" "1" "0"' + #DEFINE ASTERISK_EXT_NOT_ALLOWED_LOC 'No se admiten extensiones * o ? porque es peligroso (se pueden pisar binarios con archivo xx2 vacíos).' + #DEFINE C_PROCESSING_LOC 'Procesando archivo ' + #DEFINE C_FILE_DOESNT_EXIST_LOC "El archivo no existe:" + #DEFINE C_SOURCEFILE_LOC "Archivo origen: " + #DEFINE C_PROCESS_PROGRESS_LOC "Avance del proceso: " + #DEFINE C_CONVERTER_UNLOAD_LOC "Descarga del conversor" + #DEFINE C_CONVERTING_FILE_LOC "Convirtiendo archivo " + #DEFINE C_BACKUP_OF_LOC "Backup de: " + #DEFINE C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC 'Operación no reconocida. Solo re reconoce SETNAME y GETNAME.' + #DEFINE C_BACKLINK_CANT_UPDATE_BL_LOC 'No se pudo actualizar el backlink' + #DEFINE C_BACKLINK_OF_TABLE_LOC 'de la tabla' - PUBLIC goFrm_Avance AS frm_avance OF 'FOXBIN2PRG.PRG' ; - , goCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' - lnResp = 0 +#ELSE && English + #DEFINE C_FOXBIN2PRG_JUST_VFP_9_LOC 'FOXBIN2PRG is only for Visual FoxPro 9.0!' + #DEFINE C_FOXBIN2PRG_WARN_CAPTION_LOC 'FOXBIN2PRG: WARNING!' + #DEFINE FOXBIN2PRG_INFO_SINTAX_LOC 'FOXBIN2PRG [cType_NA cTextName_NA cGenText_NA cDontShowErrors cDebug]' + CR_LF + CR_LF ; + + 'Example to generate TXT of all VCX of "c:\desa\clases", without showing error window and generating LOG file: ' + CR_LF ; + + ' FOXBIN2PRG "c:\desa\clases\*.vcx" "0" "0" "0" "1" "1"' + CR_LF + CR_LF ; + + 'Example to generate TXT of all VCX of "c:\desa\clases", without showing error window and without LOG file: ' + CR_LF ; + + ' FOXBIN2PRG "c:\desa\clases\*.vc2" "0" "0" "0" "1" "0"' + #DEFINE ASTERISK_EXT_NOT_ALLOWED_LOC '* and ? extensions are not allowed because is dangerous (binaries can be overwriten with xx2 empty files)' + #DEFINE C_PROCESSING_LOC 'Processing file ' + #DEFINE C_FILE_DOESNT_EXIST_LOC "File doesn't exist:" + #DEFINE C_SOURCEFILE_LOC "Source file: " + #DEFINE C_PROCESS_PROGRESS_LOC "Process Progress: " + #DEFINE C_CONVERTER_UNLOAD_LOC "Converter unload" + #DEFINE C_CONVERTING_FILE_LOC "Converting file " + #DEFINE C_BACKUP_OF_LOC "Backup of: " + #DEFINE C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC 'Operation not recognized. Only SETNAME and GETNAME allowed.' + #DEFINE C_BACKLINK_CANT_UPDATE_BL_LOC 'Could not update backlink' + #DEFINE C_BACKLINK_OF_TABLE_LOC 'of table' - SET DELETED ON - SET DATE YMD - SET HOURS TO 24 - SET CENTURY ON - SET SAFETY OFF - SET TABLEPROMPT OFF +#ENDIF +******************************************************************************************************************* - IF _VFP.STARTMODE > 0 - SET ESCAPE OFF - ENDIF - - DO CASE - CASE VERSION(5) < 900 - lnResp = 1 - MESSAGEBOX( 'FOXBIN2PRG es solo para Visual FoxPro 9.0!', 0+64+4096, 'FOXBIN2PRG: SINTAXIS INFO', 60000 ) - - CASE EMPTY(tc_InputFile) - lnResp = 1 - MESSAGEBOX( 'FOXBIN2PRG [cType_NA cTextName_NA cGenText_NA cDontShowErrors cDebug]' + CR_LF + CR_LF ; - + 'Ejemplo para generar los TXT de todos los VCX de c:\desa\clases, sin mostrar ventana de error y generando LOG: ' + CR_LF ; - + ' FOXBIN2PRG "c:\desa\clases\*.vcx" "0" "0" "0" "1" "1"' + CR_LF + CR_LF ; - + 'Ejemplo para generar los VCX de todos los TXT de c:\desa\clases, sin mostrar ventana de error y sin LOG: ' + CR_LF ; - + ' FOXBIN2PRG "c:\desa\clases\*.vc2" "0" "0" "0" "1" "0"' ; - , 0+64+4096, 'FOXBIN2PRG: SINTAXIS INFO', 60000 ) - OTHERWISE - lcSys16 = SYS(16) - lcPath = SET("Path") - *SET PATH TO (JUSTPATH(lcSys16)) - SET PATH TO - llShowProgress = NOT (TRANSFORM(tcDontShowProgress)=='1') - goCnv = CREATEOBJECT("c_foxbin2prg") - goCnv.l_Debug = (TRANSFORM(tcDebug)=='1') - goCnv.l_ShowErrors = NOT (TRANSFORM(tcDontShowErrors) == '1') - - IF llShowProgress - goFrm_Avance = CREATEOBJECT("frm_avance") - ENDIF - - *-- Configuración - lcConfigFile = FORCEEXT( lcSys16, 'CFG' ) - llExisteConfig = FILE( lcConfigFile ) - - IF llExisteConfig - FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcConfigFile ), 1+4 ) - IF LOWER( LEFT( laConfig(I), 10 ) ) == 'extension:' - lcConfData = ALLTRIM( SUBSTR( laConfig(I), 11 ) ) - lcExt = 'c_' + ALLTRIM( GETWORDNUM( lcConfData, 1, '=' ) ) - IF PEMSTATUS( goCnv, lcExt, 5 ) - goCnv.ADDPROPERTY( lcExt, UPPER( ALLTRIM( GETWORDNUM( lcConfData, 2, '=' ) ) ) ) - ENDIF - ENDIF - ENDFOR - ENDIF - - - *-- Evaluación de FileSpec de entrada - DO CASE - CASE '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile ) - MESSAGEBOX( 'No se admiten extensiones * o ? porque es peligroso (se pueden pisar binarios con archivo xx2 vacíos).' ; - , 0+48+4096, 'FOXBIN2PRG: ERROR!!', 10000 ) - - CASE '*' $ JUSTSTEM( tc_InputFile ) - *-- Se quieren todos los archivos de una extensión - lcFileSpec = FULLPATH( tc_InputFile ) - CD (JUSTPATH(lcFileSpec)) - goCnv.c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG' - - IF goCnv.l_Debug - IF FILE( goCnv.c_LogFile ) - ERASE ( goCnv.c_LogFile ) - ENDIF - goCnv.writeLog( lcSys16 + ' - FileSpec: ' + EVL(tc_InputFile,'') ) - IF llExisteConfig - goCnv.writeLog( 'ConfigFile: ' + lcConfigFile ) - ENDIF - ENDIF - - lnFileCount = ADIR( laFiles, lcFileSpec ) - - IF llShowProgress - goFrm_Avance.nMAX_VALUE = lnFileCount - ENDIF - - FOR I = 1 TO lnFileCount - lcFile = FORCEPATH( laFiles(I,1), JUSTPATH( lcFileSpec ) ) - goFrm_Avance.lbl_TAREA.CAPTION = 'Procesando archivo ' + lcFile + '...' - goFrm_Avance.nVALUE = I - - IF llShowProgress - goFrm_Avance.SHOW() - ENDIF - - IF FILE( lcFile ) - lnResp = goCnv.Convertir( lcFile ) - ENDIF - ENDFOR - - OTHERWISE - *-- Un archivo individual - IF FILE(tc_InputFile) - CD (JUSTPATH(tc_InputFile)) - goCnv.c_LogFile = tc_InputFile + '.LOG' - - IF goCnv.l_Debug - IF FILE( goCnv.c_LogFile ) - ERASE ( goCnv.c_LogFile ) - ENDIF - goCnv.writeLog( lcSys16 + ' - FileSpec: ' + EVL(tc_InputFile,'') ) - ENDIF - - lnResp = goCnv.Convertir( tc_InputFile ) - ENDIF - ENDCASE - - ENDCASE - -CATCH TO loEx - IF llExisteConfig - goCnv.writeLog( 'ERROR: ' + TRANSFORM(loEx.ERRORNO) + ', ' + loEx.MESSAGE + CR_LF ; - + loEx.PROCEDURE + ', line ' + TRANSFORM(loEx.LINENO) + CR_LF ; - + loEx.DETAILS ) - ENDIF - -FINALLY - goFrm_Avance.HIDE() - goFrm_Avance.RELEASE() - STORE NULL TO goCnv, goFrm_Avance - RELEASE goCnv, goFrm_Avance - CD (JUSTPATH(lcSys16)) - SET PATH TO (lcPath) -ENDTRY +PUBLIC goCnv AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' +LOCAL lnResp +goCnv = CREATEOBJECT("c_foxbin2prg") +lnResp = goCnv.ejecutar( tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug, tcDontShowProgress ) IF _VFP.STARTMODE > 0 QUIT @@ -329,46 +283,56 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM LOCAL THIS AS c_foxbin2prg OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] + *-- + n_FB2PRG_Version = 1.15 + *-- + c_Foxbin2prg_FullPath = '' c_CurDir = '' c_InputFile = '' c_LogFile = '' c_OutputFile = '' + lFileMode = .F. l_Debug = .F. l_Test = .F. l_ShowErrors = .F. + l_ShowProgress = .T. l_MethodSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_PropSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias l_ReportSort_Enabled = .T. && Para Unit Testing se puede cambiar a .F. para buscar diferencias - lFileMode = .F. nClassTimeStamp = '' - n_FB2PRG_Version = 1.14 o_Conversor = NULL + o_Frm_Avance = NULL c_VC2 = 'VC2' c_SC2 = 'SC2' c_PJ2 = 'PJ2' @@ -380,7 +344,6 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM c_DC2 = 'DC2' - ******************************************************************************************************************* PROCEDURE INIT SET DELETED ON SET DATE YMD @@ -388,10 +351,11 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM SET CENTURY ON SET SAFETY OFF SET TABLEPROMPT OFF + THIS.c_Foxbin2prg_FullPath = SUBSTR( SYS(16), AT( 'C_FOXBIN2PRG.INIT', SYS(16) ) + LEN('C_FOXBIN2PRG.INIT') + 1 ) + THIS.c_CurDir = SYS(5) + CURDIR() ENDPROC - ******************************************************************************************************************* PROCEDURE DESTROY TRY LOCAL lcFileCDX @@ -405,19 +369,183 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM ENDPROC - ******************************************************************************************************************* + PROCEDURE Ejecutar + *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tc_InputFile (!v IN ) Nombre del archivo de entrada + * tcType_na (?v IN ) NO DISPONIBLE. Se mantiene por compatibilidad con SourceSafe + * tcTextName_na (?v IN ) NO DISPONIBLE. Se mantiene por compatibilidad con SourceSafe + * tlGenText_na (?v IN ) NO DISPONIBLE. Se mantiene por compatibilidad con SourceSafe + * tcDontShowErrors (?v IN ) '1' para no mostrar mensajes de error (MESSAGEBOX) + * tcDebug (?v IN ) '1' para habilitar modo debug (SOLO DESARROLLO) + * tcDontShowProgress (?v IN ) '1' para inhabilitar la barra de progreso + * toModulo (?@ OUT) Referencia de objeto del módulo generado (para Unit Testing) + * toEx (?@ OUT) Objeto con información del error + * tlRelanzarError (?v IN ) Indica si el error debe relanzarse o no + *-------------------------------------------------------------------------------------------------------------- + LPARAMETERS tc_InputFile, tcType_na, tcTextName_na, tlGenText_na, tcDontShowErrors, tcDebug, tcDontShowProgress ; + , toModulo, toEx AS EXCEPTION, tlRelanzarError + + TRY + LOCAL I, lcPath, lnResp, lcFileSpec, lcFile, laFiles(1,5), laConfig(1), lcConfigFile, lcExt ; + , llExisteConfig, lcConfData, lnFileCount ; + , loEx AS EXCEPTION + + lnResp = 0 + + SET DELETED ON + SET DATE YMD + SET HOURS TO 24 + SET CENTURY ON + SET SAFETY OFF + SET TABLEPROMPT OFF + + IF _VFP.STARTMODE > 0 + SET ESCAPE OFF + ENDIF + + DO CASE + CASE VERSION(5) < 900 + *-- '¡FOXBIN2PRG es solo para Visual FoxPro 9.0!' + MESSAGEBOX( C_FOXBIN2PRG_JUST_VFP_9_LOC, 0+64+4096, C_FOXBIN2PRG_WARN_CAPTION_LOC, 60000 ) + lnResp = 1 + + CASE EMPTY(tc_InputFile) + *-- (Ejemplo de sintaxis y uso) + MESSAGEBOX( FOXBIN2PRG_INFO_SINTAX_LOC, 0+64+4096, 'FOXBIN2PRG: SINTAXIS INFO', 60000 ) + lnResp = 1 + + OTHERWISE + *-- Ejecución normal + THIS.l_ShowProgress = NOT (TRANSFORM(tcDontShowProgress)=='1') + THIS.l_ShowErrors = NOT (TRANSFORM(tcDontShowErrors) == '1') + THIS.l_Debug = (TRANSFORM(tcDebug)=='1') + + IF THIS.l_ShowProgress + THIS.o_Frm_Avance = CREATEOBJECT("frm_avance") + ENDIF + + *-- Configuración + lcConfigFile = FORCEEXT( THIS.c_Foxbin2prg_FullPath, 'CFG' ) + llExisteConfig = FILE( lcConfigFile ) + + IF llExisteConfig + FOR I = 1 TO ALINES( laConfig, FILETOSTR( lcConfigFile ), 1+4 ) + IF LOWER( LEFT( laConfig(I), 10 ) ) == 'extension:' + lcConfData = ALLTRIM( SUBSTR( laConfig(I), 11 ) ) + lcExt = 'c_' + ALLTRIM( GETWORDNUM( lcConfData, 1, '=' ) ) + IF PEMSTATUS( THIS, lcExt, 5 ) + THIS.ADDPROPERTY( lcExt, UPPER( ALLTRIM( GETWORDNUM( lcConfData, 2, '=' ) ) ) ) + ENDIF + ENDIF + ENDFOR + ENDIF + + + *-- Evaluación de FileSpec de entrada + DO CASE + CASE '*' $ JUSTEXT( tc_InputFile ) OR '?' $ JUSTEXT( tc_InputFile ) + IF THIS.l_ShowErrors + MESSAGEBOX( ASTERISK_EXT_NOT_ALLOWED_LOC, 0+48+4096, 'FOXBIN2PRG: ERROR!!', 10000 ) + ELSE + ERROR ASTERISK_EXT_NOT_ALLOWED_LOC + ENDIF + + CASE '*' $ JUSTSTEM( tc_InputFile ) + *-- SE QUIEREN TODOS LOS ARCHIVOS DE UNA EXTENSIÓN + lcFileSpec = FULLPATH( tc_InputFile ) + CD (JUSTPATH(lcFileSpec)) + THIS.c_LogFile = ADDBS( JUSTPATH( lcFileSpec ) ) + STRTRAN( JUSTFNAME( lcFileSpec ), '*', '_ALL' ) + '.LOG' + + IF THIS.l_Debug + IF FILE( THIS.c_LogFile ) + ERASE ( THIS.c_LogFile ) + ENDIF + THIS.writeLog( THIS.c_Foxbin2prg_FullPath + ' - FileSpec: ' + EVL(tc_InputFile,'') ) + IF llExisteConfig + THIS.writeLog( 'ConfigFile: ' + lcConfigFile ) + ENDIF + ENDIF + + lnFileCount = ADIR( laFiles, lcFileSpec ) + + IF THIS.l_ShowProgress + THIS.o_Frm_Avance.nMAX_VALUE = lnFileCount + ENDIF + + FOR I = 1 TO lnFileCount + lcFile = FORCEPATH( laFiles(I,1), JUSTPATH( lcFileSpec ) ) + THIS.o_Frm_Avance.lbl_TAREA.CAPTION = C_PROCESSING_LOC + lcFile + '...' + THIS.o_Frm_Avance.nVALUE = I + + IF THIS.l_ShowProgress + THIS.o_Frm_Avance.SHOW() + ENDIF + + IF FILE( lcFile ) + lnResp = THIS.Convertir( lcFile, toModulo, toEx, tlRelanzarError ) + ENDIF + ENDFOR + + OTHERWISE + *-- UN ARCHIVO INDIVIDUAL + IF FILE(tc_InputFile) + CD (JUSTPATH(tc_InputFile)) + THIS.c_LogFile = tc_InputFile + '.LOG' + + IF THIS.l_Debug + IF FILE( THIS.c_LogFile ) + ERASE ( THIS.c_LogFile ) + ENDIF + THIS.writeLog( THIS.c_Foxbin2prg_FullPath + ' - FileSpec: ' + EVL(tc_InputFile,'') ) + ENDIF + + lnResp = THIS.Convertir( tc_InputFile, toModulo, toEx, tlRelanzarError ) + ENDIF + ENDCASE + + ENDCASE + + CATCH TO toEx + IF llExisteConfig + THIS.writeLog( 'ERROR: ' + TRANSFORM(toEx.ERRORNO) + ', ' + toEx.MESSAGE + CR_LF ; + + toEx.PROCEDURE + ', line ' + TRANSFORM(toEx.LINENO) + CR_LF ; + + toEx.DETAILS ) + ENDIF + IF tlRelanzarError + THROW + ENDIF + + FINALLY + IF VARTYPE(THIS.o_Frm_Avance) = "O" + THIS.o_Frm_Avance.HIDE() + THIS.o_Frm_Avance.RELEASE() + STORE NULL TO THIS.o_Frm_Avance + ENDIF + CD (JUSTPATH(THIS.c_CurDir)) + *SET PATH TO (lcPath) + ENDTRY + ENDPROC + + PROCEDURE Convertir + *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tc_InputFile (!v IN ) Nombre del archivo de entrada + * toModulo (?@ OUT) Referencia de objeto del módulo generado (para Unit Testing) + * toEx (?@ OUT) Objeto con información del error + * tlRelanzarError (?v IN ) Indica si el error debe relanzarse o no + *-------------------------------------------------------------------------------------------------------------- LPARAMETERS tc_InputFile, toModulo, toEx AS EXCEPTION, tlRelanzarError TRY LOCAL lnCodError, lcErrorInfo lnCodError = 0 THIS.c_InputFile = FULLPATH( tc_InputFile ) - THIS.c_CurDir = JUSTPATH( THIS.c_InputFile ) THIS.o_Conversor = NULL IF NOT FILE(THIS.c_InputFile) - ERROR 'El archivo [' + THIS.c_InputFile + '] no existe' + ERROR C_FILE_DOESNT_EXIST_LOC + ' [' + THIS.c_InputFile + ']' ENDIF IF FILE( THIS.c_InputFile + '.ERR' ) @@ -448,6 +576,14 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_LB2 ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_frx_a_prg' ) + CASE JUSTEXT(THIS.c_InputFile) = 'DBF' + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_DB2 ) + THIS.o_Conversor = CREATEOBJECT( 'c_conversor_dbf_a_prg' ) + + CASE JUSTEXT(THIS.c_InputFile) = 'DBC' + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, THIS.c_DC2 ) + THIS.o_Conversor = CREATEOBJECT( 'c_conversor_dbc_a_prg' ) + CASE JUSTEXT(THIS.c_InputFile) = THIS.c_VC2 THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'VCX' ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_vcx' ) @@ -468,6 +604,14 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'LBX' ) THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_frx' ) + CASE JUSTEXT(THIS.c_InputFile) = THIS.c_DB2 + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'DBF' ) + THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_dbf' ) + + CASE JUSTEXT(THIS.c_InputFile) = THIS.c_DC2 + THIS.c_OutputFile = FORCEEXT( THIS.c_InputFile, 'DBC' ) + THIS.o_Conversor = CREATEOBJECT( 'c_conversor_prg_a_dbc' ) + OTHERWISE ERROR 'El archivo [' + THIS.c_InputFile + '] no está soportado' @@ -488,7 +632,7 @@ DEFINE CLASS c_foxbin2prg AS CUSTOM CATCH TO toEx lnCodError = toEx.ERRORNO - lcErrorInfo = THIS.Exception2Str(toEx) + CR_LF + CR_LF + 'Fuente: ' + THIS.c_InputFile + lcErrorInfo = THIS.Exception2Str(toEx) + CR_LF + CR_LF + C_SOURCEFILE_LOC + THIS.c_InputFile TRY STRTOFILE( lcErrorInfo, THIS.c_InputFile + '.ERR' ) @@ -549,7 +693,7 @@ DEFINE CLASS frm_avance AS FORM DOCREATE = .T. AUTOCENTER = .T. BORDERSTYLE = 2 - CAPTION = "Avance del proceso" + CAPTION = C_PROCESS_PROGRESS_LOC CONTROLBOX = .F. BACKCOLOR = RGB(255,255,255) nMAX_VALUE = 100 @@ -611,40 +755,42 @@ DEFINE CLASS c_conversor_base AS SESSION LOCAL THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] @@ -683,7 +829,7 @@ DEFINE CLASS c_conversor_base AS SESSION C_FB2PRG_CODE = '' USE IN (SELECT("TABLABIN")) - THIS.writeLog( 'Descarga del conversor' ) + THIS.writeLog( C_CONVERTER_UNLOAD_LOC ) ENDPROC @@ -698,6 +844,7 @@ DEFINE CLASS c_conversor_base AS SESSION * Este es un valor especial * *-------------------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) * tcPropName (!v IN ) Nombre de la propiedad * tcValue (!v IN ) Valor (o inicio del valor) de la propiedad * taProps (!@ IN ) El array con las líneas del código donde buscar @@ -845,7 +992,7 @@ DEFINE CLASS c_conversor_base AS SESSION PROCEDURE Convertir LPARAMETERS toModulo, toEx AS EXCEPTION THIS.writeLog( '' ) - THIS.writeLog( 'Convirtiendo archivo ' + THIS.c_OutputFile + '...' ) + THIS.writeLog( C_CONVERTING_FILE_LOC + THIS.c_OutputFile + '...' ) ENDPROC @@ -982,9 +1129,9 @@ DEFINE CLASS c_conversor_base AS SESSION IF NOT EMPTY(lcExt_1) AND FILE( FORCEEXT(THIS.c_OutputFile, lcExt_1) ) IF EMPTY(lcExt_3) - THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 ) + THIS.writeLog( C_BACKUP_OF_LOC + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 ) ELSE - THIS.writeLog( 'backup de: ' + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 + '/' + lcExt_3 ) + THIS.writeLog( C_BACKUP_OF_LOC + FORCEEXT(THIS.c_OutputFile,lcExt_1) + '/' + lcExt_2 + '/' + lcExt_3 ) ENDIF *COPY FILE ( FORCEEXT(THIS.c_OutputFile, lcExt_1) ) TO ( FORCEEXT(THIS.c_OutputFile, lcExt_1 + lcNext_Bak) ) @@ -1087,6 +1234,64 @@ DEFINE CLASS c_conversor_base AS SESSION ENDPROC + ******************************************************************************************************************* + PROCEDURE getDBFmetadata + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tc_FileName (v! IN ) Nombre del DBF a analizar + * tn_HexFileType (@? OUT) Tipo de archivo en hexadecimal (Está detallado en la ayuda de Fox) + * tl_FileHasCDX (@? OUT) Indica si el archivo tiene CDX asociado + * tl_FileHasMemo (@? OUT) Indica si el archivo tiene archivo MEMO asociado + * tl_FileIsDBC (@? OUT) Indica si el archivo es un DBC (base de datos) + * tcDBC_Name (@? OUT) Si tiene DBC, contiene el nombre del DBC asociado + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tc_FileName, tn_HexFileType, tl_FileHasCDX, tl_FileHasMemo, tl_FileIsDBC, tcDBC_Name + + TRY + LOCAL lnHandle, lcStr, lnDataPos, lnFieldCount, loEx AS EXCEPTION + tn_HexFileType = 0 + tcDBC_Name = '' + lnHandle = FOPEN(tc_FileName,0) + + IF lnHandle = -1 + EXIT + ENDIF + + lcStr = FREAD(lnHandle,1) && File type + tn_HexFileType = EVALUATE( TRANSFORM(ASC(lcStr),'@0') ) + lcStr = FREAD(lnHandle,3) && Last update (YYMMDD) + lcStr = FREAD(lnHandle,4) && Number of records in file + lcStr = FREAD(lnHandle,2) && Position of first data record + lnDataPos = CTOBIN(lcStr,"2RS") + lnFieldCount = (lnDataPos - 296) / 32 + lcStr = FREAD(lnHandle,2) && Length of one data record, including delete flag + lcStr = FREAD(lnHandle,16) && Reserved + lcStr = FREAD(lnHandle,1) && Table flags: 0x01=Has CDX, 0x02=Has Memo, 0x04=Id DBC (flags acumulativos) + tl_FileHasCDX = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x01 ) > 0 ) + tl_FileHasMemo = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x02 ) > 0 ) + tl_FileIsDBC = ( BITAND( EVALUATE(TRANSFORM(ASC(lcStr),'@0')), 0x04 ) > 0 ) + lcStr = FREAD(lnHandle,1) && Code page mark + lcStr = FREAD(lnHandle,2) && Reserved, contains 0x00 + lcStr = FREAD(lnHandle,32 * lnFieldCount) && Field subrecords (los salteo) + lcStr = FREAD(lnHandle,1) && Header Record Terminator (0x0D) + lcStr = FREAD(lnHandle,263) && Backlink (relative path of an associated database (.dbc) file) + tcDBC_Name = RTRIM(lcStr,0,CHR(0)) && DBC Name (si tiene) + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + FCLOSE(lnHandle) + ENDTRY + + RETURN lnHandle + ENDPROC + + ******************************************************************************************************************* FUNCTION GetTimeStamp(tnTimeStamp) *-- CONVIERTE UN DATO TIMESTAMP NUMERICO USADO POR LOS ARCHIVOS SCX/VCX/etc. EN TIPO DATETIME @@ -1297,14 +1502,14 @@ DEFINE CLASS c_conversor_base AS SESSION FOR I = 1 TO OCCURS( '/>', tcValue ) TEXT TO lcValue TEXTMERGE ADDITIVE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><><', I, 1+4 )>> + <<>> <', I, 1+4 )>> ENDTEXT ENDFOR TEXT TO tcValue TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> - <><> + <<>> ENDTEXT CASE LEFT( tcValue, C_LEN_FB2P_VALUE_I ) == C_FB2P_VALUE_I @@ -1375,7 +1580,7 @@ DEFINE CLASS c_conversor_base AS SESSION CASE tcOperation == 'GETNAME' lcPropName = SUBSTR(tcPropName,5) CASE NOT tcOperation == 'SETNAME' - ERROR 'Operación no reconocida. Solo re reconoce SETNAME y GETNAME.' + ERROR C_ONLY_SETNAME_AND_GETNAME_RECOGNIZED_LOC CASE lcPropName == 'ButtonCount' lcPropName = 'A005' + lcPropName CASE lcPropName == 'ColumnCount' @@ -1621,11 +1826,78 @@ DEFINE CLASS c_conversor_base AS SESSION lnPropType = 2 && User property lcPropName = 'A998' + lcPropName ENDCASE - + RETURN lcPropName ENDPROC + ******************************************************************************************************************* + PROCEDURE write_DBF_Metadata + *--------------------------------------------------------------------------------------------------- + * PARÁMETROS: !=Obligatorio, ?=Opcional, @=Pasar por referencia, v=Pasar por valor (IN/OUT) + * tc_FileName (v! IN ) Nombre del DBF a analizar + * tcDBC_Name (v! IN ) Nombre del DBC a asociar + * tdLastUpdate (v? IN ) Fecha de última actualización + *--------------------------------------------------------------------------------------------------- + LPARAMETERS tc_FileName, tcDBC_Name, tdLastUpdate + + TRY + LOCAL lnHandle, lcStr, lnDataPos, lnFieldCount, loEx AS EXCEPTION + + IF NOT EMPTY(tcDBC_Name) + tn_HexFileType = 0 + lnHandle = FOPEN(tc_FileName,2) + + IF lnHandle = -1 + EXIT + ENDIF + + lcStr = FREAD(lnHandle,1) && File type + tn_HexFileType = EVALUATE( TRANSFORM(ASC(lcStr),'@0') ) + + IF EMPTY(tdLastUpdate) + lcStr = FREAD(lnHandle,3) && Last update (YYMMDD) + ELSE + lcStr = CHR( VAL( RIGHT( PADL( YEAR( tdLastUpdate ),4,'0'), 2 ) ) ) ; + + CHR( VAL( PADL( MONTH( tdLastUpdate ),2,'0' ) ) ) ; + + CHR( VAL( PADL( DAY( tdLastUpdate ),2,'0' ) ) ) && Last update (YYMMDD) + =FWRITE( lnHandle, PADR(lcStr,3,CHR(0)) ) + ENDIF + + lcStr = FREAD(lnHandle,4) && Number of records in file + lcStr = FREAD(lnHandle,2) && Position of first data record + lnDataPos = CTOBIN(lcStr,"2RS") + lnFieldCount = (lnDataPos - 296) / 32 + lcStr = FREAD(lnHandle,2) && Length of one data record, including delete flag + lcStr = FREAD(lnHandle,16) && Reserved + lcStr = FREAD(lnHandle,1) && Table flags: 0x01=Has CDX, 0x02=Has Memo, 0x04=Id DBC (flags acumulativos) + lcStr = FREAD(lnHandle,1) && Code page mark + lcStr = FREAD(lnHandle,2) && Reserved, contains 0x00 + lcStr = FREAD(lnHandle,32 * lnFieldCount) && Field subrecords (los salteo) + lcStr = FREAD(lnHandle,1) && Header Record Terminator (0x0D) + + IF FWRITE( lnHandle, PADR(tcDBC_Name,263,CHR(0)) ) = 0 + *-- No se pudo actualizar el backlink [] de la tabla [] + ERROR C_BACKLINK_CANT_UPDATE_BL_LOC + ' [' + tcDBC_Name + '] ' + C_BACKLINK_OF_TABLE_LOC + ' [' + tc_FileName + ']' + ENDIF + ENDIF + + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + FCLOSE(lnHandle) + ENDTRY + + RETURN lnHandle + ENDPROC + + ******************************************************************************************************************* PROCEDURE sortPropsAndValues * KNOWLEDGE BASE: @@ -1650,7 +1922,7 @@ DEFINE CLASS c_conversor_base AS SESSION DIMENSION laPropsAndValues( tnPropsAndValues_Count, lnArrayCols ) ACOPY( taPropsAndValues, laPropsAndValues ) - WITH THIS AS C_CONVERSOR_BASE OF 'FOXBIN2PRG.PRG' + WITH THIS AS c_conversor_base OF 'FOXBIN2PRG.PRG' IF m.tnSortType >= 1 * CON SORT: * - A las que no tienen '.' les pongo 'A' por delante, y al resto 'B' por delante para que queden al final @@ -1688,7 +1960,7 @@ DEFINE CLASS c_conversor_base AS SESSION FOR I = 1 TO m.tnPropsAndValues_Count *taPropsAndValues(I,1) = SUBSTR( laPropsAndValues(I,1), 2 ) && Quitar el carácter agregado - + *-- Quitar caracteres agregados antes del SORT IF '.' $ laPropsAndValues(I,1) IF m.tnSortType = 2 @@ -1704,7 +1976,7 @@ DEFINE CLASS c_conversor_base AS SESSION taPropsAndValues(I,1) = SUBSTR( laPropsAndValues(I,1), 2 ) ENDIF ENDIF - + taPropsAndValues(I,2) = laPropsAndValues(I,2) IF lnArrayCols >= 3 @@ -1811,43 +2083,43 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base LOCAL THIS AS c_conversor_prg_a_bin OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] @@ -2482,7 +2754,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> - + <<>> ENDTEXT ENDFOR @@ -2523,7 +2795,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base TEXT TO lcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <> - + <<>> ENDTEXT ENDFOR @@ -2591,10 +2863,10 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base USE (THIS.c_InputFile) AGAIN SHARED ALIAS _TABLABIN COPY STRUCTURE EXTENDED TO ( FORCEPATH( '_FRX_STRUC.DBF', ADDBS( SYS(2023) ) ) ) **** CONTINUAR SI ES NECESARIO - SIN USO POR AHORA - + CATCH TO loEx THROW - + FINALLY USE IN (SELECT("_TABLABIN")) SELECT (lnSelect) @@ -2660,7 +2932,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base TEXT TO tcMemo ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> - + <<>> ENDTEXT ENDIF ENDFOR @@ -2837,7 +3109,7 @@ DEFINE CLASS c_conversor_prg_a_bin AS c_conversor_base + ', línea ' + TRANSFORM(I) + ' del archivo ' + THIS.c_InputFile ELSE ERROR 'Error de anidamiento de estructuras. Se esperaba ENDPROC y se encontró ENDDEFINE en la clase ' ; - + toClase._Nombre + ' (' + toObjeto._Nombre + '.' + loProcedure._Nombre + ')' ; + + toClase._Nombre + ' (' + toObjeto._Nombre + '.' + loProcedure._Nombre + ')' ; + ', línea ' + TRANSFORM(I) + ' del archivo ' + THIS.c_InputFile ENDIF ENDCASE @@ -3580,7 +3852,7 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin LOCAL THIS AS c_conversor_prg_a_vcx OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; + + [] ; + [] @@ -3600,10 +3872,10 @@ DEFINE CLASS c_conversor_prg_a_vcx AS c_conversor_prg_a_bin lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) THIS.doBackup( .F., .T. ) - + *-- Creo la librería THIS.createClasslib() - + *-- Identifico los TEXT/ENDTEXT, #IF .F./#ENDIF THIS.identificarBloquesDeExclusion( @laCodeLines, lnCodeLines, .F., @laBloquesExclusion, @lnBloquesExclusion ) @@ -3844,7 +4116,7 @@ DEFINE CLASS c_conversor_prg_a_scx AS c_conversor_prg_a_bin LOCAL THIS AS c_conversor_prg_a_scx OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; + + [] ; + [] @@ -4110,22 +4382,22 @@ DEFINE CLASS c_conversor_prg_a_pjx AS c_conversor_prg_a_bin LOCAL THIS AS c_conversor_prg_a_pjx OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] ******************************************************************************************************************* PROCEDURE Convertir - LPARAMETERS toModulo, toEx AS EXCEPTION - DODEFAULT( @toModulo, @toEx ) + LPARAMETERS toProject, toEx AS EXCEPTION + DODEFAULT( @toProject, @toEx ) #IF .F. LOCAL toProject AS CL_PROJECT OF 'FOXBIN2PRG.PRG' @@ -4824,22 +5096,25 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin LOCAL THIS AS c_conversor_prg_a_frx OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; - + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] ******************************************************************************************************************* PROCEDURE Convertir - LPARAMETERS toModulo, toEx AS EXCEPTION - DODEFAULT( @toModulo, @toEx ) + LPARAMETERS toReport, toEx AS EXCEPTION + DODEFAULT( @toReport, @toEx ) + + #IF .F. + LOCAL toReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + #ENDIF TRY LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; - , laBloquesExclusion(1,2), lnBloquesExclusion, I ; - , loReport AS CL_REPORT OF 'FOXBIN2PRG.PRG' + , laBloquesExclusion(1,2), lnBloquesExclusion, I STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version STORE '' TO lcLine, lcSourceFile STORE NULL TO loReg, toModulo @@ -4853,9 +5128,9 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin THIS.createReport() *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte - THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @loReport ) + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toReport ) - THIS.escribirArchivoBin( @loReport ) + THIS.escribirArchivoBin( @toReport ) CATCH TO loEx @@ -4902,25 +5177,26 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin lnFieldLen = laFieldTypes(lnNumCampo,3) lnFieldDec = laFieldTypes(lnNumCampo,4) luValor = EVALUATE('loReg.' + laProps(I)) - + DO CASE CASE INLIST(lcFieldType, 'B') && Double - STORE CAST( luValor AS &lcFieldType. (lnFieldPrec) ) TO ('loReg.' + laProps(I)) + ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldPrec) ) ) CASE INLIST(lcFieldType, 'F', 'N', 'Y') && Float, Numeric, Currency - STORE CAST( luValor AS &lcFieldType. (lnFieldLen, lnFieldDec) ) TO ('loReg.' + laProps(I)) + ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldLen, lnFieldDec) ) ) - CASE INLIST(lcFieldType, 'W', 'G', 'M', 'Q', 'V') && Blob, General, Memo, Varbinary, Barchar - STORE CAST( luValor AS &lcFieldType. ) TO ('loReg.' + laProps(I)) + CASE INLIST(lcFieldType, 'W', 'G', 'M', 'Q', 'V', 'C') && Blob, General, Memo, Varbinary, Varchar, Character + ADDPROPERTY( loReg, laProps(I), luValor ) OTHERWISE && Demás tipos - STORE CAST( luValor AS &lcFieldType. (lnFieldLen) ) TO ('loReg.' + laProps(I)) + ADDPROPERTY( loReg, laProps(I), CAST( luValor AS &lcFieldType. (lnFieldLen) ) ) ENDCASE - + ENDFOR - + INSERT INTO TABLABIN FROM NAME loReg + loReg = NULL ENDFOR USE IN (SELECT("TABLABIN")) @@ -5023,7 +5299,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin #ENDIF TRY - LOCAL llBloqueEncontrado, lcValue, loEx as Exception + LOCAL llBloqueEncontrado, lcValue, loEx AS EXCEPTION IF LEFT(tcLine, 1 + LEN(tcPropName) + 1 + 9) == '<' + tcPropName + '>' + C_DATA_I llBloqueEncontrado = .T. @@ -5033,14 +5309,14 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin ADDPROPERTY( toReg, tcPropName, lcValue ) EXIT ENDIF - + *-- Tomo la primera parte del valor lcValue = STREXTRACT( tcLine, C_DATA_I ) - + *-- Recorro las fracciones del valor FOR I = I + 1 TO tnCodeLines - .set_Line( @tcLine, @taCodeLines, I ) - + tcLine = taCodeLines(I) + IF C_DATA_F $ tcLine && Fin del valor lcValue = lcValue + CR_LF + STREXTRACT( tcLine, '', C_DATA_F ) ADDPROPERTY( toReg, tcPropName, lcValue ) @@ -5050,12 +5326,12 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin lcValue = lcValue + CR_LF + tcLine ENDIF ENDFOR - + ENDIF CATCH TO loEx - IF loEx.ErrorNo = 1470 && Incorrect property name. - loEx.UserValue = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' + IF loEx.ERRORNO = 1470 && Incorrect property name. + loEx.USERVALUE = 'PropName=[' + TRANSFORM(tcPropName) + '], Value=[' + TRANSFORM(lcValue) + ']' ENDIF IF THIS.l_Debug AND _VFP.STARTMODE = 0 @@ -5103,7 +5379,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin ADDPROPERTY( toReg, laProps(X), lcValue ) ENDIF ENDFOR - + ENDIF CATCH TO loEx @@ -5153,18 +5429,18 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin LOOP && Saltear comentarios CASE .analizarBloque_platform( toReport, @tcLine, @taCodeLines, @I, @tnCodeLines, @loReg ) - + CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'picture' ) CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'tag' ) *-- ARREGLO ALGUNOS VALORES CAMBIADOS AL TEXTUALIZAR DO CASE CASE loReg.ObjType == "1" - loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.tag ) + loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.TAG ) CASE loReg.ObjType == "25" - loReg.TAG = SUBSTR(loReg.TAG,3) + loReg.TAG = SUBSTR(loReg.TAG,3) && Quito el ENTER agregado antes OTHERWISE - loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.tag ) + loReg.TAG = THIS.decode_SpecialCodes_1_31( loReg.TAG ) ENDCASE CASE .analizarBloque_CDATA_inline( toReport, @tcLine, @taCodeLines, @I, tnCodeLines, @loReg, 'tag2' ) @@ -5185,7 +5461,7 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin ENDWITH && THIS I = I - 1 - toReport.Add( loReg ) + toReport.ADD( loReg ) ENDIF CATCH TO loEx @@ -5201,7 +5477,400 @@ DEFINE CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin ENDPROC -ENDDEFINE +ENDDEFINE && CLASS c_conversor_prg_a_frx AS c_conversor_prg_a_bin + + +******************************************************************************************************************* +DEFINE CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin + #IF .F. + LOCAL THIS AS c_conversor_prg_a_dbf OF 'FOXBIN2PRG.PRG' + #ENDIF + _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] + + + ******************************************************************************************************************* + PROCEDURE Convertir + LPARAMETERS toTable, toEx AS EXCEPTION + DODEFAULT( @toTable, @toEx ) + + #IF .F. + LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; + , laBloquesExclusion(1,2), lnBloquesExclusion, I + STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version + STORE '' TO lcLine, lcSourceFile + STORE NULL TO loReg, toModulo + + C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) + lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + + THIS.doBackup( .F., .T. ) + + *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toTable ) + + THIS.escribirArchivoBin( @toTable ) + + + CATCH TO loEx + lnCodError = loEx.ERRORNO + + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN lnCodError + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE escribirArchivoBin + LPARAMETERS toTable + *-- ----------------------------------------------------------------------------------------------------------- + #IF .F. + LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL I, lnCodError, loEx AS EXCEPTION + LOCAL loField AS CL_DBF_FIELD OF 'FOXBIN2PRG.PRG' + LOCAL loIndex AS CL_DBF_INDEX OF 'FOXBIN2PRG.PRG' + LOCAL lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate + + STORE '' TO lcIndex, lcFieldDef + + lcCreateTable = 'CREATE TABLE "' + THIS.c_OutputFile + '" FREE CodePage=' + toTable._CodePage + ' (' + + *-- Conformo los campos + FOR EACH loField IN toTable._Fields FOXOBJECT + lcLongDec = '' + + *-- Nombre, Tipo + lcFieldDef = lcFieldDef + ', ' + loField._Name + ' ' + loField._Type + + *-- Longitud + IF INLIST( loField._Type, 'C', 'N', 'F', 'Q', 'V' ) + lcLongDec = lcLongDec + '(' + loField._Width + ENDIF + + *-- Decimales + IF INLIST( loField._Type, 'B', 'N', 'F' ) AND loField._Decimals > '0' + IF EMPTY(lcLongDec) + lcLongDec = lcLongDec + '(' + ELSE + lcLongDec = lcLongDec + ',' + ENDIF + lcLongDec = lcLongDec + loField._Decimals + ENDIF + + IF NOT EMPTY(lcLongDec) + lcLongDec = lcLongDec + ')' + ENDIF + + lcFieldDef = lcFieldDef + lcLongDec + + *-- Null + lcFieldDef = lcFieldDef + IIF( loField._Null = '.T.', ' NULL', ' NOT NULL' ) + + *-- NoCPTran + IF loField._NoCPTran = '.T.' + lcFieldDef = lcFieldDef + ' NOCPTRAN' + ENDIF + + *-- AutoInc + IF loField._AutoInc_NextVal <> '0' + lcFieldDef = lcFieldDef + ' AUTOINC NEXTVAL ' + loField._AutoInc_NextVal + ' STEP ' + loField._AutoInc_Step + ENDIF + + loField = NULL + ENDFOR + + lcCreateTable = lcCreateTable + SUBSTR(lcFieldDef,3) + ')' + *STRTOFILE(lcCreateTable,'CreateTable.txt') + &lcCreateTable. + + *-- Regenero los índices + FOR EACH loIndex IN toTable._Indexes FOXOBJECT + lcIndex = 'INDEX ON ' + loIndex._Key + ' TAG ' + loIndex._TagName + + IF loIndex._TagType = 'BINARY' + lcIndex = lcIndex + ' BINARY' + ELSE + lcIndex = lcIndex + ' COLLATE "' + loIndex._Collate + '"' + + IF NOT EMPTY(loIndex._Filter) + lcIndex = lcIndex + ' FOR ' + loIndex._Filter + ENDIF + + lcIndex = lcIndex + ' ' + loIndex._Order + + IF loIndex._TagType <> 'REGULAR' + *-- Si es PRIMARY lo cambio a CANDIDATE y luego lo recodifico + lcIndex = lcIndex + ' ' + STRTRAN( loIndex._TagType, 'PRIMARY', 'CANDIDATE' ) + ENDIF + ENDIF + + *STRTOFILE( lcIndex, 'index_' + loIndex._TagName + '.txt' ) + &lcIndex. + ENDFOR + + + USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile))) + + ldLastUpdate = EVALUATE( '{^' + toTable._LastUpdate + '}' ) + THIS.write_DBF_Metadata( THIS.c_OutputFile, toTable._Database, ldLastUpdate ) + + + CATCH TO loEx + lnCodError = loEx.ERRORNO + loEx.USERVALUE = 'lcIndex="' + TRANSFORM(lcIndex) + '"' + CR_LF ; + + 'lcFieldDef="' + TRANSFORM(lcFieldDef) + '"' + CR_LF ; + + 'lcCreateTable="' + TRANSFORM(lcCreateTable) + '"' + + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + FINALLY + + ENDTRY + + RETURN lnCodError + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE identificarBloquesDeCodigo + *-------------------------------------------------------------------------------------------------------------- + * taCodeLines (!@ IN ) El array con las líneas del código donde buscar + * tnCodeLines (!@ IN ) Cantidad de líneas de código + * taBloquesExclusion (?@ IN ) Sin uso + * tnBloquesExclusion (?@ IN ) Sin uso + * toTable (?@ OUT) Objeto con toda la información de la tabla analizada + *-------------------------------------------------------------------------------------------------------------- + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toTable + EXTERNAL ARRAY taCodeLines, taBloquesExclusion + + #IF .F. + LOCAL toTable AS CL_DBF_TABLE OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueTable_Completed + STORE 0 TO I + + THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile)) + + IF tnCodeLines > 1 + toTable = NULL + toTable = CREATEOBJECT('CL_DBF_TABLE') + + WITH THIS + FOR I = 1 TO tnCodeLines + .set_Line( @lcLine, @taCodeLines, I ) + + IF .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + LOOP + ENDIF + + DO CASE + CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toTable, @lcLine, @taCodeLines, @I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. + + CASE NOT llBloqueTable_Completed AND toTable.analizarBloque( @lcLine, @taCodeLines, @I, tnCodeLines ) + llBloqueTable_Completed = .T. + + ENDCASE + ENDFOR + ENDWITH && THIS + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN + ENDPROC + + +ENDDEFINE && CLASS c_conversor_prg_a_dbf AS c_conversor_prg_a_bin + + +******************************************************************************************************************* +DEFINE CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin + #IF .F. + LOCAL THIS AS c_conversor_prg_a_dbc OF 'FOXBIN2PRG.PRG' + #ENDIF + _MEMBERDATA = [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] + + + ******************************************************************************************************************* + PROCEDURE Convertir + LPARAMETERS toDatabase, toEx AS EXCEPTION + DODEFAULT( @toDatabase, @toEx ) + + #IF .F. + LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL lnCodError, loEx AS EXCEPTION, loReg, lcLine, laCodeLines(1), lnCodeLines, lnFB2P_Version, lcSourceFile ; + , laBloquesExclusion(1,2), lnBloquesExclusion, I + STORE 0 TO lnCodError, lnCodeLines, lnFB2P_Version + STORE '' TO lcLine, lcSourceFile + STORE NULL TO loReg, toModulo + + C_FB2PRG_CODE = FILETOSTR( THIS.c_InputFile ) + lnCodeLines = ALINES( laCodeLines, C_FB2PRG_CODE ) + + THIS.doBackup( .F., .T. ) + + *-- Creo la tabla + *THIS.createTable() + + *-- Identifico el inicio/fin de bloque, definición, cabecera y cuerpo del reporte + THIS.identificarBloquesDeCodigo( @laCodeLines, lnCodeLines, @laBloquesExclusion, lnBloquesExclusion, @toDatabase ) + + THIS.escribirArchivoBin( @toDatabase ) + + + CATCH TO loEx + lnCodError = loEx.ERRORNO + + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN lnCodError + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE escribirArchivoBin + LPARAMETERS toDatabase + *-- ----------------------------------------------------------------------------------------------------------- + #IF .F. + LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL lnCodError, lcCreateTable, lcLongDec, lcFieldDef, lcIndex, ldLastUpdate + lnCodError = 0 + STORE '' TO lcIndex, lcFieldDef + + toDatabase.updateDBC( THIS.c_OutputFile ) + + *USE IN (SELECT(JUSTSTEM(THIS.c_OutputFile))) + + + CATCH TO loEx + lnCodError = loEx.ERRORNO + + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN lnCodError + ENDPROC + + + ******************************************************************************************************************* + PROCEDURE identificarBloquesDeCodigo + *-------------------------------------------------------------------------------------------------------------- + * taCodeLines (!@ IN ) El array con las líneas del código donde buscar + * tnCodeLines (!@ IN ) Cantidad de líneas de código + * taBloquesExclusion (?@ IN ) Sin uso + * tnBloquesExclusion (?@ IN ) Sin uso + * toDatabase (?@ OUT) Objeto con toda la información de la base de datos analizada + * + * NOTA: + * Como identificador se usa el nombre de clase o de procedimiento, según corresponda. + *-------------------------------------------------------------------------------------------------------------- + LPARAMETERS taCodeLines, tnCodeLines, taBloquesExclusion, tnBloquesExclusion, toDatabase + EXTERNAL ARRAY taCodeLines, taBloquesExclusion + + #IF .F. + LOCAL toDatabase AS CL_DBC OF 'FOXBIN2PRG.PRG' + #ENDIF + + TRY + LOCAL I, lc_Comentario, lcLine, llFoxBin2Prg_Completed, llBloqueDatabase_Completed + STORE 0 TO I + + THIS.c_Type = UPPER(JUSTEXT(THIS.c_OutputFile)) + + IF tnCodeLines > 1 + toDatabase = NULL + toDatabase = CREATEOBJECT('CL_DBC') + + WITH THIS + FOR I = 1 TO tnCodeLines + .set_Line( @lcLine, @taCodeLines, I ) + + IF .lineIsOnlyCommentAndNoMetadata( @lcLine, @lc_Comentario ) && Vacía o solo Comentarios + LOOP + ENDIF + + DO CASE + CASE NOT llFoxBin2Prg_Completed AND .analizarBloque_FoxBin2Prg( toDatabase, @lcLine, @taCodeLines, @I, tnCodeLines ) + llFoxBin2Prg_Completed = .T. + + CASE NOT llBloqueDatabase_Completed AND toDatabase.analizarBloque( @lcLine, @taCodeLines, @I, tnCodeLines ) + llBloqueDatabase_Completed = .T. + + ENDCASE + ENDFOR + ENDWITH && THIS + ENDIF + + CATCH TO loEx + IF THIS.l_Debug AND _VFP.STARTMODE = 0 + SET STEP ON + ENDIF + + THROW + + ENDTRY + + RETURN + ENDPROC + + +ENDDEFINE && CLASS c_conversor_prg_a_dbc AS c_conversor_prg_a_bin ******************************************************************************************************************* @@ -5210,35 +5879,47 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LOCAL THIS AS c_conversor_bin_a_prg OF 'FOXBIN2PRG.PRG' #ENDIF _MEMBERDATA = [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; - + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + + [] ; + [] @@ -5538,7 +6219,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF VARTYPE(tcIndentation) # 'C' tcIndentation = '' ENDIF - + *-- Quito las líneas en blanco luego del final del ENDPROC X = 0 FOR I = lnFin TO 1 STEP -1 @@ -5550,7 +6231,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDIF X = X + 1 ENDFOR - + IF X > 0 lnFin = lnFin - X DIMENSION laLineas(lnFin) @@ -5790,18 +6471,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF '.' $ toRegObj.PARENT *-- Este caso: clase.objeto.objeto ==> se quita clase TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>ADD OBJECT '<>.<>' AS <> <<>> + <<>> ADD OBJECT '<>.<>' AS <> <<>> ENDTEXT ELSE *-- Este caso: objeto TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>ADD OBJECT '<>' AS <> <<>> + <<>> ADD OBJECT '<>' AS <> <<>> ENDTEXT ENDIF IF NOT EMPTY(lcMemo) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - WITH ; + <> ; <> ENDTEXT ENDIF @@ -5830,7 +6511,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 <> - + <<>> ENDTEXT CATCH TO loEx @@ -5860,18 +6541,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base FOR I = 1 TO lnMethodCount *-- Genero los métodos indentados *TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - * <><>PROCEDURE <> + * <<>> <>PROCEDURE <> * <> - * <>ENDPROC + * <<>> ENDPROC *ENDTEXT *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso - lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + 'PROCEDURE ' + laMethods(I,1) + lcMethods = lcMethods + CR_LF + C_TAB + laMethods(I,3) + C_PROCEDURE + ' ' + laMethods(I,1) lcMethods = lcMethods + CR_LF + THIS.IndentarMemo( laCode(laMethods(I,2)), CHR(9) + CHR(9) ) - lcMethods = lcMethods + CR_LF + C_TAB + 'ENDPROC' + lcMethods = lcMethods + CR_LF + C_TAB + C_ENDPROC lcMethods = lcMethods + CR_LF ENDFOR - + C_FB2PRG_CODE = C_FB2PRG_CODE + lcMethods ENDIF @@ -5913,20 +6594,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Nombre del método TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> <> + <<>> <> <> ENDTEXT *-- Comentarios del método (si tiene) IF lnCommentRow > 0 AND NOT EMPTY(taPropsAndComments(lnCommentRow,2)) TEXT TO lcMethods ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><>&& <> + <<>> && <> ENDTEXT ENDIF *-- Código del método *TEXT TO lcMethods2 ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 * <> - * <>ENDPROC + * <<>> ENDPROC *ENDTEXT *-- Sustituyo el TEXT/ENDTEXT aquí porque a veces quita espacios de la derecha, y eso es peligroso @@ -6006,20 +6687,20 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Escribo las propiedades de la clase y sus comentarios (los comentarios aquí son redundantes) FOR I = 1 TO ALEN(taPropsAndValues, 1) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> = <> + <<>> <> = <> ENDTEXT lnComment = ASCAN( taPropsAndComments, taPropsAndValues(I,1), 1, 0, 1, 8) IF lnComment > 0 AND NOT EMPTY(taPropsAndComments(lnComment,2)) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><>&& <> + <<>> && <> ENDTEXT ENDIF ENDFOR TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - + <<>> ENDTEXT ENDIF ENDWITH && THIS @@ -6057,7 +6738,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base lcPropsMethodsDefd = '' TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> + <<>> <> ENDTEXT FOR I = 1 TO tnPropsAndComments_Count @@ -6071,18 +6752,18 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base , 'p' ) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><>*<>: <> + <<>> *<>: <> ENDTEXT IF NOT EMPTY(taPropsAndComments(I,2)) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><><<'&'>><<'&'>> <> + <<>> <<'&'>><<'&'>> <> ENDTEXT ENDIF ENDFOR TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <><> + <<>> <> ENDTEXT ENDIF @@ -6115,7 +6796,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Comentario de la clase IF NOT EMPTY(toRegClass.RESERVED7) THEN TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 - <><><<'&'+'&'>> <> + <<>> <<'&'+'&'>> <> ENDTEXT ENDIF ENDPROC @@ -6127,7 +6808,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF tnLastClass = 1 TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 <<'ENDDEFINE'>> - + <<>> ENDTEXT ENDIF ENDPROC @@ -6139,7 +6820,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- #INCLUDE IF NOT EMPTY(toReg.RESERVED8) THEN TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>#INCLUDE "<>" + <<>> #INCLUDE "<>" ENDTEXT ENDIF ENDPROC @@ -6151,11 +6832,11 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base *-- Agrego Metadatos de la clase (Baseclass, Timestamp, Scale, Uniqueid) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - + <<>> ENDTEXT TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2+8 - <><> + <<>> <> Baseclass="<>" Timestamp="<>" Scale="<>" @@ -6193,7 +6874,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF NOT EMPTY(tcHiddenProp) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>HIDDEN <> + <<>> HIDDEN <> ENDTEXT ENDIF ENDPROC @@ -6220,7 +6901,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base IF NOT EMPTY(tcProtectedProp) TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>PROTECTED <> + <<>> PROTECTED <> ENDTEXT ENDIF ENDPROC @@ -6231,7 +6912,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base LPARAMETERS toReg TRY - LOCAL lc_TAG_REPORTE + LOCAL lc_TAG_REPORTE, loEx AS EXCEPTION lc_TAG_REPORTE_I = '<' + C_TAG_REPORTE + ' ' lc_TAG_REPORTE_F = '' @@ -6240,7 +6921,7 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base ENDTEXT TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>> + <<>> platform="WINDOWS " uniqueid="<>" timestamp="<>" objtype="<>" <<>> ENDTEXT TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1 PRETEXT 1+2 @@ -6311,15 +6992,14 @@ DEFINE CLASS c_conversor_bin_a_prg AS c_conversor_base supgroup="<>" supvalchng="<>" supexpr="<>" > ENDTEXT - * <>tag="<>" TEXT TO C_FB2PRG_CODE ADDITIVE TEXTMERGE NOSHOW FLAGS 1+2 PRETEXT 1+2 - <>>]]> - <>>]]> - <>>]]> - <>>]]> - <>