Compare commits

...
5 Commits
Author SHA1 Message Date
Abel LópezandClaude Sonnet 5 6ec15cfb3d Registra noprrp044 (Carnet Empleados) y corrige ruta de logo
Se agrega noprrp044 al proyecto usando nofmrp044.4fd, reutilizando
FUNCIONESREPORT y libgre.42x.

Se corrige ruta absoluta hardcodeada en noprrp044.4rp
(file:///F:/MARMOTECHC/BIN320/IMAGENES/marmotech.png, inexistente en
este equipo) por una ruta relativa a IMAGENES/Logo.png, ya presente
en el proyecto.

Probada impresion de carnet (frente y reverso) para un empleado con
foto, verificado contra BD.

Pendiente: la opcion "NO EMPLEADOS" (generacardnet, etiquetas
genericas) usa noprrp044_1.4rp, que no existe en el proyecto (solo
una version renombrada noprrp044_1_otros_ant.4rp de origen incierto).
Se deja sin resolver hasta confirmar con el usuario cual version usar.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-28 16:39:15 -04:00
Abel LópezandClaude Sonnet 5 aeab10ce0d Registra noprrp039 (Reporte Empleados) y corrige bugs de SQL y fecha
Se agrega noprrp039 al proyecto usando nofmrp039.4fd, reutilizando
FUNCIONESREPORT y libgre.42x.

Se corrige "AND  and" duplicado (typo) en las 3 consultas dinamicas
del bloque tipoEmpleados=9 (TODOS los empleados), que producia un
error de sintaxis SQL y bloqueaba completamente esa opcion.

Se corrige CONVERT(CHAR,fech_efec,103) hacia variable DATE en las 5
consultas del programa, mismo patron de error -1205 "Invalid month
in date" ya visto en otros programas.

Se crea PROYECTO/bin/IMAGENES/EMPLEADOS (con .gitkeep), carpeta
faltante donde el programa exporta las fotos de empleados
(foto_empleado.writeFile); sin ella el reporte fallaba con error
-8087 al procesar cualquier empleado con foto guardada.

Probado con empleado especifico y con "TODOS" (activos+inactivos con
foto), verificado contra BD sobre departamento 1000.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-28 13:11:32 -04:00
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
Abel LópezandClaude Sonnet 5 c7442a777b Corrige ancho insuficiente del campo Numero de Nomina en noprrp002
El campo num_nomi en nofmrp002.4fd solo permitia 6 caracteres, pero
existen numeros de nomina de 8 digitos en notb00010 (periodos
codificados como fecha, ej. 27032021). Se amplia a 9 caracteres.

Probado reporte con nomina 2118/Q (14 empleados en notb00008, de los
cuales 12 pertenecen realmente al periodo segun el rango de fechas;
los otros 2 son registros historicos de 2008/2015 con el mismo
numero de nomina por coincidencia de datos antiguos, correctamente
excluidos por el filtro de fecha del reporte).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-28 10:48:04 -04:00
Abel LópezandClaude Sonnet 5 7e2f99b50e Registra noprrp002 (Nomina de Pago) y corrige bugs de reporte PDF
Se agrega noprrp002 al proyecto usando nofmrp002.4fd, mas
vesalidaimpresora.4gl (selectOutput2) en la libreria compartida
FUNCIONESREPORT, y externalDependencies libgre.42x para el motor de
reportes.

Se corrige databaseName="marmotech" invalido en nofmrp002.4fd (schema
no registrado en el proyecto) por "smarmotech".

Se corrige bug de tipo de dato: r_output estaba declarado SMALLINT en
noprrp002.4gl, pero selectOutput2() devuelve un STRING ("PDF","SVG",
"XLSX"). Ese desajuste impedia que fgl_report_selectDevice recibiera
el dispositivo correcto, asi que elegir PDF no generaba un PDF real.
Se cambia r_output a STRING.

