{ ------------------------------------------------------------------ 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 DECIMAL(12,2) DEFINE nomina,p_depart,p_nivel,p_puesto INTEGER DEFINE k SMALLINT, ptipo VARCHAR(1) MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave LET usuarios = 'jsoto' LET clave = 'lmmjvsd2009' 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) ", "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_al,novedad.fecha_del 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 = "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 ", "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 ",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 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. FOR idx = 1 to 6 LET arr_novedad[idx].num_emp = NULL LET arr_novedad[idx].departamento = NULL LET arr_novedad[idx].nivel_emp = NULL LET arr_novedad[idx].cod_puesto = NULL LET arr_novedad[idx].descrip1 = NULL LET arr_novedad[idx].cantidad = NULL LET arr_novedad[idx].valor = NULL DISPLAY arr_novedad[idx].num_emp to consart[idx].num_emp DISPLAY arr_novedad[idx].departamento to consart[idx].departamento DISPLAY arr_novedad[idx].nivel_emp to consart[idx].nivel_emp DISPLAY arr_novedad[idx].cod_puesto to consart[idx].cod_puesto DISPLAY arr_novedad[idx].descrip1 to consart[idx].descrip1 DISPLAY arr_novedad[idx].cantidad to consart[idx].cantidad DISPLAY arr_novedad[idx].valor to consart[idx].valor END FOR # 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 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,a.nivel_emp,a.cod_puesto, ", "a.nom1_emp,b.cantidad,b.valor ", "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') ", " 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 LET idx = idx + 1 END FOREACH FREE busca_nomina FREE buscate LET total1 = 0 LET total2 = 0 DISPLAY BY NAME total1,total2 INPUT ARRAY arr_novedad WITHOUT DEFAULTS FROM consart.* AFTER FIELD num_emp LET curr1 = arr_curr() LET scr_l = scr_line() 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 INTO nombre,apellido,p_depart, p_nivel,p_puesto 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 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 FOR i = 1 TO arr_count() 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 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 EXIT INPUT END INPUT ## SI NO EXISTE NINGUN PROBLEMA EN LA ENTRADA DE INFORMACION SE PROCEDE ## A INSERTAR EL REGISTRO DELETE FROM notb00007 WHERE num_nomi = nomina and cod_mov = novedad.cod_mov # 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 = nomina and cod_mov = novedad.cod_mov 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 INSERT INTO notb00007 VALUES (nomina,ptipo, 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,null, SUSER_SNAME(),GETDATE(),null,null) 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 INSERT INTO notb00007 VALUES (nomina,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,null, SUSER_SNAME(),GETDATE(),null,null) END IF END FOR IF status < 0 THEN CALL integridad() CLEAR FORM END IF 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 EXIT FOREACH END FOREACH 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