Files

585 lines
19 KiB
Plaintext

{
------------------------------------------------------------------
PROGRAMA : CTPRMT001
OBJETIVO : Capturar, Modificar, Eliminar registros de la
Tabla catalogo semi-elaborados.
PROGRAMADOR : Ing. Juan F. Soto.
FECHA REALIZACION : Junio 14, 1993.
MODIFICACION : Agosto 2026 - Se agrego la pagina "Tabla Maestra" que al
abrir el programa lista todos los semielaborados
(cttb00001) en un DISPLAY ARRAY. Con la barra de botones
(Nuevo / Modificar / Desactivar / Re-activar / Refrescar)
el usuario selecciona un item y lo modifica en la misma
forma (pagina "Informacion"), sin ventanas adicionales.
------------------------------------------------------------------
}
GLOBALS "ctprgb000.4gl"
DEFINE descripcion_origen CHAR(30)
DEFINE m_semi DYNAMIC ARRAY OF RECORD
cod_prod INTEGER,
descripcion CHAR(50),
unidad_med CHAR(4),
nomenclatura CHAR(30),
desglose CHAR(10),
estado CHAR(10)
END RECORD
MAIN
DEFER INTERRUPT
CALL ARG_VAL(1) RETURNING usuarios
CALL ARG_VAL(2) RETURNING clave
CALL ARG_VAL(3) RETURNING impresor
CONNECT to "smarmotech" USER usuarios USING clave
SELECT a.* INTO p_compania.* FROM companias a
CALL ctprmt001()
END MAIN
#-----------------------------------------------------------------------------
# ctprmt001 : Abre la forma (folder con paginas "Tabla Maestra" e
# "Informacion") y arranca directamente en la lista de items.
#-----------------------------------------------------------------------------
FUNCTION ctprmt001()
OPEN FORM ctfmmt001 FROM "ctfmmt001"
DISPLAY FORM ctfmmt001
CALL ui.Interface.LoadStyles("mbsStyle")
CALL browse_semi()
END FUNCTION
#-----------------------------------------------------------------------------
# browse_semi : Muestra la lista de semielaborados y atiende la barra de
# botones. Cada accion se ejecuta y luego se recarga la lista.
#-----------------------------------------------------------------------------
FUNCTION browse_semi()
DEFINE r INTEGER
DEFINE seguir SMALLINT
DEFINE g_accion CHAR(10)
DEFINE g_cod INTEGER
LET seguir = TRUE
WHILE seguir
CALL carga_lista()
LET g_accion = "NADA"
LET g_cod = 0
DISPLAY ARRAY m_semi TO s_semi.* ATTRIBUTE(ACCEPT=FALSE, CANCEL=FALSE)
BEFORE DISPLAY
IF m_semi.getLength() >= 1 THEN
CALL muestra_detalle(1)
ELSE
CALL limpia_detalle()
END IF
BEFORE ROW
LET r = arr_curr()
IF r >= 1 AND r <= m_semi.getLength() THEN
CALL muestra_detalle(r)
END IF
ON ACTION nuevo
LET g_accion = "NUEVO"
EXIT DISPLAY
ON ACTION modificar
LET r = arr_curr()
IF r >= 1 AND r <= m_semi.getLength() THEN
LET g_accion = "MODIF"
LET g_cod = m_semi[r].cod_prod
EXIT DISPLAY
ELSE
CALL fgl_winmessage("Modificar",
"Seleccione un registro de la lista.", "info")
END IF
ON ACTION desactivar
LET r = arr_curr()
IF r >= 1 AND r <= m_semi.getLength() THEN
LET g_accion = "DESACT"
LET g_cod = m_semi[r].cod_prod
EXIT DISPLAY
ELSE
CALL fgl_winmessage("Desactivar",
"Seleccione un registro de la lista.", "info")
END IF
ON ACTION reactivar
LET r = arr_curr()
IF r >= 1 AND r <= m_semi.getLength() THEN
LET g_accion = "REACT"
LET g_cod = m_semi[r].cod_prod
EXIT DISPLAY
ELSE
CALL fgl_winmessage("Re-activar",
"Seleccione un registro de la lista.", "info")
END IF
ON ACTION refrescar
LET g_accion = "REFRESH"
EXIT DISPLAY
ON ACTION salir
LET g_accion = "SALIR"
EXIT DISPLAY
ON ACTION close
LET g_accion = "SALIR"
EXIT DISPLAY
END DISPLAY
# La accion interactiva se ejecuta FUERA del DISPLAY ARRAY para no
# anidar dialogos sobre la misma ventana.
CASE g_accion
WHEN "NUEVO"
CALL ctpcad001()
WHEN "MODIF"
IF g_cod > 0 THEN CALL ctmodifica(g_cod) END IF
WHEN "DESACT"
IF g_cod > 0 THEN CALL cambia_estado(g_cod, "E") END IF
WHEN "REACT"
IF g_cod > 0 THEN CALL cambia_estado(g_cod, "A") END IF
WHEN "SALIR"
LET seguir = FALSE
END CASE
END WHILE
END FUNCTION
#-----------------------------------------------------------------------------
# carga_lista : Carga en m_semi todos los semielaborados (activos y
# eliminados) ordenados por codigo. status_t NULL -> ACTIVO,
# 'E' -> ELIMINADO.
#-----------------------------------------------------------------------------
FUNCTION carga_lista()
DEFINE i INTEGER
DEFINE r_cod INTEGER
DEFINE r_desc CHAR(50)
DEFINE r_uni CHAR(4)
DEFINE r_nom CHAR(30)
DEFINE r_desg CHAR(10)
DEFINE r_st CHAR(1)
CALL m_semi.clear()
LET i = 0
DECLARE cur_lista CURSOR FOR
SELECT cod_prod, descripcion, unidad_med, nomenclatura, desglose, status_t
FROM cttb00001
ORDER BY cod_prod
FOREACH cur_lista INTO r_cod, r_desc, r_uni, r_nom, r_desg, r_st
LET i = i + 1
LET m_semi[i].cod_prod = r_cod
LET m_semi[i].descripcion = r_desc
LET m_semi[i].unidad_med = r_uni
LET m_semi[i].nomenclatura = r_nom
LET m_semi[i].desglose = r_desg
IF r_st = "E" THEN
LET m_semi[i].estado = "ELIMINADO"
ELSE
LET m_semi[i].estado = "ACTIVO"
END IF
END FOREACH
FREE cur_lista
END FUNCTION
#-----------------------------------------------------------------------------
# muestra_detalle : Presenta en la pagina "Informacion" el detalle completo
# del item de la fila r (incluyendo origen y auditoria).
#-----------------------------------------------------------------------------
FUNCTION muestra_detalle(r)
DEFINE r INTEGER
INITIALIZE produccion.* TO NULL
SELECT cod_prod, descripcion, unidad_med, nomenclatura, status_t,
us_crea, fech_crea, us_mod, fech_mod, cod_cia
INTO produccion.* FROM cttb00001
WHERE cod_prod = m_semi[r].cod_prod
IF status = NOTFOUND THEN
RETURN
END IF
DISPLAY BY NAME produccion.*
# Muestra texto completo (produccion.* proviene de un esquema mas corto)
DISPLAY m_semi[r].descripcion TO descripcion
DISPLAY m_semi[r].unidad_med TO unidad_med
DISPLAY m_semi[r].nomenclatura TO nomenclatura
DISPLAY m_semi[r].desglose TO desglose
LET descripcion_origen = NULL
SELECT a.descripcion INTO descripcion_origen FROM iptb00022 a
WHERE a.cod_cia = produccion.cod_cia
DISPLAY BY NAME descripcion_origen
END FUNCTION
#-----------------------------------------------------------------------------
# limpia_detalle : Limpia la pagina "Informacion" (lista vacia).
#-----------------------------------------------------------------------------
FUNCTION limpia_detalle()
INITIALIZE produccion.* TO NULL
LET descripcion_origen = NULL
DISPLAY BY NAME produccion.*
DISPLAY BY NAME descripcion_origen
DISPLAY "" TO desglose
END FUNCTION
#-----------------------------------------------------------------------------
# cambia_estado : Desactiva (status_t='E') o reactiva (status_t=NULL) el item.
# p_est = 'E' desactiva, cualquier otro valor reactiva.
#-----------------------------------------------------------------------------
FUNCTION cambia_estado(p_cod, p_est)
DEFINE p_cod INTEGER
DEFINE p_est CHAR(1)
DEFINE resp CHAR(3)
IF p_est = "E" THEN
LET resp = fgl_winquestion("Desactivar",
"Esta seguro de DESACTIVAR el registro " || p_cod || " ?",
"NO", "YES|NO", "question", 0)
IF resp = "YES" THEN
UPDATE cttb00001 SET status_t = "E",
us_mod = SUSER_SNAME(),
fech_mod = GETDATE()
WHERE cod_prod = p_cod
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
ELSE
CALL fgl_winmessage("Desactivar", "Registro desactivado.", "info")
END IF
END IF
ELSE
LET resp = fgl_winquestion("Re-activar",
"Esta seguro de RE-ACTIVAR el registro " || p_cod || " ?",
"NO", "YES|NO", "question", 0)
IF resp = "YES" THEN
UPDATE cttb00001 SET status_t = NULL,
us_mod = SUSER_SNAME(),
fech_mod = GETDATE()
WHERE cod_prod = p_cod
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
ELSE
CALL fgl_winmessage("Re-activar", "Registro reactivado.", "info")
END IF
END IF
END IF
END FUNCTION
#-----------------------------------------------------------------------------
# ctmodifica : Modifica el item seleccionado (origen, descripcion, unidad de
# medida y nomenclatura) directamente en la pagina "Informacion".
# Conserva las validaciones originales (iptb00022, cttb00007).
#-----------------------------------------------------------------------------
FUNCTION ctmodifica(p_cod)
DEFINE p_cod INTEGER
DEFINE l_cia SMALLINT
DEFINE l_desc CHAR(50)
DEFINE l_uni CHAR(4)
DEFINE l_nom CHAR(30)
DEFINE l_st CHAR(1)
# Se usan variables locales con el ancho real de la tabla viva
# (descripcion 50, nomenclatura 30) para NO truncar al guardar; la
# variable global produccion.* proviene de un esquema viejo mas corto.
SELECT status_t, descripcion, unidad_med, nomenclatura, cod_cia
INTO l_st, l_desc, l_uni, l_nom, l_cia
FROM cttb00001 WHERE cod_prod = p_cod
IF status = NOTFOUND THEN
CALL fgl_winmessage("Modificar", "El registro no existe.", "stop")
RETURN
END IF
IF l_st = "E" THEN
CALL fgl_winmessage("Modificar",
"El registro esta ELIMINADO. Use Re-activar antes de modificar.",
"stop")
RETURN
END IF
LET descripcion_origen = NULL
SELECT a.descripcion INTO descripcion_origen FROM iptb00022 a
WHERE a.cod_cia = l_cia
DISPLAY BY NAME descripcion_origen
LET int_flag = FALSE
INPUT l_cia, l_desc, l_uni, l_nom
FROM cod_cia, descripcion, unidad_med, nomenclatura
ATTRIBUTE(WITHOUT DEFAULTS)
AFTER FIELD cod_cia
SELECT a.descripcion INTO descripcion_origen FROM iptb00022 a
WHERE a.cod_cia = l_cia
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
NEXT FIELD cod_cia
END IF
DISPLAY BY NAME descripcion_origen
AFTER FIELD descripcion
IF l_desc IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD descripcion
END IF
AFTER FIELD unidad_med
IF l_uni IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD unidad_med
ELSE
SELECT codigo_unidad FROM cttb00007
WHERE codigo_unidad = l_uni
AND status_t IS NULL
IF STATUS = NOTFOUND THEN
LET numero_msg = 17
CALL msg(numero_msg)
NEXT FIELD unidad_med
END IF
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
END IF
AFTER FIELD nomenclatura
IF l_nom IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD nomenclatura
END IF
AFTER INPUT
IF int_flag THEN
EXIT INPUT
END IF
IF l_desc IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD descripcion
END IF
IF l_uni IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD unidad_med
END IF
SELECT codigo_unidad FROM cttb00007
WHERE codigo_unidad = l_uni
AND status_t IS NULL
IF STATUS = NOTFOUND THEN
LET numero_msg = 17
CALL msg(numero_msg)
NEXT FIELD unidad_med
END IF
EXIT INPUT
END INPUT
IF int_flag THEN
LET int_flag = FALSE
LET numero_msg = 2
CALL msg(numero_msg)
RETURN
END IF
UPDATE cttb00001 SET cod_cia = l_cia,
descripcion = l_desc,
unidad_med = l_uni,
nomenclatura = l_nom,
us_mod = SUSER_SNAME(),
fech_mod = GETDATE()
WHERE cod_prod = p_cod
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
ELSE
LET numero_msg = 13
CALL msg(numero_msg)
END IF
END FUNCTION
FUNCTION ctpcad001()
#WHENEVER ERROR CONTINUE
## Captura los datos que va a contener el registro
LET int_flag = false
LABEL vuelve:
INPUT BY NAME produccion.cod_cia,produccion.cod_prod,produccion.descripcion,
produccion.unidad_med,produccion.nomenclatura
AFTER FIELD cod_prod
IF produccion.cod_prod is null then
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD cod_prod
END IF
LET produccion.descripcion = null
LET produccion.unidad_med = null
LET produccion.nomenclatura = null
LET produccion.status_t = null
LET produccion.us_crea = null
LET produccion.fech_crea = null
LET produccion.us_mod = null
LET produccion.fech_mod = null
DISPLAY BY NAME produccion.*
SELECT cod_prod, descripcion, unidad_med, nomenclatura, status_t,
us_crea, fech_crea, us_mod, fech_mod, cod_cia
INTO produccion.* FROM cttb00001
WHERE @cod_prod = produccion.cod_prod
IF produccion.status_t = "E" THEN
LET numero_msg = 36
CALL msg(numero_msg)
DISPLAY BY NAME produccion.*
NEXT FIELD cod_prod
END IF
IF status != notfound THEN
LET numero_msg = 12
CALL msg(numero_msg)
DISPLAY BY NAME produccion.*
NEXT FIELD cod_prod
END IF
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
AFTER FIELD cod_cia
SELECT a.descripcion INTO descripcion_origen FROM iptb00022 a
WHERE a.cod_cia = produccion.cod_cia
IF STATUS = NOTFOUND THEN
LET numero_msg = 3
CALL msg(numero_msg)
NEXT FIELD cod_cia
END IF
DISPLAY BY NAME descripcion_origen
AFTER FIELD descripcion
IF produccion.descripcion IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD descripcion
END IF
AFTER FIELD unidad_med
IF produccion.unidad_med IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD unidad_med
ELSE
SELECT codigo_unidad FROM cttb00007
WHERE codigo_unidad = produccion.unidad_med and
status_t is null
IF status = NOTFOUND THEN
LET numero_msg = 17
CALL msg(numero_msg)
NEXT FIELD unidad_med
END IF
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
END IF
AFTER FIELD nomenclatura
IF produccion.nomenclatura IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD nomenclatura
END IF
AFTER INPUT
IF int_flag THEN
LET numero_msg = 2
CALL msg(numero_msg)
LET int_flag = FALSE
RETURN
END IF
IF produccion.cod_prod is null then
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD cod_prod
END IF
SELECT cod_prod, descripcion, unidad_med, nomenclatura, status_t,
us_crea, fech_crea, us_mod, fech_mod, cod_cia
INTO produccion.* FROM cttb00001
WHERE cod_prod = produccion.cod_prod
IF produccion.status_t = "E" THEN
LET numero_msg = 36
CALL msg(numero_msg)
DISPLAY BY NAME produccion.*
NEXT FIELD cod_prod
END IF
IF status != notfound THEN
LET numero_msg = 3
CALL msg(numero_msg)
DISPLAY BY NAME produccion.*
NEXT FIELD cod_prod
END IF
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
IF produccion.unidad_med IS NULL THEN
LET numero_msg = 16
CALL msg(numero_msg)
NEXT FIELD unidad_med
ELSE
SELECT codigo_unidad FROM cttb00007
WHERE codigo_unidad = produccion.unidad_med and
status_t is null
IF STATUS = NOTFOUND THEN
LET numero_msg = 17
CALL msg(numero_msg)
NEXT FIELD unidad_med
END IF
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
END IF
EXIT INPUT
END INPUT
INSERT INTO cttb00001
(cod_prod, descripcion, unidad_med, nomenclatura,
status_t, us_crea, fech_crea, us_mod, fech_mod, cod_cia)
VALUES
(produccion.cod_prod,produccion.descripcion,
produccion.unidad_med,produccion.nomenclatura,
null,SUSER_SNAME(),GETDATE(),null,null,produccion.cod_cia)
CALL integridad()
IF bandera = 1 THEN
LET bandera = 0
RETURN
END IF
LET numero_msg = 1
CALL msg(numero_msg)
GOTO vuelve
END FUNCTION