SQL Server - No Guarda los datos originales en un UPDATE

 
Vista:

No Guarda los datos originales en un UPDATE

Publicado por Néstor (3 intervenciones) el 07/06/2017 18:08:39
Hola, no soy un experto en esto por eso recurro a ustedes a ver si con su experiencia detectan que está fallando. Les mando toda la información que tengo.

---------------------------------------------------------------------------------------------------------------------------------
-- SCRIPT PARA LA GESTION DE CIERRES DE TIENDAS
--
--Existen dos tablas:
-- C_CALENDSRCDEST con formato:
-- SOURCE, DESTINATION, YEAR, MONTH, D01, D02, D02,...,D31
-- Datos:
-- ALM01, TIENDA1, 2017, 07, 1, 1, 1, 0, 0,...,1
-- ALM01, TIENDA2, 2017, 07, 1, 0, 1, 1, 0,...,0
--
-- Contiene la información de qué días de cada mes el ALM01 entrega en la TIENDA1, TIENDA2, etc. Indicando con un 0 cada día que no se entrega y con un 1, cuando sí.
--
--La segunda
-- Z_CIERRES_TIENDA con formato:
-- TIENDA, CIERRE_INIT_Y, CIERRE_INIT_M, CIERRE_INIT_D, CIERRE_FIN_Y, CIERRE_FIN_M, CIERRE_FIN_D, FLAG_CIERRE
-- Datos ejemplo:
-- TIENDA1, 2017, 07,01, 2017,07, 15, 1
--
-- Contiene la información de cuándo una tienda permanece cerrada (vacaciones, etc.) En este ejemplo, la TIENDA1 estará cerrada del
-- 1/7/2017 al 15/7/2017.
--
-- El resultado que quiero obtener es que si se encuentra un registro en la tabla de Cierres (la 2ª), se modifique la primera entre las fechas de cierre cambiando por un cero
-- en la 1ª tabla aquellos días que permanece cerrada. Pero que en todos los otros casos, cuando no figura cerrada en la tabla de cierres, respete el valor que tiene por defecto
-- esa tienda en ese día.
--
-- Problema que se me presenta: cambia correctamente los días en que aparece cerrada la tienda en este caso la TIENDA1 entre el 1 y 15 de julio. Pero, no me respeta los valores originales
-- de la tabla en los casos en que no aparece en dicha tabla de Cierres. Para estos casos, se comporta extrañamente, coloca un 1 todos los días de la semana y un 0 los domingos.
-- * He creado una tabla temporal que guarda los valores iniciales, antes del UPDATE, para luego rescatarlos desde allí y no lo hace.
-- * He verificado la información en la tabla temporal luego de ejecutar el UPDATE y es la original.
-- * He probado el script cambiando los diferentes JOINS a INNER, LEFT OUTER Y RIGHT OUTER, todos con el mismo resultado.

-- Les mando el script completo a ver si alguien se le ocurre que puede estar fallando.
-- Muchas gracias
---------------------------------------------------------------------------------------------------------------------------------

-- 1. SE CREA UNA TABLA TEMPORAL CON LA INFORMACIÓN QUE SE TIENE EN LA TABLA DE CALENDARIOS SOURCE DESTINATION ACTUAL

SELECT * INTO ##TEMPCALENDSRCDEST
FROM C_CALENDSRCDEST

---------------------------------------------------------------------------------------------------------------------------------
-- 2. SE AJUSTA EL CALENDARIO C_CALENDSRCDEST DE ACUERDO CON LAS FECHAS DE CIERRE ESTABLECIDAS EN LA TABLA Z_CIERRE_TIENDAS
-- PARA ELLO SE COMPARA CADA FECHA CON EL PERÍODO DE CIERRE Y SI ESTÁ DENTRO DEL PERÍODO SE LA DA POR CERRADA
-- SI NO COINCIDE DEBE GUARDAR EL VALOR NORMAL DEL CALENDARIO, USANDO EL VALOR GUARDADO EN LA TEMPORAL.

