{ ------------------------------------------------------------------------ PROGRAMA : ADPRMT020 OBJETIVO : Capturar, Modificar, Eliminar registros de la Tabla de Control de Entrada y Salida de Empleados PROGRAMADOR : Ing. Betania Guerrero Perez FECHA REALIZACION : Junio 11, 1993 ------------------------------------------------------------------------ } GLOBALS "adprgb000.4gl" DEFINE usuario_c,usuario_m CHAR(9) DEFINE fecha_c,fecha_m LIKE adtb00023.fech_crea ## DEFINICION DE VARIABLES PARA ORDENAMIENTO DE LOS REGISTROS DEFINE reg2 ARRAY[200] OF INTEGER DEFINE reg1 INTEGER DEFINE descri CHAR(4) DEFINE fecha1 DATE MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL ARG_VAL(3) RETURNING impresor let usuarios = "kpolanco" let clave = "RevolutionX3" CONNECT to "smarmotech" USER usuarios USING clave SELECT a.* INTO p_companias.* FROM companias a CALL adprmt020() END MAIN FUNCTION adprmt020() CLEAR SCREEN OPTIONS FORM LINE 8, ERROR LINE 24, COMMENT LINE 23 OPEN FORM adfmmt020 FROM "adfmmt020" DISPLAY FORM adfmmt020 DISPLAY "adprmt020" AT 4,3 ATTRIBUTE(RED) DISPLAY "Control Entrada y Salida de Empleados" AT 6,24 ATTRIBUTE(BLACK) MENU ON ACTION nuevo let int_flag = false INITIALIZE emplea.* TO NULL CALL adpcad020() ON ACTION buscar let int_flag = false CALL adpcmf020() ON ACTION Salir EXIT MENU END MENU END FUNCTION FUNCTION adpcad020() # WHENEVER ERROR CONTINUE LET fecha1 = today using "dd/mm/yyyy" ## CAPTURA LOS DATOS QUE VA A CONTENER EL REGISTRO LABEL vuelve: INPUT BY NAME cont_emp.fecha,cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto ## VENTANA PARA DESPLEGAR LOS EMPLEADOS DE LA EMPRESA ON KEY (CONTROL-W) CASE WHEN INFIELD (num_emp) CALL busca_empleado() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE NEXT FIELD num_emp END IF IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD num_emp END IF LET descrip1 = nombre LET cont_emp.num_emp = despl_emp[curr1].num_emp LET cont_emp.departamento = despl_emp[curr1].departamento IF cont_emp.departamento IS NOT NULL THEN SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001 WHERE departamento = cont_emp.departamento END IF LET cont_emp.nivel_emp = despl_emp[curr1].nivel_emp LET cont_emp.cod_puesto = despl_emp[curr1].cod_puesto DISPLAY BY NAME cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto, descrip1,depto.nom_dpto NEXT FIELD hora_ent END CASE BEFORE FIELD fecha { IF fecha1 IS NULL THEN LET cont_emp.fecha = today using "dd/mm/yyyy" ELSE LET cont_emp.fecha = fecha1 using "dd/mm/yyyy" END IF } LET cont_emp.fecha = fecha1 using "dd/mm/yyyy" DISPLAY BY NAME cont_emp.fecha AFTER FIELD fecha IF cont_emp.fecha IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha END IF LET fecha1 = cont_emp.fecha ## VERIFICA QUE NO SE REPITA EL EMPLEADO PARA LA MISMA FECHA AFTER FIELD num_emp IF cont_emp.num_emp IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_emp ELSE SELECT UNIQUE convert(char(10),a.fecha,103),a.num_emp,a.departamento, a.nivel_emp,a.cod_puesto INTO cont_emp.fecha,cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto FROM adtb00023 a WHERE a.fecha=cont_emp.fecha and a.num_emp=cont_emp.num_emp and a.status_t is null IF status != NOTFOUND THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD fecha END IF END IF ## VERIFICA QUE EL EMPLEADO EXISTA EN LA TALA DE EMPLEAADOS IF cont_emp.num_emp IS NOT NULL THEN SELECT departamento,nivel_emp,cod_puesto,nom1_emp,nom2_emp, apell1_emp,apell2_emp INTO cont_emp.departamento,cont_emp.nivel_emp,cont_emp.cod_puesto, nombre1,nombre2,apellido1,apellido2 FROM adtb00003 WHERE num_emp = cont_emp.num_emp and (status_t is null or status_t = "I") IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD num_emp END IF ## BUSCA EL NOMBRE DEL DEPARTAMENTO SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001 WHERE departamento = cont_emp.departamento and status_t is null IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD num_emp END IF LET descrip1 = nombre1 clipped," ",nombre2 clipped," ", apellido1 clipped," ",apellido2 clipped DISPLAY BY NAME cont_emp.departamento,cont_emp.nivel_emp, cont_emp.cod_puesto,descrip1,depto.nom_dpto END IF EXIT INPUT END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF ## CHEQUEO DE LAS HORAS DE ENTRADA Y SALIDA DE LOS EMPLEADOS FOR idx = 1 to 5 LET arr_control[idx].hora_ent = NULL LET arr_control[idx].hora_sal = NULL DISPLAY arr_control[idx].hora_ent to consart[idx].hora_ent DISPLAY arr_control[idx].hora_sal to consart[idx].hora_sal END FOR INPUT ARRAY arr_control FROM consart.* BEFORE ROW LET curr = arr_curr() LET scr_l = scr_line() LET descr = NULL LET descri = NULL ## CHEQUEA SI LA HORA DE ENTRADA FUE DE DIA O DE NOCHE AFTER FIELD hora_ent LET curr = arr_curr() IF arr_control[curr].hora_ent >= "01:00" and arr_control[curr].hora_ent <= "11:59" THEN LET descr = "a.m." END IF IF arr_control[curr].hora_ent >= "12:01" and arr_control[curr].hora_ent <= "23:59" THEN LET descr = "p.m." END IF IF arr_control[curr].hora_ent = "00:00" THEN LET descr = "m.n." END IF IF arr_control[curr].hora_ent = "12:00" THEN LET descr = "m.d." END IF ## CHEQUEA SI LA HORA DE SALIDA FUE DE DIA O DE NOCHE AFTER FIELD hora_sal LET curr = arr_curr() IF arr_control[curr].hora_sal >= "01:00" and arr_control[curr].hora_sal <= "11:59" THEN LET descri = "a.m." END IF IF arr_control[curr].hora_sal >= "12:01" and arr_control[curr].hora_sal <= "23:59" THEN LET descri = "p.m." END IF IF arr_control[curr].hora_sal = "00:00" THEN LET descri = "m.n." END IF IF arr_control[curr].hora_sal = "12:00" THEN LET descri = "m.d." END IF ## CHEQUEA QUE LA HORA DE ENTRADA Y SALIDA NO SEAN IGUALES IF arr_control[curr].hora_sal = arr_control[curr].hora_ent THEN LET numero_msg = 148 CALL msg(numero_msg) NEXT FIELD hora_sal END IF ## CHEQUEA QUE LA HORA DE SALIDA NO SEA MENOR QUE LA HORA DE ENTRADA IF arr_control[curr].hora_sal < arr_control[curr].hora_ent THEN LET numero_msg = 150 CALL msg(numero_msg) NEXT FIELD hora_sal 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 ## SI NO OCURRE NINGUN ERROR EN EL PROCESO SE PROCEDE A INSERTAR EL REGISTRO ## EN LA TABLA DE CONTROL DE ENTRADA Y SALIDA FOR idx = 1 to arr_count() IF arr_control[idx].hora_ent is not null or arr_control[idx].hora_sal is not null THEN INSERT INTO adtb00023 VALUES (cont_emp.fecha,cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto, arr_control[idx].hora_ent,arr_control[idx].hora_sal, null,SUSER_SNAME (),GETDATE (),null,null) END IF END FOR LET numero_msg = 1 CALL msg(numero_msg) CLEAR FORM IF status < 0 THEN CLEAR FORM END IF GOTO vuelve END FUNCTION FUNCTION adpcmf020() ## AQUI SE PREPARA PARA LA CAPTURA DEL CRITERIO DE SELECCION PARA LA ## MODIFICACION DE REGISTROS # # WHENEVER ERROR CONTINUE ## DEFINICION DEL CRITERIO DE BUSQUEDA PARA LA MODIFICACION/CONSULTA CONSTRUCT criterio ON fecha,num_emp,departamento,nivel_emp,cod_puesto FROM fecha,num_emp,departamento,nivel_emp,cod_puesto IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF ## SE SELECCIONAN LOS CAMPOS QUE SE DESEAN CONSULTAR/MODIFICAR LET SELEC="SELECT UNIQUE convert(char(10),fecha,103),num_emp,departamento,nivel_emp,cod_puesto ", "FROM adtb00023 ", "WHERE status_t is null and ",criterio clipped," ORDER BY 1" PREPARE busca FROM selec DECLARE datos SCROLL CURSOR FOR busca OPEN datos ## BUSCA LOS DATOS SELECCIONADOS FETCH FIRST datos INTO cont_emp.* IF status >= 0 THEN IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF END IF SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001 WHERE departamento = cont_emp.departamento SELECT nom1_emp,nom2_emp,apell1_emp,apell2_emp INTO nombre1,nombre2,apellido1,apellido2 FROM adtb00003 WHERE num_emp = cont_emp.num_emp and departamento = cont_emp.departamento and nivel_emp = cont_emp.nivel_emp and cod_puesto = cont_emp.cod_puesto LET descrip1 = nombre1 clipped," ",nombre2 clipped," ", apellido1 clipped," ",apellido2 clipped DISPLAY BY NAME cont_emp.fecha,cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto,depto.nom_dpto, descrip1 CALL busca_us() ## BUSQUEDA DE LOS REGISTROS MENU "OPCION" COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO cont_emp.* IF STATUS = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001 WHERE departamento = cont_emp.departamento SELECT nom1_emp,nom2_emp,apell1_emp,apell2_emp INTO nombre1,nombre2,apellido1,apellido2 FROM adtb00003 WHERE num_emp=cont_emp.num_emp and departamento=cont_emp.departamento and nivel_emp = cont_emp.nivel_emp and cod_puesto = cont_emp.cod_puesto LET descrip1 = nombre1 clipped," ",nombre2 clipped," ", apellido1 clipped," ",apellido2 clipped DISPLAY BY NAME cont_emp.fecha,cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto,depto.nom_dpto, descrip1 CALL busca_us() COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO cont_emp.* IF STATUS = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001 WHERE departamento = cont_emp.departamento SELECT nom1_emp,nom2_emp,apell1_emp,apell2_emp INTO nombre1,nombre2,apellido1,apellido2 FROM adtb00003 WHERE num_emp=cont_emp.num_emp and departamento=cont_emp.departamento and nivel_emp = cont_emp.nivel_emp and cod_puesto=cont_emp.cod_puesto LET descrip1 = nombre1 clipped," ",nombre2 clipped," ", apellido1 clipped," ",apellido2 clipped DISPLAY BY NAME cont_emp.fecha,cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto,depto.nom_dpto, descrip1 CALL busca_us() COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO cont_emp.* SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001 WHERE departamento = cont_emp.departamento SELECT nom1_emp,nom2_emp,apell1_emp,apell2_emp INTO nombre1,nombre2,apellido1,apellido2 FROM adtb00003 WHERE num_emp=cont_emp.num_emp and departamento=cont_emp.departamento and nivel_emp = cont_emp.nivel_emp and cod_puesto=cont_emp.cod_puesto LET descrip1 = nombre1 clipped," ",nombre2 clipped," ", apellido1 clipped," ",apellido2 clipped DISPLAY BY NAME cont_emp.fecha,cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto,depto.nom_dpto, descrip1 CALL busca_us() LET numero_msg = 5 CALL msg(numero_msg) COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO cont_emp.* SELECT nom_dpto INTO depto.nom_dpto FROM adtb00001 WHERE departamento = cont_emp.departamento SELECT nom1_emp,nom2_emp,apell1_emp,apell2_emp INTO nombre1,nombre2,apellido1,apellido2 FROM adtb00003 WHERE num_emp=cont_emp.num_emp and departamento=cont_emp.departamento and nivel_emp=cont_emp.nivel_emp and cod_puesto=cont_emp.cod_puesto LET descrip1 = nombre1 clipped," ",nombre2 clipped," ", apellido1 clipped," ",apellido2 clipped DISPLAY BY NAME cont_emp.fecha,cont_emp.num_emp,cont_emp.departamento, cont_emp.nivel_emp,cont_emp.cod_puesto,depto.nom_dpto, descrip1 CALL busca_us() LET numero_msg = 4 CALL msg(numero_msg) COMMAND "Escoger" " Actualiza Registro Cancela Operacion" ## SELECCION DEL REGISTRO QUE SE DESEA MODIFICAR FOR idx = 1 to 5 LET arr_control[idx].hora_ent = NULL LET arr_control[idx].hora_sal = NULL DISPLAY arr_control[idx].hora_ent to consart[idx].hora_ent DISPLAY arr_control[idx].hora_sal to consart[idx].hora_sal END FOR ## DESPLEGA LOS DATOS DEL ARREGLO DEL REGISTRO ESCOGIDO DECLARE controlar CURSOR FOR SELECT rowid,a.hora_ent,a.hora_sal FROM adtb00023 a WHERE a.fecha = cont_emp.fecha and a.num_emp = cont_emp.num_emp and a.departamento = cont_emp.departamento and a.nivel_emp = cont_emp.nivel_emp and a.cod_puesto = cont_emp.cod_puesto and a.status_t is null ORDER BY 1 DESC LET idx = 1 FOREACH controlar INTO reg2[idx],arr_control[idx].* IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) EXIT FOREACH END IF IF arr_control[idx].hora_ent >= "01:00" and arr_control[idx].hora_ent <= "11:59" THEN LET descr = "a.m." END IF IF arr_control[idx].hora_ent >= "12:01" and arr_control[idx].hora_ent <= "23:59" THEN LET descr = "p.m." END IF IF arr_control[idx].hora_ent = "00:00" THEN LET descr = "m.n." END IF IF arr_control[idx].hora_ent = "12:00" THEN LET descr = "m.d." END IF IF arr_control[idx].hora_sal >= "01:00" and arr_control[idx].hora_sal <= "11:59" THEN LET descri = "a.m." END IF IF arr_control[idx].hora_sal >= "12:01" and arr_control[idx].hora_sal <= "23:59" THEN LET descri = "p.m." END IF IF arr_control[idx].hora_sal = "00:00" THEN LET descri = "m.n." END IF IF arr_control[idx].hora_sal = "12:00" THEN LET descri = "m.d." END IF LET idx = idx + 1 END FOREACH CALL set_count(idx - 1) INPUT ARRAY arr_control WITHOUT DEFAULTS FROM consart.* BEFORE ROW LET curr = arr_curr() LET scr_l = scr_line() LET descr = NULL LET descri = NULL ## CHEQUEA SI LA HORA DE ENTRADA ES DE DIA O DE NOCHE AFTER FIELD hora_ent IF arr_control[curr].hora_ent >= "01:00" and arr_control[curr].hora_ent <= "11:59" THEN LET descr = "a.m." END IF IF arr_control[curr].hora_ent >= "12:01" and arr_control[curr].hora_ent <= "23:59" THEN LET descr = "p.m." END IF IF arr_control[curr].hora_ent = "00:00" THEN LET descr = "m.n." END IF IF arr_control[curr].hora_ent = "12:00" THEN LET descr = "m.d." END IF ## CHEQUEA SI LA HORA DE SALIDA ES DE DIA O DE NOCHE AFTER FIELD hora_sal IF arr_control[curr].hora_sal >= "01:00" and arr_control[curr].hora_sal <= "11:59" THEN LET descri = "a.m." END IF IF arr_control[curr].hora_sal >= "12:01" and arr_control[curr].hora_sal <= "23:59" THEN LET descri = "p.m." END IF IF arr_control[curr].hora_sal = "00:00" THEN LET descri = "m.n." END IF IF arr_control[curr].hora_sal = "12:00" THEN LET descri = "m.d." END IF ## CHEQUEA QUE LA HORA DE SALIDA NO SEA IGUAL QUE LA DE ENTRADA IF arr_control[curr].hora_sal = arr_control[curr].hora_ent THEN LET numero_msg = 148 CALL msg(numero_msg) NEXT FIELD hora_sal END IF ## CHEQUEA QUE LA HORA DE SALIDA NO SEA MENOR QUE LA HORA DE ENTRADA IF arr_control[curr].hora_sal < arr_control[curr].hora_ent THEN LET numero_msg = 150 CALL msg(numero_msg) NEXT FIELD hora_sal END IF AFTER INPUT IF status < 0 THEN IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF 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 ## ACTUALIZACION DEL REGISTRO MODIFICADO FOR idx = 1 to arr_count() IF arr_control[idx].hora_ent is not null or arr_control[idx].hora_sal is not null THEN UPDATE adtb00023 set hora_ent = arr_control[idx].hora_ent, hora_sal = arr_control[idx].hora_sal, us_mod = SUSER_SNAME (), fech_mod = GETDATE () WHERE rowid = reg2[idx] END IF END FOR LET numero_msg = 13 CALL msg(numero_msg) IF status < 0 THEN END IF ## ELIMINACION DEL REGISTRO ESCOGIDO COMMAND KEY ("L") "eLiminar" UPDATE adtb00023 SET status_t = "E" WHERE fecha = cont_emp.fecha and num_emp = cont_emp.num_emp and departamento = cont_emp.departamento and nivel_emp = cont_emp.nivel_emp and cod_puesto = cont_emp.cod_puesto LET numero_msg = 39 CALL msg(numero_msg) COMMAND "Retornar" "Retorna al menu anterior" CLEAR FORM FOR idx = 1 to 5 LET arr_control[idx].hora_ent = NULL LET arr_control[idx].hora_sal = NULL DISPLAY arr_control[idx].hora_ent to consart[idx].hora_ent DISPLAY arr_control[idx].hora_sal to consart[idx].hora_sal END FOR EXIT MENU END MENU END FUNCTION FUNCTION busca_us() # WHENEVER ERROR CONTINUE SELECT UNIQUE us_crea,fech_crea,fech_mod,us_mod INTO usuario_c, fecha_c,fecha_m,usuario_m FROM adtb00023 WHERE num_emp = cont_emp.num_emp and departamento = cont_emp.departamento and nivel_emp = cont_emp.nivel_emp and cod_puesto = cont_emp.cod_puesto and fecha = cont_emp.fecha IF status < 0 THEN SELECT UNIQUE us_crea,us_mod INTO usuario_c, usuario_m FROM adtb00023 WHERE num_emp = cont_emp.num_emp and departamento = cont_emp.departamento and nivel_emp = cont_emp.nivel_emp and cod_puesto = cont_emp.cod_puesto and fecha = cont_emp.fecha LET fecha_c = null LET fecha_m = null END IF DISPLAY BY NAME usuario_c,usuario_m,fecha_c,fecha_m END FUNCTION