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

554 lines
20 KiB
Plaintext

{
------------------------------------------------------------------
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