Actualizacion dinamica Procedimiento Almacenado
Publicado por Paulo (4 intervenciones) el 20/05/2014 16:37:52
Amigos,
Les cuento mi problema: Estoy haciendo un procedimiento el cual tiene que, entre otras cosas, actualizar un campo de la tabla dependiendo de una condicion. Eso funciona bien, pero mi problema es que no tengo idea como actualizar sólo el registro actual. Quiero decir al corroborar si la condición se cumple, el UPDATE me actualiza todas las filas, obviamente sé que en mi código falta la claúsula WHERE pero lo que no sé es como hacer que ese WHERE vaya cambiando a medida que el IF revisa las condicones. Les dejo el código para que le echen un vistazo:
Ojalá puedan orientarme.
Saludos desde Chile
Les cuento mi problema: Estoy haciendo un procedimiento el cual tiene que, entre otras cosas, actualizar un campo de la tabla dependiendo de una condicion. Eso funciona bien, pero mi problema es que no tengo idea como actualizar sólo el registro actual. Quiero decir al corroborar si la condición se cumple, el UPDATE me actualiza todas las filas, obviamente sé que en mi código falta la claúsula WHERE pero lo que no sé es como hacer que ese WHERE vaya cambiando a medida que el IF revisa las condicones. Les dejo el código para que le echen un vistazo:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
ALTER PROCEDURE sp_automatizacion AS
BEGIN
--Borramos la tabla
DELETE FROM DESC_REP_CERR_COPIA;
--Insertamos todos los registros de la tabla DESCARGA_REPARACIONES_CERRADAS en la tabla DESC_REP_CERR_COPIA
INSERT INTO [dbo].[DESC_REP_CERR_COPIA] ([PS], [FECHA_RECEPCION], [FECHA_CIERRE_TECNICO], [AREA_DDD], [TELEFONO], [ULTIMO_TECNICO], [CLCLA_MOD], [CLCAUS_MOD], [SEGMENTO], [FECHA_PLAZO], [FECHA_CITA_DESDE], [FECHA_CITA_HASTA], [REPETIDO], [REPEINS], [FECHA_DESPACHO_TAC], [COD_AGENCIA], [EDIFICIO], [TIPO_RECLAMO], [SUBTIPO_RECLAMO], [CLAVE_RECEPCION], [USUARIO_RECEPCION], [USUARIO_CIERRE], [RECEPCION_ANTERIOR], [CANCELACION_ANTERIOR], [CAUSA_ANTERIOR], [TECNICO_ANTERIOR], [COD_SEGMENTO], [EMPRESA_ACTUAL], [EMPREA_ANTERIOR], [PS_ANTERIOR], [CLASIFICACION], [SISTEMA], [TAC_INS], [REPEMP], [ID_COD], [AGENCIA], [PETICION], [CABLE], [PAR], [DIRECCION], [AMM], [AMA], [CLAVE_ORIGINAL], [FECHA_ENTRADA_SISTEMA], [USUARIO_DESCARGA], [NOTAS], [NUM_FACT], [FECHA_CIERRE_MAT], [USUARIO_CIERRE_MAT], [VALIDADO], [ENTREGADO], [REPUESTO], [asignador], [NUM_GUIA_DEVOLUCION])SELECT * FROM [dbo].[DESCARGA_REPARACIONES_CERRADAS];
--Actualizamos los campos de Fecha para seccionar la misma
UPDATE DESC_REP_CERR_COPIA SET DIA = CONVERT(INT,DAY(FECHA_CIERRE_TECNICO)),
MES = CONVERT(INT,MONTH(FECHA_CIERRE_TECNICO)), ANIO = CONVERT(INT,YEAR(FECHA_CIERRE_TECNICO)),
ATRASO = CONVERT(INT,GETDATE()-FECHA_CIERRE_TECNICO); --GetDate() trae la fecha actual, ATRASO es para ver los días fuera de plazo de los técnicos
--Declaramos una variable y le asignamos un valor de la tabla
DECLARE @NUM_FACT VARCHAR(25)
DECLARE @MATER VARCHAR(3)
DECLARE @ID VARCHAR(15)
SELECT @NUM_FACT = NUM_FACT FROM DESC_REP_CERR_COPIA;
SELECT @MATER = (SELECT COUNT(*) AS MATERUALES FROM PROPUESTA_CIERRE_REPARACIONES prop, DESCARGA_REPARACIONES_CERRADAS desca WHERE prop.CLAVE = desca.CLCLA_MOD);
SELECT @ID = ID_COD FROM DESC_REP_CERR_COPIA;
DECLARE c_actualizacion CURSOR FOR
SELECT NUM_FACT, ID_COD FROM DESC_REP_CERR_COPIA
WHERE ID_COD <> 0 OR ID_COD <> NULL OR ID_COD <> ''
AND
NUM_FACT <> 0 OR NUM_FACT <> NULL OR ID_COD <> '';
OPEN c_actualizacion;
FETCH NEXT FROM c_actualizacion INTO @NUM_FACT, @ID;
WHILE(@@FETCH_STATUS = 0)
BEGIN
--Validamos si el campo NUM_FACT es nulo o no.
IF((@NUM_FACT <> '') OR (@NUM_FACT <> NULL))
BEGIN
UPDATE DESC_REP_CERR_COPIA SET DEPENDENCIA_NUM_FACT = 1 WHERE ID_COD = @ID;
--UPDATE DESC_REP_CERR_COPIA SET DEPENDENCIA_NUM_FACT = 1;
FETCH NEXT FROM c_actualizacion INTO @NUM_FACT, @ID;
END
ELSE
BEGIN
UPDATE DESC_REP_CERR_COPIA SET DEPENDENCIA_NUM_FACT = 0 WHERE ID_COD = @ID;
--UPDATE DESC_REP_CERR_COPIA SET DEPENDENCIA_NUM_FACT = 0;
FETCH NEXT FROM c_actualizacion INTO @NUM_FACT, @ID;
END
IF(@MATER <> 0)
BEGIN
UPDATE DESC_REP_CERR_COPIA SET LLEVA_MATER = 'SI';
END
ELSE
BEGIN
UPDATE DESC_REP_CERR_COPIA SET LLEVA_MATER = 'NO';
END
END
CLOSE c_actualizacion
DEALLOCATE c_actualizacion
END
Ojalá puedan orientarme.
Saludos desde Chile
Valora esta pregunta
0