Lambaré - Paraguay.Víctor.Hola FranciscoNo sé si sea posible desde el ejecutable, pero podrías generar una tabla o un archivo de texto antes de generar el .exe:
Para obtener los formularios del proyecto:
SELECT Key FROM NomProyecto.pjx WHERE Type = "K"Por cada formulario:
SELECT Properties FROM NomFormulario.scx WHERE Class == "form"
lcName = STREXTRACT(Properties, [Name = "], ["])Saludos,
Hola Francisco :
El control a ese nivel se suele hacer en dos partes.
Una parte implica poner todos los nombres de forms en una tabla, y vincular esa tabla a la de usuarios y permisos.
La otra parte implica no llamar a los forma directamente con do form, sino usando un método al que se le pasa el nombre del formato a cargar, y es éste método el que verifica los permisos y permite, o no, ejecutar el form.
Hola Francisco :
El control a ese nivel se suele hacer en dos partes.
Una parte implica poner todos los nombres de forms en una tabla, y vincular esa tabla a la de usuarios y permisos.
La otra parte implica no llamar a los forma directamente con do form, sino usando un método al que se le pasa el nombre del formato a cargar, y es éste método el que verifica los permisos y permite, o no, ejecutar el form.
#DEFINE _DEFCLAS_ "DEFINE CLASS "
#DEFINE _ASFORM_ " AS form"
#DEFINE _NAME_ "Name = "+CHR(34)
#DEFINE _IGUAL_ CHR(61)
#DEFINE _COMIL_ CHR(34)
TRY
LOCAL foxbin_dir,;
loEx as Exception, ;
loCnv as Object, ;
lcScx, ;
i, ;
j, ;
lnLines, ;
lWrite ,;
lcFolder, ;
lnFiles, ;
lnNames, ;
lnMaxScx ,;
lnMaxName,;
lnCount
LOCAL ARRAY laLines(1),laNames(1,2)
lnNames = 0
lnMaxScx = 0
lnMaxName = 0
lnCount = 0
foxbin_dir = JUSTPATH(LOCFILE("foxbin2prg.exe","exe","Foxbin2prg"))
IF FILE(ADDBS(foxbin_dir)+"foxbin2prg.exe")
loCnv = NEWOBJECT("c_foxbin2prg",ADDBS(foxbin_dir)+"FOXBIN2PRG.EXE")
ENDIF
lcFolder = GETDIR(FULLPATH(""),"Forms","Carpeta de Forms",48)
IF NOT EMPTY(lcFolder)
lnFiles = ADIR(laFiles,ADDBS(lcFolder)+"*.scx","",1)
FOR i = 1 TO m.lnFiles
lcScx = ADDBS(m.lcFolder)+laFiles[m.i,1]
lcFoxbin = FORCEEXT(lcScx,"sc2")
loCnv.execute(lcScx)
IF FILE(lcFoxbin)
lnCount = lnCount + 1
lnLines = ALINES(lalines,FILETOSTR(m.lcFoxbin),1+4,CHR(13))
FOR j=1 TO lnlines
IF AT( _DEFCLAS_ ,lalines[m.j]) > 0 ;
AND AT( _ASFORM_ ,laLines[m.j]) > 0
lWrite = .t.
LOOP
ENDIF
IF lWrite
IF AT(_NAME_ , lalines[m.j] ) > 0
lnNames = m.lnNames + 1
DIMENSION laNames(m.lnNames,2)
laNames[m.lnNames,1]=m.lcScx
laNames[m.lnNames,2]=CHRTRAN(GETWORDNUM(laLines[m.j],2,_IGUAL_ ),CHR(32)+_COMIL_,"")
lWrite = .f.
EXIT
ENDIF
ENDIF
NEXT
ENDIF
NEXT
IF m.lnNames > 0
FOR i=1 TO m.lnNames
lnMaxScx = MAX(LEN(laNames[m.i,1]),lnMaxScx)
lnMaxName = MAX(LEN(laNames[m.i,2]),lnMaxName)
NEXT
CREATE TABLE MisForms FREE ("file_name" c(m.lnMaxScx) , "Prop_Name" c(m.lnMaxName))
INSERT INTO misforms FROM ARRAY laNames
SELECT misforms
GO TOP
BROWSE
ENDIF
ENDIF
CATCH TO loex
loex.UserValue=PROGRAM()
ShowError(loex)
FINALLY
loCnv = null
ENDTRY
Fran, creo que todavía no caes en que realmente no te ahorraría nada, ya que los permisos para cada formulario necesitarías definirlos igualmente.
Imaginate que tuvieras ese array con la lista de forms, ¿qué harías luego con él?
Exacto lo que quería era ahorrarme eso de forms en una tabla dado que como he dicho van incrementandose y es un rollo tener que ir actualizando la tabla. Creía que habría alguna variable del sistema tipo matriz que contenía dicha información pero veo que no. Así que haré lo que indica Victor.
El miércoles, 24 de junio de 2015, 15:14:02 (UTC+2), Fernando D. Bozzo escribió:
Hola Francisco :
El control a ese nivel se suele hacer en dos partes.
Una parte implica poner todos los nombres de forms en una tabla, y vincular esa tabla a la de usuarios y permisos.
La otra parte implica no llamar a los forma directamente con do form, sino usando un método al que se le pasa el nombre del formato a cargar, y es éste método el que verifica los permisos y permite, o no, ejecutar el form.
Fran, creo que todavía no caes en que realmente no te ahorraría nada, ya que los permisos para cada formulario necesitarías definirlos igualmente.
Imaginate que tuvieras ese array con la lista de forms, ¿qué harías luego con él?
El 24/06/2015 16:02, "Francisco" <direccion@informatica-apliges.com> escribió:
Exacto lo que quería era ahorrarme eso de forms en una tabla dado que como he dicho van incrementandose y es un rollo tener que ir actualizando la tabla. Creía que habría alguna variable del sistema tipo matriz que contenía dicha información pero veo que no. Así que haré lo que indica Victor.
El miércoles, 24 de junio de 2015, 15:14:02 (UTC+2), Fernando D. Bozzo escribió:
Hola Francisco :
El control a ese nivel se suele hacer en dos partes.
Una parte implica poner todos los nombres de forms en una tabla, y vincular esa tabla a la de usuarios y permisos.
La otra parte implica no llamar a los forma directamente con do form, sino usando un método al que se le pasa el nombre del formato a cargar, y es éste método el que verifica los permisos y permite, o no, ejecutar el form.
Fernando la aplicación funciona de la manera que el usuario puede hacer todo y en permisos precisamente hay que incluir solo lo que tenga prohibido. Osea no necesito poner los permisos para cada formulario sino solo lo que en cada formulario tenga prohibido.. por ejemplo añadir en el formulario clientes... eso indica que ese usuario no puede añadir nada en dicho formulario de mantenimiento y así con el resto de ellos...
El miércoles, 24 de junio de 2015, 18:01:46 (UTC+2), Fernando D. Bozzo escribió:
Fran, creo que todavía no caes en que realmente no te ahorraría nada, ya que los permisos para cada formulario necesitarías definirlos igualmente.
Imaginate que tuvieras ese array con la lista de forms, ¿qué harías luego con él?
IF lWrite
**** IF AT(_NAME_ , lalines[m.j] ) > 0
IF RIGHT(CHRTRAN(laLines[m.j],chr(9),""),len(_NAME_))==_NAME_
lnNames = m.lnNames + 1
DIMENSION laNames(m.lnNames,2)
laNames[m.lnNames,1]=m.lcScx
laNames[m.lnNames,2]=CHRTRAN(GETWORDNUM(laLines[m.j],2,_IGUAL_ ),CHR(32)+_COMIL_,"")
lWrite = .f.
EXIT
ENDIF
ENDIF
declare Integer GetFileAttributes in win32api string @
LOCAL lcFolder,nFILES,nT,cForm,cNOMBREFORM,LINEA,cCONT,cCONT1
IF !EXISTE_FILE('FORMULARIOS.DBF') *** CREAR TABLA LIBRE FORMULARIOS cAUX="FORMULARIOS" CREATE TABLE (cAUX) FREE; (NOMBRE C(80),; TITULO C(120)) SELECT FORMULARIOSELSE IF !USED("FORMULARIOS") use FORMULARIOS in 0 EXCLUSIVE ELSE SELECT FORMULARIOS ENDIF GO TOP IF !EOF() SET SAFETY OFF ZAP PACK IN FORMULARIOS SET SAFETY ON ENDIF
ENDIF
lcFolder = GETDIR(FULLPATH(""),"Forms","Carpeta de Forms",48)IF NOT EMPTY(lcFolder)
nFILES= ADIR(mFILES,ADDBS(lcFolder)+"*.SCX","",1) FOR nCONT=1 TO nFILES cForm=ADDBS(lcFolder)+ALLTRIM(mFILES(nCONT,1)) IF existe_file(cForm) && en caso existir el FORM USE (cForm) IN 0 EXCLUSIVE ALIAS TEMPORAL SELECT TEMPORAL GO TOP SCAN ALL IF UPPER(ALLTRIM(TEMPORAL.BASECLASS))=="FORM" linea=ATLINE("Caption",temporal.properties) IF LINEA<>0 cCONT1=MLINE(TEMPORAL.PROPERTIES,LINEA) ELSE cCONT1="" ENDIF nLINEAS=ALINES(cARRAY,temporal.properties) FOR nT = 1 TO nLINEAS IF LEFT(cARRAY(nT),4)="Name" cCONT=cARRAY(nT) EXIT ELSE cCONT="" ENDIF ENDFOR cNOMBREFORM=ALLTRIM(SACAR_NOMBRE(cCont)) cCAPTION=ALLTRIM(SACAR_NOMBRE(cCONT1)) WAIT "FORMULARIO : "+cForm+CHR(13)+"Contenido: "+cNOMBREFORM WINDOWS NOWAIT
SELECT FORMULARIOS LOCATE FOR ALLTRIM(NOMBRE)== cNOMBREFORM IF NOT FOUND() INSERT INTO FORMULARIOS (NOMBRE,TITULO) VALUES (cNOMBREFORM,IIF(EMPTY(cCAPTION),cNOMBREFORM,cCAPTION)) ENDIF
ENDIF SELECT TEMPORAL ENDSCAN USE IN TEMPORAL ENDIF ENDFOR =MESSAGEBOX("PROCESO TERMINADO")ENDIFUSE IN FORMULARIOS
RETURN
************************************************************************************ ALTERNATIVA A FILE()***********************************************************************************Function existe_File LParameters tcFileName return (GetFileAttributes(@m.tcFileName) <> -1)ENDFUNC
* --------------------------------------------------------------* --------------------------------------------------------------FUNCTION SACAR_NOMBRE(cVARIABLENOMBRE AS Character)LOCAL cSUBCADENA cSUBCADENA="" IF '"' $ cVARIABLENOMBRE cSUBCADENA=ALLTRIM(SUBSTR(cVARIABLENOMBRE,AT('"',cVARIABLENOMBRE)+1)) cSUBCADENA=LEFT(cSUBCADENA,LEN(cSUBCADENA)-1) ELSE SUBCADENA=cVARIABLENOMBRE ENDIFRETURN (UPPER(cSUBCADENA))ENDFUNC