Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Haber Si Alguien me Puede Ayudar?

Estas en el tema de Haber Si Alguien me Puede Ayudar? en el foro de SQL Server en Foros del Web. Les Cuento Muchachos que Estoy Realizando un sistema de Control de Stock. Y Tengo la Sgte Situacion : Tengo una Tabla Llamada Usuarios con los ...
  #1 (permalink)  
Antiguo 03/10/2007, 18:30
 
Fecha de Ingreso: mayo-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
Haber Si Alguien me Puede Ayudar?

Les Cuento Muchachos que Estoy Realizando un sistema de Control de Stock. Y Tengo la Sgte Situacion :

Tengo una Tabla Llamada Usuarios con los Campos(Nombre,Apellidos,Rut,Sitio,Departamento). Resulta Que la Actualizacion de Usuarios Llega cada mes en Formato Excel. Para Esto importo desde Enterprise Manager El aRchivo Excel y Creo una Tabla LLamada Usuarios Temporal que Posee los mismos Campos

Para Insertar a los Nuevos Usuarios Ejecuto la Sgte Query :

insert into usuarios SELECT *
FROM UsuariosTemporal
WHERE Rut NOT IN ( SELECT Rut FROM usuarios )

El Problema es Con la Actualizacion de Los Usuarios que Se Encuentran en las Tablas. Tengo q Comparar todos Los Campos (Nombre, Apellidos,Sitio,Departamento) Segun su Rut. Si un Campos es Distinto hacer El Update Correspondiente
Ademas Cuando un Dato de Usuario se Actualiza Tengo q Insertar en una Tabla LLamada Movimientos de Usuarios Al Usuario Actualizado, para Que Quede Registrado un Historial del Usuario(Se Podra Usar Triggers??)

Ejemplo :

Tengo en Usuarios (Juan,Perez,14253698-9,Dos,Tres)
(Luis,Gonzales,15399658-7,cinco,seis)

Llega LA Tabla de Usuarios Actualizada

Usuarios Temporal (Juan,Perez,14253698-9,Dos,Tres)
(Luis,Gonzales,15399658-7,cuatro,Cinco)
(Jose,Carreño,12547858-7,Nueve,uno)

El Resultado de la Tabla Usuarios Seria :
Les Cuento Muchachos que Estoy Realizando un sistema de Control de Stock. Y Tengo la Sgte Situacion :

Tengo una Tabla Llamada Usuarios con los Campos(Nombre,Apellidos,Rut,Sitio,Departamento). Resulta Que la Actualizacion de Usuarios Llega cada mes en Formato Excel. Para Esto importo desde Enterprise Manager El aRchivo Excel y Creo una Tabla LLamada Usuarios Temporal que Posee los mismos Campos

Para Insertar a los Nuevos Usuarios Ejecuto la Sgte Query :

insert into usuarios SELECT *
FROM UsuariosTemporal
WHERE Rut NOT IN ( SELECT Rut FROM usuarios )

El Problema es Con la Actualizacion de Los Usuarios que Se Encuentran en las Tablas. Tengo q Comparar todos Los Campos (Nombre, Apellidos,Sitio,Departamento) Segun su Rut. Si un Campos es Distinto hacer El Update Correspondiente
Ademas Cuando un Dato de Usuario se Actualiza Tengo q Insertar en una Tabla LLamada Movimientos de Usuarios Al Usuario Actualizado, para Que Quede Registrado un Historial del Usuario(Se Podra Usar Triggers??)

Ejemplo :

Tengo en Usuarios (Juan,Perez,14253698-9,Dos,Tres)
(Luis,Gonzales,15399658-7,cinco,seis)

Llega LA Tabla de Usuarios Actualizada

Usuarios Temporal (Juan,Perez,14253698-9,Dos,Tres)
(Luis,Gonzales,15399658-7,cuatro,Cinco)
(Jose,Carreño,12547858-7,Nueve,uno)


La Tabla Usuarios Tendria que Quedar :

(Juan,Perez,14253698-9,Dos,Tres)
(Luis,Gonzales,15399658-7,cuatro,Cinco)
(Jose,Carreño,12547858-7,Nueve,uno)

y Movimiento de Usuarios
(Luis,Gonzales,15399658-7,cuatro,Cinco) --> Que Son los Usuarios Que se Actualizaron por que Poseian algun Campo diferente






Bueno Esperando Que Me Ayuden ....Desde ya Muchas Gracias
  #2 (permalink)  
Antiguo 04/10/2007, 11:37
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Haber Si Alguien me Puede Ayudar?

1.- Separa en 2 tablas, los que vas a INSERTAR y los que vas a ACTUALIZAR
2.- Para la inserccion, ya lo tienes resuelto
3.- Para la actualizacion, prueba este codigo con una tabla ejemplo:

Cita:
UPDATE tutabla
SET tucol1 = CASE WHEN a.tucol1 <> x.tucol1 then x.tucol1 else tucol1 END
SET tucol2 = CASE WHEN a.tucol2 <> x.tucol2 then x.tucol2 else tucol2 END
SET tucol3 = CASE WHEN a.tucol3 <> x.tucol3 then x.tucol3 else tucol3 END
FROM tutabla a JOIN tutemporal x on a.id = x.id
Dime si ste funciona.
  #3 (permalink)  
