SQL Server - URGENTE!! AFTER UPDATE Trigger. Mover de posicion la fila.

   
Vista:
Imágen de perfil de Marco

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:
Tabla

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.
Tabla2

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
Hasta aqui todo bien porque se actualiza el Grupo nuevo al cual va pertenecer.
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

URGENTE!! AFTER UPDATE Trigger. Mover de posicion la fila.

Publicado por Isaias (3181 intervenciones) el 15/05/2015 00:51:29
Regla de los foros, no se atiende NADA URGENTE !!!

No es que no ENTIENDA tu argumento, tal vez no esta bien escrito, no se COMPRENDE

¿Sabias que los TRIGGERS no fueron creados para codificar la lógica de un proceso?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Marco

URGENTE!! AFTER UPDATE Trigger. Mover de posicion la fila.

Publicado por Marco (2 intervenciones) el 15/05/2015 15:24:20
Ok. Disculpa. Bueno, es que está dificil de explicar este caso. Averiguaré la forma de hacer esto por mi cuenta. Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

URGENTE!! AFTER UPDATE Trigger. Mover de posicion la fila.

Publicado por Isaias (3181 intervenciones) el 15/05/2015 19:13:54
¿Nos lo podrías EXPLICAR con algo mas sencillo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar