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>
190 lines
7.2 KiB
Plaintext
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 |