Antiguo 04/10/2007, 13:01
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
De acuerdo Re: Haber Si Alguien me Puede Ayudar?

Una variacion...

Código:
UPDATE tutabla 
SET tucol1 = x.tucol1
      ,tucol2 = x.tucol2 
      ,a.tucol3 = x.tucol3
FROM     tutabla a 
Inner JOIN 
             tutemporal x 
On         a.id = x.id
Where  a.tucol1 <> x.tucol1 Or 
             a.tucol2 <> x.tucol2 Or
             a.tucol3 <> x.tucol3
Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #4 (permalink)  
Antiguo 04/10/2007, 17:13
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Haber Si Alguien me Puede Ayudar?

Andres95

Tengo una duda sobre tu propuesta, ¿esta funcionaria SI y SOLO SI, todas las columnas fueran modificadas?, ¿cierto?
  #5 (permalink)  
Antiguo 04/10/2007, 18:40
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Haber Si Alguien me Puede Ayudar?

Nop, es un Or lo que está en el Where, lo unico es que va a modificar todos los valores del registro.... incluso los que no hayan cambiado.... pero no está mal..

iislas, a tu update le faltó la A, ya que seguro SQL te dara error de Ambiguous name TuCol1


Quedaría así:

Código:
UPDATE tutabla
SET tucol1 = CASE WHEN a.tucol1 <> x.tucol1 then x.tucol1 else a.tucol1 END
SET tucol2 = CASE WHEN a.tucol2 <> x.tucol2 then x.tucol2 else a.tucol2 END
SET tucol3 = CASE WHEN a.tucol3 <> x.tucol3 then x.tucol3 else a.tucol3 END
FROM tutabla a JOIN tutemporal x on a.id = x.id
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #6 (permalink)  
Antiguo 04/10/2007, 18:46
 
Fecha de Ingreso: mayo-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
De acuerdo Re: Haber Si Alguien me Puede Ayudar?

Me Funciono con la sgte query :

Update Usuarios
Set Nombre=u2.nombre,apellidos=u2.apellidos,sitio=u2.s itio,departamento=u2.departamento
from usuarios u1
inner join
Usuariostemporal u2
on u1.rut=u2.rut
where u1.nombre <> u2.nombre or u1.apellidos<>u2.apellidos...etc

Muchas Gracias por las respuestas muchachos. Quiero decir que a diferencias de otros foros, aca se dan respuestas de muy buen nivel, se nota que existe gente capacitada en esta area y dispuesta ayudar, los felicito y espero que el foro cresca cada dia mas.
  #7 (permalink)  
Antiguo 04/10/2007, 18:48
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Haber Si Alguien me Puede Ayudar?

Ahh! The_Haunted, para la insercion del log de movimientos puedes usar la misma condicion de busqueda.... es decir

Código:
--Para loguear a los empleados que estás insertando
Insert into TbLogMovimientos (Rut, TipoMovimiento)
    SELECT Rut, 'Insercion'
    FROM UsuariosTemporal
    WHERE Rut NOT IN (SELECT Rut FROM usuarios)

--Para loguear a los empleados que estás actualizando
Insert into TbLogMovimientos (Rut, TipoMovimiento)
    Select A.Rut, 'Actualización'
    From Usuarios a 
    Inner Join Usuariostemporal x 
        On a.id = x.id
    Where  a.tucol1 <> x.tucol1 Or 
             a.tucol2 <> x.tucol2 Or
             a.tucol3 <> x.tucol3

Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #8 (permalink)  
Antiguo 05/10/2007, 08:38
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
De acuerdo Re: Haber Si Alguien me Puede Ayudar?

Una variacion, aunque no me ha dado tiempo de probarla con un ejemplo real.

La intencion es ingresar en el log todo en una sola vez...

Código:
-------------------------------------------------------------------
-- Para loguear a los empleados que estás actualizando e insertando
-------------------------------------------------------------------
Insert into TbLogMovimientos (Rut, TipoMovimiento)
Select x.Rut
      ,Case When a.Id is null  
            Then 'Insercion'
            Else 'Actualización' End
From   Usuariostemporal x 
Left outer Join 
       Usuarios a 
On     x.id = a.id
Where  a.Id is null Or                    -- Es un registro nuevo
       (a.Id is not null And              -- Es una modificacion
       (a.tucol1 <> x.tucol1 Or 
       a.tucol2 <> x.tucol2 Or
       a.tucol3 <> x.tucol3))
Espero les sirva....

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #9 (permalink)  
Antiguo 05/10/2007, 10:40
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Haber Si Alguien me Puede Ayudar?

Excelente alternativa Andres95!

Un saludo!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #10 (permalink)  
Antiguo 05/10/2007, 13:09
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Haber Si Alguien me Puede Ayudar?

gracias Gabo77, por la correccion.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:09.