Files
MBS/PROYECTO/otrodir/MainMenu.4gl
T
2026-08-21 17:09:03 -04:00

358 lines
11 KiB
Plaintext

{
=========================================================================
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 <DDir> 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 <DDir> 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