Update de varias lineas

27/06/2006 - 13:45 por Paco | Informe spam
Hola al grupo, tengo definido un sp que actualiza los valores de una
tabla en funcion del select de otra:
CREATE PROCEDURE MiProc @producto int, @linea int AS
if exists (select campo from tabla where cod_prod = @producto)
update lineas_pedidos set campo = (select top 1 campo
from tabla
where cod_prod= @producto order by fecha desc, hora desc)
where linea = @linea
GO

El problema es que lo ejecuto en un bucle desde VB6 para varios
registros pero va muy muy lento.
Mi pregunta es si hay alguna otra forma, bien desde VB6 o bien desde
sql para poder hacer este proceso de forma mas rapida.

Muchas gracias

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
27/06/2006 - 15:11 | Informe spam
Paco,

Nos puedes explicar lo que tratas de hacer?
Por que un bucle?


AMB

"Paco" wrote:

Hola al grupo, tengo definido un sp que actualiza los valores de una
tabla en funcion del select de otra:
CREATE PROCEDURE MiProc @producto int, @linea int AS
if exists (select campo from tabla where cod_prod = @producto)
update lineas_pedidos set campo = (select top 1 campo
from tabla
where cod_prod= @producto order by fecha desc, hora desc)
where linea = @linea
GO

El problema es que lo ejecuto en un bucle desde VB6 para varios
registros pero va muy muy lento.
Mi pregunta es si hay alguna otra forma, bien desde VB6 o bien desde
sql para poder hacer este proceso de forma mas rapida.

Muchas gracias


Respuesta Responder a este mensaje
#2 Paco
28/06/2006 - 07:48 | Informe spam
Si, claro. El proceso tiene que asignar un determinado numero de lote
que obtengo de la tabla 'tabla' y que es diferente para cada uno de los
productos de la tabla lineas_pedidos, de ahi lo del bucle. Por eso
preguntaba si existia alguna forma mas rapida o eficiente de realizar
todo esto.


Alejandro Mesa ha escrito:

Paco,

Nos puedes explicar lo que tratas de hacer?
Por que un bucle?


AMB

"Paco" wrote:

> Hola al grupo, tengo definido un sp que actualiza los valores de una
> tabla en funcion del select de otra:
> CREATE PROCEDURE MiProc @producto int, @linea int AS
> if exists (select campo from tabla where cod_prod = @producto)
> update lineas_pedidos set campo = (select top 1 campo
> from tabla
> where cod_prod= @producto order by fecha desc, hora desc)
> where linea = @linea
> GO
>
> El problema es que lo ejecuto en un bucle desde VB6 para varios
> registros pero va muy muy lento.
> Mi pregunta es si hay alguna otra forma, bien desde VB6 o bien desde
> sql para poder hacer este proceso de forma mas rapida.
>
> Muchas gracias
>
>
Respuesta Responder a este mensaje
#3 qwalgrande
30/06/2006 - 06:50 | Informe spam
Hola.

Lo voy a hacer en varios pasos, con el fin de que veas cómo puedes hacer
este tipo de cosas en casos parecidos.

Lo primero que has de hacer es preparar una consulta que te devuelva la
select del top 1, pero sin el filtro de productos y el top 1. Normalmente,
deberías tener una clave primaria que fuera siempre creciente, con lo que el
mayor valor para la clave primaria sería también la máxima fecha y hora. Si
no es así, tendrías que combinar fecha y hora (mucho peor rendimiento).

Si existe esa PK que siempre crece (llamémosle al campo IdTabla)

select producto, max(IdTabla) as IdTabla
from tabla
group by producto

Si no existe:

select producto, campo, max(fecha + hora) as FechaHora
from tabla
group by producto

En un segundo paso, recurro nuevamente a la tabla para obtener el valor de
campo para el último valor que obtuve (voy a seguir con el primer caso
únicamente):

select m.campo, m.producto
from tabla m inner join
(select campo, producto, max(IdTabla) as IdTabla
from tabla
group by producto) s on m.IdTabla = s.IdTabla

Ahora uno esta consulta con la tabla de líneas de pedido :

select m.campo, m.producto
from tabla m inner join
(select campo, producto, max(IdTabla) as IdTabla
from tabla
group by producto) s on m.IdTabla = s.IdTabla inner join
lineas_pedido l on m.producto = l,producto

Con ello tienes la consulta tal y como tendría que quedar el valor t.campo,
hay que convertir el select en un update

update l set campo = m.campo
from tabla m inner join
(select campo, producto, max(IdTabla) as IdTabla
from tabla
group by producto) s on m.IdTabla = s.IdTabla inner join
lineas_pedido l on m.producto = l,producto

Espero que se entienda y que te ayude.

Alberto López Grande (qwalgrande)


