Problema importación datos incrementales.

27/12/2006 - 12:42 por Salvador Ramos | Informe spam
Hola a todos,

Tengo una tabla origen en la cual no tengo PK, y cuento con algunas
repetidas (filas totalmente iguales, con el mismo valor en todas sus
columnas:

CREATE TABLE [dbo].[avlValec](
[Empresa] [int] NULL,
[cliente] [int] NULL,
[tipo_fact] [char](2) COLLATE Modern_Spanish_CI_AS NULL,
[num_tarjeta] [char](19) COLLATE Modern_Spanish_CI_AS NULL,
[fecha] [smalldatetime] NULL,
[num_mvto] [varchar](10) COLLATE Modern_Spanish_CI_AS NULL,
[cod_articulo] [varchar](8) COLLATE Modern_Spanish_CI_AS NULL,
[denominacion] [varchar](40) COLLATE Modern_Spanish_CI_AS NULL,
[pvp_iva] [decimal](8, 3) NULL,
[tipo_dto] [char](1) COLLATE Modern_Spanish_CI_AS NULL,
[canti] [decimal](8, 2) NULL,
[importe_vale] [decimal](8, 2) NULL,
[impor_dto] [decimal](7, 2) NULL,
[dto] [decimal](6, 3) NULL,
[iva] [decimal](3, 1) NULL,
[codigo_esta] [int] NULL,
[hora] [varchar](4) COLLATE Modern_Spanish_CI_AS NULL,
[matricula] [char](10) COLLATE Modern_Spanish_CI_AS NULL,
[fecha_factu] [smalldatetime] NULL,
[num_factu] [varchar](10) COLLATE Modern_Spanish_CI_AS NULL,
[facturado] [char](1) COLLATE Modern_Spanish_CI_AS NULL,
[contab] [char](1) COLLATE Modern_Spanish_CI_AS NULL
) ON [PRIMARY]

Y otra tabla destino en la que tengo que insertar filas desde la tabla
origen anterior. Esta tabla contiene algunas columnas procedentes de la
tabla anterior (no todas).

CREATE TABLE [dbo].[andGasoleoProfMov](
[IdMovCont] [char](21) COLLATE Modern_Spanish_CI_AS NOT NULL,
[CIM] [char](8) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Fecha] [datetime] NOT NULL,
[Hora] [char](4) COLLATE Modern_Spanish_CI_AS NOT NULL,
[CodPro] [char](3) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Lit] [decimal](7, 2) NOT NULL,
[NIF] [char](9) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Matricula] [varchar](12) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Estado] [char](1) COLLATE Modern_Spanish_CI_AS NOT NULL,
[Fichero] [varchar](50) COLLATE Modern_Spanish_CI_AS NOT NULL,
[FechaAudit] [datetime] NOT NULL,
[Empresa] [int] NOT NULL,
CONSTRAINT [PK_andGasoleoProfMov] PRIMARY KEY CLUSTERED
(
[IdMovCont] ASC
) ON [PRIMARY]
) ON [PRIMARY]

Las columnas Estado, Fichero y FechaAudit al importar los datos quedan en
blanco y posteriormente las actualizan otros procesos.

Necesito realizar un proceso periódico para la importación de datos nuevos
en la tabla andGasoleoProfMov, pero al no tener PK la tabla de origen y
tener filas totalmente idénticas, me dan problemas todas las soluciones que
se me han ocurrido, y no consigo hacerlo.
No es posible poner una PK a la tabla origen, ya que es una tabla de mi ERP
de la cual sólo puedo leer datos, en ningún caso modificar su estructura.
Algunos de los datos de la tabla destino salen de otras tablas, pero no he
querido complicarlo aquí, ya que puedo hacer join a ellas y obtenerlos sin
ningún problema.

Si se os ocurre alguna solución, os estaré muy agradecido, ya que pretendo
solucionar un problema importante para mi emrpresa, y además voy
contrareloj, tenía que estar hecho para ayer :-(

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)

Preguntas similare

Leer las respuestas

#6 Carlos Sacristán
28/12/2006 - 08:31 | Informe spam
Bueno, pues si efectivamente lo he entendido bien y no hay más detalles
a tener en cuenta, lo siguiente te devuelve las filas que no están en la
tabla destino:

select distinct o.* from origen o left join destino d on o.c1=d.c1 and
o.c2=d.c2 and o.c3=d.c3 where d.c1 is null

