Insert y Update desde otra tabla

24/11/2005 - 22:10 por Aventurero | Informe spam
Buenas.
Tengo una tabla TblClientes en el Servidor.
Frecuentemente voy a tener que subir información de unos Puntos de Venta y
se reporta mediante archivo Plano. Hasta la lectura y carga en una tabla
temporal el plano ya está, TblTemporal.
Como la identificación es única y pueden venir clientes para actualizar
datos que camino sigo para cuando existen darle UPDATE y cuando no INSERT.

TblClientes
cedula (llave numérica)
nombre
direccion
telefono
ciudad

TblTemporal
cedula
nombre
direccion
telefono
ciudad

Gracias desde ya.

Atentamente,

Aveturero

Preguntas similare

Leer las respuestas

#1 Harold Rivas
24/11/2005 - 22:38 | Informe spam
muchos saltaran y diran que no es la mejor forma, pero yo, asi lo haria.
Haria un cursor que recorriera TblTemporal y evaluara si el registro ya
existe en TblClientes pues entonces que hga un UPDATE y si no existe que
haga un Insert.


Aventurero escribió:

Buenas.
Tengo una tabla TblClientes en el Servidor.
Frecuentemente voy a tener que subir información de unos Puntos de Venta y
se reporta mediante archivo Plano. Hasta la lectura y carga en una tabla
temporal el plano ya está, TblTemporal.
Como la identificación es única y pueden venir clientes para actualizar
datos que camino sigo para cuando existen darle UPDATE y cuando no INSERT.

TblClientes
cedula (llave numérica)
nombre
direccion
telefono
ciudad

TblTemporal
cedula
nombre
direccion
telefono
ciudad

Gracias desde ya.

Atentamente,

Aveturero




Respuesta Responder a este mensaje
#2 Aventurero
24/11/2005 - 23:56 | Informe spam
Gracias Harold.
Me fuí por ese lado.

Atentamente,


Aventurero
Respuesta Responder a este mensaje
#3 Ele
25/11/2005 - 01:43 | Informe spam
Hola para evitar los cursores seria algo asi:
Insert into TblClientes
Select * From TblTemporal A Where Not exists(Select 1 From TblClientes B
Where B.cedula = A.cedula)

Update A
Set A.nombre = ..
From TblClientes A
Inner Join TblTemporal B On B.cedula = A.cedula

Ahora estaria bien que hicieras una comparacion CON CURSOR y SIN CURSOR
este mismo caso me resulto mas rapido hacerlo con cursores que haciendolo
por bloques porque al hacer el update o insert masivo bloquea la tabla y es
mas critico en la hora pico cuando el sistema es mas lento
pero esperemos ver mas opiniones

"Harold Rivas" escribió en el mensaje
news:
muchos saltaran y diran que no es la mejor forma, pero yo, asi lo haria.
Haria un cursor que recorriera TblTemporal y evaluara si el registro ya
existe en TblClientes pues entonces que hga un UPDATE y si no existe que
haga un Insert.


Aventurero escribió:

>Buenas.
>Tengo una tabla TblClientes en el Servidor.
>Frecuentemente voy a tener que subir información de unos Puntos de Venta


y
>se reporta mediante archivo Plano. Hasta la lectura y carga en una tabla
>temporal el plano ya está, TblTemporal.
>Como la identificación es única y pueden venir clientes para actualizar
>datos que camino sigo para cuando existen darle UPDATE y cuando no


INSERT.
>
>TblClientes
> cedula (llave numérica)
> nombre
> direccion
> telefono
> ciudad
>
>TblTemporal
> cedula
> nombre
> direccion
> telefono
> ciudad
>
>Gracias desde ya.
>
>Atentamente,
>
>Aveturero
>
>
>
>
Respuesta Responder a este mensaje
#4 Harold Crow
25/11/2005 - 04:42 | Informe spam
Ele escribió:

Hola para evitar los cursores seria algo asi:
Insert into TblClientes
Select * From TblTemporal A Where Not exists(Select 1 From TblClientes B
Where B.cedula = A.cedula)

Update A
Set A.nombre = ..
From TblClientes A
Inner Join TblTemporal B On B.cedula = A.cedula

