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