
URGENTE!! AFTER UPDATE Trigger. Mover de posicion la fila.
Publicado por Marco (2 intervenciones) el 14/05/2015 22:59:38
Tengo una tabla asi:

Esta tabla se llama Test.
CodigoCompania es de tipo varchar(3) y NO es autonumerico.
IDCompania es varchar (3) y NO es autonumerico.
Se insertaron manualmente los valores de CodigoCompania y el IDCompania es mostrado automaticamente por la relación de IDCompania con la otra tabla "TestCompanias"
Esta es la tabla TestCompanias.

Se pretende automatizar la modificacion del CodigoCompania al actualizar la tabla TestCompanias.
Deseo mover el numero de fila de la columna CodigoCompania cuando al actualizar una fila de TestCompania pero a su ves deseo colocar en orden los CodigoCompania.
Hasta aqui todo bien porque se actualiza el Grupo nuevo al cual va pertenecer.
He aquí el problema...
Intente utilizar MERGE INTO pero no se utilizarlo bien. Solo me dejaba la columna que recien insertaba todo las demas filas las borraba...supongo que es por el DELETE al final.
Aquí les va un poco de variables que he utilizado.
Espero puedan entender el objetivo del asunto.
1. Es actualizar una fila cualquiera de TestCompanias.
Aquí actúa el Trigger After Update...
2. Actualiza el nuevo valor del grupo (01,02 o 03)
Aquí lo que debe suceder es que el CodigoCompania cambia de posicion hacia la ultima fila(MAX) del grupo nuevo.
3.Debe moverse CodigoCompania..1 posición hacia atrás de la actual. sería algo como:
1,2(esta es la fila actualizada),3,4,5
1,2,3,4(se movio a esta posicion ahora),5
Esta tabla se llama Test.
CodigoCompania es de tipo varchar(3) y NO es autonumerico.
IDCompania es varchar (3) y NO es autonumerico.
Se insertaron manualmente los valores de CodigoCompania y el IDCompania es mostrado automaticamente por la relación de IDCompania con la otra tabla "TestCompanias"
Esta es la tabla TestCompanias.
Se pretende automatizar la modificacion del CodigoCompania al actualizar la tabla TestCompanias.
Deseo mover el numero de fila de la columna CodigoCompania cuando al actualizar una fila de TestCompania pero a su ves deseo colocar en orden los CodigoCompania.
1
2
3
4
5
6
7
8
BEGIN TRAN
IF(@nuevogrupo <> @viejogrupo)
BEGIN
UPDATE Test
SET Grupo = @nuevogrupo
FROM Test t,inserted i
WHERE i.IDCompania = t.IDCompania
END
He aquí el problema...
1
2
3
4
5
6
7
8
9
10
IF((SELECT i.Grupo FROM inserted i,TestCompanias tc WHERE i.IDCompania = tc.IDCompania) = @grupo1)
BEGIN
UPDATE Test
SET CodigoCompania = CodigoCompania + 1
WHERE CodigoCompania > @total1
-----------
UPDATE Test
SET CodigoCompania = CodigoCompania - 1
END
COMMIT
Intente utilizar MERGE INTO pero no se utilizarlo bien. Solo me dejaba la columna que recien insertaba todo las demas filas las borraba...supongo que es por el DELETE al final.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
--BEGIN
-- MERGE INTO Test AS t --target
-- USING inserted AS i --source
-- ON t.IDCompania = i.IDCompania
-- WHEN MATCHED AND t.Grupo = @grupo1 or t.Grupo = @grupo2 or t.Grupo = @grupo3 THEN
-- UPDATE SET CodigoCompania = CodigoCompania + 1
-- WHEN NOT MATCHED BY TARGET AND i.Grupo = @nuevogrupo THEN
-- INSERT(CodigoCompania,IDCompania,NombreCompania,Grupo)
-- VALUES(@codigocomp,@idcompania,@nuevacompania,@nuevogrupo);
-- --WHEN NOT MATCHED BY SOURCE THEN
-- --DELETE;
--END
Aquí les va un poco de variables que he utilizado.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
ALTER TRIGGER TRG_UPDATE_COMPANIA ON TestCompanias
AFTER UPDATE
AS
BEGIN
DECLARE
@idcompania varchar(3),
@codigocomp varchar(3),
@nuevacompania varchar (35),
@viejacompania varchar(35),
@nuevadivision varchar(2),
@viejadivision varchar(2),
@nuevogrupo varchar(2),
@viejogrupo varchar(2),
@total1 varchar(3),
@total2 varchar(3),
@total3 varchar(3),
@grupo1 varchar(3),
@grupo2 varchar(3),
@grupo3 varchar(3)
--
SET @idcompania = (SELECT i.IDCompania FROM inserted i,TestCompanias tc WHERE i.IDCompania = tc.IDCompania)
SET @codigocomp = (SELECT t.CodigoCompania FROM inserted i,Test t WHERE i.IDCompania = t.IDCompania)
SET @nuevacompania = (SELECT i.NombreCompania FROM inserted i,TestCompanias tc WHERE i.IDCompania = tc.IDCompania)
SET @viejacompania = (SELECT d.NombreCompania FROM deleted d,TestCompanias tc WHERE d.IDCompania = tc.IDCompania)
SET @nuevadivision = (SELECT i.Division FROM inserted i,TestCompanias tc WHERE i.IDCompania = tc.IDCompania)
SET @viejadivision = (SELECT d.Division FROM deleted d,TestCompanias tc WHERE d.IDCompania = tc.IDCompania)
SET @nuevogrupo = (SELECT i.Grupo FROM inserted i,TestCompanias tc WHERE i.IDCompania = tc.IDCompania)
SET @viejogrupo = (SELECT d.Grupo FROM deleted d,TestCompanias tc WHERE d.IDCompania = tc.IDCompania)
SET @total1 = (SELECT MAX(CodigoCompania) FROM Test WHERE Division = '01' and Grupo = '01' and IDCompania < 50)
SET @total2 = (SELECT MAX(CodigoCompania) FROM Test WHERE Division = '02' and Grupo = '02' and IDCompania < 50)
SET @total3 = (SELECT MAX(CodigoCompania) FROM Test WHERE Division = '02' and Grupo = '03' and IDCompania < 50)
SET @grupo1 = (SELECT t.Grupo,t.Division FROM Test t,inserted i WHERE i.IDCompania = t.IDCompania and t.Grupo = '01' and t.IDCompania < 50)
SET @grupo2 = (SELECT t.Grupo,t.Division FROM Test t,inserted i WHERE i.IDCompania = t.IDCompania and t.Grupo = '02' and t.IDCompania < 50)
SET @grupo3 = (SELECT t.Grupo,t.Division FROM Test t,inserted i WHERE i.IDCompania = t.IDCompania and t.Grupo = '03' and t.IDCompania < 50)
Espero puedan entender el objetivo del asunto.
1. Es actualizar una fila cualquiera de TestCompanias.
Aquí actúa el Trigger After Update...
2. Actualiza el nuevo valor del grupo (01,02 o 03)
Aquí lo que debe suceder es que el CodigoCompania cambia de posicion hacia la ultima fila(MAX) del grupo nuevo.
3.Debe moverse CodigoCompania..1 posición hacia atrás de la actual. sería algo como:
1,2(esta es la fila actualizada),3,4,5
1,2,3,4(se movio a esta posicion ahora),5
Valora esta pregunta


0