No sé. Me da a mí que hay algo más por ahí...



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Salvador Ramos" escribió en el
mensaje news:
Mostrar la cita
#7 Salvador Ramos
28/12/2006 - 11:37 | Informe spam
Efectivamente, que en la tabla destino tiene que haber las mismas filas que
en la tabla origen, y con lo que indicas no se incluyen las filas que
aparecen 2, 3 o más veces en la tabla origen (lo habitual es que haya filas
que aparecen dos veces, pero yo lo tengo que plantear independientemente del
número de repeticiones que haya.

Además imaginate que en la importación de ayer había sólo una fila con los
valoeres 1 - 1 - 4 y en la de hoy aparece otra más, esa fila tendría que
importarla.

Muchas gracias

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:
Mostrar la cita
#8 Carlos Sacristán
28/12/2006 - 12:12 | Informe spam
Vaya, nunca dejaré de sorprenderme la cantidad de situaciones en las que
podemos encontrarnos... parece increíble que necesites algo así.

Mmmmm si tienes una tabla de numeración, prueba con lo siguiente. A
mí me salen las filas que están en la tabla origen y no en la de destino el
número de veces correcto:

select o.c1, o.c2, o.c3

from (select count(*) num, c1, c2, c3 from __origen group by c1, c2, c3) o

left join (select count(*) num, c1, c2, c3 from __destino group by c1, c2,
c3) d

on o.c1=d.c1 and o.c2=d.c2 and o.c3=d.c3

full outer join __numeros n on (o.num - isnull(d.num, 0)) > n.num

where o.c1 is not null and o.num > isnull(d.num, 0)



Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Salvador Ramos" escribió en el
mensaje news:%
Mostrar la cita
#9 Salvador Ramos
28/12/2006 - 16:34 | Informe spam
Hola Carlos,

Perdona que te ande liando, realmente te puse un ejemplo para explicar la
situación, pero realmente son tablas más complejas, con más columnas y
diversos tipos de datos. Las que envié en el primer post de este hilo.

Estoy trabajando con el amigo Miguel Egea en una solución basada en una
tabla intermedia donde pueda generar una PK y ya a partir de ahí pueda
importar correctamente. Al menos hemos visto algo de luz para resolver el
problema.

Ya cuento aquí la solución cuando consiga implementarla.
Muchas gracias por tu tiempo.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server / MCTS: SQL Server 2005]
www.helpdna.net (información sobre SQL Server y .NET)


"Carlos Sacristán" <csacristanARROBAmvpsPUNTOorg> escribió en el mensaje
news:
Mostrar la cita
#10 Alejandro Mesa
29/12/2006 - 15:38 | Informe spam
Salvador,

Vaya lio en el que te han metido esos tios, por no seguir la mas basica
regla de los sistemas rdbms.

Trata creando una vista que agrupe por todas las columnas involucradas y que
calcule la cantidad de duplicados. Esa vista la debes crear dos veces una
para origen y la otra para destino. Luego selecionas las filas que machen y
donde la cantidad de duplicados no sea la misma. La diferencia de los
duplicados dara la cantidad de veces que se necesita insertar la fila y con
el uso de una tabla auxiliar de numeros insertas esa cantidad.

create view dbo.vw_o
as
select c1, c2, ..., cn, count(*) as cnt
from dbo.origen
group by c1, c2, ..., cn
go

create view dbo.vw_d
as
select c1, c2, ..., cn, count(*) as cnt
from dbo.destino
group by c1, c2, ..., cn
go

select
o.c1, o.c2, ..., o.cn, (o.cnt - d.cnt) as cnt
into
#t
from
dbo.vw_o as o, dbo.vw_d as d
where
(o.c1 = d.c1 or (o.c1 is null and d.c1 is null))
and (o.c2 = d.c2 or (o.c2 is null and d.c2 is null))
...
and (o.cn = d.cn or (o.cn is null and d.cn is null))
and o.cnt > d.cnt

insert into dbo.destino(c1, c2, ..., cn)
select t.c1, t.c2, ..., t.cn
from #t as t, dbo.numero as n
where n.numero <= t.cnt

drop table #t
go

Si estas usando 2005, puedes crear la tabla auxiliar de #s en el aire. Hay
un articulo muy interesante, de Itzik Ben-Gan, en la ultima edicion de la
revista sql magazine o en su libro "Inside Microsoft SQL Server 2005: T-SQL
Querying" sobre como hacerlo.

Claro esta que esta solucion sera lenta, puesto que cada vez que ejecutes el
script, se debera calcular el agregado para toda la tabla. Quizas puedas usar
alguna de las columnas tipo fecha para calcular el agregado solo de la fecha
en cuestion.


AMB

"Salvador Ramos" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida