JSOTO Arreglo programa ipprmt005, quitando la conexion IFMX
This commit is contained in:
@@ -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;
|
||||
--------------------------------------------------------------------- */
|
||||
Reference in New Issue
Block a user