Files
MBS/PROYECTO/nodir/noprrp017.4gl
T

622 lines
19 KiB
Plaintext

{
-------------------------------------------------------------------------------
PROGRAMA : NOPRRP017
OBJETIVO : REPORTE DE NOMINA (14 mvtos)
PROGRAMADOR : Ing. Juan Soto
FECHA REALIZACION : Noviembre 03, 1993
-------------------------------------------------------------------------------
}
GLOBALS "noprgb000.4gl"
DEFINE cod_mov_del,p,m SMALLINT
DEFINE totales ARRAY[50] OF DECIMAL(12,2)
DEFINE sigue CHAR(1)
DEFINE tot_gral ARRAY[50] OF RECORD
cod_mov SMALLINT,
valor DECIMAL(12,2)
END RECORD
DEFINE o,kq SMALLINT
DEFINE j ARRAY[100] OF RECORD
primer_enc LIKE notb00002.primer_enc,
segundo_enc LIKE notb00002.segundo_enc,
tercer_enc LIKE notb00002.tercer_enc,
cod_mov LIKE notb00002.cod_mov,
no_columna INTEGER
END RECORD
FUNCTION noprrp017()
## DEFINICION DE LOS REGISTROS DE BUSQUEDA CON LOS CAMPOS NECESARIOS PARA
## EL REPORTE
DEFINE e ARRAY[100] OF RECORD
primer_enc LIKE notb00002.primer_enc,
segundo_enc LIKE notb00002.segundo_enc,
tercer_enc LIKE notb00002.tercer_enc,
cod_mov LIKE notb00002.cod_mov,
no_columna INTEGER
END RECORD
DEFINE imprime RECORD
num_emp LIKE notb00008.num_emp,
nom1_emp LIKE adtb00003.nom1_emp,
nom2_emp LIKE adtb00003.nom2_emp,
apell1_emp LIKE adtb00003.apell1_emp,
apell2_emp LIKE adtb00003.apell2_emp,
cod_mov LIKE notb00008.cod_mov,
cantidad LIKE notb00008.cantidad,
clase_mov CHAR(1),
valor LIKE notb00008.valor,
departamento LIKE adtb00003.departamento,
cuenta_no LIKE cgtb00002.cuenta_no
END RECORD
# WHENEVER ERROR CONTINUE
OPTIONS
FORM LINE 8,
ERROR LINE 23,
COMMENT LINE 21
CLEAR SCREEN
OPEN FORM nofmrp017 FROM "nofmrp017"
DISPLAY FORM nofmrp017
CALL pantalla()
DISPLAY "noprrp017" AT 4,3
DISPLAY "Nomina Empleados" AT 6,34
## INDICA EL TIPO DE PAPEL NECESARIO PARA EL REPORTE. 1 - PAPEL 9 1/2 X 11
## 2 - PAPEL 14 7/8 X 11
LET tipo_papel = 2
CALL msgrp000(tipo_papel)
## AQUI SE INDICA EL CRITERIO DE BUSQUEDA DEL REPORTE
INPUT BY NAME per_nomi.num_nomi,per_nomi.tipo_emp,cod_mov_del
AFTER FIELD num_nomi
IF per_nomi.num_nomi IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD num_nomi
END IF
AFTER FIELD tipo_emp
IF per_nomi.num_nomi IS NOT NULL THEN
IF per_nomi.tipo_emp IS NOT NULL THEN
SELECT num_nomi,tipo_emp,fecha_del,fecha_al
INTO per_nomi.num_nomi,per_nomi.tipo_emp,
per_nomi.fecha_del,per_nomi.fecha_al
FROM notb00010
WHERE num_nomi = per_nomi.num_nomi and
tipo_emp = per_nomi.tipo_emp
IF status = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
RETURN
END IF
ELSE
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD tipo_emp
END IF
END IF
DISPLAY BY NAME per_nomi.fecha_del,per_nomi.fecha_al
SELECT UNIQUE a.descrip INTO nombre_mes FROM mestable a
WHERE a.mes = MONTH(per_nomi.fecha_del)
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
EXIT INPUT
END INPUT
# Busqueda de los encabezados
DECLARE accion CURSOR FOR
SELECT UNIQUE a.primer_enc,a.segundo_enc,a.tercer_enc,b.cod_mov
FROM notb00002 a,notb00008 b
WHERE a.cod_mov = b.cod_mov and
b.num_nomi = per_nomi.num_nomi AND b.tipo_emp = per_nomi.tipo_emp AND
a.status_t is null and
a.cod_mov >= cod_mov_del
ORDER BY 4
LET idx = 1
FOREACH accion INTO j[idx].*
LET idx = idx + 1
END FOREACH
LET idx = idx - 1
# Busqueda de totales Generales
DECLARE accion3 CURSOR FOR
SELECT a.cod_mov,sum(a.valor) FROM notb00008 a,notb00002 b
WHERE a.num_nomi = per_nomi.num_nomi and
a.tipo_emp = per_nomi.tipo_emp and
a.cod_mov >= cod_mov_del and
a.cod_mov = b.cod_mov
GROUP BY 1
ORDER BY 1
LET o = 1
FOREACH accion3 INTO tot_gral[o].*
LET o = o + 1
END FOREACH
## SE SELECCIONAN LOS CAMPOS NECESARIOS PARA EL REPORTE Y
## SE DECLARA EL CURSOR PARA BUSCAR LA INFORMACION SELECCIONADA
DECLARE accion1 CURSOR FOR
SELECT UNIQUE a.num_emp,b.nom1_emp,b.nom2_emp,b.apell1_emp,b.apell2_emp,
a.cod_mov,a.cantidad,a.clase_mov,a.valor,b.departamento,
c.cuenta_no
FROM notb00008 a,adtb00003 b,notb00002 d,outer cgtb00002 c
WHERE a.num_nomi = per_nomi.num_nomi AND a.tipo_emp = per_nomi.tipo_emp AND
a.num_emp = b.num_emp AND
a.departamento = b.departamento AND
a.departamento = c.departamento AND
a.fecha between per_nomi.fecha_del and per_nomi.fecha_al AND
a.status_t is null and
a.cod_mov >= cod_mov_del and
d.cod_mov = a.cod_mov
ORDER BY 1,6
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
DISPLAY "Buscando Informacion ... Espere Por Favor" AT 19,14
ATTRIBUTE (REVERSE,BOLD)
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
DISPLAY " " AT 19,14
DISPLAY "<< Reporte Generandose ... Por Favor Espere. >>"
AT 19,14 ATTRIBUTE (REVERSE)
START REPORT nomina17 TO "C:\\archivo"
## SE BUSCA LA INFORMACION DE LOS CAMPOS DEL REGISTRO PARA DARLE
## SALIDA AL REPORTE
FOREACH accion1 INTO imprime.*
# Acumula el total de descuentos por empleado
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
OUTPUT TO REPORT nomina17(imprime.*,per_nomi.num_nomi,per_nomi.tipo_emp,
per_nomi.fecha_del,per_nomi.fecha_al,nombre_mes)
END FOREACH
FINISH REPORT nomina17
CLEAR SCREEN
RUN "type C:\\archivo > %USPRINT%" END FUNCTION
## DEFINICION DEL REGISTRO DE IMPRESION CON LOS CAMPOS NECESARIOS PARA
## EL REPORTE
REPORT nomina17(x,no_nomina,tipo,fecha1,fecha2,nombre)
DEFINE x RECORD
num_emp LIKE notb00008.num_emp,
nom1_emp LIKE adtb00003.nom1_emp,
nom2_emp LIKE adtb00003.nom2_emp,
apell1_emp LIKE adtb00003.apell1_emp,
apell2_emp LIKE adtb00003.apell2_emp,
cod_mov LIKE notb00008.cod_mov,
cantidad LIKE notb00008.cantidad,
clase_mov CHAR(1),
valor LIKE notb00008.valor,
departamento LIKE adtb00003.departamento,
cuenta_no LIKE cgtb00002.cuenta_no
END RECORD
## DEFINICION DE LAS VARIABLES DE IMPRESION
DEFINE nombre_depto CHAR(20)
DEFINE doble_on CHAR(2)
DEFINE doble_off CHAR(2)
DEFINE negrillas_on CHAR(2)
DEFINE negrillas_off CHAR(2)
DEFINE comp_on CHAR(2)
DEFINE comp_off CHAR(2)
DEFINE doce CHAR(2)
DEFINE normal CHAR(2)
DEFINE hora CHAR(5)
DEFINE fecha1,fecha2 DATE
DEFINE tipo CHAR(1)
DEFINE p_codigo,no_emp,k,h,n,ficha,no_nomina,l SMALLINT
DEFINE nombre,varia CHAR(11)
DEFINE t_sal_hora,t_horas,sal_hora,horas DECIMAL(7,2)
DEFINE t_salario1,salario,salario1 DECIMAL(8,2)
DEFINE t_desc1,t_desc,neto,monto_desc,t_ganado,t_ganado_h,valor1,
t_valor1 DECIMAL(10,2)
DEFINE t_t_valor,t_t_neto,t_neto,t_t_Desc,t_t_ganado DECIMAL(12,2)
OUTPUT
## DEFINICION DE LOS MARGENES DE IMPRESION
TOP MARGIN 0
LEFT MARGIN 0
BOTTOM MARGIN 3
ORDER BY x.departamento,x.num_emp,x.cod_mov
FORMAT
PAGE HEADER
LET doble_on = ASCII 14
LET doble_off = ASCII 20
LET negrillas_on = ASCII 27, ASCII 69
LET negrillas_off = ASCII 27, ASCII 70
LET comp_on = ASCII 27, ASCII 15
LET comp_off = ASCII 18
LET doce = ASCII 27, ASCII 77
LET normal = ASCII 27, ASCII 80
LET hora = time
## ASIGNACION DEL TIPO DE NOMINA A IMPRIMIR
IF tipo = "Q" THEN LET varia = "QUINCENALES" END IF
IF tipo = "S" THEN LET varia = "SEMANALES" END IF
IF tipo = "V" THEN LET varia = "VENDEDORES" END IF
## SE CALCULA LA LONGITUD DE LA VARIABLE -VARIA-
LET l = (171 - LENGTH(varia))/2
## AQUI SE INDICA LA IMPRESION DE LOS ENCABEZADOS
PRINT COLUMN 1, doce,comp_on,
COLUMN 2, "Nomina No.:",
COLUMN 15, no_nomina,
COLUMN 30, negrillas_on,
COLUMN 31, doble_on,
COLUMN 23, p_companias.nombre CLIPPED,
negrillas_off,
doble_off clipped,
COLUMN 104," Pag. ",pageno using "###"
PRINT COLUMN 2, "noprrp017",
COLUMN 63, "Nomina Empleados ",
COLUMN L, varia ,
COLUMN 145, today using "dd/mm/yy"
PRINT COLUMN 42, "Nomina Regular del",
COLUMN 62, DAY(fecha1) using "&&",
COLUMN 66, "de",
COLUMN 70, nombre clipped,
COLUMN 83, "Al",
COLUMN 87, DAY(fecha2) using "&&",
COLUMN 91, nombre clipped,
COLUMN 103, "de",
COLUMN 107, YEAR(fecha2) using "####",
COLUMN 145, time
SKIP 1 LINE
PRINT COLUMN 1, "-----------------------------------";
LET m = 36
FOR i = 1 to idx
PRINT COLUMN m, "------------";
LET m = m + 12
END FOR
PRINT COLUMN m, "--------"
# PRINT COLUMN 77, "Total";
LET m = 56
FOR i = 1 to idx
PRINT COLUMN m, j[i].primer_enc;
LET m = m + 10
END FOR
PRINT " "
{ PRINT COLUMN 69, "Salario",
COLUMN 77, "Horas";}
LET m = 56
FOR i = 1 to idx
PRINT COLUMN m, j[i].segundo_enc;
LET m = m + 10
END FOR
PRINT " "
PRINT COLUMN 1, "Ficha",
COLUMN 7, "Nombre";
# COLUMN 69, "P/Hora",
# COLUMN 77, "Trabaj";
LET m = 56
FOR i = 1 to idx
PRINT COLUMN m, j[i].tercer_enc;
LET m = m + 10
END FOR
PRINT
LET m = 56
FOR i = 1 TO idx
PRINT COLUMN m, "(",j[i].cod_mov using "&&&",")";
LET m = m + 10
END FOR
PRINT " "
PRINT COLUMN 1, "-----------------------------------";
LET m = 36
FOR i = 1 to idx
PRINT COLUMN m, "------------";
LET m = m + 12
END FOR
PRINT COLUMN m, "--------"
## AQUI SE INDICA LA IMPRESION DEL DETALLE
BEFORE GROUP OF x.departamento
LET t_ganado = 0
LET t_valor1 = 0
LET t_desc = 0
LET t_neto = 0
# Inicializacion del arreglo para los totales por departamentos
FOR i = 1 TO idx
LET totales[i] = 0
END FOR
#--------------------------------------------------------------------------
IF t_t_ganado is null THEN
LET t_t_ganado = 0
END IF
IF t_t_desc is null THEN
LET t_t_desc = 0
END IF
IF t_t_neto is null THEN
LET t_t_neto = 0
END IF
skip 1 line
BEFORE GROUP OF x.num_emp
LET t_ganado_h = 0
LET t_sal_hora = 0
LET neto = 0
LET valor1 = 0
LET sigue = "N"
LET p = 1
LET i = 1
LET n = 38
LET t_desc1 = 0
PRINT COLUMN 1, x.num_emp using "&&&&",
COLUMN 7, x.nom1_emp clipped," ",
x.apell1_emp clipped;
ON EVERY ROW
IF x.cod_mov = 1 THEN
LET sal_hora = x.valor/x.cantidad
PRINT COLUMN n, sal_hora using "###.##",
COLUMN n+8, x.cantidad USING "###.##",
COLUMN n+12, x.valor USING "##,###.##";
LET sigue = "S"
LET t_sal_hora = t_sal_hora + sal_hora
LET n = n + 23
LET totales[i] = totales[i] + x.valor
# Acumulacion de los Ingresos
IF x.clase_mov = "I" or
x.clase_mov = "E" THEN
LET t_ganado_h = t_ganado_h + x.valor
END IF
END IF
IF sigue = "N" THEN
LET sigue = "S"
LET n = n + 13
END IF
IF x.cod_mov > 1 THEN
IF j[i].cod_mov = x.cod_mov THEN
# Este sum es porque el interes es un movimiento y hay que sumarlo con el
# valor de la cuota
IF j[i].cod_mov = 12 or
j[i].cod_mov = 13 or
j[i].cod_mov = 19 THEN
CASE
WHEN j[i].cod_mov = 12
LET p_codigo = 110
EXIT CASE
WHEN j[i].cod_mov = 13
LET p_codigo = 111
EXIT CASE
WHEN j[i].cod_mov = 19
LET p_codigo = 112
EXIT CASE
END CASE
SELECT valor INTO valor1 FROM notb00008
WHERE cod_mov = p_codigo and
num_emp = x.num_emp and
num_nomi = no_nomina and
tipo_emp = tipo
IF valor1 is null THEN
LET valor1 = 0
END IF
LET x.valor = x.valor + valor1
END IF
LET totales[i] = totales[i] + x.valor
# Acumulacion de los Ingresos
IF x.clase_mov = "I" or
x.clase_mov = "E" THEN
LET t_ganado_h = t_ganado_h + x.valor
END IF
# Acumulacion de los descuentos
IF x.clase_mov = "R" or
x.clase_mov = "S" or
x.clase_mov = "D" THEN
LET t_desc1 = t_desc1 + x.valor
END IF
PRINT COLUMN n,x.valor USING "##,###.##";
ELSE
FOR k = i TO idx
IF j[k].cod_mov = x.cod_mov THEN
PRINT COLUMN n,x.valor USING "##,###.##";
LET totales[k] = totales[k] + x.valor
# Acumulacion de los Ingresos
IF x.clase_mov = "I" or
x.clase_mov = "E" THEN
LET t_ganado_h = t_ganado_h + x.valor
END IF
# Acumulacion de los descuentos
IF x.clase_mov = "R" or
x.clase_mov = "S" or
x.clase_mov = "D" THEN
LET t_desc1 = t_desc1 + x.valor
END IF
LET i = k
EXIT FOR
ELSE
PRINT COLUMN n,0 USING "##,###.##";
LET totales[k] = totales[k] + 0
END IF
LET n = n + 10
LET p = p + 1
END FOR
END IF
LET p = p + 1
LET n = n+10
END IF
LET i = i + 1
AFTER GROUP OF x.num_emp
IF no_emp is null THEN
LET no_emp = 0
END IF
LET no_emp = no_emp + 1
IF t_neto IS NULL THEN
LET t_neto = 0
END IF
IF p != idx THEN
LET p = idx - p
LET p = (i + p)
FOR k = i TO p
PRINT COLUMN n, 0 using "##,###.##";
LET totales[k] = totales[k] + 0
LET n = n + 10
END FOR
END IF
PRINT
AFTER GROUP OF x.departamento
IF o is null THEN
LET o = 1
END IF
#-------------------------------------------------------------------------------
SELECT nom_dpto INTO nombre_depto FROM adtb00001
WHERE departamento = x.departamento
IF status = notfound THEN
LET status = 0
END IF
PRINT negrillas_on
# Impresion de los totales de los departamentos
PRINT COLUMN 4,x.departamento USING "####"," ",nombre_depto;
IF t_t_valor is null THEN
LET t_t_valor = 0
END IF
LET m = 38
LET sigue = "N"
IF j[1].cod_mov = 1 THEN
LET m = m + 13
LET sigue = "S"
END IF
IF sigue = "N" THEN
LET m = m + 13
END IF
FOR i= 1 TO idx
PRINT COLUMN m, totales[i] using "##,###.##";
LET m = m + 10
END FOR
PRINT negrillas_off
ON LAST ROW
PRINT negrillas_on
PRINT COLUMN 4, "Total General ";
LET m = 38
LET sigue = "N"
IF j[1].cod_mov = 1 THEN
LET m = m + 14
LET sigue = "S"
END IF
IF sigue = "N" THEN
LET m = m + 14
END IF
FOR h = 1 to o
# Este sum es porque el interes es un movimiento y hay que sumarlo con el
# valor de la cuota
IF tot_gral[h].cod_mov = 12 or
tot_gral[h].cod_mov = 13 or
tot_gral[h].cod_mov = 19 THEN
CASE
WHEN tot_gral[h].cod_mov = 12
LET p_codigo = 110
EXIT CASE
WHEN tot_gral[h].cod_mov = 13
LET p_codigo = 111
EXIT CASE
WHEN tot_gral[h].cod_mov = 19
LET p_codigo = 112
EXIT CASE
END CASE
SELECT sum(valor) INTO x.valor FROM notb00008
WHERE cod_mov = p_codigo and
num_nomi = no_nomina and
tipo_emp = tipo
IF x.valor is null THEN
LET x.valor = 0
END IF
LET tot_gral[h].valor = tot_gral[h].valor + x.valor
END IF
IF tot_gral[h].valor is not null THEN
PRINT COLUMN m, tot_gral[h].valor using "###,###.##";
LET m = m + 10
END IF
END FOR
IF t_t_desc < 0 THEN
LET t_t_desc = t_t_desc * -1
END IF
PRINT
PRINT COLUMN 4, "Total Empleados ",
no_emp using "<<<"
PRINT COLUMN 1,normal,comp_off
PRINT negrillas_off
END REPORT