Probado reporte agrupado de nomina (vista previa en pantalla y
exportacion a PDF real), verificado contra BD sobre empleado 110,
periodo 2320/Q.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-28 10:09:33 -04:00
7 changed files with 73 additions and 26 deletions
+2 -2
View File
@@ -32,7 +32,7 @@
<MINIPAGE name="Separator" width="1" length="max" color="#ffffff" bgColor="#ffffff" layoutDirection="leftToRight"/>
<WORDBOX name="WordBox7" length=".2inch" bgColor="#54565a" floatingBehavior="enclosed"/>
<LAYOUTNODE name="logo1" width="max" length="min" alignment="none" bgColor="#54565a" layoutDirection="bottomToTop" floatingBehavior="enclosed">
<IMAGEBOX name="ImageBox3" width="1.5inch" alignment="center" baselineType="leftleft" floatingBehavior="enclosed" url="{{&quot;file:///F:/MARMOTECHC/BIN320/IMAGENES/marmotech.png&quot;}}" fill="preserveAspectRatio" intendedResolution="72"/>
<IMAGEBOX name="ImageBox3" width="1.5inch" alignment="center" baselineType="leftleft" floatingBehavior="enclosed" url="{{&quot;IMAGENES/Logo.png&quot;}}" fill="preserveAspectRatio" intendedResolution="72"/>
</LAYOUTNODE>
</LAYOUTNODE>
</MINIPAGE>
@@ -40,7 +40,7 @@
<MINIPAGE name="objetivos1" width="max" length="max" bgColor="#54565a" layoutDirection="topToBottom" floatingBehavior="free" marginTopWidth="0">
<LAYOUTNODE name="logo" width="min" length="min" alignment="center" layoutDirection="topToBottom" floatingBehavior="enclosed">
<WORDBOX name="WordBox8" length=".5inch" floatingBehavior="enclosed"/>
<IMAGEBOX name="ImageBox" width="1.5inch" alignment="center" transformTransparently="true" floatingBehavior="enclosed" url="{{&quot;file:///F:/MARMOTECHC/BIN320/IMAGENES/marmotech.png&quot;}}" fill="completely" intendedResolution="72"/>
<IMAGEBOX name="ImageBox" width="1.5inch" alignment="center" transformTransparently="true" floatingBehavior="enclosed" url="{{&quot;IMAGENES/Logo.png&quot;}}" fill="completely" intendedResolution="72"/>
</LAYOUTNODE>
<LAYOUTNODE name="direccion" width="min" length="min" fontName="Raleway" fontSize="7" layoutDirection="topToBottom" floatingBehavior="enclosed">
<WORDBOX name="WordBox9" length=".4inch" floatingBehavior="enclosed"/>
+25
View File
@@ -143,6 +143,7 @@
<Library binaryName="FUNCIONESREPORT" id="-1423229125" label="FUNCIONESREPORT">
<File filePath="otrodir/msgrp000.4gl"/>
<File filePath="otrodir/seleccionarsalida.4gl"/>
<File filePath="otrodir/vesalidaimpresora.4gl"/>
<File filePath="vedir/veprrp049_1.4gl"/>
<File filePath="otrodir/Configuration.4fd"/>
</Library>
@@ -486,6 +487,10 @@
<File filePath="nodir/nofmcs002.per"/>
<File filePath="nodir/nofmcs004.4fd"/>
<File filePath="nodir/nofmcs006.4fd"/>
<File filePath="nodir/nofmrp002.4fd"/>
<File filePath="nodir/nofmrp003.4fd"/>
<File filePath="nodir/nofmrp039.4fd"/>
<File filePath="nodir/nofmrp044.4fd"/>
</Library>
<Library binaryName="FUNCIONES_NO" id="-306412216" label="FUNCIONES_NO">
<File filePath="nodir/noprgb000.4gl"/>
@@ -554,6 +559,26 @@
<File filePath="nodir/noprcs006.4gl"/>
<File filePath="bin/noprcs006.4rp"/>
</Application>
<Application binaryName="noprrp002" dependencies="-1026233879,-764824792,-306412216,-335228674,-1423229125" externalDependencies="libgre.42x" id="-700000075" label="noprrp002">
<Configuration commandLineArguments="alopez Lopez2023" id="-700000076" label="Configuration"/>
<File filePath="nodir/noprrp002.4gl"/>
<File filePath="bin/noprrp002.4rp"/>
</Application>
<Application binaryName="noprrp003" dependencies="-1026233879,-764824792,-306412216,-335228674,-1423229125" externalDependencies="libgre.42x" id="-700000077" label="noprrp003">
<Configuration commandLineArguments="alopez Lopez2023" id="-700000078" label="Configuration"/>
<File filePath="nodir/noprrp003.4gl"/>
<File filePath="bin/noprrp003.4rp"/>
</Application>
<Application binaryName="noprrp039" dependencies="-1026233879,-764824792,-306412216,-335228674,-1423229125" externalDependencies="libgre.42x" id="-700000079" label="noprrp039">
<Configuration commandLineArguments="alopez Lopez2023" id="-700000080" label="Configuration"/>
<File filePath="nodir/noprrp039.4gl"/>
<File filePath="bin/noprrp039.4rp"/>
</Application>
<Application binaryName="noprrp044" dependencies="-1026233879,-764824792,-306412216,-335228674,-1423229125" externalDependencies="libgre.42x" id="-700000081" label="noprrp044">
<Configuration commandLineArguments="alopez Lopez2023" id="-700000082" label="Configuration"/>
<File filePath="nodir/noprrp044.4gl"/>
<File filePath="bin/noprrp044.4rp"/>
</Application>
</Group>
<Group id="1667448785" label="PRODUCTOS TERMINADOS">
<Library binaryName="FORMULARIOS_IP" dependencies="-1026233879" id="-1826025351" label="FORMULARIOS_IP">
+2 -2
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" ?>
<ManagedForm databaseName="marmotech" fileVersion="31400" gstVersion="3140a" name="ManagedForm" uid="{d7d471c5-a746-452d-9cbb-7c33717f2215}">
<ManagedForm databaseName="smarmotech" fileVersion="31400" gstVersion="3140a" name="ManagedForm" uid="{d7d471c5-a746-452d-9cbb-7c33717f2215}">
<AGSettings>
<DynamicProperties version="2"/>
</AGSettings>
@@ -14,7 +14,7 @@
<Form gridHeight="9" gridWidth="53" name="nofmrp002">
<Grid gridHeight="9" gridWidth="53" name="grid1" posX="0" posY="0">
<Label gridHeight="1" gridWidth="13" name="label1" posX="3" posY="1" text="Nomina No. "/>
<Edit colName="num_nomi" fieldId="0" gridHeight="1" gridWidth="6" name="num_nomi" posX="17" posY="1" sqlTabName="formonly" sqlType="INTEGER" tabIndex="1" widget="Edit"/>
<Edit colName="num_nomi" fieldId="0" gridHeight="1" gridWidth="9" name="num_nomi" posX="17" posY="1" sqlTabName="formonly" sqlType="INTEGER" tabIndex="1" widget="Edit"/>
<Label gridHeight="1" gridWidth="11" name="label2" posX="27" posY="1" text="Tipo Emp."/>
<ComboBox colName="tipo_emp" fieldId="1" gridHeight="1" gridWidth="11" items="QUINCENAL, TEMPORAL" name="tipo_emp" posX="39" posY="1" scroll="true" sqlTabName="formonly" sqlType="CHAR" tabIndex="2" widget="ComboBox">
<Item lstrtext="false" name="Q" text="QUINCENAL"/>
+1 -1
View File
@@ -29,7 +29,7 @@ DEFINE
idx INT,
selec1 STRING,
r_filename STRING,
r_output SMALLINT,
r_output STRING,
preview SMALLINT,
handler om.SaxDocumentHandler,
varia CHAR(12)
+24 -2
View File
@@ -57,6 +57,12 @@ FUNCTION noprrp003()
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,'')), ",
@@ -84,6 +90,7 @@ FUNCTION noprrp003()
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"
@@ -143,5 +150,20 @@ REPORT rep_herr(x)
ON EVERY ROW
PRINTX x.fecha, x.codigo, x.descripcion, x.documento, x.cantidad
END REPORT
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
+19 -19
View File
@@ -52,27 +52,27 @@ OPEN WINDOW w1 WITH FORM "nofmrp039"
IF fotos = "SI" THEN
LET selec =
"SELECT a.num_emp,a.departamento,a.cod_puesto,",
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,CONVERT(CHAR(10),a.fech_efec,103), ",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" FROM adtb00003 a WHERE ",criterio CLIPPED, " AND and a.fech_efec IS NOT NULL
AND a.foto_empleado IS NOT NULL
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,a.fech_efec, ",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" FROM adtb00003 a WHERE ",criterio CLIPPED, " AND a.fech_efec IS NOT NULL
AND a.foto_empleado IS NOT NULL
ORDER BY a.departamento,a.num_emp "
ELSE
LET selec =
"SELECT a.num_emp,a.departamento,a.cod_puesto,",
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,CONVERT(CHAR(10),a.fech_efec,103), ",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" FROM adtb00003 a WHERE ",criterio CLIPPED, " AND and a.fech_efec IS NOT NULL
AND a.foto_empleado IS NULL
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,a.fech_efec, ",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" FROM adtb00003 a WHERE ",criterio CLIPPED, " AND a.fech_efec IS NOT NULL
AND a.foto_empleado IS NULL
ORDER BY a.departamento,a.num_emp "
END IF
END IF
IF fotos = "TODOS" THEN
LET selec =
"SELECT a.num_emp,a.departamento,a.cod_puesto,",
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,CONVERT(CHAR(10),a.fech_efec,103), ",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" FROM adtb00003 a WHERE ",criterio CLIPPED, " AND and a.fech_efec IS NOT NULL
AND a.foto_empleado IS NOT NULL
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,a.fech_efec, ",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" FROM adtb00003 a WHERE ",criterio CLIPPED, " AND a.fech_efec IS NOT NULL
AND a.foto_empleado IS NOT NULL
ORDER BY a.departamento,a.num_emp "
END IF
END IF
@@ -80,10 +80,10 @@ OPEN WINDOW w1 WITH FORM "nofmrp039"
LET chEmpleados = "EMPLEADOS ACTIVOS"
LET selec =
"SELECT a.num_emp,a.departamento,a.cod_puesto,",
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,CONVERT(CHAR(10),a.fech_efec,103), ",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,a.fech_efec, ",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" FROM adtb00003 a WHERE ",criterio CLIPPED,
" AND (a.status_t is null or a.status_t = 'I') and a.fech_efec IS NOT NULL ",
" AND (a.status_t is null or a.status_t = 'I') and a.fech_efec IS NOT NULL ",
" ORDER BY a.departamento,a.num_emp "
END IF
@@ -91,10 +91,10 @@ OPEN WINDOW w1 WITH FORM "nofmrp039"
LET chEmpleados = "EMPLEADOS DESACTIVOS"
LET selec =
"SELECT a.num_emp,a.departamento,a.cod_puesto,",
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,CONVERT(CHAR(10),a.fech_efec,103),",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" a.nom1_emp,a.apell1_emp,a.apell2_emp,a.calle,a.casa_num,a.fech_efec,",
" a.cedula,a.sueldo_ac,a.fech_nac,a.foto_empleado ",
" FROM adtb00003 a WHERE ",criterio CLIPPED,
" AND a.status_t is not null and a.fech_efec IS NOT NULL",
" AND a.status_t is not null and a.fech_efec IS NOT NULL",
" ORDER BY a.departamento,a.num_emp "
END IF