UPDATE [C_CALENDSRCDEST]
SET
D01 = CIERRE_LOC.NUEVO_D01,
D02 = CIERRE_LOC.NUEVO_D02,
D03 = CIERRE_LOC.NUEVO_D03,
D04 = CIERRE_LOC.NUEVO_D04,
D05 = CIERRE_LOC.NUEVO_D05,
D06 = CIERRE_LOC.NUEVO_D06,
D07 = CIERRE_LOC.NUEVO_D07,
D08 = CIERRE_LOC.NUEVO_D08,
D09 = CIERRE_LOC.NUEVO_D09,
D10 = CIERRE_LOC.NUEVO_D10,
D11 = CIERRE_LOC.NUEVO_D11,
D12 = CIERRE_LOC.NUEVO_D12,
D13 = CIERRE_LOC.NUEVO_D13,
D14 = CIERRE_LOC.NUEVO_D14,
D15 = CIERRE_LOC.NUEVO_D15,
D16 = CIERRE_LOC.NUEVO_D16,
D17 = CIERRE_LOC.NUEVO_D17,
D18 = CIERRE_LOC.NUEVO_D18,
D19 = CIERRE_LOC.NUEVO_D19,
D20 = CIERRE_LOC.NUEVO_D20,
D21 = CIERRE_LOC.NUEVO_D21,
D22 = CIERRE_LOC.NUEVO_D22,
D23 = CIERRE_LOC.NUEVO_D23,
D24 = CIERRE_LOC.NUEVO_D24,
D25 = CIERRE_LOC.NUEVO_D25,
D26 = CIERRE_LOC.NUEVO_D26,
D27 = CIERRE_LOC.NUEVO_D27,
D28 = CIERRE_LOC.NUEVO_D28,
D29 = CIERRE_LOC.NUEVO_D29,
D30 = CIERRE_LOC.NUEVO_D30,
D31 = CIERRE_LOC.NUEVO_D31
FROM [dbo].[C_CALENDSRCDEST] AS [CALEND_1]
LEFT OUTER JOIN
(SELECT CSD.SRCLOC, CSD.DESTLOC, CSD.YEAR, CSD.MONTH,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 1 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE [CSD2].[D01] END AS NUEVO_D01,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 2 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D02 END AS NUEVO_D02,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 3 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D03 END AS NUEVO_D03,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 4 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D04 END AS NUEVO_D04,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 5 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D05 END AS NUEVO_D05,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 6 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D06 END AS NUEVO_D06,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 7 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D07 END AS NUEVO_D07,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 8 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D08 END AS NUEVO_D08,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 9 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D09 END AS NUEVO_D09,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+10 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D10 END AS NUEVO_D10,

CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 11 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D11 END AS NUEVO_D11,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 12 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D12 END AS NUEVO_D12,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 13 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D13 END AS NUEVO_D13,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 14 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D14 END AS NUEVO_D14,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 15 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D15 END AS NUEVO_D15,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 16 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D16 END AS NUEVO_D16,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 17 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D17 END AS NUEVO_D17,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 18 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D18 END AS NUEVO_D18,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 19 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D19 END AS NUEVO_D19,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+20 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D20 END AS NUEVO_D20,

CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 21 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D21 END AS NUEVO_D21,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 22 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D22 END AS NUEVO_D22,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 23 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D23 END AS NUEVO_D23,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 24 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D24 END AS NUEVO_D24,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 25 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D25 END AS NUEVO_D25,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 26 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D26 END AS NUEVO_D26,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 27 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D27 END AS NUEVO_D27,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 28 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D28 END AS NUEVO_D28,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+ 29 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D29 END AS NUEVO_D29,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+30 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D30 END AS NUEVO_D30,
CASE WHEN CSD.YEAR * 10000+CSD.MONTH*100+31 BETWEEN CT.[CIERRE_INIT_Y]*10000+[CIERRE_INIT_M]*100+[CIERRE_INIT_D]
AND CT.[CIERRE_FIN_Y]*10000+[CIERRE_FIN_M]*100+[CIERRE_FIN_D] THEN 0 ELSE CSD2.D31 END AS NUEVO_D31

FROM C_CALENDSRCDEST CSD
LEFT OUTER JOIN ##TEMPCALENDSRCDEST CSD2
ON CSD.SRCLOC = CSD2.SRCLOC
AND CSD.DESTLOC = CSD2.DESTLOC
AND CSD.YEAR = CSD2.YEAR
AND CSD.MONTH = CSD2.MONTH
LEFT OUTER JOIN Z_CIERRE_TIENDAS CT
ON CSD.DESTLOC = CT.TIENDA
WHERE CT.FLAG_CIERRE = 1
) CIERRE_LOC
ON CALEND_1.SRCLOC = CIERRE_LOC.SRCLOC AND CALEND_1.YEAR = CIERRE_LOC.YEAR AND CALEND_1.MONTH = CIERRE_LOC.MONTH

--SELECT * FROM ##TEMPCALENDSRCDEST
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
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

No Guarda los datos originales en un UPDATE

Publicado por Isaias (4558 intervenciones) el 07/06/2017 19:25:09
Amigo, no lo tome a mal, pero es como si nos enviara un JUMBO 727 y nos dijera que lo revisaramos porque esta FALLANDO,

¿Que esta fallando?, ¿Como sabe que esta fallando?, ¿Que mensajes de error le manda?, ¿Que deberia hacer y no hace?, ¿Que version de SQL Server y edicion esta manejando?
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

No Guarda los datos originales en un UPDATE

Publicado por Néstor Stura (3 intervenciones) el 07/06/2017 20:31:33
Muchas gracias por su respuesta y le pido mil disculpas ya que es mi primer post. Recurro a ustedes porque le he dado muchas vueltas y no le encuentro la solución.
Estoy usando SQL Server 2012, ante todo. No estoy seguro de como consultar la versión pero creo que es la 11.1.3000
Con respecto a su pregunta, no me da un error, si no que simplemente no hace lo que espero de resultado.
Trataré de explicarlo brevemente.
Tengo dos tablas que están relacionadas. De acuerdo con la existencia o no de un registro en la tabla 2 quiero que cambie un valor en la tabla 1, solamente de aquellos registros que coinciden con la tabla 2.
Como resultado, consigo el cambio en en los registros que coinciden pero también me cambian los valores del resto de registros de la tabla 1 sin causa aparente.
Espero haber sido más claro, pero no dude en pedirme más datos si lo considera necesario.
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
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

No Guarda los datos originales en un UPDATE

Publicado por Isaias (4558 intervenciones) el 07/06/2017 23:02:59
De acuerdo, seria algo asi

1
2
3
4
UPDATE mytabla1 SET mycolumna = mytabla2.mycolumna
FROM
SELECT columnax FRO mytabla1
INNER JOIN mytabla2 ON mytabla1.mypk = mytabla2.mypk
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

No Guarda los datos originales en un UPDATE

Publicado por Néstor Stura (3 intervenciones) el 08/06/2017 23:47:18
Gracias Isaías por tu consejo, pero creo que no me se hacer entender. Mi problema es bastante más complejo que ese.
Seguiré buscando. Como dije, gracias de todos modos.
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