{ ========================================================================= PROGRAMA : MAINMENU OBJETIVO : INICIAR EL MENU DEL SISTEMA PROGRAMADOR : ING. JUAN SOTO FECHA : 13 de Marzo 2009 ======================================================================== } IMPORT os GLOBALS DEFINE dirs DYNAMIC ARRAY OF RECORD ddir STRING END RECORD, usuario,nclave,cclave,clave char(50), altera CHAR(100), cambia_c,accesso CHAR(2), pperfil SMALLINT, sesion INT, ptasa DEC(12,2) DEFINE mbs DYNAMIC ARRAY OF RECORD mbs STRING, prog STRING, type STRING, desc STRING END RECORD DEFINE nmbs INTEGER DEFINE longDesc STRING, pprograma CHAR(50), ckprinter,pprinter1,pprinter2 SMALLINT, menu_layout CHAR(1) END GLOBALS # --- variables de modulo para el menu desde seg0004 (guardas de PREPARE) --- DEFINE m_prep_dirs SMALLINT DEFINE m_prep_sync SMALLINT MAIN DEFINE nombre_cia CHAR(50) DEFER INTERRUPT OPTIONS ACCEPT KEY RETURN #OPTIONS INPUT WRAP CALL autentificacion() RETURNING pperfil,pprinter1,pprinter2,ckprinter,usuario,clave OPEN FORM main FROM "mainmenuform" DISPLAY FORM main # BUSCA EL NOMBRE DE LA EMPRESA SELECT a.nombre INTO nombre_cia FROM companias a SELECT a.prima INTO Ptasa FROM vetb00019 a WHERE disponible = "S" DISPLAY "Usuario" TO lusuario DISPLAY "Fecha" TO lfecha DISPLAY "Tasa" TO ltasa DISPLAY ptasa TO tasa DISPLAY BY NAME nombre_cia,usuario CALL load_lookfeel() CALL init_mbs() DIALOG ATTRIBUTES(FIELD ORDER FORM, UNBUFFERED) DISPLAY ARRAY dirs TO dirs.* BEFORE ROW CALL sync_mbs(DIALOG) CALL DIALOG.setCurrentRow("mbs",1) END DISPLAY DISPLAY ARRAY mbs TO mbs.* END DISPLAY INPUT BY NAME longDesc END INPUT ON ACTION show CALL show_mbs(DIALOG) ON ACTION clave CALL cambia_clave(usuario,clave) ON ACTION lookfeel CALL choose_lookfeel() ON ACTION close EXIT DIALOG END DIALOG END MAIN FUNCTION show_mbs(d) DEFINE d ui.Dialog DEFINE rdir, rmbs INTEGER DEFINE cmd STRING,file_path VARCHAR(100), strconect VARCHAR(20) LET rdir = d.getCurrentRow("dirs") LET rmbs = d.getCurrentRow("mbs") IF mbs[rmbs].prog IS NULL THEN RETURN END IF IF mbs[rmbs].type = "services" THEN #CONTROL ACCESO AL PROGRAMA LET pprograma = mbs[rmbs].prog CALL seg000(usuario,pperfil,pprograma) RETURNING accesso DISPLAY BY NAME usuario,file_path,pperfil IF accesso = "SI" THEN SELECT a.ruta,a.conexion INTO file_path,strconect FROM seg0005 a WHERE a.cod_perfil = pperfil AND a.programa = pprograma # LET file_path = 'E:\\MARMOTECHC\\BIN320' DISPLAY BY NAME file_path,pperfil DISPLAY "mainmenu credenciales: ",usuario clipped," ",clave clipped," ",file_path clipped LET cmd = "fglrun ",file_path CLIPPED, "\\",mbs[rmbs].prog, ".42r " ,usuario CLIPPED," ",clave CLIPPED, " ",pprinter1 ," ",pprinter2, " ",ckprinter," ",file_path," ",strconect RUN cmd WITHOUT WAITING UPDATE seg0001 SET ultimo_programa_ejecutado = pprograma WHERE seg0001.usuario = usuario ELSE CALL mbox_msg( "ATENCION", "USUARIO NO TIENE PERMISOS PARA UTILIZAR OPCION", "stop") END IF END IF IF mbs[rmbs].type = "FILE" THEN #IF accesso = "SI" THEN LET cmd = fgl_getenv("FGLFILE"), "\\",mbs[rmbs].prog CLIPPED,".XLS" # RUN cmd WITHOUT WAITING # ELSE # CALL FGL_WINMESSAGE( "ATENCION", "USUARIO NO TIENE PERMISOS PARA UTILIZAR OPCION", "stop") # END IF #CALL showfile(dirs[rdir].ddir || "/" || mbs[rmbs].prog) RETURN END IF END FUNCTION #------------------------------------------------------------------------- # init_mbs(): carga los MODULOS (columna izquierda) desde seg0004. # Antes: leia los del XML mainmenu.data. # Ahora: SELECT DISTINCT modulo ... WHERE activo=1 ORDER BY modulo_orden #------------------------------------------------------------------------- FUNCTION init_mbs() DEFINE p_modulo CHAR(40) DEFINE l_sql STRING DISPLAY today TO fecha_sistema CALL dirs.clear() CALL mbs.clear() IF m_prep_dirs = 0 THEN LET l_sql = "SELECT modulo FROM seg0004", " WHERE activo = 1 AND modulo IS NOT NULL", " GROUP BY modulo, modulo_orden", " ORDER BY modulo_orden, modulo" PREPARE p_dirs FROM l_sql DECLARE c_dirs CURSOR FOR p_dirs LET m_prep_dirs = 1 END IF FOREACH c_dirs INTO p_modulo CALL dirs.appendElement() LET dirs[dirs.getLength()].ddir = p_modulo CLIPPED END FOREACH END FUNCTION #------------------------------------------------------------------------- # sync_mbs(): carga las OPCIONES del modulo seleccionado desde seg0004. # Antes: recorria el XML del activo. # Ahora: SELECT etiqueta,programa,tipo,descripcion # WHERE modulo=? AND activo=1 ORDER BY orden # Mapeo de tipos IGUAL al original (V/F/B/C -> services/FILE/file). #------------------------------------------------------------------------- FUNCTION sync_mbs(d) DEFINE d ui.Dialog DEFINE p_modulo CHAR(40) DEFINE r_etq CHAR(80), r_prog CHAR(50), r_tipo CHAR(2), r_desc CHAR(100) DEFINE n INTEGER DEFINE l_sql STRING INITIALIZE longDesc TO NULL CALL mbs.clear() LET p_modulo = dirs[d.getCurrentRow("dirs")].ddir IF m_prep_sync = 0 THEN LET l_sql = "SELECT etiqueta, programa, tipo, descripcion FROM seg0004", " WHERE modulo = ? AND activo = 1", " ORDER BY orden" PREPARE p_sync FROM l_sql DECLARE c_mbs CURSOR FOR p_sync LET m_prep_sync = 1 END IF FOREACH c_mbs USING p_modulo INTO r_etq, r_prog, r_tipo, r_desc CASE r_tipo CLIPPED WHEN "V" CALL mbs.appendElement() LET n = mbs.getLength() LET mbs[n].type = "services" LET mbs[n].mbs = r_etq CLIPPED LET mbs[n].prog = r_prog CLIPPED LET mbs[n].desc = r_desc CLIPPED WHEN "F" CALL mbs.appendElement() LET n = mbs.getLength() LET mbs[n].type = "FILE" LET mbs[n].mbs = r_etq CLIPPED LET mbs[n].prog = r_prog CLIPPED LET mbs[n].desc = r_desc CLIPPED WHEN "B" IF r_prog CLIPPED == "README" THEN LET longDesc = readfile(p_modulo CLIPPED || "/README") ELSE CALL mbs.appendElement() LET n = mbs.getLength() LET mbs[n].type = "file" LET mbs[n].mbs = r_etq CLIPPED LET mbs[n].prog = r_prog CLIPPED LET mbs[n].desc = r_desc CLIPPED END IF WHEN "C" CALL mbs.appendElement() LET n = mbs.getLength() LET mbs[n].type = "file" LET mbs[n].mbs = r_etq CLIPPED LET mbs[n].prog = r_prog CLIPPED LET mbs[n].desc = r_desc CLIPPED END CASE END FOREACH END FUNCTION FUNCTION showfile(fn) DEFINE fn STRING DEFINE txt STRING OPEN WINDOW w WITH FORM "Maindisp" ATTRIBUTE(TEXT="File: ["||fn||"]",STYLE="dialog") LET txt = readfile(fn) INPUT BY NAME txt WITHOUT DEFAULTS AFTER INPUT IF INT_FLAG THEN EXIT INPUT END IF CONTINUE INPUT END INPUT CLOSE WINDOW w END FUNCTION FUNCTION readfile(fn) DEFINE fn STRING DEFINE txt STRING DEFINE ln STRING DEFINE ch base.Channel LET ch=base.Channel.create() CALL ch.openfile(fn,"r") CALL ch.setDelimiter("") WHILE ch.read(ln) IF txt IS NULL THEN IF ln IS NULL THEN LET txt = "\n" else LET txt = ln END IF ELSE IF ln IS NULL THEN LET txt = txt || "\n" ELSE LET txt = txt || "\n" || ln END IF END IF END WHILE CALL ch.close() RETURN txt END FUNCTION #------------------------------------------------------------------------- # LOOK & FEEL (seg0013): lee la preferencia y aplica los estilos. # usuario propio primero; si no hay, el valor por defecto (usuario=''). # Se usa l_user para no chocar con la columna 'usuario' de seg0013. #------------------------------------------------------------------------- FUNCTION load_lookfeel() DEFINE l_user VARCHAR(50) DEFINE v CHAR(100) LET menu_layout = "A" LET l_user = usuario CLIPPED LET v = NULL SELECT a.valor INTO v FROM seg0013 a WHERE a.usuario = l_user AND a.clave = 'menu_layout' IF STATUS = NOTFOUND OR v IS NULL THEN SELECT a.valor INTO v FROM seg0013 a WHERE a.usuario = '' AND a.clave = 'menu_layout' END IF IF v IS NOT NULL THEN LET menu_layout = v[1,1] END IF CALL apply_lookfeel() END FUNCTION FUNCTION apply_lookfeel() CASE menu_layout WHEN "A" CALL ui.Interface.LoadStyles("mainmenu_A") WHEN "B" CALL ui.Interface.LoadStyles("mainmenu_B") WHEN "C" CALL ui.Interface.LoadStyles("mainmenu_C") WHEN "D" CALL ui.Interface.LoadStyles("mainmenu_D") OTHERWISE CALL ui.Interface.LoadStyles("mainmenu") END CASE END FUNCTION #------------------------------------------------------------------------- # choose_lookfeel(): el BOTON. Elige A/B/C/D, lo guarda por usuario en # seg0013 (UPSERT) y re-aplica los estilos al vuelo. #------------------------------------------------------------------------- FUNCTION choose_lookfeel() DEFINE l_user VARCHAR(50) DEFINE op CHAR(1) LET l_user = usuario CLIPPED LET op = menu_layout MENU "Estilo del menu" ATTRIBUTES(STYLE="dialog", COMMENT="Elija la apariencia del menu principal") COMMAND "A - Arbol + busqueda" LET op = "A" EXIT MENU COMMAND "B - Tablero (dashboard)" LET op = "B" EXIT MENU COMMAND "C - Nativo (GBC)" LET op = "C" EXIT MENU COMMAND "D - Clasico (re-skin)" LET op = "D" EXIT MENU COMMAND "Cancelar" RETURN END MENU -- UPSERT robusto (no depende de SQLERRD[3], poco fiable con dbmsnc): -- borra la preferencia previa del usuario y reinserta la nueva. DELETE FROM seg0013 WHERE seg0013.usuario = l_user AND seg0013.clave = 'menu_layout' INSERT INTO seg0013(usuario,clave,valor) VALUES (l_user, 'menu_layout', op) LET menu_layout = op CALL apply_lookfeel() CALL mbox_msg("Look & Feel", "Estilo '"||menu_layout CLIPPED||"' aplicado. Algunos cambios se veran al reingresar.","information") END FUNCTION