{ ========================================================================= PROGRAMA : MAINMENU OBJETIVO : INICIAR EL MENU DEL SISTEMA PROGRAMADOR : ING. JUAN SOTO FECHA : 13 de Marzo 2009 ======================================================================== } IMPORT os CONSTANT filename = "mainmenu.data" 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 END GLOBALS MAIN DEFINE pprograma CHAR(50), i int, pdescripcion,pdir VARCHAR(100) DEFER INTERRUPT OPTIONS ACCEPT KEY RETURN OPTIONS INPUT WRAP CONNECT to "smarmotech" AS "MSSQL" USER 'jsoto' USING 'lmmjvsd2014' OPEN FORM main FROM "mainmenuform_1" DISPLAY FORM main CALL ui.Interface.LoadStyles("mainmenu") 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 SET CONNECTION "MSSQL" FOR i = 1 TO mbs.getLength() IF mbs[i].prog IS NOT NULL THEN LET pprograma=mbs[i].prog CLIPPED LET pdescripcion = mbs[i].mbs CLIPPED LET pdir = dirs[arr_curr()].ddir CLIPPED SELECT MAX(a.programa) FROM seg0004 a WHERE a.programa = pprograma IF STATUS <> NOTFOUND THEN DISPLAY "descripcion ",pprograma,"(",pdescripcion,")",pdir UPDATE seg0004 SET descripcion = RTRIM(pdescripcion),sistema=RTRIM(pdir) WHERE programa=pprograma ELSE INSERT INTO seg0004 VALUES (RTRIM(pprograma),RTRIM(pdir),RTRIM(pdescripcion),' ') END IF END IF END FOR ON ACTION clave CALL cambia_clave() 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 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 DISPLAY BY NAME file_path,pperfil DISPLAY "conect ",strconect 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 FGL_WINMESSAGE( "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 FUNCTION init_mbs() DEFINE reader om.XmlReader, attributes om.SaxAttributes, saxevent STRING, s_sel,puser CHAR(50) LET reader = om.XmlReader.createFileReader(filename) LET attributes = reader.getAttributes() LET saxevent = reader.read() DISPLAY today TO fecha_sistema CALL dirs.clear() CALL mbs.clear() WHILE saxevent IS NOT NULL CASE saxevent WHEN 'StartDocument' LET nmbs=0 WHEN 'StartElement' CASE reader.getTagName() WHEN 'mbs' -- Nothing WHEN 'DDir' CALL dirs.appendElement() LET dirs[dirs.getLength()].ddir = attributes.getValue('name') WHEN 'mbs' -- Nothing OTHERWISE DISPLAY "Error: wrong tagName:",reader.getTagName() END CASE WHEN 'EndElement' -- Nothing END CASE LET saxevent=reader.read() END WHILE END FUNCTION FUNCTION sync_mbs(d) DEFINE d ui.Dialog DEFINE reader om.XmlReader, attributes om.SaxAttributes, saxevent STRING DEFINE n INTEGER LET reader = om.XmlReader.createFileReader(filename) LET attributes = reader.getAttributes() LET saxevent = reader.read() INITIALIZE longDesc TO NULL CALL mbs.clear() WHILE saxevent IS NOT NULL CASE saxevent WHEN 'StartDocument' LET nmbs=0 WHEN 'StartElement' CASE reader.getTagName() WHEN 'mbs' -- Nothing WHEN 'DDir' IF attributes.getValue('name') == dirs[d.getCurrentRow("dirs")].ddir THEN LET saxevent = reader.read() WHILE saxevent IS NOT NULL IF saxevent == 'StartElement' THEN CASE reader.getTagName() WHEN 'mbs' CASE attributes.getValue('type') WHEN "V" CALL mbs.appendElement() LET n = mbs.getLength() LET mbs[n].type="services" LET mbs[n].mbs=attributes.getValue('name') LET mbs[n].prog=attributes.getValue('program') LET mbs[n].desc=attributes.getValue('description') WHEN "F" CALL mbs.appendElement() LET n = mbs.getLength() LET mbs[n].type="FILE" LET mbs[n].mbs=attributes.getValue('name') LET mbs[n].prog=attributes.getValue('program') LET mbs[n].desc=attributes.getValue('description') WHEN "B" IF attributes.getValue('program') == "README" THEN LET longDesc = readfile(dirs[d.getCurrentRow("dirs")].ddir || "/README") ELSE CALL mbs.appendElement() LET n = mbs.getLength() LET mbs[n].type="file" LET mbs[n].mbs=attributes.getValue('name') LET mbs[n].prog=attributes.getValue('program') LET mbs[n].desc=attributes.getValue('description') END IF WHEN "C" CALL mbs.appendElement() LET n = mbs.getLength() LET mbs[n].type="file" LET mbs[n].mbs=attributes.getValue('name') LET mbs[n].prog=attributes.getValue('program') LET mbs[n].desc=attributes.getValue('description') END CASE OTHERWISE RETURN END CASE END IF LET saxevent = reader.read() END WHILE END IF WHEN 'mbs' OTHERWISE DISPLAY "Error: wrong tagName:",reader.getTagName() END CASE WHEN 'EndElement' -- Nothing END CASE LET saxevent=reader.read() END WHILE 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 {================================================ FUNCION : AUTENTIFICACION OBJETIVO : VALIDAR FUNCION DEL USUARIO FECHA : 30/6/2009 PROGRAMADOR: JUAN SOTO ================================================== } FUNCTION autentificacion() WHENEVER ERROR CONTINUE CALL startlog("errores.log") OPEN WINDOW inicio AT 1,1 WITH FORM "inicial" INPUT BY NAME usuario,clave WITHOUT DEFAULTS AFTER INPUT IF INT_FLAG THEN ERROR "OPERACION CANCELADA" EXIT INPUT END IF CONNECT TO "smarmotech" USER usuario USING clave IF STATUS < 0 THEN ERROR "USUARIO NO ES VALIDO" CONTINUE INPUT END IF SELECT a.cod_perfil,a.printerdefecto,a.otro_printer ,a.printer_cheque,a.cambia_clave INTO pperfil,pprinter1,pprinter2,ckprinter,cambia_c FROM seg0001 a WHERE a.usuario = usuario IF STATUS != 0 THEN ERROR "APLICACION ESTA REPORTANDO UN ERROR, COMUNIQUESE CON SU ADMINISTRADOR" END IF UPDATE seg0001 SET seg0001.fecha_ultimo_login = getdate(), seg0001.clave = clave WHERE seg0001.usuario = usuario LET cambia_c = UPSHIFT(cambia_c) IF cambia_c = "SI" THEN CALL fgl_winmessage("INFO","DEBE CAMBIAR LA CLAVE","INFO") CALL cambia_clave() END IF EXIT INPUT END INPUT CLOSE WINDOW inicio END FUNCTION FUNCTION cambia_clave() OPEN WINDOW cambia AT 1,1 WITH FORM "cambia" DISPLAY usuario TO usuario DISPLAY clave TO clave INPUT BY NAME nclave,cclave AFTER INPUT IF INT_FLAG THEN CALL FGL_WINMESSAGE( "ATENCION", "OPERACION CANCELADA", "stop") EXIT INPUT END IF IF nclave IS NULL OR nclave = " " THEN CALL FGL_WINMESSAGE( "ATENCION", "CLAVE NUEVA NO PUEDE ESTAR EN BLANCO", "stop") NEXT FIELD nclave END IF IF cclave IS NULL OR cclave = " " THEN CALL FGL_WINMESSAGE( "ATENCION", "CLAVE NUEVA NO PUEDE ESTAR EN BLANCO", "stop") NEXT FIELD cclave END IF IF nclave <> cclave THEN CALL FGL_WINMESSAGE( "ATENCION", "CLAVE NUEVA NO COINCIDE CON LA CONFIRMACION DE LA CLAVE", "stop") NEXT FIELD nclave ELSE LET altera = "sp_password @old = '", clave CLIPPED,"', ", "@new = '",nclave CLIPPED,"' ,", "@loginame = '",usuario CLIPPED, "'" PREPARE caltera FROM altera EXECUTE caltera IF STATUS = 0 THEN UPDATE seg0001 SET cambia_clave = "NO" WHERE seg0001.usuario = usuario CALL FGL_WINMESSAGE( "ATENCION", "CLAVE CAMBIADA SATISFACTORIAMENTE", "stop") LET clave = nclave ELSE CALL FGL_WINMESSAGE( "ATENCION", "NO FUE POSIBLE EL CAMBIO DE LA CLAVE, TRATE NUEVA VEZ", "stop") NEXT FIELD nclave END IF END IF EXIT INPUT END INPUT IF INT_FLAG THEN LET INT_FLAG = FALSE RETURN CLOSE WINDOW cambia END IF END FUNCTION