358 lines
11 KiB
Plaintext
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
|