585 lines
19 KiB
Plaintext
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
|