Files
MBS/PROYECTO/nodir/noprmt002.4gl
T

718 lines
21 KiB
Plaintext

{
------------------------------------------------------------------
PROGRAMA : NOPRMT002
OBJETIVO : Capturar, Modificar, Eliminar registros de la
Tabla de Movimientos Fijos del Empleado
PROGRAMADOR : Ing. Betania Guerrero Perez
FECHA REALIZACION : Agosto 20, 1993
------------------------------------------------------------------
}
GLOBALS "noprgb000.4gl"
DEFINE opcion STRING
MAIN
DEFER INTERRUPT
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 noprmt002()
END MAIN
FUNCTION noprmt002()
CLEAR SCREEN
OPTIONS
FORM LINE 9,
ERROR LINE 23,
COMMENT LINE 21
LET formulario = formulario CLIPPED,"nofmmt002"
OPEN FORM nofmmt002 FROM "nofmmt002"
DISPLAY FORM nofmmt002
#CALL pantalla()
DISPLAY "noprmt002" AT 4,3
DISPLAY "Movimientos Fijos del Empleado" AT 6,25
MENU
ON ACTION nuevo
LET int_flag = false
CLEAR FORM
CALL nopcad002()
ON ACTION buscar
LET int_flag = false
CALL nopcmf002()
ON ACTION Salir
EXIT MENU
END MENU
END FUNCTION
FUNCTION nopcad002()
# WHENEVER ERROR CONTINUE
LABEL vuelve:
INPUT BY NAME fijo.num_emp
## VENTANA PARA BUSCAR LOS EMPLEADOS
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 = 159
CALL msg(numero_msg)
NEXT FIELD num_emp
END IF
LET descrip1 = nombre
LET fijo.num_emp = despl_emp[curr].num_emp
LET fijo.departamento = despl_emp[curr].departamento
LET fijo.nivel_emp = despl_emp[curr].nivel_emp
LET fijo.cod_puesto = despl_emp[curr].cod_puesto
DISPLAY BY NAME fijo.num_emp,fijo.departamento,fijo.nivel_emp,
fijo.cod_puesto,descrip1
EXIT INPUT
END CASE
## CAPTURA LOS DATOS QUE VA A CONTENER EL REGISTRO.
### CHEQUEA QUE EL EMPLEADO EXISTA EN LA TABLA DE EMPLEADOS.
AFTER FIELD num_emp
IF fijo.num_emp IS NOT NULL THEN
SELECT departamento,nivel_emp,cod_puesto,nom1_emp,nom2_emp,
apell1_emp,apell2_emp INTO fijo.departamento,
fijo.nivel_emp,fijo.cod_puesto,nombre1,nombre2,
apellido1,apellido2 FROM adtb00003
WHERE num_emp = fijo.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
ELSE
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD num_emp
END IF
LET descrip1 = nombre1 clipped," ",nombre2 clipped," ",
apellido1 clipped," ",apellido2 clipped
DISPLAY BY NAME fijo.departamento,fijo.nivel_emp,fijo.cod_puesto,
descrip1
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
INPUT ARRAY arr_fijo 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_fijo[curr1].cod_mov and status_t is null
LET arr_fijo[curr1].descrip_mov = mov_nomi.descrip_mov
DISPLAY arr_fijo[curr1].descrip_mov to consart[scr_l].descrip_mov
LET control = "N"
CALL repite()
IF control = "S" THEN
NEXT FIELD cod_mov
END IF
END CASE
AFTER FIELD cod_mov
LET curr1 = arr_curr()
LET scr_l = scr_line()
IF arr_fijo[curr1].cod_mov IS NOT NULL THEN
LET control = "N"
CALL repite()
IF control = "S" THEN
NEXT FIELD cod_mov
END IF
SELECT descrip_mov INTO mov_nomi.descrip_mov
FROM notb00002
WHERE cod_mov = arr_fijo[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_fijo[curr1].descrip_mov = mov_nomi.descrip_mov
DISPLAY arr_fijo[curr1].descrip_mov to consart[scr_l].descrip_mov
SELECT unique cod_mov FROM notb00003
WHERE num_emp = fijo.num_emp and cod_mov = arr_fijo[curr1].cod_mov
IF status != notfound THEN
LET numero_msg = 12
CALL msg(numero_msg)
NEXT FIELD cod_mov
END IF
SELECT unique cod_mov FROM notb00007
WHERE num_emp = fijo.num_emp and cod_mov = arr_fijo[curr1].cod_mov
IF status != notfound THEN
DELETE FROM notb00007 WHERE cod_mov = arr_fijo[curr1].cod_mov
and num_emp = fijo.num_emp
END IF
END IF
AFTER FIELD VALOR
IF arr_fijo[curr1].cod_mov IS NOT NULL THEN
IF arr_fijo[curr1].valor IS NULL THEN
CALL msg(16)
NEXT FIELD valor
END IF
END IF
END INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
## SI NO EXISTE NINGUN PROBLEMA EN LA ENTRADA DE INFORMACION SE PROCEDE
## A INSERTAR EL REGISTRO
FOR idx = 1 to arr_fijo.getLength()
IF arr_fijo[idx].cod_mov is not null THEN
IF arr_fijo[idx].valor IS NOT NULL THEN
INSERT INTO notb00003
VALUES(fijo.num_emp,fijo.departamento,fijo.nivel_emp,
fijo.cod_puesto,arr_fijo[idx].cod_mov,arr_fijo[idx].cantidad,
arr_fijo[idx].valor,null,usuarios,GETDATE(),null,NULL)
INSERT INTO notb00003_log
(
num_emp
,departamento
,nivel_emp
,cod_puesto
,cod_mov
,cantidad
,valor
,us_crea
,fech_crea
,operacion
,fecha_operacion)
VALUES
(
fijo.num_emp,fijo.departamento
,fijo.nivel_emp
,fijo.cod_puesto
,arr_fijo[idx].cod_mov,arr_fijo[idx].cantidad,
arr_fijo[idx].valor,usuarios,GETDATE(),"ADICIONANDO",getdate())
END IF
END IF
END FOR
LET numero_msg = 1
CALL msg(numero_msg)
CLEAR FORM
IF status < 0 THEN
CALL integridad()
CLEAR FORM
END IF
GOTO vuelve
END FUNCTION
FUNCTION nopcmf002()
## AQUI SE PREPARA PARA LA CAPTURA DEL CRITERIO DE SELECCION PARA LA
## MODIFICACION DE REGISTROS.
# WHENEVER ERROR CONTINUE
CONSTRUCT criterio ON num_emp,departamento
FROM notb00003.num_emp,notb00003.departamento
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
LET SELEC = " SELECT UNIQUE num_emp,departamento,nivel_emp,cod_puesto ",
" FROM notb00003 where ",
" status_t is null and ",
criterio clipped,
" ORDER BY 1,2,3,4"
PREPARE busca FROM selec
DECLARE datos SCROLL CURSOR FOR busca
OPEN datos
FETCH FIRST datos INTO fijo.num_emp,fijo.departamento,
fijo.nivel_emp,fijo.cod_puesto
IF status >= 0 THEN
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
RETURN
END IF
END IF
CALL selecciona()
MENU "OPCION"
COMMAND "Siguiente"
"Presenta en pantalla el proximo registro encontrado"
FETCH NEXT datos INTO fijo.num_emp,fijo.departamento,
fijo.nivel_emp,fijo.cod_puesto
IF STATUS = NOTFOUND THEN
LET numero_msg = 4
CALL msg(numero_msg)
END IF
CALL selecciona()
COMMAND "Anterior"
"Presenta en pantalla el registro anterior encontrado"
FETCH PREVIOUS datos INTO fijo.num_emp,fijo.departamento,
fijo.nivel_emp,fijo.cod_puesto
IF STATUS = NOTFOUND THEN
LET numero_msg = 5
CALL msg(numero_msg)
END IF
CALL selecciona()
COMMAND "Primero"
"Presenta en pantalla el primer registro encontrado"
FETCH FIRST datos INTO fijo.num_emp,fijo.departamento,
fijo.nivel_emp,fijo.cod_puesto
CALL selecciona()
LET numero_msg = 5
CALL msg(numero_msg)
COMMAND "Ultimo"
"Presenta en pantalla el ultimo registro encontrado"
FETCH LAST datos INTO fijo.num_emp,fijo.departamento,
fijo.nivel_emp,fijo.cod_puesto
CALL selecciona()
LET numero_msg = 4
CALL msg(numero_msg)
COMMAND "Escoger"
"<Esc> Actualiza Registro <CTRL-C> Cancela Operacion"
IF fijo.status_t = "E" THEN
LET numero_msg = 39
CALL msg(numero_msg)
RETURN
END IF
## AQUI SE MODIFICAN LOS MOVIMIENTOS
CALL arr_fijo.clear()
## SELECCIONA LOS CAMPOS DEL ARREGLO
DECLARE buscando CURSOR FOR
SELECT UNIQUE a.cod_mov,b.descrip_mov,a.cantidad,a.valor
FROM notb00003 a,notb00002 b
WHERE a.cod_mov = b.cod_mov and
a.num_emp = fijo.num_emp and
a.status_t is null
ORDER BY 1
LET idx = 1
FOREACH buscando INTO arr_fijo[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_fijo 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_fijo[curr1].cod_mov and
status_t is null
LET arr_fijo[curr1].descrip_mov = mov_nomi.descrip_mov
DISPLAY arr_fijo[curr1].cod_mov to consart[scr_l].cod_mov
DISPLAY arr_fijo[curr1].descrip_mov to consart[scr_l].descrip_mov
LET control = "N"
CALL repite()
IF control = "S" THEN
NEXT FIELD cod_mov
END IF
END CASE
AFTER FIELD VALOR
IF arr_fijo[curr1].cod_mov IS NOT NULL THEN
IF arr_fijo[curr1].valor IS NULL THEN
CALL msg(16)
NEXT FIELD valor
END IF
END IF
AFTER FIELD cod_mov
LET curr1 = arr_curr()
LET scr_l = scr_line()
IF arr_fijo[curr1].cod_mov IS NOT NULL THEN
LET control = "N"
CALL repite()
IF control = "S" THEN
NEXT FIELD cod_mov
END IF
SELECT descrip_mov
INTO mov_nomi.descrip_mov
FROM notb00002
WHERE cod_mov = arr_fijo[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_fijo[curr1].descrip_mov = mov_nomi.descrip_mov
DISPLAY arr_fijo[curr1].descrip_mov to consart[scr_l].descrip_mov
END IF
AFTER INPUT
IF status < 0 THEN
CALL integridad()
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
## AQUI SE REALIZA LA ACTUALIZACION DEL REGISTRO
BEGIN WORK
INSERT INTO notb00003_log
(
num_emp
,departamento
,nivel_emp
,cod_puesto
,cod_mov
,cantidad
,valor
,us_crea
,fech_crea
,operacion
,fecha_operacion)
SELECT a.num_emp
,a.departamento
,a.nivel_emp
,a.cod_puesto
,a.cod_mov
,a.cantidad
,a.valor
,a.us_crea
,a.fech_crea
,'MODIFICANDO'
,getdate()
FROM notb00003 a WHERE a.num_emp = fijo.num_emp
DELETE FROM notb00003
WHERE num_emp = fijo.num_emp
FOR idx = 1 to arr_fijo.getLength()
IF arr_fijo[idx].cod_mov is not null THEN
IF arr_fijo[idx].valor IS NOT NULL THEN
INSERT INTO notb00003
(num_emp
,departamento
,nivel_emp
,cod_puesto
,cod_mov
,cantidad
,valor
,us_mod
,fech_mod)
VALUES
(fijo.num_emp,fijo.departamento,
fijo.nivel_emp,fijo.cod_puesto,arr_fijo[idx].cod_mov,
arr_fijo[idx].cantidad,arr_fijo[idx].valor,
usuarios,GETDATE())
IF STATUS < 0 THEN
ROLLBACK WORK
CALL fgl_winmessage("ERROR",SQLCA.sqlerrm,"exclamation")
CONTINUE MENU
END IF
END IF
END IF
END FOR
COMMIT WORK
LET numero_msg = 13
CALL msg(numero_msg)
IF status < 0 THEN
CALL integridad()
END IF
COMMAND KEY ("L") "eLiminar"
LET opcion = fgl_winquestion("ADVERTENCIA","ESTA SEGURO DE DESACTIVAR ESTE REGISTRO?","NO","YES|NO","QUESTION",0)
IF opcion = "YES" THEN
UPDATE notb00003 SET status_t = "E",
us_mod = usuarios,
fech_mod = getdate()
WHERE num_emp = fijo.num_emp
INSERT INTO notb00003_log
(
num_emp
,departamento
,nivel_emp
,cod_puesto
,cod_mov
,cantidad
,valor
,us_crea
,fech_crea
,operacion
,fecha_operacion)
SELECT a.num_emp
,a.departamento
,a.nivel_emp
,a.cod_puesto
,a.cod_mov
,a.cantidad
,a.valor
,a.us_crea
,a.fech_crea
,'ELIMINADO'
,getdate()
FROM notb00003 a WHERE a.num_emp = fijo.num_emp
LET numero_msg = 39
CALL msg(numero_msg)
END IF
COMMAND "Retornar"
"Retorna al menu anterior"
CLEAR FORM
FOR idx = 1 to 3
LET arr_fijo[idx].cod_mov = NULL
LET arr_fijo[idx].descrip_mov = NULL
LET arr_fijo[idx].cantidad = NULL
LET arr_fijo[idx].valor = NULL
DISPLAY arr_fijo[idx].cod_mov to consart[idx].cod_mov
DISPLAY arr_fijo[idx].descrip_mov to consart[idx].descrip_mov
DISPLAY arr_fijo[idx].cantidad to consart[idx].cantidad
DISPLAY arr_fijo[idx].valor to consart[idx].valor
END FOR
EXIT MENU
END MENU
END FUNCTION
## VENTANA PARA DESPLEGAR LOS MOVIMIENTOS
FUNCTION busca_movimientos()
OPEN WINDOW busqueda AT 5,5 WITH FORM "nofmwd001"
ATTRIBUTE (BORDER,FORM LINE FIRST + 2, comment line last)
CONSTRUCT criterio ON notb00002.descrip_mov FROM notb00002.descrip_mov
LET selec3 = "SELECT cod_mov,descrip_mov,cantidad,valor ",
"FROM notb00002 ",
" WHERE ",
" status_t is null AND ",
criterio clipped,
"ORDER BY 1 "
PREPARE busca3 FROM selec3
DECLARE local CURSOR FOR busca3
LET idx = 1
FOREACH local INTO buscar_movi[idx].*
IF status = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
EXIT FOREACH
END IF
LET despl_movi[idx].cod_mov = buscar_movi[idx].cod_mov
LET despl_movi[idx].descrip_mov = buscar_movi[idx].descrip_mov clipped
LET idx = idx + 1
END FOREACH
CALL set_count(idx-1)
DISPLAY ARRAY despl_movi TO s_movimiento.*
LET curr = arr_curr()
LET arr_fijo[curr1].cod_mov = despl_movi[curr].cod_mov
LET mov_nomi.descrip_mov = despl_movi[curr].descrip_mov
CLOSE WINDOW busqueda
END FUNCTION
## VENTANA DE LOS EMPLEADOS DE LA EMPRESA
FUNCTION busca_empleado()
OPEN WINDOW busqueda1 AT 7,10 WITH FORM "adfmwd004"
ATTRIBUTE (BORDER,FORM LINE FIRST + 2, comment line last)
CONSTRUCT criterio ON adtb00003.nom1_emp,adtb00003.nom2_emp,
adtb00003.apell1_emp,adtb00003.apell2_emp
FROM nom1_emp,apell1_emp
LET selec1 = "SELECT num_emp,departamento,nivel_emp,cod_puesto, ",
"nom1_emp,apell1_emp FROM adtb00003 ",
" WHERE ",
" (status_t is null or status_t = 'I') AND ",
criterio clipped,
"ORDER BY 1,2,3,4"
PREPARE busca1 FROM selec1
DECLARE local1 CURSOR FOR busca1
LET idx = 1
FOREACH local1 INTO buscar_emp[idx].*
IF status = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
EXIT FOREACH
END IF
LET despl_emp[idx].num_emp = buscar_emp[idx].num_emp
LET despl_emp[idx].departamento = buscar_emp[idx].departamento
LET despl_emp[idx].nivel_emp = buscar_emp[idx].nivel_emp
LET despl_emp[idx].cod_puesto = buscar_emp[idx].cod_puesto
LET despl_emp[idx].nom1_emp = buscar_emp[idx].nom1_emp clipped
LET despl_emp[idx].nom2_emp = buscar_emp[idx].nom2_emp clipped
LET despl_emp[idx].apell1_emp = buscar_emp[idx].apell1_emp clipped
LET despl_emp[idx].apell2_emp = buscar_emp[idx].apell2_emp clipped
LET idx = idx + 1
END FOREACH
CALL set_count(idx-1)
DISPLAY ARRAY despl_emp TO s_empleado.*
LET curr = arr_curr()
LET nombre =
despl_emp[curr].nom1_emp clipped," ",despl_emp[curr].nom2_emp clipped," ",
despl_emp[curr].apell1_emp clipped," ",despl_emp[curr].apell2_emp clipped
CLOSE WINDOW busqueda1
END FUNCTION
## VERIFICA QUE NO SE REPITAN LOS MOVIMIENTOS
FUNCTION repite()
DEFINE movi_ant RECORD
cod_mov SMALLINT
END RECORD
LET movi_ant.cod_mov = arr_fijo[curr1].cod_mov
FOR idx = 1 to arr_count()
IF idx != curr1 THEN
IF arr_fijo[idx].cod_mov IS NOT NULL THEN
IF arr_fijo[idx].cod_mov = movi_ant.cod_mov 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
## SELECCIONA Y DESPLIEGA LOS DATOS DEL REGISTRO ESCOGIDO
FUNCTION selecciona()
SELECT nom1_emp,nom2_emp,apell1_emp,apell2_emp
INTO nombre1,nombre2,apellido1,apellido2 FROM adtb00003
WHERE num_emp = fijo.num_emp
IF status = notfound THEN
LET descrip1 = "EMPLEADO NO EXISTE"
ELSE
LET descrip1 = nombre1 clipped," ",nombre2 clipped," ",
apellido1 clipped," ",apellido2 clipped
END IF
DISPLAY BY NAME fijo.num_emp,fijo.departamento,fijo.nivel_emp,
fijo.cod_puesto,descrip1
END FUNCTION