Files
MBS/PROYECTO/nodir/noprrp003.4gl
T
Abel LópezandClaude Sonnet 5 0641c6b2be Registra noprrp003 (Herramientas de Empleados) y corrige bugs
Se agrega noprrp003 al proyecto usando nofmrp003.4fd, reutilizando
FUNCIONESREPORT y libgre.42x ya configurados para noprrp002.

Se corrige bug donde el combo "Departamento=TODOS" (valor NULL)
generaba via CONSTRUCT la condicion "e.departamento is null" en vez
de no filtrar, excluyendo a todos los empleados con departamento
asignado (confirmado con debug logging: solo empleados sin
departamento pasaban el filtro). Se agrega neutraliza_depto_null()
para neutralizar esa condicion especifica tras el CONSTRUCT.

Se corrige fila vacia sobrante al final del reporte (el FOREACH deja
un elemento extra en el arreglo dinamico; se agrega
inv.deleteElement(idx), igual que en noprrp002).

Probado con empleado especifico, todos los empleados y filtro por
departamento, verificado contra BD (94 registros totales, 12 para
CONTABILIDAD).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-28 12:09:57 -04:00

169 lines
5.1 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : NOPRRP003
OBJETIVO : Reporte de Herramientas por Empleado (adtb00057)
DESARROLLADOR : Ing. Elvis Garcia
-------------------------------------------------------------------------------
Version .4rp: el reporte NO formatea columnas. Solo hace PRINTX; el diseno
visual vive en noprrp003.4rp (Report Studio).
-------------------------------------------------------------------------------
}
GLOBALS "noprgb000.4gl"
DEFINE inv DYNAMIC ARRAY OF RECORD
num_emp INT,
nombre_emp STRING,
departamento SMALLINT,
nom_dpto STRING,
fecha DATE,
codigo STRING,
descripcion STRING,
documento STRING,
cantidad DECIMAL(18,5)
END RECORD
DEFINE p_num_emp_desde, p_num_emp_hasta INT
DEFINE p_departamento SMALLINT
DEFINE p_nom_desde, p_nom_hasta STRING
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT TO "smarmotech" USER usuarios USING clave
SELECT a.* INTO p_companias.* FROM companias a
CALL noprrp003()
END MAIN
FUNCTION noprrp003()
DEFINE handler om.SaxDocumentHandler
DEFINE r_filename STRING
DEFINE r_output STRING
DEFINE preview INT
DEFINE idx INT
DEFINE query STRING
DEFINE criterio STRING
OPEN FORM f FROM "nofmrp003"
DISPLAY FORM f
CALL carga_deptos()
CONSTRUCT criterio ON a.num_emp, e.departamento
FROM num_emp, departamento
IF int_flag THEN
LET int_flag = FALSE
RETURN
END IF
-- El combo "departamento" usa NULL como valor para "TODOS", pero
-- CONSTRUCT traduce eso a "e.departamento is null", que excluye
-- (en vez de incluir) a los empleados con departamento asignado.
-- Se neutraliza esa condicion para que "TODOS" no filtre nada.
CALL neutraliza_depto_null(criterio) RETURNING criterio
LET query =
"SELECT a.num_emp, ",
" RTRIM(e.nom1_emp)+' '+RTRIM(ISNULL(e.apell1_emp,'')), ",
" e.departamento, ",
" RTRIM(ISNULL(d.nom_dpto,'')), ",
" a.fecha, a.codigo, ",
" RTRIM(ISNULL(b.descrip_esp,'')), ",
" a.documento, a.cantidad ",
" FROM adtb00057 a ",
" LEFT JOIN adtb00003 e ON e.num_emp = a.num_emp ",
" LEFT JOIN adtb00001 d ON d.departamento = e.departamento ",
" LEFT JOIN irtb00002 b ",
" ON CAST(b.cod_n AS VARCHAR(10))+'-'+ ",
" CAST(b.cod_grupo AS VARCHAR(10))+'-'+ ",
" CAST(b.cod_tipo AS VARCHAR(10))+'-'+ ",
" CAST(b.cod_sec AS VARCHAR(10)) = a.codigo ",
" WHERE ", criterio CLIPPED, " AND e.status_t is null ",
" ORDER BY e.departamento, a.num_emp, a.fecha "
PREPARE p_rep FROM query
DECLARE cur_rep CURSOR FOR p_rep
CALL inv.clear()
LET idx = 1
FOREACH cur_rep INTO inv[idx].*
LET idx = idx + 1
END FOREACH
CALL inv.deleteElement(idx) -- descarta la fila vacia que deja el FOREACH
IF idx > 1 THEN
LET r_filename = "noprrp003.4rp"
IF fgl_report_loadCurrentSettings(r_filename) THEN
LET preview = 1
CALL selectoutput2() RETURNING r_output
CALL fgl_report_selectDevice(r_output)
CALL fgl_report_selectPreview(preview)
LET handler = fgl_report_commitCurrentSettings()
END IF
START REPORT rep_herr TO XML HANDLER handler
FOR idx = 1 TO inv.getLength()
OUTPUT TO REPORT rep_herr(inv[idx].*)
END FOR
FINISH REPORT rep_herr
ELSE
CALL fgl_winmessage("INFO","NO EXISTEN REGISTROS","INFO")
END IF
END FUNCTION
FUNCTION carga_deptos()
DEFINE cb ui.ComboBox
DEFINE cod SMALLINT
DEFINE nom STRING
LET cb = ui.ComboBox.forName("departamento")
CALL cb.clear()
CALL cb.addItem(NULL, "TODOS")
DECLARE cur_dp CURSOR FOR
SELECT departamento, nom_dpto FROM adtb00001
WHERE status_t IS NULL ORDER BY nom_dpto
FOREACH cur_dp INTO cod, nom
CALL cb.addItem(cod, nom)
END FOREACH
END FUNCTION
REPORT rep_herr(x)
DEFINE x RECORD
num_emp INT,
nombre_emp STRING,
departamento SMALLINT,
nom_dpto STRING,
fecha DATE,
codigo STRING,
descripcion STRING,
documento STRING,
cantidad DECIMAL(18,5)
END RECORD
ORDER EXTERNAL BY x.num_emp
FORMAT
BEFORE GROUP OF x.num_emp
PRINTX x.num_emp, x.nombre_emp, x.departamento, x.nom_dpto
ON EVERY ROW
PRINTX x.fecha, x.codigo, x.descripcion, x.documento, x.cantidad
END REPORT
FUNCTION neutraliza_depto_null(criterio)
DEFINE criterio STRING
DEFINE patron STRING
DEFINE pos INT
LET patron = "e.departamento is null"
LET pos = criterio.getIndexOf(patron, 1)
IF pos > 0 THEN
LET criterio = criterio.subString(1, pos - 1), "1=1",
criterio.subString(pos + patron.getLength(), criterio.getLength())
END IF
RETURN criterio
END FUNCTION