{ ======================================================================== PROGRAMA : noprmt028 DESAROLLADO POR: Miguel Pinales / Ing. Juan Soto FECHA :1/10/2019 ========================================================================= } GLOBALS "noprgb000.4gl" DEFINE empleado char(50) DEFINE data_master RECORD text_ndocumento INT, h_fecha DATE, text_sup VARCHAR(100), xfecha_cierre DATE, comentario VARCHAR(100) END RECORD, num_emp_super INT, actualiza char(2), xnumdoc INT, xfecha_cierre DATE, pcompanias RECORD LIKE companias.* DEFINE DATARR DYNAMIC ARRAY OF RECORD fecha_extra DATE, ficha_empleado INT, nom_empleado VARCHAR(100), departamento INT, sueldo FLOAT, cantidad SMALLINT, valor FLOAT, nombre_mov SMALLINT, cod_mov SMALLINT END RECORD, xnombre_mov VARCHAR(50) DEFINE depart char(20) MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT to "decomarmol" USER usuarios USING clave SELECT * INTO pcompanias.* FROM companias --LET usuarios = 'bisaac' CALL noprmt028() END MAIN FUNCTION noprmt028() OPEN WINDOW HOME_FRM WITH FORM 'nofmmt028.4fd' MENU ON ACTION nuevo LET actualiza="NO" CALL noprmtad028() ON ACTION modifica LET actualiza="SI" CALL noprmtmf028() ON ACTION salir EXIT MENU END MENU CLOSE WINDOW HOME_FRM END FUNCTION FUNCTION noprmtad028() DIALOG ATTRIBUTE(UNBUFFERED) INPUT BY NAME data_master.* ATTRIBUTE (WITHOUT DEFAULTS) BEFORE INPUT LET data_master.h_fecha = TODAY DISPLAY BY NAME data_master.h_fecha SELECT '('||cast(a.num_emp AS varchar(10))||') '||RTRIM(a.nom1_emp)||' '||RTRIM(a.apell1_Emp)||' '||a.apell2_emp ,a.num_Emp INTO data_master.text_sup FROM adtb00003 a, seg0001 b WHERE b.usuario=usuarios AND b.num_emp=a.num_emp SELECT CONVERT(CHAR(10),MAX(a.fecha_cierre_nomina),103) INTO xfecha_cierre FROM notb00010 a WHERE a.fecha_del < today DISPLAY BY NAME data_master.text_sup,xfecha_cierre NEXT FIELD h_fecha AFTER INPUT IF actualiza="NO" THEN DECLARE buscar CURSOR FOR SELECT ' ', a.num_emp,RTRIM(a.nom1_emp)||' '||RTRIM(a.apell1_Emp),a.sueldo_ac FROM adtb00003 a WHERE a.status_t IS NULL LET idx =1 FOREACH buscar INTO DATARR[idx].fecha_extra,DATARR[idx].ficha_empleado,DATARR[idx].nom_empleado, DATARR[idx].sueldo LET IDX = IDX +1 END FOREACH END IF END INPUT INPUT ARRAY DATARR FROM adetalle.* ATTRIBUTE (WITHOUT DEFAULTS) BEFORE FIELD departamento CALL departamentos() AFTER FIELD DEPARTAMENTO SELECT a.nom_dpto INTO depart FROM adtb00001 a WHERE a.status_t IS NULL AND a.departamento=DATARR[ARR_CURR()].departamento AFTER FIELD ficha_empleado IF DATARR[arr_curr()].ficha_empleado IS NOT NULL THEN SELECT RTRIM(a.nom1_emp)||' '||RTRIM(a.apell1_Emp),a.sueldo_ac INTO DATARR[arr_curr()].nom_empleado,DATARR[arr_curr()].sueldo FROM adtb00003 a,adtb00004 b WHERE a.num_emp =DATARR[arr_curr()].ficha_empleado AND a.cod_puesto = b.cod_puesto AND a.status_t IS NULL IF STATUS = NOTFOUND THEN CALL msg(3) NEXT FIELD ficha_empleado END IF DISPLAY DATARR[arr_curr()].nom_empleado TO adetalle[arr_curr()].nom_empleado # DISPLAY DATARR[arr_curr()].sueldo TO adetalle[arr_curr()].sueldo END IF AFTER FIELD cantidad IF DATARR[arr_curr()].ficha_empleado IS NOT NULL THEN DISPLAY DATARR[arr_curr()].ficha_empleado DISPLAY WEEKDAY(DATARR[arr_curr()].fecha_extra) IF WEEKDAY(DATARR[arr_curr()].fecha_extra) = 0 THEN CALL busca_mov(2) RETURNING xnombre_mov LET datarr[arr_curr()].cod_mov=2 LET datarr[arr_curr()].nombre_mov=xnombre_mov CALL calcula100(datarr[arr_curr()].sueldo,datarr[arr_curr()].cantidad) RETURNING DATARR[ARR_CURR()].valor DISPLAY DATARR[ARR_CURR()].valor ELSE CALL busca_mov(3) RETURNING xnombre_mov LET datarr[arr_curr()].cod_mov=3 LET datarr[arr_curr()].nombre_mov=xnombre_mov # DISPLAY datarr[arr_curr()].sueldo CALL calcula35(datarr[arr_curr()].sueldo,datarr[arr_curr()].cantidad) RETURNING DATARR[ARR_CURR()].valor END IF END IF AFTER FIELD fecha_extra IF DATARR[arr_curr()].fecha_extra IS NOT NULL THEN IF DATARR[arr_curr()].fecha_extra > xfecha_cierre THEN CALL msg(57) NEXT FIELD fecha_extra END IF IF DATARR[arr_curr()].fecha_extra > TODAY THEN CALL msg(241) NEXT FIELD fecha_extra END IF END IF ON ACTION guardar CALL salvaInformacion() ON ACTION reporte CALL reporte() AFTER INPUT FOR idx = 1 TO datarr.getLength() IF DATARR[idx].ficha_empleado IS NULL AND DATARR[idx].cantidad > 0 THEN CALL msg(16) NEXT FIELD ficha_empleado END IF END FOR END INPUT ON ACTION CANCEL EXIT PROGRAM END DIALOG END FUNCTION FUNCTION calcula15(salario,cantidad) DEFINE salario, resultado,cantidad DECIMAL(12,2) LET resultado = (((salario/23.83)/3) * cantidad)* 1.15 DISPLAY resultado RETURN resultado END FUNCTION FUNCTION calcula35(salario,cantidad) DEFINE salario, resultado,cantidad DECIMAL(12,2) LET resultado = (((salario/23.83)/8) * cantidad)* 1.35 DISPLAY resultado RETURN resultado END FUNCTION FUNCTION calcula100(salario,cantidad) DEFINE salario,cantidad, resultado2 DECIMAL(12,2) LET resultado2 = (((salario/23.83)/8) * cantidad)* 2 RETURN resultado2 END FUNCTION FUNCTION salvaInformacion() DEFINE idx INT BEGIN WORK IF actualiza ="NO" THEN INSERT INTO notb00028(supervisor, fecha, num_emp, fech_crea, us_crea,pagado, comentario) VALUES(data_master.text_sup ,data_master.h_fecha ,num_emp_super, getdate(),usuarios,'NO',data_master.comentario) LET xnumdoc = sqlca.sqlerrd[2] DISPLAY xnumdoc TO text_ndocumento END IF DELETE FROM notb00029 WHERE num_doc=xnumdoc FOR idx = 1 TO DATARR.getLength() IF DATARR[idx].cantidad > 0 THEN INSERT INTO notb00029(num_doc,fecha,num_emp,nombre,sueldo,cantidad ,valor,descrip_mov,cod_mov,us_crea,fech_crea, departamento_labor) VALUES (xnumdoc,DATARR[idx].fecha_extra,DATARR[idx].ficha_empleado, DATARR[idx].nom_empleado,DATARR[idx].sueldo,DATARR[idx].cantidad, DATARR[idx].valor,DATARR[idx].nombre_mov,datarr[idx].cod_mov, usuarios,getdate(), DATARR[idx].departamento) END IF END FOR COMMIT WORK CALL fgl_winmessage("INFO","INFORMACION SALVADA","INFO") END FUNCTION FUNCTION noprmtmf028() DEFINE criterio, pquery STRING CONSTRUCT criterio ON a.num_doc, a.fecha FROM text_ndocumento, h_fecha LET pquery = "SELECT a.num_doc, a.fecha ,Cast(a.num_emp as char(10)) +' '+ b.nom1_emp+' '+RTRIM(b.apell1_emp) ", "from notb00028 a, adtb00003 b, seg0001 c ", "where ",criterio clipped," and ", " c.usuario='", usuarios CLIPPED,"' and ", "c.num_emp=b.num_emp" PREPARE comando FROM pquery DECLARE busca SCROLL CURSOR FOR comando OPEN busca FETCH FIRST busca INTO xnumdoc,data_master.h_fecha,data_master.text_sup IF STATUS = NOTFOUND THEN CALL msg(3) RETURN END IF LET data_master.text_ndocumento = xnumdoc DISPLAY BY NAME data_master.* MENU ON ACTION Primero FETCH FIRST busca INTO xnumdoc,data_master.h_fecha,data_master.text_sup IF STATUS = NOTFOUND THEN CALL msg(5) CONTINUE MENU END IF ON ACTION siguiente FETCH NEXT busca INTO xnumdoc,data_master.h_fecha,data_master.text_sup IF STATUS = NOTFOUND THEN CALL msg(4) CONTINUE MENU END IF LET data_master.text_ndocumento = xnumdoc DISPLAY BY NAME data_master.* ON ACTION anterior FETCH NEXT busca INTO xnumdoc,data_master.h_fecha,data_master.text_sup IF STATUS = NOTFOUND THEN CALL msg(5) CONTINUE MENU END IF LET data_master.text_ndocumento = xnumdoc DISPLAY BY NAME data_master.* ON ACTION actualiza DECLARE busca_detalle CURSOR FOR SELECT a.fecha,a.num_emp,a.nombre, a.sueldo,a.cantidad,a.valor,a.descrip_mov,a.cod_mov FROM notb00029 a WHERE a.num_doc = xnumdoc LET i = 1 FOREACH busca_detalle INTO DATARR[i].* LET i = i + 1 END FOREACH CALL noprmtad028() ON ACTION retornar EXIT MENU END MENU END FUNCTION FUNCTION busca_mov(codigo) DEFINE nombre_mov VARCHAR(50), codigo SMALLINT LET nombre_mov = NULL SELECT a.descrip_mov INTO nombre_mov FROM notb00002 a WHERE a.cod_mov = codigo RETURN nombre_mov END FUNCTION FUNCTION reporte() DEFINE handler om.SaxDocumentHandler, -- return value from fgl_report_commitCurrentSettings() r_filename STRING, -- filename of Report Design Document including .4rp extension r_output STRING, -- output format option preview INTEGER -- TRUE/FALSE, to set preview option LET r_filename ="noprrp028.4rp" LET idx = 1 DISPLAY DATARR[1].valor FOR idx = 1 TO DATARR.getLength() IF DATARR[idx].cantidad > 0 THEN IF idx = 1 THEN IF fgl_report_loadCurrentSettings(r_filename) THEN LET preview=1 CALL seleccionarsalida() RETURNING r_output -- load the .4rp file CALL fgl_report_selectDevice(r_output) -- changing default CALL fgl_report_selectPreview(preview) -- changing default LET handler = fgl_report_commitCurrentSettings() -- commit changes END IF --LET idx = 2 START REPORT reporteHoras_rpt TO XML HANDLER HANDLER DISPLAY "reporte inicio" END IF OUTPUT TO REPORT reporteHoras_rpt(DATARR[idx].*, data_master.text_sup, data_master.h_fecha) END IF END FOR IF idx > 1 THEN FINISH REPORT reporteHoras_rpt ELSE CALL fgl_winmessage("INFO", "NO HAY REGISTROS EN ESTE RANGO DE FECHA Y CON LOS PARAMETROS INDICADOS", "INFO") END IF END FUNCTION REPORT reporteHoras_rpt(x, supervisor, fecha_doc) DEFINE x RECORD fecha_extra DATE, ficha_empleado INT, nom_empleado VARCHAR(100), departamento INT, sueldo FLOAT, cantidad SMALLINT, valor FLOAT, nombre_mov SMALLINT, cod_mov SMALLINT END RECORD, fecha_reporte char(30), fecha char(30), total_horas INT, total_valor_horas DECIMAL(12,2), supervisor VARCHAR(50), fecha_doc DATE, departamento char(20) FORMAT BEFORE GROUP OF supervisor PRINTX supervisor ON EVERY ROW SELECT a.nom_dpto INTO departamento FROM adtb00001 a WHERE a.departamento = x.departamento LET fecha_reporte = today USING "mm/dd/yyyy" LET fecha = data_master.h_fecha USING "mm/dd/yyyy",'--',xfecha_cierre USING "mm/dd/yyyy" PRINTX fecha, fecha_reporte, pcompanias.nombre, x.nom_empleado, x.fecha_extra, x.cantidad , x.valor, x.nombre_mov, xnumdoc, x.fecha_extra, supervisor, fecha_doc,departamento ON LAST ROW LET total_horas = SUM(x.cantidad) LET total_valor_horas = SUM(x.valor) PRINTX total_horas, total_valor_horas END REPORT