Files
MBS/PROYECTO/nodir/noprrp043.4gl
T
Abel LópezandClaude Sonnet 5 a7431ef94a Registra noprrp043 (Informe Registro Entrada/Salidas) y corrige bugs
Se agrega noprrp043 al proyecto usando nofmrp043.4fd, reutilizando
FUNCIONESREPORT y libgre.42x.

Se corrige validacion residual de otro programa: comprobaba
"fecha_inicial IS NULL" (variable nunca asignada aqui) y hacia
NEXT FIELD fecha_inicial, campo que no existe en este formulario
(solo existen xfecha1/xfecha2). Esto hacia que el boton "Imprimir"
fallara siempre con "Field not found". Se elimina esa validacion,
ya que la validacion real de xfecha1 esta justo despues.

Se corrige rango de fechas: WHERE checktime BETWEEN fecha1 AND fecha2
(sin hora) excluye registros del ultimo dia con hora posterior a
medianoche. Se cambia a >= fecha1 AND < fecha2+1.

Probado con empleado 5001, rango 14/10/2024-16/10/2024, verificado
contra BD (2 registros de entrada, fecha/hora correctas).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-30 10:58:35 -04:00

190 lines
7.2 KiB
Plaintext

{
PROGRAMA : NOPRRP043
DESCRIPCION : GENERAR INFORMACION SOBRE EMPLEADOS REGISTRADOS DIARIOS
SISTEMA BIOMETRICO
FECHA DESARROYO : JUNIO 1, 2021
DESARROLLADO POR : ING. JUAN SOTO
}
IMPORT util
GLOBALS "noprgb000.4gl"
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
xfecha1,xfecha2 DATE,
nombre_cia VARCHAR(100)
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT to "smarmotech" USER usuarios USING clave
SELECT a.nombre INTO nombre_cia FROM companias a
CALL noprrp043()
END MAIN
FUNCTION noprrp043()
OPEN WINDOW w1 WITH FORM "nofmrp043"
DIALOG ATTRIBUTE(UNBUFFERED)
INPUT BY NAME xfecha1,xfecha2
END INPUT
CONSTRUCT criterio ON c.departamento,c.num_emp FROM departamento,num_emp
BEFORE CONSTRUCT
CALL departamentos()
AFTER CONSTRUCT
END CONSTRUCT
ON ACTION CANCEL ATTRIBUTE(TEXT="Cancelar", IMAGE="cancel")
EXIT PROGRAM
ON ACTION imprimir ATTRIBUTE(TEXT="Imprime", IMAGE="printer")
IF xfecha1 IS NULL THEN
CALL msg(16)
NEXT FIELD xfecha1
END IF
IF xfecha2 < xfecha1 THEN
CALL msg(51)
NEXT FIELD xfecha1
END IF
CALL reporte()
END DIALOG
END FUNCTION
FUNCTION reporte()
DEFINE data RECORD
dia INT,
tipo_reg VARCHAR(2),
departamento VARCHAR(100),
num_emp INT,
nivel_emp,puesto,primer_nombre,primer_apellido VARCHAR(100),
checktime DATETIME YEAR TO MINUTE,
horas_trabajadas,horas_extras35,horas_extras100 DEC(12,2),
fecha DATETIME YEAR TO MINUTE,
entrada,salida VARCHAR(50),
hora_almuerzo INT
END RECORD,
fecha_ant DATE
LET selec = " SELECT datepart(weekday,a.checktime) as dia,a.checktype,'('+CAST(c.departamento AS CHAR(20))+') '+b.nom_dpto,a.num_emp,
' ',' ',c.nom1_emp,c.apell1_emp,a.checktime,ISNULL(a.h_trabajadas,0),ISNULL(a.h_extras35,0),ISNULL(a.h_extras100,0),
CAST(a.checktime as date)
FROM CHECKINOUT a,adtb00001 b ,adtb00003 c
WHERE c.departamento = b.departamento AND a.num_emp = c.num_emp AND
c.status_t is null and a.CHECKTIME >= '",xfecha1 USING 'yyyy-mm-dd',"' and a.CHECKTIME < '",(xfecha2+1) USING 'yyyy-mm-dd',"' and ",
criterio CLIPPED,
" order by '('+CAST(c.departamento AS CHAR(20))+') '+b.nom_dpto,a.num_emp,cast(a.checktime as date) "
{
" group by datepart(weekday,a.checktime) ,a.checktype,'('+CAST(c.departamento AS CHAR(20))+') '+b.nom_dpto,a.num_emp,
k1.nom_educa,k.nom_puesto,c.nom1_emp,c.apell1_emp,ISNULL(a.h_trabajadas,0),ISNULL(a.h_extras35,0),ISNULL(a.h_extras100,0),
cast(a.checktime as date) ",
}
PREPARE comando FROM selec
DECLARE buscar CURSOR FOR comando
LET idx = 1
LET r_filename = 'noprrp043.4rp'
FOREACH buscar INTO data.*
IF idx = 1 THEN
IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file
CALL seleccionarSalida() RETURNING r_output
LET preview=1
CALL fgl_report_selectDevice(r_output) -- changing default
CALL fgl_report_selectPreview(preview) -- changing default
CALL fgl_report_configurexlsxdevice(null,null,null,false,false,null,1)
LET handler = fgl_report_commitCurrentSettings() -- commit changes
END IF
IF handler IS NOT NULL THEN -- report engine was configured ok
START REPORT registros TO XML HANDLER HANDLER
ELSE
EXIT PROGRAM
END IF
END IF
IF fecha_ant <> data.fecha THEN
LET data.entrada = NULL
LET data.salida = NULL
LET fecha_ant = data.fecha
END IF
CASE
WHEN UPSHIFT(data.tipo_reg) = "I"
LET data.entrada = util.Datetime.format( data.checktime, "(%A) %B %d, %Y %H:%M:%S" )
DISPLAY "en case I: ",data.entrada," ORIG: ",data.checktime
# LET data.salida = NULL
EXIT CASE
WHEN UPSHIFT(data.tipo_reg) = "O"
LET data.salida =util.Datetime.format( data.checktime, "(%A) %B %d, %Y %H:%M:%S" )
DISPLAY "en case O: ",data.salida," ORIG: ",data.checktime
# LET data.entrada = NULL
EXIT CASE
END CASE
# IF data.horas_trabajadas > 0 THEN
# LET data.horas_trabajadas = data.horas_trabajadas - hora_almuerzo
# END IF
LET data.dia = WEEKDAY(data.checktime)
DISPLAY "data ",data.fecha," ",data.entrada," ",data.salida," fa: ",fecha_ant," ",data.checktime," origen: ",data.tipo_reg,
" Emp ",data.num_emp
OUTPUT TO REPORT registros(data.*)
LET idx = idx +1
END FOREACH
IF idx > 1 THEN
FINISH REPORT registros
ELSE
CALL msg(3)
END IF
END FUNCTION
REPORT registros(x)
DEFINE x RECORD
dia INT,
tipo_reg VARCHAR(2),
departamento VARCHAR(100),
num_emp INT,
nivel_emp,puesto,primer_nombre,primer_apellido VARCHAR(100),
checktime DATETIME YEAR TO MINUTE,
horas_trabajadas,horas_extras35,horas_extras100 DEC(12,2),
fecha DATETIME YEAR TO MINUTE,
entrada,salida VARCHAR(50),
hora_almuerzo INT
END RECORD,
fecha1,fecha2 VARCHAR(20),
total_horas,thoras35,thoras100 DEC(12,2),
thalmuerzo,totalhoras INT,
hora string
ORDER BY x.departamento,x.num_emp,x.fecha
FORMAT
FIRST PAGE HEADER
LET hora = util.Datetime.format( CURRENT, "%Y-%m-%d %H:%M" )
LET fecha1 = xfecha1 USING "dd/mm/yyyy"
LET fecha2 = xfecha2 USING "dd/mm/yyyy"
PRINTX nombre_cia,hora,fecha1,fecha2
BEFORE GROUP OF x.departamento
PRINTX x.departamento
BEFORE GROUP OF x.num_emp
PRINTX x.num_emp,x.primer_nombre,x.primer_apellido
AFTER GROUP OF x.num_emp
LET total_horas= GROUP SUM(x.horas_trabajadas)
LET thoras35= GROUP SUM(x.horas_extras35)
LET thoras100= GROUP SUM(x.horas_extras100)
LET thalmuerzo = GROUP SUM(x.hora_almuerzo)
LET totalhoras = thoras35+thoras100+thalmuerzo+total_horas
# DISPLAY "emp ",x.num_emp," 35 ",thoras35," 100 ",thoras100," al ",thalmuerzo," thoras ",totalhoras
PRINTX total_horas,thoras35,thoras100,totalhoras
AFTER GROUP OF x.fecha
PRINTX x.entrada,x.salida,x.horas_trabajadas,x.horas_extras35,x.horas_extras100,
x.dia,thalmuerzo,x.hora_almuerzo
{ ON EVERY ROW
PRINTX x.dia,x.checktime,x.tipo_reg}
END REPORT