From 7915a27efeb932d48341621532c1d2f69abfaa99 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 11 Sep 2026 10:05:22 -0400 Subject: [PATCH 01/11] Agregar mapeo de conexion marmotech -> EXTERIOR en fglprofile Autorizado por Johnny Soto: crear DSN ODBC apuntando a la base EXTERIOR para la segunda conexion legada de Informix usada en ipprmt064/ipprmt005. Investigacion: la conexion aislada a EXTERIOR funciona correctamente, pero abrir esta segunda conexion junto con la conexion activa a smarmotech falla con error -6366 "Changed database context" del driver dbmsnc de Genero. Se descarto: colision de nombre de DSN, pooling de conexiones ODBC, y version del driver (probados ODBC Driver 18 y el driver "SQL Server" legado) - mismo resultado en todos los casos. Parece ser una limitacion del driver de Genero al manejar dos conexiones simultaneas al mismo servidor SQL Server. Escalado a Johnny para abrir caso con soporte de Four Js. Co-Authored-By: Claude Sonnet 5 --- PROYECTO/config/fglprofile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/PROYECTO/config/fglprofile b/PROYECTO/config/fglprofile index 7e9ba80..56e9925 100644 --- a/PROYECTO/config/fglprofile +++ b/PROYECTO/config/fglprofile @@ -6,3 +6,10 @@ dbi.database.mydatabase.source = "mydatabase.db" # OJO: el runtime debe tener el driver dbmsnc (esta en fgl602, NO en el 6.00.01 de GST603). dbi.database.smarmotech.source = "marmotech250s" dbi.database.smarmotech.driver = "dbmsnc" + +# --- MBS ERP: conexion marmotech -> .250/EXTERIOR (DSN ODBC18 marmotech) --- +# Segunda conexion legada de la epoca Informix (alias IFMX/SQL_E en varios +# programas viejos), usada para validar movimientos contra Cuentas por +# Cobrar en la base EXTERIOR. Autorizado por Johnny Soto, 11/09/2026. +dbi.database.marmotech.source = "exteriordb" +dbi.database.marmotech.driver = "dbmsnc" From ecdd77063222f6de95ff10371e05884a6666a78b Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 11 Sep 2026 10:29:39 -0400 Subject: [PATCH 02/11] Registrar formulario ipfmmt012.per para ipprmt012 (Administracion Grupos) Probado completo: alta, consulta-modificacion y eliminacion - todo funciona correctamente. Co-Authored-By: Claude Sonnet 5 --- PROYECTO/mbsERP.4pw | 1 + 1 file changed, 1 insertion(+) diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index a424b4a..2928878 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -503,6 +503,7 @@ + From 189c582eee3176a6ddc3875d1d7fae121417e79e Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 11 Sep 2026 11:38:45 -0400 Subject: [PATCH 03/11] Registrar formulario ipfmmt010.per para ipprmt010 (Tipos de Productos) Probado completo: alta, consulta-modificacion y eliminacion (confirmado en BD que status_t queda en 'E') - todo funciona correctamente. Co-Authored-By: Claude Sonnet 5 --- PROYECTO/mbsERP.4pw | 1 + 1 file changed, 1 insertion(+) diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 2928878..0498dc9 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -504,6 +504,7 @@ + From 1ed4e0e691e9ecf14129205b1eeba04bcc0e6aa6 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 11 Sep 2026 11:48:59 -0400 Subject: [PATCH 04/11] Corregir ipprmt010: campos de usuario/fecha/estado enlazados a tabla equivocada - El formulario ipfmmt010.per tenia los campos Usuario Creador/Modificador, Fecha Creacion/Modificacion y el indicador de estado enlazados a iptb00020 (tabla de Grupos, ajena a este programa) en vez de iptb00024 (Tipos de Productos) - copiado por error del formulario de otro programa - La consulta en ipprmt010.4gl tampoco seleccionaba esas columnas - Al eliminar, el registro en memoria y la pantalla no se actualizaban con el nuevo estado, solo la base de datos Confirmado por Johnny que el estado 'E' debe reflejarse en pantalla al eliminar. Co-Authored-By: Claude Sonnet 5 --- PROYECTO/ipdir/ipfmmt010.per | 12 ++++++------ PROYECTO/ipdir/ipprmt010.4gl | 16 ++++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/PROYECTO/ipdir/ipfmmt010.per b/PROYECTO/ipdir/ipfmmt010.per index f40da81..f221c8d 100644 --- a/PROYECTO/ipdir/ipfmmt010.per +++ b/PROYECTO/ipdir/ipfmmt010.per @@ -14,15 +14,15 @@ LAYOUT (TEXT="TIPOS PRODUCTOS") } end tables -iptb00020,iptb00024 +iptb00024 attributes f006 = iptb00024.cod_tipo; f007 = iptb00024.descripcion,upshift; -b = iptb00020.status_t,noentry; -f002 = iptb00020.us_crea,noentry; -f003 = iptb00020.fech_crea,noentry; -f004 = iptb00020.us_mod,noentry; -f005 = iptb00020.fech_mod,NOENTRY; +b = iptb00024.status_t,noentry; +f002 = iptb00024.us_crea,noentry; +f003 = iptb00024.fech_crea,noentry; +f004 = iptb00024.us_mod,noentry; +f005 = iptb00024.fech_mod,NOENTRY; COMBOBOX inv = formonly.cod_inv,ITEMS=(("3","PRODUCTOS TERMINADOS"),("1","MATERIA PRIMA"),("7","REPUESTOS")),DEFAULT=3; instructions delimiters diff --git a/PROYECTO/ipdir/ipprmt010.4gl b/PROYECTO/ipdir/ipprmt010.4gl index 2a266c7..ccc6fb4 100644 --- a/PROYECTO/ipdir/ipprmt010.4gl +++ b/PROYECTO/ipdir/ipprmt010.4gl @@ -105,7 +105,7 @@ FUNCTION ippcmf010() RETURN END IF - LET SELEC = " SELECT UNIQUE a.cod_tipo,a.descripcion,a.cod_inv FROM iptb00024 a WHERE ", + LET SELEC = " SELECT UNIQUE a.* FROM iptb00024 a WHERE ", criterio clipped, " ORDER BY a.cod_tipo" @@ -120,7 +120,7 @@ FUNCTION ippcmf010() RETURN END IF - DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv + DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv,p_iptb24.status_t,p_iptb24.us_crea,p_iptb24.fech_crea,p_iptb24.us_mod,p_iptb24.fech_mod MENU "OPCIONES " COMMAND "Siguiente" @@ -131,7 +131,7 @@ FUNCTION ippcmf010() CALL msg(numero_msg) END IF - DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv + DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv,p_iptb24.status_t,p_iptb24.us_crea,p_iptb24.fech_crea,p_iptb24.us_mod,p_iptb24.fech_mod COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" @@ -141,13 +141,13 @@ FUNCTION ippcmf010() CALL msg(numero_msg) END IF - DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv + DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv,p_iptb24.status_t,p_iptb24.us_crea,p_iptb24.fech_crea,p_iptb24.us_mod,p_iptb24.fech_mod COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO p_iptb24.* - DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv + DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv,p_iptb24.status_t,p_iptb24.us_crea,p_iptb24.fech_crea,p_iptb24.us_mod,p_iptb24.fech_mod LET numero_msg = 5 CALL msg(numero_msg) @@ -156,7 +156,7 @@ FUNCTION ippcmf010() "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO p_iptb24.* - DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv + DISPLAY BY NAME p_iptb24.cod_tipo,p_iptb24.descripcion,p_iptb24.cod_inv,p_iptb24.status_t,p_iptb24.us_crea,p_iptb24.fech_crea,p_iptb24.us_mod,p_iptb24.fech_mod LET numero_msg = 4 CALL msg(numero_msg) @@ -196,6 +196,10 @@ FUNCTION ippcmf010() fech_mod = GETDATE() WHERE @cod_tipo = p_iptb24.cod_tipo + LET p_iptb24.status_t = "E" + LET p_iptb24.us_mod = usuarios + LET p_iptb24.fech_mod = CURRENT + DISPLAY BY NAME p_iptb24.status_t,p_iptb24.us_mod,p_iptb24.fech_mod LET numero_msg = 39 CALL msg(numero_msg) From 4ce1e7a03dfe2d189ae3533dffa986ed9359d253 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 11 Sep 2026 12:28:56 -0400 Subject: [PATCH 05/11] Registrar y corregir ipprmt014 (Administracion Medidas) - Registrar formulario ipfmmt014.per (faltaba) - Corregir refresco de pantalla al eliminar (no mostraba estado 'E' hasta volver a consultar), confirmado por Johnny que debe verse al instante - Agregar validacion para no permitir eliminar un registro ya eliminado (mostraba "REGISTRO ELIMINADO" de nuevo sin avisar) Nota: el aviso de "ya eliminado" no sale centrado en pantalla - limitacion del cliente grafico de Genero para dialogos lanzados desde pantallas tipo MENU clasico (no aplica en pantallas DIALOG modernas). Aceptado por la usuaria, no es bloqueante. Co-Authored-By: Claude Sonnet 5 --- PROYECTO/ipdir/ipprmt014.4gl | 50 ++++++++++++++++++++++++------------ PROYECTO/mbsERP.4pw | 1 + 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/PROYECTO/ipdir/ipprmt014.4gl b/PROYECTO/ipdir/ipprmt014.4gl index aa3d532..a48be82 100644 --- a/PROYECTO/ipdir/ipprmt014.4gl +++ b/PROYECTO/ipdir/ipprmt014.4gl @@ -76,7 +76,8 @@ FUNCTION ippcad012() END FUNCTION FUNCTION ippcmf012() - DEFINE encontrados INTEGER + DEFINE encontrados INTEGER + DEFINE respuestaAviso STRING ## Aqui se prepara para la captura del criterio de seleccion #WHENEVER ERROR CONTINUE CONSTRUCT BY NAME criterio ON iptb00030.* @@ -173,24 +174,39 @@ FUNCTION ippcmf012() END INPUT COMMAND KEY ("L") "eLiminar" - LET encontrados = 0 - SELECT count(*) INTO encontrados - FROM iptb00002 - WHERE cod_sec = iptb30.cod_sec AND status_t IS NULL + IF iptb30.status_t = "E" THEN + CALL fgl_winquestion( + "Aviso", + "Este registro ya fue eliminado anteriormente.", + "OK", + "OK", + "INFORMATION", + 0) + RETURNING respuestaAviso + ELSE + LET encontrados = 0 + SELECT count(*) INTO encontrados + FROM iptb00002 + WHERE cod_sec = iptb30.cod_sec AND status_t IS NULL - IF encontrados = 0 THEN - UPDATE iptb00030 SET status_t = "E", - us_mod = SUSER_SNAME(), - fech_mod = GETDATE() - WHERE cod_sec = iptb30.cod_sec + IF encontrados = 0 THEN + UPDATE iptb00030 SET status_t = "E", + us_mod = SUSER_SNAME(), + fech_mod = GETDATE() + WHERE cod_sec = iptb30.cod_sec - - LET numero_msg = 39 - CALL msg(numero_msg) - ELSE - LET numero_msg = 383 - CALL msg(numero_msg) - END IF + LET iptb30.status_t = "E" + LET iptb30.us_mod = usuarios + LET iptb30.fech_mod = CURRENT + DISPLAY BY NAME iptb30.* + + LET numero_msg = 39 + CALL msg(numero_msg) + ELSE + LET numero_msg = 383 + CALL msg(numero_msg) + END IF + END IF COMMAND "Retornar" "Retorna al menu anterior" diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 1bf94a0..052441b 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -512,6 +512,7 @@ + From 866778edfef855c2a148896af7905a41ab0a3307 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 11 Sep 2026 13:23:21 -0400 Subject: [PATCH 06/11] Avanzar en registro y correccion de ipprmt017 (Precio por Cliente) - Registrar ipfmmt017.4fd e ipfmwd008.per (faltaban) - Corregir esquema viejo "marmotech" -> "smarmotech" en ipfmwd008.per - Copiar vefmwd002.4fd a ipdir (renombrado vefmwd002_ip.4fd) para evitar depender de la libreria FORMULARIOS_PR (de Compras), que tiene errores propios sin relacion (prfmmt006.4fd con columna inexistente, prfmwd014.per con problema estructural) que bloqueaban la compilacion - Corregir 3 columnas de la lista de precios sin titulo (idrow, unidadmed, moneda): idrow se oculta (es un campo interno), unidadmed y moneda reciben titulo visible Pendiente: falta recompilar y probar el flujo completo (alta, consulta, eliminacion) de ipprmt017. Co-Authored-By: Claude Sonnet 5 --- PROYECTO/ipdir/ipfmmt017.4fd | 6 +++--- PROYECTO/ipdir/ipfmwd008.per | 2 +- PROYECTO/ipdir/ipprmt017.4gl | 2 +- PROYECTO/ipdir/vefmwd002_ip.4fd | 32 ++++++++++++++++++++++++++++++++ PROYECTO/mbsERP.4pw | 3 +++ 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 PROYECTO/ipdir/vefmwd002_ip.4fd diff --git a/PROYECTO/ipdir/ipfmmt017.4fd b/PROYECTO/ipdir/ipfmmt017.4fd index ccfc424..f20b592 100644 --- a/PROYECTO/ipdir/ipfmmt017.4fd +++ b/PROYECTO/ipdir/ipfmmt017.4fd @@ -45,7 +45,7 @@ - +
+ + + + + + +
+ + + + + + \ No newline at end of file diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 052441b..75baef8 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -513,6 +513,9 @@ + + +
From bb9d9a05a16ed66c50c5ba9de95b5063b6707d27 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Fri, 11 Sep 2026 17:00:17 -0400 Subject: [PATCH 07/11] Corregir ipprmt017: columnas sin titulo, toolbar incompleto y checkbox Elimina - Agregar titulo a columnas Unidad y Moneda, ocultar campo interno idrow - Agregar a ToolBar1 los botones Busca Informacion, Limpia Screen, Conversion Moneda y Cancela operacion (estaban definidos como ActionDefault pero nunca agregados a la barra, por eso no se veian) - Capturar el idrow generado al insertar un precio nuevo (antes quedaba NULL en memoria, rompiendo el eliminar de esa misma fila en la misma sesion) - Corregir el checkbox "Elimina": el clic con mouse marcaba la casilla visualmente pero no actualizaba el valor real hasta perder el foco con Tab (bug de renderizado de GST). Se cambio el trigger de AFTER FIELD a ON CHANGE, que si sincroniza el valor de inmediato con clic de mouse Pendiente: falta la prueba final completa del flujo eliminar en ipprmt017 (se hizo hasta confirmar que ON CHANGE captura el valor correctamente, falta probar el guardado + verificacion en BD) Co-Authored-By: Claude Sonnet 5 --- PROYECTO/ipdir/ipfmmt017.4fd | 4 ++++ PROYECTO/ipdir/ipprmt017.4gl | 13 +++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/PROYECTO/ipdir/ipfmmt017.4fd b/PROYECTO/ipdir/ipfmmt017.4fd index f20b592..03289a8 100644 --- a/PROYECTO/ipdir/ipfmmt017.4fd +++ b/PROYECTO/ipdir/ipfmmt017.4fd @@ -36,6 +36,10 @@ + + + + diff --git a/PROYECTO/ipdir/ipprmt017.4gl b/PROYECTO/ipdir/ipprmt017.4gl index 01ff7f3..4e1cf85 100644 --- a/PROYECTO/ipdir/ipprmt017.4gl +++ b/PROYECTO/ipdir/ipprmt017.4gl @@ -87,7 +87,7 @@ FUNCTION ippcad017() # WHENEVER ERROR CONTINUE DEFINE noreg INT - + DIALOG ATTRIBUTES (UNBUFFERED, FIELD ORDER FORM) CONSTRUCT criterio ON iptb00002.cod_n,iptb00002.cod_grupo,iptb00002.cod_tipo,iptb00002.cod_sec, iptb00002.descrip_esp,vetb00025.cod_lista,vetb00025.ventas @@ -206,6 +206,9 @@ FUNCTION ippcad017() LET listproduct[curr1].codlista = 1 DISPLAY listproduct[curr1].codlista TO lproducto2[scr_l].codlista END IF + ON CHANGE elimina + LET curr1 = arr_curr() + LET listproduct[curr1].elimina = listproduct[curr1].elimina AFTER FIELD seccliente LET curr1 = arr_curr() LET scr_l = scr_line() @@ -353,7 +356,11 @@ FUNCTION ippcad017() listproduct[idx].codtipo,listproduct[idx].codsec,listproduct[idx].tipocliente, listproduct[idx].seccliente,listproduct[idx].pprecio,usuarios,GETDATE(), listproduct[idx].codlista) - + + LET selec = "SELECT @@IDENTITY" + PREPARE getIdrow FROM selec + EXECUTE getIdrow INTO listproduct[idx].idrow + IF STATUS < 0 THEN ROLLBACK WORK CALL fgl_winmessage("Error","NO PUDE ACTUALIZAR INFORMACION","STOP") @@ -386,8 +393,6 @@ FUNCTION ippcad017() cod_sec = listproduct[idx].codsec END IF END IF - # CALL fgl_winmessage("o",listproduct[idx].elimina,"info") - DISPLAY "emilina ",listproduct[idx].elimina IF listproduct[idx].elimina = "S" THEN # CALL fgl_winmessage("o",listproduct[idx].idrow,"info") INSERT INTO vetb00091 (cod_lista,cod_n,cod_Grupo,cod_tipo, From d4eb103454319fc12ae9ea9c508b7622045651b0 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Mon, 14 Sep 2026 15:03:03 -0400 Subject: [PATCH 08/11] Registrar y corregir ipprcs002 (Consulta Maestra de Productos) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Registrar formulario ipfmcs002.per (faltaba) - Extraer la funcion pantalla() de ipmn00000.4gl (programa de menu con su propio MAIN) a un archivo compartido nuevo (otrodir/pantalla_ip.4gl) para poder reutilizarla sin conflicto de MAIN duplicado - Bug corregido: el programa nunca tenia CONNECT TO, dependia de heredar una conexion de otro programa que nunca lo invoca en este contexto de prueba - se agrego ARG_VAL + CONNECT TO "smarmotech" como en el resto de los programas - Bug corregido: el arreglo global "prod" (usado solo por este programa) era de tamaƱo fijo ARRAY[200], causaba error -1326 con mas de 200 resultados - convertido a DYNAMIC ARRAY, y se agrego prod.clear() antes de repoblarlo - Agregado titulo a la ventana (usaba "screen size" clasico sin TITLE) Pendiente de decision de Johnny: la pantalla no exige ningun filtro de busqueda y hace una consulta SQL adicional por cada producto encontrado (calculo de existencia) - sin filtro intenta traer todo el catalogo y tarda mas de una hora antes de fallar. Se probo exitosamente usando siempre un codigo de producto completo (clase-grupo-tipo-secuencia). Co-Authored-By: Claude Sonnet 5 --- PROYECTO/ipdir/ipfmcs002.per | 2 +- PROYECTO/ipdir/ipprcs002.4gl | 7 ++++++- PROYECTO/ipdir/ipprgb000.4gl | 2 +- PROYECTO/mbsERP.4pw | 2 ++ PROYECTO/otrodir/pantalla_ip.4gl | 18 ++++++++++++++++++ 5 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 PROYECTO/otrodir/pantalla_ip.4gl diff --git a/PROYECTO/ipdir/ipfmcs002.per b/PROYECTO/ipdir/ipfmcs002.per index 7c65b3e..753bde9 100644 --- a/PROYECTO/ipdir/ipfmcs002.per +++ b/PROYECTO/ipdir/ipfmcs002.per @@ -1,5 +1,5 @@ database smarmotech -screen size 24 by 80 +screen size 24 by 80 title "Consulta Maestra de Productos" { Producto Terminado [a ]-[b ]-[c ]-[d ] [a1 ] diff --git a/PROYECTO/ipdir/ipprcs002.4gl b/PROYECTO/ipdir/ipprcs002.4gl index e00e828..ee0257f 100644 --- a/PROYECTO/ipdir/ipprcs002.4gl +++ b/PROYECTO/ipdir/ipprcs002.4gl @@ -9,8 +9,12 @@ DIRECTOR PROYECTO : JOSE ALFREDO PAULINO ALEJO } GLOBALS "ipprgb000.4gl" -MAIN +MAIN DEFER INTERRUPT + CALL ARG_VAL(1) RETURNING usuarios + CALL ARG_VAL(2) RETURNING clave + + CONNECT TO "smarmotech" USER usuarios USING clave SELECT * INTO p_companias.* FROM companias CALL ipprcs002() END MAIN @@ -55,6 +59,7 @@ LET SELEC = ## Busca los registros con la condicion dada y verifica si el producto terminado ## existe en el catalogo de bienes y servicios. + CALL prod.clear() LET idx = 1 FOREACH accion INTO prod[idx].*,descrip1 IF int_flag THEN diff --git a/PROYECTO/ipdir/ipprgb000.4gl b/PROYECTO/ipdir/ipprgb000.4gl index 34a8d37..450a857 100644 --- a/PROYECTO/ipdir/ipprgb000.4gl +++ b/PROYECTO/ipdir/ipprgb000.4gl @@ -328,7 +328,7 @@ DEFINE prod11 DYNAMIC ARRAY OF RECORD fecha_ordenada DATE END RECORD -DEFINE prod ARRAY[200] OF RECORD +DEFINE prod DYNAMIC ARRAY OF RECORD cod_n1 SMALLINT, cod_grupo1 SMALLINT, cod_tipo1 SMALLINT, diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 75baef8..63a1a2c 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -516,6 +516,7 @@ + @@ -530,6 +531,7 @@ + diff --git a/PROYECTO/otrodir/pantalla_ip.4gl b/PROYECTO/otrodir/pantalla_ip.4gl new file mode 100644 index 0000000..d749e14 --- /dev/null +++ b/PROYECTO/otrodir/pantalla_ip.4gl @@ -0,0 +1,18 @@ +GLOBALS "../ipdir/ipprgb000.4gl" + +FUNCTION pantalla() + DEFINE fecha CHAR(8), + hora char(5), + l SMALLINT + SELECT UNIQUE a.* INTO p_companias.* FROM companias a + LET fecha = today USING "dd/mm/yy" + LET hora = time + LET l = (80 - LENGTH(p_companias.nombre CLIPPED))/2 + DISPLAY p_companias.nombre CLIPPED AT 4,l ATTRIBUTE (REVERSE,BLUE) + DISPLAY fecha AT 4,70 ATTRIBUTE (BLUE) + DISPLAY "Sistema Inventario de Productos" AT 5,25 + DISPLAY hora AT 6,73 ATTRIBUTE(BLUE) + + CALL fgl_drawbox(5,79,3,1) + CALL fgl_drawbox(1,79,22,1) +END FUNCTION From 3d293561d21a6ea5a44f73630bea24cff7967d1b Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Mon, 14 Sep 2026 16:15:26 -0400 Subject: [PATCH 09/11] Registrar formulario ipfmcs006.4fd para ipprcs006 (Consulta Balances) Probado: filtros de busqueda (producto, bodega, rango de fechas) con opcion "Actual" - resultados correctos comparados contra la BD. Opcion "Historico" (consulta base separada historicomtech) confirmada como bug preexistente: falla con "Invalid column name num_oc" tanto en el ambiente de pruebas (se restauro un backup fresco de produccion del 40.8 para poder probar) como en produccion Genero 3.20 - la tabla historicomtech.dbo.iptb00006 nunca tuvo la columna num_oc que si tiene la tabla en vivo. No es un bug de la migracion, no se toca. Co-Authored-By: Claude Sonnet 5 --- PROYECTO/mbsERP.4pw | 1 + 1 file changed, 1 insertion(+) diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 63a1a2c..2281d05 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -517,6 +517,7 @@ + From 61195adc7510b0a67daf8cec22911f5e6a4af703 Mon Sep 17 00:00:00 2001 From: Jhonny Soto Date: Tue, 15 Sep 2026 12:14:15 -0400 Subject: [PATCH 10/11] JSOTO Arreglo programa ipprmt005, quitando la conexion IFMX --- PROYECTO/ipdir/RUBIOBONDY.txt | 24 ----- PROYECTO/ipdir/ipfmmt005.per | 2 +- PROYECTO/ipdir/ipprgb000.4gl | 2 +- PROYECTO/ipdir/ipprmt005.4gl | 33 +++---- PROYECTO/ipdir/ipprmt005_trg_exterior.sql | 105 ++++++++++++++++++++++ PROYECTO/ipdir/rubio220513.txt | 33 ------- PROYECTO/mbsERP.4pw | 3 +- 7 files changed, 119 insertions(+), 83 deletions(-) delete mode 100644 PROYECTO/ipdir/RUBIOBONDY.txt create mode 100644 PROYECTO/ipdir/ipprmt005_trg_exterior.sql delete mode 100644 PROYECTO/ipdir/rubio220513.txt diff --git a/PROYECTO/ipdir/RUBIOBONDY.txt b/PROYECTO/ipdir/RUBIOBONDY.txt deleted file mode 100644 index 2998725..0000000 --- a/PROYECTO/ipdir/RUBIOBONDY.txt +++ /dev/null @@ -1,24 +0,0 @@ -WANDY TIENE 2 SALIDAS 1 CARRERAS -JOSE HERNANDEZ 13 ENTRADA DE 14 PONCHES -STRABURG 2-0 FRENTE A SFO -CAIN HA GANADO LOS - -LE VA MA FRENTE ATLANTA. -LE VA BIEN A MINESOTA. -PHIL HUGES 13 CARRERAS -KLUBER - -TAMPA 8-1 CON - -STL - ATL 77 - PIRATAS 77 -CINCINATA 77 - LAA - PHILS -KC -LAD -DET - SFO -COLORADO - diff --git a/PROYECTO/ipdir/ipfmmt005.per b/PROYECTO/ipdir/ipfmmt005.per index 3d9a9a1..c35fc76 100644 --- a/PROYECTO/ipdir/ipfmmt005.per +++ b/PROYECTO/ipdir/ipfmmt005.per @@ -1,4 +1,4 @@ -database marmotech +database smarmotech screen size 24 by 80 { Codigo del movimiento [f0] Material[f002 ] diff --git a/PROYECTO/ipdir/ipprgb000.4gl b/PROYECTO/ipdir/ipprgb000.4gl index 34a8d37..418405e 100644 --- a/PROYECTO/ipdir/ipprgb000.4gl +++ b/PROYECTO/ipdir/ipprgb000.4gl @@ -248,7 +248,7 @@ END RECORD DEFINE balance DECIMAL(12,5) DEFINE cod_mov_ant LIKE iptb00006.cod_mov DEFINE existe_comp,suplidor1,doc_existe,actual,mat_prima CHAR (1000) - DEFINE opt1,opt4,opt,existe,ya ,opera1,cambio CHAR(3) + DEFINE opt1,opt4,opt,ya ,opera1,cambio CHAR(3) DEFINE medida CHAR (3) DEFINE fila smallint DEFINE m_articulos RECORD LIKE iptb00002.* diff --git a/PROYECTO/ipdir/ipprmt005.4gl b/PROYECTO/ipdir/ipprmt005.4gl index 0c987ef..7a7d25f 100644 --- a/PROYECTO/ipdir/ipprmt005.4gl +++ b/PROYECTO/ipdir/ipprmt005.4gl @@ -16,8 +16,10 @@ MAIN CALL ARG_VAL(2) RETURNING clave CONNECT to "smarmotech" AS "MSSQL" USER usuarios USING clave - CONNECT TO "marmotech" AS "IFMX" USER usuarios USING clave - + -- Migracion Genero 6.0: se elimina la conexion IFMX (EXTERIOR). + -- La replicacion de iptb00020 a exterior.dbo.iptb00020 ahora la hace + -- un trigger en marmotech.dbo.iptb00020 (ver ipprmt005_trg_exterior.sql). + CALL ipprmt005() END MAIN @@ -81,11 +83,8 @@ FUNCTION ippcad012() VALUES (p_iptb20.cod_n,p_iptb20.producto,usuarios,getdate(),p_iptb20.comentario,p_iptb20.genera_orden,p_iptb20.instalacion) INSERT INTO iptb00035 (cod_n,cod_cat) VALUES (p_iptb20.cod_n,p_iptb20.cod_cat) - COMMIT WORK - SET CONNECTION "IFMX" - INSERT INTO iptb00020 (cod_n,producto,us_crea,fech_crea,instalacion) VALUES - (p_iptb20.cod_n,p_iptb20.producto,usuarios,getdate(),p_iptb20.instalacion) - + COMMIT WORK + -- La replica a EXTERIOR la realiza el trigger en iptb00020. LET numero_msg = 1 CALL msg(numero_msg) END FUNCTION @@ -230,16 +229,9 @@ SET CONNECTION "MSSQL" WHERE cod_n = p_iptb20.cod_n DELETE FROM iptb00035 WHERE cod_n = p_iptb20.cod_n INSERT INTO iptb00035 (cod_cat,cod_n) VALUES (p_iptb20.cod_cat,p_iptb20.cod_n) - COMMIT WORK - SET CONNECTION "IFMX" - UPDATE iptb00020 SET producto = p_iptb20.producto, - us_mod = usuarios, - fech_mod = getdate(), - instalacion = p_iptb20.instalacion - WHERE cod_n = p_iptb20.cod_n - - SET CONNECTION "MSSQL" - LET numero_msg = 13 + COMMIT WORK + -- La replica a EXTERIOR la realiza el trigger en iptb00020. + LET numero_msg = 13 CALL msg(numero_msg) EXIT INPUT @@ -257,12 +249,7 @@ END INPUT fech_mod = GETDATE() WHERE cod_n = p_iptb20.cod_n - SET CONNECTION "IFMX" - UPDATE iptb00020 SET status_t = "E", - us_mod = usuarios - - WHERE cod_n = p_iptb20.cod_n - + -- La replica del "borrado logico" a EXTERIOR la realiza el trigger. LET numero_msg = 39 CALL msg(numero_msg) ELSE diff --git a/PROYECTO/ipdir/ipprmt005_trg_exterior.sql b/PROYECTO/ipdir/ipprmt005_trg_exterior.sql new file mode 100644 index 0000000..bd26cd2 --- /dev/null +++ b/PROYECTO/ipdir/ipprmt005_trg_exterior.sql @@ -0,0 +1,105 @@ +/* ===================================================================== + TRIGGER DE REPLICACION iptb00020 (Grupos / Clases) + marmotech.dbo.iptb00020 ---> exterior.dbo.iptb00020 + + Motivo: + Migracion a Genero 6.0. El programa ipprmt005 abria una segunda + conexion "IFMX" (= base EXTERIOR en la misma instancia SQL Server) + para replicar manualmente cada INSERT/UPDATE de iptb00020. + Con Genero 6.0 + ODBC Driver 18 ese segundo CONNECT falla con + el error -6366 ("Changed database context to 'marmotech'"). + + Se elimino del fuente ipprmt005.4gl toda la logica "SET CONNECTION IFMX" + y esa replicacion la asume ahora este trigger, del lado del servidor. + + Cobertura: + - ipprmt005.4gl es el UNICO programa del ERP que escribe iptb00020 + (los demas solo la consultan), asi que el trigger reemplaza por + completo la replicacion sin riesgo de escrituras duplicadas. + + Comportamiento (identico al del programa original): + - INSERT -> crea la fila en EXTERIOR. + - UPDATE -> sincroniza la fila en EXTERIOR (cubre tanto "Modificar" + como el "borrado logico" status_t='E'). + - Cross-database directo (misma instancia, sin linked server). + - NO se maneja DELETE fisico: el ERP nunca borra fisicamente esta + tabla, solo marca status_t = 'E'. + + Ambiente: probar primero en DESARROLLO (.40.9) antes de PRODUCCION (.40.8). + ===================================================================== */ + +/* --------------------------------------------------------------------- + PASO 0 (VERIFICACION - correr ANTES de crear el trigger) + Confirmar las columnas reales de EXTERIOR.dbo.iptb00020. + El esquema local (.sch) de ipdir esta viejo y NO lista 'instalacion', + pero el programa 3.20 si la escribia, por lo que deberia existir. + Si en el resultado NO aparece 'instalacion', elimine del trigger las + dos referencias a e.instalacion / i.instalacion antes de crearlo. + --------------------------------------------------------------------- */ +-- SELECT c.name AS columna, t.name AS tipo, c.max_length, c.is_nullable +-- FROM exterior.sys.columns c +-- JOIN exterior.sys.types t ON t.user_type_id = c.user_type_id +-- WHERE c.object_id = OBJECT_ID('exterior.dbo.iptb00020') +-- ORDER BY c.column_id; +GO + +USE marmotech; +GO + +IF OBJECT_ID('dbo.trg_iptb00020_repl_exterior', 'TR') IS NOT NULL + DROP TRIGGER dbo.trg_iptb00020_repl_exterior; +GO + +CREATE TRIGGER dbo.trg_iptb00020_repl_exterior +ON dbo.iptb00020 +AFTER INSERT, UPDATE +AS +BEGIN + SET NOCOUNT ON; + + IF NOT EXISTS (SELECT 1 FROM inserted) + RETURN; + + /* 1) Actualizar en EXTERIOR las filas que ya existen (por cod_n). */ + UPDATE e + SET e.producto = i.producto, + e.status_t = i.status_t, + e.us_crea = i.us_crea, + e.fech_crea = i.fech_crea, + e.us_mod = i.us_mod, + e.fech_mod = i.fech_mod, + e.instalacion = i.instalacion + FROM exterior.dbo.iptb00020 e + INNER JOIN inserted i ON e.cod_n = i.cod_n; + + /* 2) Insertar en EXTERIOR las filas que aun no existen. */ + INSERT INTO exterior.dbo.iptb00020 + (cod_n, producto, status_t, us_crea, fech_crea, us_mod, fech_mod, instalacion) + SELECT i.cod_n, i.producto, i.status_t, i.us_crea, i.fech_crea, i.us_mod, i.fech_mod, i.instalacion + FROM inserted i + WHERE NOT EXISTS (SELECT 1 + FROM exterior.dbo.iptb00020 e + WHERE e.cod_n = i.cod_n); +END; +GO + +/* --------------------------------------------------------------------- + ROLLBACK (si hiciera falta revertir): + USE marmotech; + DROP TRIGGER dbo.trg_iptb00020_repl_exterior; + + PRUEBA rapida (en DESARROLLO): + -- alta + INSERT INTO marmotech.dbo.iptb00020 (cod_n,producto,us_crea,fech_crea,instalacion) + VALUES (999999,'PRUEBA TRG', SUSER_SNAME(), GETDATE(), 1); + SELECT * FROM exterior.dbo.iptb00020 WHERE cod_n = 999999; -- debe aparecer + -- modificacion + UPDATE marmotech.dbo.iptb00020 SET producto='PRUEBA TRG MOD' WHERE cod_n=999999; + SELECT producto FROM exterior.dbo.iptb00020 WHERE cod_n = 999999; -- debe reflejar + -- borrado logico + UPDATE marmotech.dbo.iptb00020 SET status_t='E' WHERE cod_n=999999; + SELECT status_t FROM exterior.dbo.iptb00020 WHERE cod_n = 999999; -- debe ser 'E' + -- limpieza + DELETE FROM marmotech.dbo.iptb00020 WHERE cod_n=999999; + DELETE FROM exterior.dbo.iptb00020 WHERE cod_n=999999; + --------------------------------------------------------------------- */ diff --git a/PROYECTO/ipdir/rubio220513.txt b/PROYECTO/ipdir/rubio220513.txt deleted file mode 100644 index 7eba626..0000000 --- a/PROYECTO/ipdir/rubio220513.txt +++ /dev/null @@ -1,33 +0,0 @@ -RUBIO BLOND - -okland 5 victorias -tampa bien los miercoles en toronto 7 de ultimos 8 -Mine le va mal en interligas -atl le ha ganado 5 como favoritos -cinci le va bien en la ruta. Va Harvey. - -LAD frente a derechos han perdido 10 de los untimos 14 -Ariz ha perdido los ultimos juegos en la runta con los zurdos. - -Sfo 10 - -LAAD 75 -PHILIS 74 -STL 73 -PIT 72 -KC 71 -BOS 65 -NYY 62 -DET 61 - - -MNE -SEATLE -WASH - -WILLY PEREALTA 2 LOSS -HARVEY LANZANDO EN SU PATIO ES PELIGROSO -DE LA ROSA TIENE 7-4 FRENTE ARIZ -SMARTIZA 4-0 FRENTE A LOS PIT - - diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 75baef8..989a0e3 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -506,6 +506,7 @@ + @@ -564,7 +565,7 @@ - + From 5667c1e508f5c7b4fb17ba77b7a47a4b6b118036 Mon Sep 17 00:00:00 2001 From: Jeilyn Peguero Date: Tue, 15 Sep 2026 12:17:35 -0400 Subject: [PATCH 11/11] Registrar formularios y libreria nueva para ipprcs004 - Registrar ipfmcs004.4fd, coloca_ubicacion.4fd, ipfmcs004b.per e ipfmcs004_1.4fd (faltaban) - Crear libreria UBICACIONDH_IP para ubicacionDH.4gl (funcion InsertaUbicacionDH), separada de FUNCIONES_IP porque su otra funcion buscardata() choca con la ya existente en ipprmt020.4gl - Agregar dependencia de FUNCIONESREPORT a ipprcs004 (para seleccionarSalida, ya registrada ahi para ipprmt044) Co-Authored-By: Claude Sonnet 5 --- PROYECTO/mbsERP.4pw | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/PROYECTO/mbsERP.4pw b/PROYECTO/mbsERP.4pw index 2281d05..31c066c 100644 --- a/PROYECTO/mbsERP.4pw +++ b/PROYECTO/mbsERP.4pw @@ -518,6 +518,13 @@ + + + + + + + @@ -594,7 +601,7 @@ - +