Ahora estaria bien que hicieras una comparacion CON CURSOR y SIN CURSOR
este mismo caso me resulto mas rapido hacerlo con cursores que haciendolo
por bloques porque al hacer el update o insert masivo bloquea la tabla y es
mas critico en la hora pico cuando el sistema es mas lento
pero esperemos ver mas opiniones

"Harold Rivas" escribió en el mensaje
news:

muchos saltaran y diran que no es la mejor forma, pero yo, asi lo haria.
Haria un cursor que recorriera TblTemporal y evaluara si el registro ya
existe en TblClientes pues entonces que hga un UPDATE y si no existe que
haga un Insert.


Aventurero escribió:


Buenas.
Tengo una tabla TblClientes en el Servidor.
Frecuentemente voy a tener que subir información de unos Puntos de Venta





y

se reporta mediante archivo Plano. Hasta la lectura y carga en una tabla
temporal el plano ya está, TblTemporal.
Como la identificación es única y pueden venir clientes para actualizar
datos que camino sigo para cuando existen darle UPDATE y cuando no





INSERT.

TblClientes
cedula (llave numérica)
nombre
direccion
telefono
ciudad

TblTemporal
cedula
nombre
direccion
telefono
ciudad

Gracias desde ya.

Atentamente,

Aveturero













exactamente por eso me inclino a veces por los cursores, mas cuando no
son procesos que ejecutaran los usuarios, sino que son para hacer
actualizaciones o para mover datos.
Respuesta Responder a este mensaje
#5 yodelmis
26/11/2005 - 09:14 | Informe spam
Saludos a todos y aqui va mi idea del asunto (sin utilizar cursores)

** Idea 1 (con la ayuda de un programa)

Crea dos procedimientos almacenados para insert y update
respectivamente,sobre la tabla TblClientes.Ambos SP tendrian como parametros
a @cedula , @nombre, @direccion, @telefono,@ciudad

Ej: SP Insertar
Insert Into TblClientes (select @cedula ,@nombre, @direccion,
@telefono,@ciudad)

Ej SP Actualiza
Update TblClientes
Set nombre= ,@nombre
where
cedula=@cedula

Crea un programilla donde tengas algo como esto:

dim con as new adodb.connection
dim rs as new rs.adodb.recordset
dim errcount as integer
...
on error goto mm
con.BeginTrans
rs.open("select * from TblTemporal",adOpenForwardOnly,adLockReadOnly)
do while not rs.eof
if ExisteEnTblClientes(rs("cedula")) then ExisteEnTblClientes
funcion que busca en TblClientes y devuelve true si existe
ejecutaSpActualiza(con,rs("cedula"),rs("Nombre"),...)
sub que llama al SP Actualiza
else
ejecutaSpInserta(con,rs("cedula"),rs("nombre"),...) -
sub que llama al SP Insertar
end if
loop
if errcount =0 then con.CommitTrans else con.RollbackTrans
exit
mm:
msgbox "error al procesar " & rs("cedula") & " esto se podria cambiar
por una escritura en un fichero "
errcount=errcount+1
resume next


otra variante podria ser:

dim con as new adodb.connection
dim rs as new rs.adodb.recordset
dim Operaciones as new collection
dim errcount as integer
...
on error goto mm

rs.open("select * from TblTemporal",adOpenForwardOnly,adLockReadOnly)
do while not rs.eof
if ExisteEnTblClientes(rs("cedula")) then ExisteEnTblClientes
funcion que busca en TblClientes y devuelve true si existe
Operaciones.add
ArmaSpActualiza(rs("cedula"),rs("Nombre"),...) Fuction que crea el
script para utilizar el Sp Actualizar
else
operaciones.add
ArmaSpInserta(con,rs("cedula"),rs("nombre"),...) - Fuction que crea el
script para utilizar el Sp inserta
end if
loop

dim v
con.BeginTrans
for each v in operaciones
con.Execute CStr(v)

next
con.CommitTrans
exit
mm:
msgbox "error al procesar " & v & " esto se podria cambiar por una
escritura en un fichero "
con.RollbackTrans
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida