Files
MBS/PROYECTO/addir/adprmt020.4gl
T

642 lines
23 KiB
Plaintext

{
------------------------------------------------------------------------
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" "<Esc> Actualiza Registro <Ctrl-C> 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