Files

509 lines
16 KiB
Plaintext

{
PROGRAMA: CGPRCS025
OBJETIVO: VISUALIZAR LOS GASTOS DE FORMA PANORAMICA ANUAL
FECHA DESARROLLO: ENERO 23,2023
DESARROLLADO POR: ING. JUAN SOTO
}
GLOBALS "cgprgb000.4gl"
DEFINE
data DYNAMIC ARRAY OF RECORD
descripcion VARCHAR(100),
mes1,
mes2,
mes3,
mes4,
mes5,
mes6,
mes7,
mes8,
mes9,
mes10,
mes11,
mes12,
total
DEC(18, 2),
departamento INT,
cuenta_no VARCHAR(15),
parentID, childid VARCHAR(20)
END RECORD,
pano,
nodo,
hijo,
secuencia,
progreso,
cuentadepto,
nopregdepto,
noregacum,
cuentaacum
INT,
usuario_c VARCHAR(100),
i INT
MAIN
DEFER INTERRUPT
--CALL STARTLOG("CGPRMT021.TXT")
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CONNECT TO "smarmotech" AS "MSSQL" USER usuarios USING clave
CALL cgprcs025()
END MAIN
FUNCTION cgprcs025()
DEFINE fechas RECORD
fecha1, fecha2 DATE
END RECORD
DEFINE v_col STRING
DEFINE
v_mes SMALLINT,
kdepartamento INT
CALL ui.Interface.loadStyles("formularios")
OPEN WINDOW w1 WITH FORM 'cgfmcs026'
DIALOG ATTRIBUTE(UNBUFFERED)
INPUT BY NAME pano
BEFORE INPUT
DISPLAY 'VISUALIZACION GASTOS DEPARTAMENTOS PANORAMICO ANUAL'
TO encabezado
SELECT RTRIM(a.nom1_emp) || ' ' || a.apell1_emp
INTO usuario_c
FROM adtb00003 a, seg0001 b
WHERE b.usuario = usuarios AND a.num_emp = b.num_emp
DISPLAY BY NAME usuario_c
AFTER FIELD pano
IF pano IS NULL THEN
CALL msg(16)
NEXT FIELD pano
END IF
LET noregacum = 1
LET progreso = 0
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
END INPUT
DISPLAY ARRAY data TO sdata.*
BEFORE DISPLAY
CALL buscaNodo0()
ON ACTION gasranfech ATTRIBUTE(TEXT = "Registro", IMAGE = 'record')
# LET v_col = DIALOG.getCurrentItem()
LET v_mes = seleccionarMes(arr_curr())
DISPLAY "data1: ", v_mes
IF v_mes = 0 THEN
CALL msg(1024)
CONTINUE DIALOG
END IF
IF data[arr_curr()].cuenta_no IS NULL THEN
CALL msg(1025)
CONTINUE DIALOG
END IF
DISPLAY "data: ",
pano,
" ",
v_mes,
" ",
data[arr_curr()].cuenta_no,
" DEP: ",
data[arr_curr()].departamento
-- 4) Rango de fechas del mes/a?o desde prdtable
SELECT a.fecha_inicio, a.fecha_corte
INTO fechas.*
FROM prdtable a
WHERE a.ano = pano AND a.mes = v_mes
IF STATUS = NOTFOUND THEN
CALL msg(45)
CONTINUE DIALOG
END IF -- 5) Detalle (te recomiendo pasar tambi?n v_mes por claridad)
FOR i = 1 TO arr_curr()
IF data[i].departamento IS NOT NULL THEN
LET kdepartamento = data[i].departamento
END IF
DISPLAY "i: ", i, " ", kdepartamento
END FOR
CALL detalleGastos(
'NO TIENE',
data[arr_curr()].cuenta_no,
kdepartamento,
'gasranfech',
fechas.*)
ON ACTION CANCEL
EXIT PROGRAM
ON ACTION continuar
ATTRIBUTE(TEXT = "Cont. Consulta", IMAGE = 'refresh')
CALL data.clear()
NEXT FIELD pano
END DISPLAY
END DIALOG
END FUNCTION
FUNCTION buscaNodo0()
DECLARE busca_noDeptos CURSOR FOR
SELECT COUNT(DISTINCT a.cuenta_no), d.departamento_visualiza
FROM cgtb00004 a, cgtb00001 b, prdtable c, adtb00056 d
WHERE (a.cuenta_no = b.cuenta_no AND a.cuenta_no LIKE '7%')
AND (a.fecha BETWEEN c.fecha_inicio AND c.fecha_corte)
AND (a.ref = a.ref AND a.tipo <> 3)
AND (a.departamento = d.departamento_Visualiza)
AND a.ref NOT LIKE 'ED.99%' AND a.cuenta_no <> '7600'
AND d.usuario = usuarios
AND c.ano = pano
AND a.status_t IS NULL
GROUP BY d.departamento_visualiza
IF cuentaacum IS NULL THEN
LET cuentaacum = 0
END IF
FOREACH busca_noDeptos INTO cuentadepto
DISPLAY "cuenta acum ",
cuentaacum,
" ano ",
pano,
" usuario ",
usuarios,
" depto ",
cuentadepto
LET cuentaacum = cuentaacum + cuentadepto
END FOREACH
LET secuencia = 1
DECLARE nodo0 CURSOR FOR
SELECT a.nom_dpto, a.departamento
FROM adtb00001 a, adtb00056 b
WHERE a.departamento = b.departamento_visualiza
AND b.usuario = usuarios
LET idx = 1
LET nodo = NULL
LET hijo = 1
FOREACH nodo0 INTO data[idx].descripcion, data[idx].departamento
LET data[idx].parentID = nodo
LET data[idx].childid = secuencia USING "<<<"
# DISPLAY data[idx].descripcion," parent ",data[idx].parentID," child ",data[idx].childid
CALL balanceTotalMes(data[idx].departamento)
CALL llenahijos(data[idx].departamento)
LET idx = idx + 1
END FOREACH
FOR idx = 1 TO data.getLength()
IF data[idx].descripcion IS NULL THEN
CALL data.deleteElement(idx)
END IF
END FOR
{
LET data[1].descripcion ='TECNOLOGIA'
LET data[1].parentID = null
LET data[1].childid='1'
LET data[2].descripcion ='GASTOS1'
LET data[2].parentID = 1
LET data[2].childid='1.1'
LET data[2].mes1 = 1000
LET data[3].descripcion ='GASTOS2'
LET data[3].parentID = 1
LET data[3].childid='1.2'
LET data[3].mes1 = 2000
LET data[4].descripcion ='CORTES A MEDIDAS'
LET data[4].parentID = null
LET data[4].childid='2'
LET data[5].descripcion ='GASTOS3'
LET data[5].parentID = 2
LET data[5].childid='2'
LET data[5].mes1 = 4000
}
END FUNCTION
FUNCTION llenahijos(pdepartamento)
DEFINE pdepartamento, noreg INT
DECLARE buscahijos CURSOR FOR
SELECT DISTINCT '(' || RTRIM(b.cuenta_no) || ')' || b.descripcion,
b.cuenta_no
FROM cgtb00004 a, cgtb00001 b, prdtable c
WHERE (a.cuenta_no = b.cuenta_no AND a.cuenta_no LIKE '7%')
AND (a.fecha BETWEEN c.fecha_inicio AND c.fecha_corte)
AND (a.departamento = pdepartamento)
AND a.ref NOT LIKE 'ED.99%' AND a.cuenta_no <> '7600'
AND (a.ref = a.ref AND a.tipo <> 3)
AND c.ano = pano
AND a.status_t IS NULL
LET idx = idx + 1
IF noreg IS NULL THEN
LET noreg = 0
END IF
FOREACH buscahijos INTO data[idx].descripcion, data[idx].cuenta_no
LET data[idx].parentID = secuencia
LET data[idx].childid =
data[idx].parentID CLIPPED, ".", hijo USING "<<<"
CALL balances(pdepartamento, data[idx].cuenta_no)
LET progreso = (noregacum / cuentaacum) * 100
DISPLAY "regis ",
noregacum,
" cuenta ",
cuentaacum,
" progreso ",
progreso
DISPLAY "noreg ", noreg, " cuenta ", data[idx].descripcion
DISPLAY progreso TO progreso
CALL ui.Interface.refresh()
LET noregacum = noregacum + 1
LET noreg = noreg + 1
LET idx = idx + 1
LET hijo = hijo + 1
END FOREACH
LET secuencia = secuencia + 1
END FUNCTION
FUNCTION balances(xdepartamento, xcuenta_no)
DEFINE
xdepartamento INT,
xcuenta_no VARCHAR(14),
balance DEC(12, 2)
FOR i = 1 TO 12
#GASTOS RANGO DE FECHAS:
SELECT a.fecha_inicio, a.fecha_corte
INTO fecha1, fecha2
FROM prdtable a
WHERE a.ano = pano AND a.mes = i
LET balance = 0
SELECT ISNULL(SUM(a.debito - a.credito), 0)
INTO balance
FROM cgtb00004 a
WHERE (a.cuenta_no = xcuenta_no AND a.cuenta_no LIKE '7%')
AND (a.fecha BETWEEN fecha1 AND fecha2)
AND (a.departamento = xdepartamento)
AND (a.ref = a.ref AND a.tipo <> 3)
AND a.ref NOT LIKE 'ED.99%' AND a.cuenta_no <> '7600'
AND a.status_t IS NULL
IF i = 1 THEN
LET data[idx].mes1 = balance
# DISPLAY "BALANCE ",BALANCE," DEP ",xdepartamento," CUENTA ",xcuenta_no," fechas ",fecha1," ",fecha2
END IF
IF i = 2 THEN
LET data[idx].mes2 = balance
END IF
IF i = 3 THEN
LET data[idx].mes3 = balance
END IF
IF i = 4 THEN
LET data[idx].mes4 = balance
END IF
IF i = 5 THEN
LET data[idx].mes5 = balance
END IF
IF i = 6 THEN
LET data[idx].mes6 = balance
END IF
IF i = 7 THEN
LET data[idx].mes7 = balance
END IF
IF i = 8 THEN
LET data[idx].mes8 = balance
END IF
IF i = 9 THEN
LET data[idx].mes9 = balance
END IF
IF i = 10 THEN
LET data[idx].mes10 = balance
END IF
IF i = 11 THEN
LET data[idx].mes11 = balance
END IF
IF i = 12 THEN
LET data[idx].mes12 = balance
END IF
END FOR
END FUNCTION
FUNCTION balanceTotalMes(hdepartamento)
DEFINE
balancem, totalG DEC(12, 2),
hdepartamento INT
LET totalG = 0
FOR i = 1 TO 12
SELECT a.fecha_inicio, a.fecha_corte
INTO fecha1, fecha2
FROM prdtable a
WHERE a.ano = pano AND a.mes = i
SELECT ISNULL(SUM(a.debito - a.credito), 0)
INTO balanceM
FROM cgtb00004 a
WHERE (a.cuenta_no LIKE '7%')
AND (a.fecha BETWEEN fecha1 AND fecha2)
AND (a.departamento = hdepartamento)
AND (a.ref = a.ref AND a.tipo <> 3)
AND a.ref NOT LIKE 'ED.99%' AND a.cuenta_no <> '7600'
AND a.status_t IS NULL
IF i = 1 THEN
LET data[idx].mes1 = balanceM
# DISPLAY "BALANCE ",BALANCE," DEP ",xdepartamento," CUENTA ",xcuenta_no," fechas ",fecha1," ",fecha2
END IF
IF i = 2 THEN
LET data[idx].mes2 = balanceM
END IF
IF i = 3 THEN
LET data[idx].mes3 = balanceM
END IF
IF i = 4 THEN
LET data[idx].mes4 = balanceM
END IF
IF i = 5 THEN
LET data[idx].mes5 = balanceM
END IF
IF i = 6 THEN
LET data[idx].mes6 = balanceM
END IF
IF i = 7 THEN
LET data[idx].mes7 = balanceM
END IF
IF i = 8 THEN
LET data[idx].mes8 = balanceM
END IF
IF i = 9 THEN
LET data[idx].mes9 = balanceM
END IF
IF i = 10 THEN
LET data[idx].mes10 = balanceM
END IF
IF i = 11 THEN
LET data[idx].mes11 = balanceM
END IF
IF i = 12 THEN
LET data[idx].mes12 = balanceM
END IF
LET totalG = totalG + balanceM
LET data[idx].total = totalG
END FOR
END FUNCTION
FUNCTION seleccionarMes(p_idx)
DEFINE p_idx INTEGER
DEFINE v_mes SMALLINT
DEFINE i SMALLINT
DEFINE l_nombre ARRAY[12] OF STRING
LET v_mes = 0
LET l_nombre[1] = "Enero"
LET l_nombre[2] = "Febrero"
LET l_nombre[3] = "Marzo"
LET l_nombre[4] = "Abril"
LET l_nombre[5] = "Mayo"
LET l_nombre[6] = "Junio"
LET l_nombre[7] = "Julio"
LET l_nombre[8] = "Agosto"
LET l_nombre[9] = "Septiembre"
LET l_nombre[10] = "Octubre"
LET l_nombre[11] = "Noviembre"
LET l_nombre[12] = "Diciembre"
MENU "Seleccione el mes a consultar"
BEFORE MENU
-- Oculta los meses sin valor en la fila seleccionada
IF data[p_idx].mes1 IS NULL OR data[p_idx].mes1 == 0 THEN
HIDE OPTION "m1"
END IF
IF data[p_idx].mes2 IS NULL OR data[p_idx].mes2 == 0 THEN
HIDE OPTION "m2"
END IF
IF data[p_idx].mes3 IS NULL OR data[p_idx].mes3 == 0 THEN
HIDE OPTION "m3"
END IF
IF data[p_idx].mes4 IS NULL OR data[p_idx].mes4 == 0 THEN
HIDE OPTION "m4"
END IF
IF data[p_idx].mes5 IS NULL OR data[p_idx].mes5 == 0 THEN
HIDE OPTION "m5"
END IF
IF data[p_idx].mes6 IS NULL OR data[p_idx].mes6 == 0 THEN
HIDE OPTION "m6"
END IF
IF data[p_idx].mes7 IS NULL OR data[p_idx].mes7 == 0 THEN
HIDE OPTION "m7"
END IF
IF data[p_idx].mes8 IS NULL OR data[p_idx].mes8 == 0 THEN
HIDE OPTION "m8"
END IF
IF data[p_idx].mes9 IS NULL OR data[p_idx].mes9 == 0 THEN
HIDE OPTION "m9"
END IF
IF data[p_idx].mes10 IS NULL OR data[p_idx].mes10 == 0 THEN
HIDE OPTION "m10"
END IF
IF data[p_idx].mes11 IS NULL OR data[p_idx].mes11 == 0 THEN
HIDE OPTION "m11"
END IF
IF data[p_idx].mes12 IS NULL OR data[p_idx].mes12 == 0 THEN
HIDE OPTION "m12"
END IF
ON ACTION m1 ATTRIBUTE(TEXT = l_nombre[1])
LET v_mes = 1
EXIT MENU
ON ACTION m2 ATTRIBUTE(TEXT = l_nombre[2])
LET v_mes = 2
EXIT MENU
ON ACTION m3 ATTRIBUTE(TEXT = l_nombre[3])
LET v_mes = 3
EXIT MENU
ON ACTION m4 ATTRIBUTE(TEXT = l_nombre[4])
LET v_mes = 4
EXIT MENU
ON ACTION m5 ATTRIBUTE(TEXT = l_nombre[5])
LET v_mes = 5
EXIT MENU
ON ACTION m6 ATTRIBUTE(TEXT = l_nombre[6])
LET v_mes = 6
EXIT MENU
ON ACTION m7 ATTRIBUTE(TEXT = l_nombre[7])
LET v_mes = 7
EXIT MENU
ON ACTION m8 ATTRIBUTE(TEXT = l_nombre[8])
LET v_mes = 8
EXIT MENU
ON ACTION m9 ATTRIBUTE(TEXT = l_nombre[9])
LET v_mes = 9
EXIT MENU
ON ACTION m10 ATTRIBUTE(TEXT = l_nombre[10])
LET v_mes = 10
EXIT MENU
ON ACTION m11 ATTRIBUTE(TEXT = l_nombre[11])
LET v_mes = 11
EXIT MENU
ON ACTION m12 ATTRIBUTE(TEXT = l_nombre[12])
LET v_mes = 12
EXIT MENU
COMMAND "Cancelar"
LET v_mes = 0
EXIT MENU
END MENU
RETURN v_mes
END FUNCTION