{ ------------------------------------------------------------------------------- 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