{ ------------------------------------------------------------------ PROGRAMA : NOPRMT007 OBJETIVO : Captura y Modifica registros de la Tabla de Novedades de la Nomina PROGRAMADOR : Ing. Juan Soto FECHA REALIZACION : Noviembre 5, 1993. ------------------------------------------------------------------ } GLOBALS "noprgb000.4gl" DEFINE apellido CHAR(30) DEFINE p_cantidad, total1, total2, salario_diario, salario_hora, factor DECIMAL(12, 2) DEFINE nomina, p_depart, p_nivel, p_puesto INTEGER DEFINE k SMALLINT, ptipo VARCHAR(1), titulo_dep_act, titulo_dep_afecta VARCHAR(100) MAIN DEFER INTERRUPT #WHENEVER ERROR CONTINUE CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT TO "smarmotech" USER usuarios USING clave SELECT a.* INTO p_companias.* FROM companias a CALL noprmt007() END MAIN FUNCTION noprmt007() CLEAR SCREEN OPTIONS FORM LINE 8, ERROR LINE 23, COMMENT LINE 23 LET formulario = formulario CLIPPED, "nofmmt007" OPEN FORM nofmmt007 FROM "nofmmt007" DISPLAY FORM nofmmt007 #CALL pantalla() #DISPLAY "noprmt007" AT 4,3 #DISPLAY "Novedades de la Nomina" AT 6,29 CALL nopcad007() END FUNCTION FUNCTION nopcad007() ## AQUI SE PROCEDE A CAPTURAR LA INFORMACION # WHENEVER ERROR CONTINUE DIALOG ATTRIBUTE(UNBUFFERED) INPUT BY NAME novedad.num_nomi, novedad.tipo_emp, novedad.veces ATTRIBUTE(WITHOUT DEFAULTS = TRUE) AFTER FIELD tipo_emp IF novedad.num_nomi IS NOT NULL THEN LET ptipo = novedad.tipo_emp LET nomina = novedad.num_nomi LET selec10 = "SELECT CONVERT(char(10),a.fecha_del,101),convert(char(10),a.fecha_al,101),a.h_normal ", "FROM notb00010 AS a ", " WHERE a.num_nomi = ", novedad.num_nomi USING "<<<<", " and ", " a.tipo_emp = '", novedad.tipo_emp, "' and ", " a.status_t is null " PREPARE busca_fecha FROM selec10 EXECUTE busca_fecha INTO novedad.fecha_del, novedad.fecha_al, per_nomi.h_normal IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) # NEXT FIELD num_nomi END IF IF novedad.tipo_emp IS NOT NULL THEN IF novedad.tipo_emp = "Q" THEN LET descr = "QUINCENAL" END IF IF novedad.tipo_emp = "J" THEN LET descr = "JORNALES" END IF IF novedad.tipo_emp = "S" THEN LET descr = "SEMANAL" END IF IF novedad.tipo_emp = "V" THEN LET descr = "VENDEDOR" END IF END IF ELSE LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_nomi END IF DISPLAY BY NAME descr, novedad.fecha_del, novedad.fecha_al END INPUT CONSTRUCT BY NAME criterio ON d.cod_mov AFTER CONSTRUCT LET selec = "SELECT d.cod_mov,d.descrip_mov,d.cantidad_cia,d.modifica,d.clase_mov,d.cantidad_cia ", "FROM notb00002 AS d LEFT OUTER JOIN notb00007 AS c ", " on c.cod_mov = d.cod_mov ", " AND c.num_nomi = ", novedad.num_nomi USING "<<<<", " and ", "c.tipo_emp = '", novedad.tipo_emp, "' ", "WHERE d.status_t is null and c.status_t IS NULL and ", criterio CLIPPED, " ORDER BY d.cod_mov " PREPARE busca FROM selec DECLARE datos SCROLL CURSOR FOR busca LET idx = 1 FOREACH datos INTO novedad.cod_mov, novedad.descrip_mov, novedad.cantidad_cia, mov_nomi.modifica, mov_nomi.clase_mov, mov_nomi.cantidad_cia DISPLAY BY NAME novedad.cod_mov, novedad.descrip_mov ## SE INTRODUCEN LOS DATOS DEL ARREGLO Y CHEQUEA QUE LOS MOVIMIENTOS EXISTAN ## EN EL CATALOGO DE MOVIMIENTOS. CALL arr_novedad.clear() # Busqueda de los empleados que tiene el movimiento que esta en memoria LET selec1 = "SELECT DISTINCT A.num_nomi FROM notb00007 A WHERE ", " A.num_nomi = ", novedad.num_nomi USING "<<<<", " and A.tipo_emp ='", novedad.tipo_emp, "' and ", " A.cod_mov = ", novedad.cod_mov, " AND a.status_t IS NULL " PREPARE busca_nomina FROM selec1 EXECUTE busca_nomina # IF status = notfound THEN # LET nomina = novedad.num_nomi - 1 # END IF LET selec2 = "SELECT UNIQUE a.num_emp,a.departamento,ISNULL(b.departamento_afecta,a.departamento), a.nivel_emp,a.cod_puesto, ", "a.nom1_emp,b.cantidad,b.valor,b.num_trx,a.sueldo_ac ", "FROM notb00007 b,adtb00003 a,notb00002 c ", "WHERE ", " b.num_nomi = ", nomina USING "<<<<", " and ", " a.num_emp = b.num_emp and ", " a.nomina = '", novedad.tipo_emp, "' and ", " b.cod_mov = ", novedad.cod_mov, " and ", " b.cod_mov = c.cod_mov and ", " (a.status_t is null or ", " a.status_t = 'I') and b.status_t IS NULL ", " ORDER BY a.num_emp " PREPARE comando1 FROM selec2 DECLARE buscate CURSOR FOR comando1 LET idx = 1 FOREACH buscate INTO arr_novedad[idx].* IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) EXIT FOREACH END IF SELECT nom1_emp, apell1_emp INTO nombre, apellido FROM adtb00003 WHERE num_emp = arr_novedad[idx].num_emp LET arr_novedad[idx].descrip1 = nombre CLIPPED, " ", apellido CLIPPED IF novedad.veces > 0 THEN LET arr_novedad[idx].cantidad = arr_novedad[idx].cantidad * 2 LET arr_novedad[idx].valor = arr_novedad[idx].valor * novedad.veces END IF { ESTA EN COMENTARIO EL CALCULO DEL VALOR DE LAS HORAS EXTRAS PORQUE SI POR ALGUN MOTIVO SE GUARDA EN LA TABLA DE NOVEDADES EL VALOR ERRADO, CUANDO SE BUSCA Y SE CALCULA EL USUARIO VA A PENSAR QUE ESTA CORRECTO EL VALOR GUARDADO CALCULADO, ES MEJOR QUE SE PRESENTE EL VALOR Y CUANDO EL USUARIO PASE POR EL CAMPO CANTIDAD SE REALICE EL CALCULO IF mov_nomi.clase_mov ='E' OR novedad.cod_mov = 1 THEN LET salario_diario =arr_novedad[idx].sueldo_act/23.83 LET factor = (mov_nomi.cantidad_cia/100)+1 DISPLAY "empleado a ",arr_novedad[idx].num_emp," ",salario_diario," ",salario_hora," ",mov_nomi.cantidad_cia LET salario_hora = (salario_diario / 8)*factor DISPLAY "empleado b ",arr_novedad[idx].num_emp," ",salario_hora LET arr_novedad[idx].valor = salario_hora * arr_novedad[idx].cantidad END IF } LET idx = idx + 1 END FOREACH FREE busca_nomina FREE buscate LET total1 = 0 LET total2 = 0 DISPLAY BY NAME total1, total2 IF mov_nomi.modifica = 'SI' THEN INPUT ARRAY arr_novedad WITHOUT DEFAULTS FROM consart.* ON ACTION depto LET curr1 = arr_curr() CALL busca_depto() RETURNING arr_novedad[curr1] .departamento_afecta, titulo_dep_afecta BEFORE ROW LET curr1 = arr_curr() LET scr_l = scr_line() AFTER FIELD departamento_afecta IF arr_novedad[curr1] .departamento_afecta IS NULL THEN LET arr_novedad[curr1].departamento_afecta = arr_novedad[curr1].departamento DISPLAY arr_novedad[curr1] .departamento_afecta TO consart.departamento_afecta END IF IF arr_novedad[curr1] .departamento_afecta IS NOT NULL THEN SELECT a.nom_dpto INTO titulo_dep_afecta FROM adtb00001 a WHERE a.departamento = arr_novedad[curr1] .departamento_afecta AND a.status_t IS NULL IF STATUS = NOTFOUND THEN CALL msg(3) NEXT FIELD departamento_afecta END IF DISPLAY BY NAME titulo_dep_afecta END IF IF arr_novedad[curr1] .departamento IS NOT NULL THEN SELECT a.nom_dpto INTO titulo_dep_act FROM adtb00001 a WHERE a.departamento = arr_novedad[curr1].departamento AND a.status_t IS NULL DISPLAY BY NAME titulo_dep_act END IF AFTER FIELD num_emp IF arr_novedad[curr1].num_emp IS NOT NULL THEN LET control = "N" CALL repetido() IF control = "S" THEN NEXT FIELD num_emp END IF SELECT nom1_emp, apell1_emp, departamento, nivel_emp, cod_puesto, sueldo_ac INTO nombre, apellido, p_depart, p_nivel, p_puesto, arr_novedad[curr1].sueldo_act FROM adtb00003 WHERE num_emp = arr_novedad[curr1].num_emp AND (status_t IS NULL OR status_t = "I") IF status = NOTFOUND THEN LET numero_msg = 34 CALL msg(numero_msg) NEXT FIELD num_emp END IF LET arr_novedad[curr1].departamento = p_depart LET arr_novedad[curr1].cod_puesto = p_puesto LET arr_novedad[curr1].nivel_emp = p_nivel LET arr_novedad[curr1].descrip1 = nombre CLIPPED, " ", apellido CLIPPED DISPLAY arr_novedad[curr1].departamento TO consart[scr_l].departamento DISPLAY arr_novedad[curr1].nivel_emp TO consart[scr_l].nivel_emp DISPLAY arr_novedad[curr1].cod_puesto TO consart[scr_l].cod_puesto DISPLAY arr_novedad[curr1].descrip1 TO consart[scr_l].descrip1 DISPLAY arr_novedad[curr1].num_trx TO consart[scr_l].num_trx DISPLAY arr_novedad[curr1].sueldo_act TO consart[scr_l].sueldo_act { ESTE CONTROL ERA CUANDO EL PROGRAMA DE GENERACION DE NOMINAS NO TENIA LA CARACTERISITCAS DE GENERAR LOS CODIGOS AUNQU LO PUSIERAS EN AMBAS TABLAS (FIJO Y NOVEDAD) SELECT cod_mov FROM notb00003 WHERE cod_mov = novedad.cod_mov and num_emp = arr_novedad[curr1].num_emp and status_t is null IF status != notfound THEN LET numero_msg = 196 CALL msg(numero_msg) NEXT FIELD num_emp END IF } END IF AFTER FIELD cantidad IF arr_novedad[curr1].cantidad IS NOT NULL THEN LET total1 = 0 LET salario_diario = 0 LET salario_hora = 0 LET factor = 0 FOR i = 1 TO arr_novedad.getLength() IF arr_novedad[i].valor IS NULL THEN LET arr_novedad[i].valor = 0 END IF LET total1 = total1 + arr_novedad[i].cantidad END FOR IF mov_nomi.clase_mov = 'E' OR novedad.cod_mov = 1 THEN LET salario_diario = arr_novedad[curr1].sueldo_act / 23.83 LET factor = (mov_nomi.cantidad_cia / 100) + 1 # DISPLAY "empleado a ",arr_novedad[curr1].num_emp," s diario ",salario_diario," s hora ", # salario_hora," ",factor LET salario_hora = (salario_diario / 8) * factor # DISPLAY "empleado b ",arr_novedad[curr1].num_emp," ",salario_hora LET arr_novedad[curr1].valor = salario_hora * arr_novedad[curr1].cantidad NEXT FIELD sueldo_Act END IF END IF DISPLAY BY NAME total1 ATTRIBUTE(BOLD) AFTER FIELD valor IF arr_novedad[curr1].valor IS NOT NULL THEN LET total2 = 0 FOR i = 1 TO arr_count() IF arr_novedad[i].valor IS NULL THEN LET arr_novedad[i].valor = 0 END IF LET total2 = total2 + arr_novedad[i].valor END FOR END IF DISPLAY BY NAME total2 ATTRIBUTE(BOLD) AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF LET opt = fgl_winquestion( "Actualiza", "Desa Adicionar Informacion?", "yes", "yes|no", "question", 0) IF opt = "no" THEN CONTINUE INPUT END IF ## SI NO EXISTE NINGUN PROBLEMA EN LA ENTRADA DE INFORMACION SE PROCEDE ## A INSERTAR EL REGISTRO BEGIN WORK DELETE FROM notb00007 WHERE num_nomi = nomina AND cod_mov = novedad.cod_mov AND tipo_emp = novedad.tipo_emp IF STATUS < 0 THEN ROLLBACK WORK EXIT PROGRAM END IF # Cuando el movimiento se va a faccionar en cuotas IF novedad.veces > 0 THEN LET k = 1 WHILE k <= novedad.veces LET novedad.num_nomi1 = novedad.num_nomi + 1 DELETE FROM notb00007 WHERE num_nomi = novedad.num_nomi AND cod_mov = novedad.cod_mov AND tipo_emp = novedad.tipo_emp IF STATUS < 0 THEN ROLLBACK WORK EXIT PROGRAM END IF FOR idx = 1 TO arr_count() IF arr_novedad[idx] .num_emp IS NOT NULL THEN LET p_cantidad = arr_novedad[idx].cantidad / novedad.veces LET p_valor = arr_novedad[idx].valor / novedad.veces IF arr_novedad[idx] .departamento_afecta IS NULL THEN LET arr_novedad[idx] .departamento_afecta = arr_novedad[idx] .departamento END IF IF arr_novedad[idx] .valor IS NULL THEN ROLLBACK WORK CALL msg(16) NEXT FIELD valor END IF INSERT INTO notb00007( num_nomi, tipo_emp, num_emp, departamento, nivel_emp, cod_puesto, cod_mov, cantidad, valor, us_crea, fech_crea, departamento_afecta) VALUES(novedad.num_nomi, novedad.tipo_emp, arr_novedad[idx] .num_emp, arr_novedad[idx] .departamento, arr_novedad[idx] .nivel_emp, arr_novedad[idx] .cod_puesto, novedad.cod_mov, p_cantidad, p_valor, SUSER_SNAME(), GETDATE(), arr_novedad[idx] .departamento_afecta) IF STATUS < 0 THEN ROLLBACK WORK EXIT PROGRAM END IF END IF END FOR LET k = k + 1 END WHILE END IF # Inserta las novedades normales FOR idx = 1 TO arr_count() IF arr_novedad[idx].num_emp IS NOT NULL THEN LET p_cantidad = arr_novedad[idx].cantidad LET p_valor = arr_novedad[idx].valor IF novedad.veces > 0 THEN LET p_cantidad = arr_novedad[idx].cantidad / novedad.veces LET p_valor = arr_novedad[idx].valor / novedad.veces END IF IF arr_novedad[idx] .departamento_afecta IS NULL THEN LET arr_novedad[idx] .departamento_afecta = arr_novedad[idx].departamento END IF IF arr_novedad[idx].valor IS NULL THEN ROLLBACK WORK CALL msg(16) NEXT FIELD valor END IF INSERT INTO notb00007( num_nomi, tipo_emp, num_emp, departamento, nivel_emp, cod_puesto, cod_mov, cantidad, valor, us_crea, fech_crea, departamento_afecta) VALUES(novedad.num_nomi, novedad.tipo_emp, arr_novedad[idx].num_emp, arr_novedad[idx].departamento, arr_novedad[idx].nivel_emp, arr_novedad[idx].cod_puesto, novedad.cod_mov, p_cantidad, p_valor, SUSER_SNAME(), GETDATE(), arr_novedad[idx] .departamento_afecta) IF STATUS < 0 THEN ROLLBACK WORK EXIT PROGRAM END IF END IF END FOR EXIT INPUT END INPUT LET numero_msg = 13 CALL msg(numero_msg) # Se puso el EXIT WHILE porque cuando hay mas de una nomina en la tabla # de novedades no salia al final de los empleados digitados ELSE DISPLAY ARRAY arr_novedad TO consart.* END IF EXIT FOREACH END FOREACH IF mov_nomi.modifica = "SI" THEN COMMIT WORK END IF END CONSTRUCT ON ACTION cancel CALL msg(2) EXIT PROGRAM END DIALOG END FUNCTION { FUNCTION nopcmf007() ## AQUI SE PREPARA PARA LA CAPTURA DEL CRITERIO DE SELECCION PARA LA ## MODIFICACION DE REGISTROS. # WHENEVER ERROR CONTINUE CONSTRUCT BY NAME criterio ON b.num_nomi,b.tipo_emp,a.cod_mov IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF LET SELEC1 = " SELECT UNIQUE b.num_nomi,b.tipo_emp,c.fecha_del, ", "c.fecha_al,a.num_emp,a.departamento,a.nivel_emp, ", "a.cod_puesto,a.nom1_emp,a.apell1_emp ", " FROM adtb00003 a,notb00007 b,notb00010 c where ", " a.num_emp = b.num_emp and ", " a.departamento = b.departamento and ", " b.num_nomi = c.num_nomi and ", " b.tipo_emp = c.tipo_emp and ", " (a.status_t is null or ", " a.status_t = 'I') and ", criterio clipped, " ORDER BY 2,1,5,6" PREPARE busca1 FROM selec1 DECLARE datos1 SCROLL CURSOR FOR busca1 OPEN datos1 LET idx = 1 WHILE status != NOTFOUND FETCH datos1 INTO novedad.* IF status = NOTFOUND THEN EXIT WHILE END IF LET descrip1 = novedad.nom1_emp clipped," ",novedad.apell1_emp clipped IF novedad.tipo_emp = "Q" THEN LET descr = "QUINCENAL" END IF IF novedad.tipo_emp = "S" THEN LET descr = "SEMANAL" END IF IF novedad.tipo_emp = "V" THEN LET descr = "VENDEDOR" END IF DISPLAY BY NAME novedad.num_nomi,novedad.tipo_emp,descr,novedad.fecha_del, novedad.fecha_al,novedad.num_emp,novedad.departamento, novedad.nivel_emp,novedad.cod_puesto,descrip1 ## SE PROCEDE A MODIFICAR LOS DATOS DEL ARREGLO Y CHEQUEA QUE LOS MOVIMIENTOS ## EXISTAN EN EL CATALOGO DE MOVIMIENTOS. FOR idx = 1 to 3 LET arr_novedad[idx].cod_mov = NULL LET arr_novedad[idx].descrip_mov = NULL LET arr_novedad[idx].cantidad = NULL LET arr_novedad[idx].valor = NULL DISPLAY arr_novedad[idx].cod_mov to consart[idx].cod_mov DISPLAY arr_novedad[idx].descrip_mov to consart[idx].descrip_mov DISPLAY arr_novedad[idx].cantidad to consart[idx].cantidad DISPLAY arr_novedad[idx].valor to consart[idx].valor END FOR DECLARE buscate1 CURSOR FOR SELECT c.cod_mov,d.descrip_mov,c.cantidad,c.valor FROM notb00007 c,notb00002 d WHERE c.cod_mov = d.cod_mov and c.num_emp = novedad.num_emp and c.departamento = novedad.departamento and c.num_nomi = novedad.num_nomi and c.tipo_emp = novedad.tipo_emp and c.status_t is null ORDER BY 1 LET idx = 1 FOREACH buscate1 INTO arr_novedad[idx].* IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) EXIT FOREACH END IF LET idx = idx + 1 END FOREACH CALL set_count(idx - 1) INPUT ARRAY arr_novedad WITHOUT DEFAULTS FROM consart.* ## VENTANA QUE BUSCA LOS MOVIMIENTOS ON KEY (CONTROL-W) LET curr1 = arr_curr() LET scr_l = scr_line() CASE WHEN INFIELD (cod_mov) CALL busca_movimientos() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE NEXT FIELD cod_mov END IF IF status = NOTFOUND THEN LET numero_msg = 34 CALL msg(numero_msg) NEXT FIELD cod_mov END IF SELECT descrip_mov INTO mov_nomi.descrip_mov FROM notb00002 WHERE cod_mov = arr_novedad[curr1].cod_mov and status_t is null LET arr_novedad[curr1].cod_mov = arr_fijo[curr1].cod_mov LET arr_novedad[curr1].descrip_mov = mov_nomi.descrip_mov DISPLAY arr_novedad[curr1].cod_mov to consart[scr_l].cod_mov DISPLAY arr_novedad[curr1].descrip_mov to consart[scr_l].descrip_mov LET control = "N" CALL repetido() IF control = "S" THEN NEXT FIELD cod_mov END IF NEXT FIELD cantidad END CASE AFTER FIELD cod_mov LET curr1 = arr_curr() LET scr_l = scr_line() IF arr_novedad[curr1].cod_mov IS NOT NULL THEN LET control = "N" CALL repetido() IF control = "S" THEN NEXT FIELD cod_mov END IF SELECT descrip_mov INTO mov_nomi.descrip_mov FROM notb00002 WHERE cod_mov = arr_novedad[curr1].cod_mov and status_t is null IF status = NOTFOUND THEN LET numero_msg = 34 CALL msg(numero_msg) NEXT FIELD cod_mov END IF LET arr_novedad[curr1].descrip_mov = mov_nomi.descrip_mov DISPLAY arr_novedad[curr1].descrip_mov to consart[scr_l].descrip_mov END IF AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF EXIT INPUT END INPUT DELETE FROM notb00007 where num_nomi = novedad.num_nomi and tipo_emp = novedad.tipo_emp and num_emp = novedad.num_emp FOR idx = 1 to arr_count() IF arr_novedad[idx].cod_mov is not null THEN INSERT INTO notb00007 VALUES (novedad.num_nomi,novedad.tipo_emp, novedad.num_emp,novedad.departamento,novedad.nivel_emp, novedad.cod_puesto,arr_novedad[idx].cod_mov, arr_novedad[idx].cantidad,arr_novedad[idx].valor,null, SUSER_SNAME(),GETDATE(),null,null) END IF END FOR LET numero_msg = 13 CALL msg(numero_msg) IF status < 0 THEN CALL integridad() END IF END WHILE END FUNCTION } ## VERIFICA QUE NO SE REPITAN LOS MOVIMIENTOS FUNCTION repetido() DEFINE movi_ant RECORD num_emp SMALLINT END RECORD LET movi_ant.num_emp = arr_novedad[curr1].num_emp FOR idx = 1 TO arr_count() IF idx != curr1 THEN IF arr_novedad[idx].num_emp IS NOT NULL THEN IF arr_novedad[idx].num_emp = movi_ant.num_emp THEN LET numero_msg = 135 CALL msg(numero_msg) LET control = "S" ELSE IF control != "S" THEN LET control = "N" END IF END IF END IF END IF END FOR END FUNCTION