JSOTO Arreglo programa ipprmt005, quitando la conexion IFMX

This commit is contained in:
2026-09-15 12:14:15 -04:00
parent bb9d9a05a1
commit 61195adc75
7 changed files with 119 additions and 83 deletions
+105
View File
@@ -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;
--------------------------------------------------------------------- */