{===================================================== FUNCION : REPORTE ANÁLISIS PRODUCCIÓN OBJETIVO : *************************** PROGRAMADOR : ELVIS GARCÍA FECHA : 17 de abril, 2025 =====================================================} GLOBALS "prprgb000.4gl" SCHEMA smarmotech DEFINE datos RECORD fecha_inicial DATE, fecha_final DATE END RECORD, pcompanias RECORD LIKE companias.* DEFINE data_prod DYNAMIC ARRAY OF RECORD descripcion LIKE cttb00001.descripcion , nom_departamento LIKE adtb00001.nom_dpto, cantidad LIKE cttb00003.cantidad, valor LIKE cttb00003.costo_gasto END RECORD MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT TO "smarmotech" USER usuarios USING clave SELECT * INTO pcompanias.* FROM companias CALL analisis_produccion() END MAIN FUNCTION analisis_produccion() 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 criterio STRING OPEN WINDOW HOME_FRM WITH FORM 'prfmrp021' DIALOG ATTRIBUTE(UNBUFFERED) INPUT BY NAME datos .* AFTER FIELD fecha_final IF datos.fecha_inicial IS NULL AND DATOS.fecha_final IS NOT NULL THEN CALL fgl_winmessage("INFO", "SI ESPECIFICA UN RANGO DE FECHA DEBE INDICAR FECHA INICIAL", "INFO") NEXT FIELD fecha_inicial END IF IF datos.fecha_final < datos.fecha_inicial THEN CALL fgl_winmessage("INFO", "LA FECHA FINAL DEBE SER MAS RECIENTE A LA INICIAL", "INFO") NEXT FIELD fecha_final END IF END INPUT CONSTRUCT BY NAME criterio ON c.departamento, c.cod_prod BEFORE CONSTRUCT CALL departamentos() AFTER CONSTRUCT LET selec = "SELECT '(' + CAST(a.cod_prod AS VARCHAR) + ') ' + a.descripcion, b.nom_dpto, SUM(c.cantidad) as cantidad, SUM(c.costo_gasto) as valor FROM cttb00003 c inner join adtb00001 b on c.departamento = b.departamento INNER JOIN cttb00001 a on a.cod_prod = c.cod_prod WHERE c.fecha between '",datos.fecha_inicial USING "MM/DD/YYYY","' AND '",datos.fecha_final USING "MM/DD/YYYY" ,"' AND c.status_t IS NULL AND ",criterio CLIPPED," group by a.cod_prod, a.descripcion, b.nom_dpto" PREPARE comando FROM selec DECLARE produccion CURSOR FOR comando LET r_filename = 'prprrp021.4rp' IF fgl_report_loadCurrentSettings(r_filename) THEN -- load the .4rp file LET preview=1 CALL seleccionarsalida() RETURNING r_output CALL fgl_report_selectDevice(r_output) -- changing default CALL fgl_report_selectPreview(preview) -- changing default LET handler = fgl_report_commitCurrentSettings() -- commit changes END IF IF HANDLER IS NOT NULL THEN START REPORT analisis_prod TO XML HANDLER HANDLER LET idx = 1 FOREACH produccion INTO data_prod[idx].* OUTPUT TO REPORT analisis_prod(data_prod[idx].*,datos.*) LET idx = idx + 1 END FOREACH IF idx > 1 THEN FINISH REPORT analisis_prod ELSE CALL fgl_winmessage("INFO", "NO HAY REGISTROS EN ESTE RANGO DE FECHA Y CON LOS PARAMETROS INDICADOS", "INFO") NEXT FIELD fecha_final END IF END IF END CONSTRUCT ON ACTION CANCEL CALL msg(2) LET INT_FLAG = FALSE EXIT PROGRAM END DIALOG CLOSE WINDOW HOME_FRM END FUNCTION REPORT analisis_prod(x, y) DEFINE x RECORD descripcion LIKE cttb00001.descripcion , nom_departamento LIKE adtb00001.nom_dpto, cantidad LIKE cttb00003.cantidad, valor LIKE cttb00003.costo_gasto END RECORD DEFINE y RECORD fecha_inicial DATE, fecha_final DATE END RECORD DEFINE fecha_reporte DATE, rango_fecha VARCHAR(75), total_cantidad, total_valor FLOAT ORDER BY x.nom_departamento,x.descripcion FORMAT BEFORE GROUP OF x.nom_departamento LET total_cantidad = 0 LET total_valor = 0 ON EVERY ROW LET fecha_reporte = CURRENT USING "MM/DD/YYYY" LET rango_fecha = y.fecha_inicial,'--',y.fecha_final PRINTX rango_fecha, x.descripcion, x.nom_departamento, x.cantidad, x.valor, fecha_reporte AFTER GROUP OF x.nom_departamento LET total_cantidad = GROUP SUM(x.cantidad) LET total_valor = GROUP SUM(x.valor) PRINTX total_cantidad, total_valor END REPORT FUNCTION seleccionarSalida() DEFINE r_output STRING, -- output format option r_action STRING, -- used to set preview option r_filename STRING, -- filename of Report Design document (the .4rp filename) preview INTEGER -- preview option TRUE/FALSE, to display report in Report Viewer -- display form allowing user to select the .4rp filename and output options #CLOSE WINDOW SCREEN OPTIONS INPUT WRAP OPEN WINDOW f_configuration WITH FORM "Configuration" LET INT_FLAG=FALSE LET preview = FALSE INPUT BY NAME r_output ON ACTION CANCEL EXIT PROGRAM ON ACTION CLOSE EXIT PROGRAM END INPUT CLOSE WINDOW f_configuration CALL ui.interface.refresh() -- set preview variable to match output option r_action IF r_action IS NOT NULL THEN IF r_action == "preview" THEN LET preview = TRUE END IF END IF --return report name (filename of Report Design Document) and output option variables to be used to configure the report engine RETURN r_output END FUNCTION FUNCTION departamentos() DEFINE pdepartamento SMALLINT,pdescripcion CHAR(30), kdepto ui.ComboBox LET kdepto = ui.ComboBox.forName("formonly.departamento") CALL kdepto.clear() DECLARE busca_dpto CURSOR FOR SELECT a.departamento,a.nom_dpto FROM adtb00001 a WHERE a.status_t IS NULL ORDER BY a.nom_dpto FOREACH busca_dpto INTO pdepartamento,pdescripcion CALL kdepto.additem(pdepartamento,pdescripcion) END FOREACH END FUNCTION FUNCTION msg(numero_msg) DEFINE numero_msg SMALLINT DEFINE descripcion CHAR (60) SELECT desc_msg INTO descripcion FROM msgtable WHERE cod_msg = numero_msg IF status = NOTFOUND THEN SELECT desc_msg INTO descripcion FROM msgtable WHERE cod_msg = 22 LET descripcion = descripcion CLIPPED,numero_msg using "<<<<" ERROR descripcion ATTRIBUTE(BOLD) ELSE ERROR descripcion ATTRIBUTE(BOLD) LET numero_msg = 0 END IF END FUNCTION