Files
MBS/PROYECTO/ipdir/ipprrp047.4gl
T
jpegueroandClaude Sonnet 5.5 d805fa3164 Corrige ipprrp047 (Operacion por Movimiento Detallado y Valorizado)
- Registra ipfmrp047.4fd y la dependencia FUNCIONESREPORT en mbsERP.4pw
  (resuelve msgrp000 y seleccionarSalida)
- busca_departamento() definida localmente (igual que ipprrp035/036)
- seleccionarsalida() -> selectOutputSimple()
- Rescata ipprrp047.4rp del respaldo PROYECTOS/bin (ipdir/ y bin/)
- Titulo de ventana corregido

Verificado en pantalla: 01/05/2026 a hoy, 113+ paginas agrupadas por
movimiento y departamento con totales. PDF y Excel no probados.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 17:00:45 -04:00

525 lines
18 KiB
Plaintext

{------------------------------------------------------------------------------
PROGRAMA : ipprrp047
OBJETIVO : Operacion por Tipo de Movimiento detallado
PROGRAMADOR : Ing. Juan Fco. Soto
FECHA REALIZACION : Febrero 1997
MODIFICADO POR : VALENTI RODRIGUEZ
FECHA MODIFICACION : ABRIL 2019
-------------------------------------------------------------------------------
}
GLOBALS "ipprgb000.4gl"
DEFINE nombre_v CHAR(20)
DEFINE ventas,salir CHAR(1),
costos VARCHAR(50),
cantidad_linea SMALLINT
DEFINE total_costo_st DEC(30,2)
DEFINE control_existencia BOOLEAN
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CALL ARG_VAL(3) RETURNING impresor
CONNECT TO "smarmotech" USER usuarios USING clave
SELECT * INTO p_companias.* FROM companias
CALL ipprrp047()
END MAIN
FUNCTION ipprrp047()
DEFINE select_ac STRING
DEFINE ano_act CHAR(4)
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
DEFINE acumulado_ac RECORD
departamento VARCHAR(40),
cod_mov LIKE iptb00005.cod_mov,
cod_n SMALLINT,
cod_grupo SMALLINT,
cod_Tipo SMALLINT,
cod_Sec SMALLINT,
consumo FLOAT
END RECORD
DEFINE acumulado RECORD
cod_cia LIKE iptb00002.cod_cia,
cod_n LIKE iptb00002.cod_n,
cod_grupo LIKE iptb00002.cod_grupo,
cod_tipo LIKE iptb00002.cod_tipo,
cod_sec LIKE iptb00002.cod_sec,
descrip_esp CHAR(50),
descrip_ing LIKE iptb00002.descrip_ing,
unidad_med LIKE iptb00002.unidad_med,
cod_mov LIKE iptb00006.cod_mov,
descrip_mov LIKE iptb00005.descrip_mov,
consumo DECIMAL(30,5),
material DECIMAL(30,5),
labor DECIMAL(30,5),
gastos DECIMAL(30,5),
descripcion_origen VARCHAR(30),
departamento VARCHAR(40)
END RECORD
# WHENEVER ERROR CONTINUE
OPTIONS
FORM LINE 8,
ERROR LINE 23,
COMMENT LINE 21
OPEN FORM ipfmrp047 FROM "ipfmrp047"
DISPLAY FORM ipfmrp047
CALL ui.Window.getCurrent().setText("Transacciones de Inventario")
DISPLAY "ipprrp047" AT 4,3
DISPLAY "Operacion Por Movimiento Detallado y Valorizado" AT 6,18
LET tipo_papel = 1
CALL msgrp000(tipo_papel)
INPUT BY NAME ventas,datos_cons.fech_in,datos_cons.fech_fi,control_existencia, costos
AFTER FIELD ventas
IF ventas = "1" THEN
LET nombre_v = "LOCAL"
ELSE
LET nombre_v = "EXPORTACION"
END IF
DISPLAY BY NAME nombre_v ATTRIBUTE (BOLD)
AFTER FIELD fech_in
IF datos_cons.fech_in IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fech_in
END IF
AFTER FIELD fech_fi
IF datos_cons.fech_fi IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD fech_fi
END IF
END INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
CONSTRUCT criterio ON f.cod_cia,c.cod_mov,c.departamento, c.cod_n, c.cod_grupo, c.cod_tipo, c.cod_sec, c.bodega
FROM cod_cia,cod_mov, departamento,cod_n,cod_grupo,cod_tipo,cod_sec,bodega
BEFORE CONSTRUCT
LET k1 = '1'
CALL bodegas(k1)
CALL busca_departamento()
AFTER CONSTRUCT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
END CONSTRUCT
IF control_existencia = FALSE OR control_existencia IS NULL THEN
LET select_ac =
"SELECT isnull(e.nom_dpto, 'NO DEPARTAMENTO'), c.cod_mov,c.cod_n,c.cod_grupo,c.cod_tipo,c.cod_sec, ",
"SUM(c.cantidad_2),f.descrip_esp,f.unidad_med,g.descripcion,g.cod_cia ",
"FROM iptb00006 c JOIN iptb00002 f on c.cod_n=f.cod_n and c.cod_grupo = f.cod_grupo and c.cod_tipo=f.cod_tipo and ",
" c.cod_sec = f.cod_sec ",
" INNER JOIN iptb00022 g ON f.cod_cia = g.cod_cia ",
"left join adtb00001 e on e.departamento = c.departamento ",
"WHERE ",criterio clipped," and c.fecha between '",datos_cons.fech_in USING 'mm/dd/yyyy',"' and '",
datos_cons.fech_fi USING 'mm/dd/yyyy',"' ",
" AND c.status_t is NULL ",
"GROUP BY g.descripcion,e.nom_dpto, c.cod_mov,c.cod_n,c.cod_grupo,c.cod_tipo,c.cod_sec,f.descrip_esp, ",
" g.cod_cia,f.unidad_med ",
"HAVING SUM(c.cantidad_2) <> 0 ",
"ORDER BY g.cod_cia, e.nom_dpto, c.cod_mov,c.cod_n,c.cod_grupo,c.cod_tipo,c.cod_sec "
ELSE
LET select_ac =
"SELECT isnull(e.nom_dpto, 'NO DEPARTAMENTO'), c.cod_mov,c.cod_n,c.cod_grupo,c.cod_tipo,c.cod_sec, ",
"SUM(c.cantidad_2),f.descrip_esp,f.unidad_med,g.descripcion,g.cod_cia ",
"FROM iptb00006 c JOIN iptb00002 f on c.cod_n=f.cod_n and c.cod_grupo = f.cod_grupo and c.cod_tipo=f.cod_tipo and ",
" c.cod_sec = f.cod_sec ",
" INNER JOIN iptb00022 g ON f.cod_cia = g.cod_cia ",
"left join adtb00001 e on e.departamento = c.departamento ",
"WHERE ",criterio clipped," and c.fecha between '",datos_cons.fech_in USING 'mm/dd/yyyy',"' and '",
datos_cons.fech_fi USING 'mm/dd/yyyy',"' ",
" AND f.control_existencia = 'SI' AND c.status_t is NULL ",
"GROUP BY g.descripcion,e.nom_dpto, c.cod_mov,c.cod_n,c.cod_grupo,c.cod_tipo,c.cod_sec,f.descrip_esp, ",
" g.cod_cia,f.unidad_med ",
"HAVING SUM(c.cantidad_2) <> 0 ",
"ORDER BY g.cod_cia, e.nom_dpto, c.cod_mov,c.cod_n,c.cod_grupo,c.cod_tipo,c.cod_sec "
END IF
DISPLAY "<< Estoy Buscando Acumulado Del Periodo Dado >>"
AT 19,14 ATTRIBUTE (REVERSE,BOLD)
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
DISPLAY " "
AT 19,14
LET ano_act = year(datos_cons.fech_fi)
DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>"
AT 19,14 ATTRIBUTE (REVERSE)
PREPARE busca_ant FROM select_ac
DECLARE actual SCROLL CURSOR FOR busca_ant
LET r_filename ="ipprrp047.4rp"
LET idx = 1
FOREACH actual INTO acumulado_ac.*,
acumulado.descrip_esp,acumulado.unidad_med,acumulado.descripcion_origen,
acumulado.cod_cia
IF idx = 1 THEN
IF fgl_report_loadCurrentSettings(r_filename) THEN
LET preview=1
CALL selectOutputSimple() RETURNING r_output -- load the .4rp file
CALL fgl_report_selectDevice(r_output) -- changing default
CALL fgl_report_selectPreview(preview) -- changing default
LET handler = fgl_report_commitCurrentSettings() -- commit changes
END IF
LET idx = 2
START REPORT opera TO XML HANDLER HANDLER
END IF
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
LET acumulado.consumo = acumulado_ac.consumo
LET acumulado.cod_mov = acumulado_ac.cod_mov
# Buscando Los Costos de Los Materiales
LET acumulado.material = 0
LET acumulado.labor = 0
LET acumulado.gastos = 0
SELECT c.material,c.labor,c.gastos
INTO acumulado.material,acumulado.labor,acumulado.gastos
FROM iptb00004 c
WHERE c.ventas = ventas and c.ano = ano_act and
c.mes_ini = "01" and c.mes_fin = "12" and
c.cod_n = acumulado_ac.cod_n AND
c.cod_grupo = acumulado_ac.cod_grupo AND
c.cod_tipo = acumulado_ac.cod_tipo AND
c.cod_Sec = acumulado_ac.cod_sec AND c.status_t is NULL
# Busqueda del Material Con su descripcion y unidad de medida
{LET acumulado.descrip_esp = null
LET acumulado.unidad_med = null
LET acumulado.cod_cia = NULL
SELECT a.cod_cia,a.descrip_esp,a.unidad_med,b.descripcion
INTO acumulado.cod_cia,acumulado.descrip_esp,acumulado.unidad_med,acumulado.descripcion_origen
FROM iptb00002 a,iptb00022 b
WHERE a.cod_n = acumulado_ac.cod_n AND
a.cod_grupo = acumulado_ac.cod_grupo AND
a.cod_tipo = acumulado_ac.cod_tipo AND
a.cod_Sec = acumulado_ac.cod_sec AND
a.cod_cia = b.cod_cia
}
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = false
RETURN
END IF
LET acumulado.cod_n = acumulado_ac.cod_n
LET acumulado.cod_grupo = acumulado_ac.cod_grupo
LET acumulado.cod_tipo = acumulado_ac.cod_tipo
LET acumulado.cod_sec = acumulado_ac.cod_sec
LET acumulado.departamento = acumulado_ac.departamento
IF acumulado.labor IS NULL THEN
LET acumulado.labor = 0
END IF
IF acumulado.gastos IS NULL THEN
LET acumulado.gastos = 0
END IF
IF acumulado.material IS NULL THEN
LET acumulado.material = 0
END IF
IF acumulado.consumo IS NOT NULL THEN
LET total_costo_st = 0
LET total_costo_st = (acumulado.material+acumulado.labor+acumulado.gastos) * acumulado.consumo
END IF
--LET t_total_costo_st = t_total_costo_st + total_costo_st
IF costos = "TODOS" THEN
LET idx = 3
OUTPUT TO REPORT opera(acumulado.*, total_costo_st)
ELSE
IF costos = 'COSTOS' THEN
IF acumulado.material+acumulado.labor+acumulado.gastos = 0 THEN
LET idx = 3
OUTPUT TO REPORT opera(acumulado.*, total_costo_st)
END IF
END IF
{ IF costos = 'NEGATIVOS' THEN
IF acumulado.consumo < 0 THEN
OUTPUT TO REPORT opera(acumulado.*, total_costo_st)
END IF
END IF}
END IF
END FOREACH
IF idx =3 THEN
FINISH REPORT opera
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 FUNCTION
REPORT opera(x, total_costo_st)
DEFINE x RECORD
cod_cia LIKE iptb00002.cod_cia,
cod_n LIKE iptb00002.cod_n,
cod_grupo LIKE iptb00002.cod_grupo,
cod_tipo LIKE iptb00002.cod_tipo,
cod_sec LIKE iptb00002.cod_sec,
descrip_esp CHAR(50),
descrip_ing LIKE iptb00002.descrip_ing,
unidad_med LIKE iptb00002.unidad_med,
cod_mov LIKE iptb00006.cod_mov,
descrip_mov LIKE iptb00005.descrip_mov,
consumo DECIMAL(12,5),
material DECIMAL(12,3),
labor DECIMAL(12,3),
gastos DECIMAL(12,3),
descripcion_origen VARCHAR(30),
departamento VARCHAR(40)
END RECORD,
titulo_mov,titulo_cia VARCHAR(50),
rango_fecha CHAR(50),
fecha_reporte CHAR(15),
producto VARCHAR(150),
--TOTALES POR CIA
t_material_cia,
t_labor_cia,
t_gasto_cia,
t_consumo_cia,
t_general_cia,
--TOTALES POR DEPARTAMENTOS
t_material,
t_labor,
t_gasto,
t_consumo,
--TOTALES POR MOVIMIENTOS
t_m_consumo,
t_m_material,
t_m_labor,
t_m_gasto,
--VALORES POR CADA REGISTRO(ON EVERY ROW)
v_material,
v_labor,
v_gasto,
--TOTALES VALORES POR DEPARTAMENTOS
total_material,
total_labor,
total_gastos,
total_consumo,
total_valor_departamento,
--TOTALES VALORES POR MOVIMIENTOS
total_material_movimiento,
total_consumo_movimiento,
total_labor_movimiento,
total_gastos_movimiento,
total_valor_movimiento
FLOAT,
--TOTALES GENERALES
total_cantidad,
total_material_gral,
total_consumo_gral,
total_labor_gral,
total_gastos_gral,
total_valor_gral
FLOAT
DEFINE total_costo_st, t_total_costo_st, t_cantidad
DECIMAL (12,2)
FORMAT
FIRST PAGE HEADER
LET total_material_gral = 0
LET total_consumo_gral = 0
LET total_labor_gral = 0
LET total_gastos_gral = 0
LET total_valor_gral = 0
BEFORE GROUP OF x.cod_cia
LET t_material_cia =0
LET t_labor_cia =0
LET t_gasto_cia =0
LET t_consumo_cia =0
LET titulo_cia = "(",x.cod_cia USING "&&",")", x.descripcion_origen
PRINTX titulo_cia
BEFORE GROUP OF x.cod_mov
SELECT descrip_mov INTO x.descrip_mov FROM iptb00005
WHERE cod_mov = x.cod_mov
LET titulo_mov = "Movimiento: ",x.cod_mov," ",x.descrip_mov CLIPPED
LET t_cantidad = 0
--LET total_costo_st = 0
LET total_valor_movimiento = 0
PRINTX titulo_mov
BEFORE GROUP OF x.departamento
LET total_valor_departamento = 0
PRINTX x.departamento
ON EVERY ROW
LET rango_fecha ="Desde ",datos_cons.fech_in using "dd/mm/yyyy",
"Hasta ", datos_cons.fech_fi using "dd/mm/yyyy"
LET fecha_reporte = TODAY
LET producto = x.cod_n USING "&&&&&","-",x.cod_grupo USING "&&&&&","-",
x.cod_tipo USING "&&&&&","-",x.cod_sec USING "&&&&&"," ",
x.descrip_esp
IF x.consumo IS NOT NULL THEN
IF x.material IS NULL THEN
LET x.material = 0
END IF
IF x.labor IS NULL THEN
LET x.labor = 0
END IF
IF x.gastos IS NULL THEN
LET x.gastos = 0
END IF
LET v_material = x.consumo*x.material
LET v_labor = x.consumo*x.labor
LET v_gasto = x.consumo * x.gastos
LET t_cantidad = t_cantidad + x.consumo
{ LET total_costo_st = 0
LET total_costo_st = (x.material+x.labor+x.gastos) * x.consumo
LET t_total_costo_st = t_total_costo_st + total_costo_st}
END IF
PRINTX producto, x.consumo, x.material, v_material,
x.labor, v_labor, x.gastos, v_gasto,
total_costo_st, p_companias.nombre, rango_fecha, fecha_reporte
AFTER GROUP OF x.departamento
LET t_consumo = GROUP SUM(x.consumo)
LET t_material = GROUP SUM(x.material)
LET t_labor = GROUP SUM(x.labor)
LET t_gasto = GROUP SUM(x.gastos)
LET total_consumo = GROUP SUM(x.consumo * x.consumo)
LET total_material = GROUP SUM(x.consumo * x.material)
LET total_labor = GROUP SUM(x.consumo * x.labor)
LET total_gastos = GROUP SUM(x.consumo * x.gastos)
LET total_valor_departamento = GROUP SUM(total_costo_st)
PRINTX t_consumo,t_labor, t_gasto,t_material, total_material,
total_gastos, total_labor, total_valor_departamento
AFTER GROUP OF x.cod_mov
LET t_m_consumo = GROUP SUM(x.consumo)
LET t_m_material = GROUP SUM(x.material)
LET t_m_labor = GROUP SUM(x.labor)
LET t_m_gasto = GROUP SUM(x.gastos)
LET total_consumo_movimiento = GROUP SUM(x.consumo)
LET total_material_movimiento = GROUP SUM(x.consumo * x.material)
LET total_labor_movimiento = GROUP SUM(x.consumo * x.labor)
LET total_gastos_movimiento = GROUP SUM(x.consumo * x.gastos)
LET total_valor_movimiento = GROUP SUM(total_costo_st)
PRINTX total_consumo_movimiento, total_material_movimiento,
total_labor_movimiento, total_gastos_movimiento, t_m_consumo,
t_m_material, t_m_labor, t_m_gasto, total_valor_movimiento
AFTER GROUP OF x.cod_cia
LET t_consumo_cia = GROUP SUM(x.consumo)
LET t_material_cia = GROUP SUM(x.material)
LET t_labor_cia = GROUP SUM(x.labor)
LET t_gasto_cia = GROUP SUM(x.gastos)
LET t_general_cia = t_material_cia + t_labor_cia + t_gasto_cia
PRINTX t_consumo_cia,t_material_cia,t_labor_cia,t_gasto_cia,t_general_cia
ON LAST ROW
--LET total_cantidad = SUM(t_cantidad)
LET total_material_gral = SUM(x.material)
LET total_consumo_gral = SUM(x.consumo)
LET total_labor_gral = SUM(x.labor)
LET total_gastos_gral = SUM(x.gastos)
LET total_valor_gral = SUM(total_costo_st)
PRINTX total_material_gral,total_consumo_gral,total_labor_gral,total_gastos_gral,total_valor_gral
END REPORT
FUNCTION busca_departamento()
DEFINE
pdepartamento ui.combobox,
kdepartamento SMALLINT,
kdescripcion CHAR(30)
LET pdepartamento = ui.combobox.forname("formonly.departamento")
CALL pdepartamento.clear()
DECLARE pagar CURSOR FOR
SELECT departamento, nom_dpto
FROM adtb00001
WHERE status_t IS NULL
ORDER BY nom_dpto
FOREACH pagar INTO kdepartamento, kdescripcion
CALL pdepartamento.additem(kdepartamento, kdescripcion)
END FOREACH
END FUNCTION