"Paco" escribió en el mensaje
news:
Si, claro. El proceso tiene que asignar un determinado numero de lote
que obtengo de la tabla 'tabla' y que es diferente para cada uno de los
productos de la tabla lineas_pedidos, de ahi lo del bucle. Por eso
preguntaba si existia alguna forma mas rapida o eficiente de realizar
todo esto.


Alejandro Mesa ha escrito:

Paco,

Nos puedes explicar lo que tratas de hacer?
Por que un bucle?


AMB

"Paco" wrote:

> Hola al grupo, tengo definido un sp que actualiza los valores de una
> tabla en funcion del select de otra:
> CREATE PROCEDURE MiProc @producto int, @linea int AS
> if exists (select campo from tabla where cod_prod = @producto)
> update lineas_pedidos set campo = (select top 1 campo
> from tabla
> where cod_prod= @producto order by fecha desc, hora desc)
> where linea = @linea
> GO
>
> El problema es que lo ejecuto en un bucle desde VB6 para varios
> registros pero va muy muy lento.
> Mi pregunta es si hay alguna otra forma, bien desde VB6 o bien desde
> sql para poder hacer este proceso de forma mas rapida.
>
> Muchas gracias
>
>



Respuesta Responder a este mensaje
#4 Paco
30/06/2006 - 11:03 | Informe spam
Alberto, eres un crack!
Esto ha funcionado de pm! Simplemente le he tenido que añadir el where
de nº de pedido y funciona de perlas.
Muchas gracias


qwalgrande ha escrito:

Hola.

Lo voy a hacer en varios pasos, con el fin de que veas cómo puedes hacer
este tipo de cosas en casos parecidos.

Lo primero que has de hacer es preparar una consulta que te devuelva la
select del top 1, pero sin el filtro de productos y el top 1. Normalmente,
deberías tener una clave primaria que fuera siempre creciente, con lo que el
mayor valor para la clave primaria sería también la máxima fecha y hora. Si
no es así, tendrías que combinar fecha y hora (mucho peor rendimiento).

Si existe esa PK que siempre crece (llamémosle al campo IdTabla)

select producto, max(IdTabla) as IdTabla
from tabla
group by producto

Si no existe:

select producto, campo, max(fecha + hora) as FechaHora
from tabla
group by producto

En un segundo paso, recurro nuevamente a la tabla para obtener el valor de
campo para el último valor que obtuve (voy a seguir con el primer caso
únicamente):

select m.campo, m.producto
from tabla m inner join
(select campo, producto, max(IdTabla) as IdTabla
from tabla
group by producto) s on m.IdTabla = s.IdTabla

Ahora uno esta consulta con la tabla de líneas de pedido :

select m.campo, m.producto
from tabla m inner join
(select campo, producto, max(IdTabla) as IdTabla
from tabla
group by producto) s on m.IdTabla = s.IdTabla inner join
lineas_pedido l on m.producto = l,producto

Con ello tienes la consulta tal y como tendría que quedar el valor t.campo,
hay que convertir el select en un update

update l set campo = m.campo
from tabla m inner join
(select campo, producto, max(IdTabla) as IdTabla
from tabla
group by producto) s on m.IdTabla = s.IdTabla inner join
lineas_pedido l on m.producto = l,producto

Espero que se entienda y que te ayude.

Alberto López Grande (qwalgrande)


"Paco" escribió en el mensaje
news:
> Si, claro. El proceso tiene que asignar un determinado numero de lote
> que obtengo de la tabla 'tabla' y que es diferente para cada uno de los
> productos de la tabla lineas_pedidos, de ahi lo del bucle. Por eso
> preguntaba si existia alguna forma mas rapida o eficiente de realizar
> todo esto.
>
>
> Alejandro Mesa ha escrito:
>
>> Paco,
>>
>> Nos puedes explicar lo que tratas de hacer?
>> Por que un bucle?
>>
>>
>> AMB
>>
>> "Paco" wrote:
>>
>> > Hola al grupo, tengo definido un sp que actualiza los valores de una
>> > tabla en funcion del select de otra:
>> > CREATE PROCEDURE MiProc @producto int, @linea int AS
>> > if exists (select campo from tabla where cod_prod = @producto)
>> > update lineas_pedidos set campo = (select top 1 campo
>> > from tabla
>> > where cod_prod= @producto order by fecha desc, hora desc)
>> > where linea = @linea
>> > GO
>> >
>> > El problema es que lo ejecuto en un bucle desde VB6 para varios
>> > registros pero va muy muy lento.
>> > Mi pregunta es si hay alguna otra forma, bien desde VB6 o bien desde
>> > sql para poder hacer este proceso de forma mas rapida.
>> >
>> > Muchas gracias
>> >
>> >
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida