Recorrer Variable tipo table

25/09/2008 - 15:51 por German Lugo | Informe spam
Apreciados amigos:

Cómo estan ?

En que forma puedo recorrer una variable tipo table, simulando que fuera un
cursor ?

Ensayé con un cursor pero es demasiado lento.

Agradezco anticipadamente la ayuda que me puedan brindar, que como siempre
me ha sido de utilidad invaluable. Me parece que este el foro mas serio de
los que he conocido.

Best regards,

GERMAN LUGO
PROVENET LTDA. CI
ADDRESS CALLE 13 No. 58-42
BOGOTA D.C. - COLOMBIA
PHONE : 57 1 4145832
PHONEFAX : 57 1 4467880
YAHOOMAIL :german_provenetci@yahoo.com
WEBSITE :www.provenetci.com

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
25/09/2008 - 17:21 | Informe spam
German Lugo,

Por que mejor no nos explica lo que tratas de hacer y ver si podemos buscar
una solucion basada en conjuntos y no en procesamiento fila a fila?

Puedes usar un "while" para recorrer las variable tipo tabla, pero a la
final es lo mismo. Como declarastes el cursor, static, fast_forward, etc.?


AMB


"German Lugo" wrote:

Apreciados amigos:

Cómo estan ?

En que forma puedo recorrer una variable tipo table, simulando que fuera un
cursor ?

Ensayé con un cursor pero es demasiado lento.

Agradezco anticipadamente la ayuda que me puedan brindar, que como siempre
me ha sido de utilidad invaluable. Me parece que este el foro mas serio de
los que he conocido.

Best regards,

GERMAN LUGO
PROVENET LTDA. CI
ADDRESS CALLE 13 No. 58-42
BOGOTA D.C. - COLOMBIA
PHONE : 57 1 4145832
PHONEFAX : 57 1 4467880
YAHOOMAIL :
WEBSITE :www.provenetci.com




Respuesta Responder a este mensaje
#2 German Lugo
26/09/2008 - 14:13 | Informe spam
Apreciado Alejandro:

Cómo ha estado ?

Lo que busco es determinar la existencia de un producto o de todos los
productos en una fecha dada.

Siguiendo sus sugerencias diseñé una consulta que reemplazara el recorrido
por el cursor. A continuacion la consulta:

UPDATE temporal SET temporal.exist = temporal.exist+mvto.total

FROM temporal INNER JOIN

(SELECT SUM(mvtoinv.cantidad) *

(CASE WHEN entrada 0 THEN -1 ELSE 1 END) AS total,mvtoinv.codigo

FROM mvtoinv WHERE mvtoinv.codigo LIKE @codigo AND mvtoinv.fecha<@fecha
GROUP BY mvtoinv.codigo) AS mvto

ON temporal.codigo=mvto.codigo

El tiempo que emplea la consulta es muy parecido al que emplea el recorrido
por el cursor.

Será que está mal diseñada la consulta ?

La tabla de productos tiene 3.000 registros, la de movimientos 25.000
aproximadamente.

Quedo pendiente de las sugerencias.

Best regards,

GERMAN LUGO
PROVENET LTDA. CI
ADDRESS CALLE 13 No. 58-42
BOGOTA D.C. - COLOMBIA
PHONE : 57 1 4145832
PHONEFAX : 57 1 4467880
YAHOOMAIL :
WEBSITE :www.provenetci.com


"Alejandro Mesa" escribió en el
mensaje news:
German Lugo,

Por que mejor no nos explica lo que tratas de hacer y ver si podemos
buscar
una solucion basada en conjuntos y no en procesamiento fila a fila?

Puedes usar un "while" para recorrer las variable tipo tabla, pero a la
final es lo mismo. Como declarastes el cursor, static, fast_forward, etc.?


AMB


"German Lugo" wrote:

Apreciados amigos:

Cómo estan ?

En que forma puedo recorrer una variable tipo table, simulando que fuera
un
cursor ?

Ensayé con un cursor pero es demasiado lento.

Agradezco anticipadamente la ayuda que me puedan brindar, que como
siempre
me ha sido de utilidad invaluable. Me parece que este el foro mas serio
de
los que he conocido.

Best regards,

GERMAN LUGO
PROVENET LTDA. CI
ADDRESS CALLE 13 No. 58-42
BOGOTA D.C. - COLOMBIA
PHONE : 57 1 4145832
PHONEFAX : 57 1 4467880
YAHOOMAIL :
WEBSITE :www.provenetci.com




Respuesta Responder a este mensaje
#3 Alejandro Mesa
26/09/2008 - 15:53 | Informe spam
German Lugo,

No entiendo bien la sentencia, sobre todo porque filtras los movimientos
para un codigo en especial en la tabla de movimientos pero no asi en la
temporal.

Quizas podamos usar:

UPDATE
temporal
SET
temporal.exist = temporal.exist + ISNULL(
(
SELECT SUM(mvtoinv.cantidad * CASE WHEN entrada = 0 THEN -1 ELSE 1 END)
FROM mvtoinv
WHERE mvtoinv.codigo = @codigo AND mvtoinv.fecha < @fecha
), 0)

WHERE
temporal.codigo = @codigo

Si esta sentencia se adapta a tus necesidades, asegurate de tener un indice
en la tabla temporal por la columna [codigo].

En la tabla de movimientos podriamos usar un indice clustered por fecha de
el movimiento, si es que vas a usar filtros abiertos por esta columna de
manera frecuente, quizas nos sirva mejor un indice clustered por (fecha,
codigo).

Todo esto lo debes probar, pues una cosa es lo que dice la teoria y otra al
que nos dice la practica.


AMB



"German Lugo" wrote:

Apreciado Alejandro:

Cómo ha estado ?

Lo que busco es determinar la existencia de un producto o de todos los
productos en una fecha dada.

Siguiendo sus sugerencias diseñé una consulta que reemplazara el recorrido
por el cursor. A continuacion la consulta:

UPDATE temporal SET temporal.exist = temporal.exist+mvto.total

FROM temporal INNER JOIN

(SELECT SUM(mvtoinv.cantidad) *

(CASE WHEN entrada 0 THEN -1 ELSE 1 END) AS total,mvtoinv.codigo

FROM mvtoinv WHERE mvtoinv.codigo LIKE @codigo AND mvtoinv.fecha<@fecha
GROUP BY mvtoinv.codigo) AS mvto

ON temporal.codigo=mvto.codigo

El tiempo que emplea la consulta es muy parecido al que emplea el recorrido
por el cursor.

Será que está mal diseñada la consulta ?

La tabla de productos tiene 3.000 registros, la de movimientos 25.000
aproximadamente.

Quedo pendiente de las sugerencias.

Best regards,

GERMAN LUGO
PROVENET LTDA. CI
ADDRESS CALLE 13 No. 58-42
BOGOTA D.C. - COLOMBIA
PHONE : 57 1 4145832
PHONEFAX : 57 1 4467880
YAHOOMAIL :
WEBSITE :www.provenetci.com


"Alejandro Mesa" escribió en el
mensaje news:
> German Lugo,
>
> Por que mejor no nos explica lo que tratas de hacer y ver si podemos
> buscar
> una solucion basada en conjuntos y no en procesamiento fila a fila?
>
> Puedes usar un "while" para recorrer las variable tipo tabla, pero a la
> final es lo mismo. Como declarastes el cursor, static, fast_forward, etc.?
>
>
> AMB
>
>
> "German Lugo" wrote:
>
>> Apreciados amigos:
>>
>> Cómo estan ?
>>
>> En que forma puedo recorrer una variable tipo table, simulando que fuera
>> un
>> cursor ?
>>
>> Ensayé con un cursor pero es demasiado lento.
>>
>> Agradezco anticipadamente la ayuda que me puedan brindar, que como
>> siempre
>> me ha sido de utilidad invaluable. Me parece que este el foro mas serio
>> de
>> los que he conocido.
>>
>> Best regards,
>>
>> GERMAN LUGO
>> PROVENET LTDA. CI
>> ADDRESS CALLE 13 No. 58-42
>> BOGOTA D.C. - COLOMBIA
>> PHONE : 57 1 4145832
>> PHONEFAX : 57 1 4467880
>> YAHOOMAIL :
>> WEBSITE :www.provenetci.com
>>
>>
>>
>>



Respuesta Responder a este mensaje
#4 German Lugo
26/09/2008 - 17:10 | Informe spam
Apreciado Alejandro:

Perfecto !!!!

Filtre el codigo en la temporal y tardo 2 segundos.

Muchas gracias !

Best regards,

GERMAN LUGO
PROVENET LTDA. CI
ADDRESS CALLE 13 No. 58-42
BOGOTA D.C. - COLOMBIA
PHONE : 57 1 4145832
PHONEFAX : 57 1 4467880
YAHOOMAIL :
WEBSITE :www.provenetci.com


"Alejandro Mesa" escribió en el
mensaje news:
German Lugo,

No entiendo bien la sentencia, sobre todo porque filtras los movimientos
para un codigo en especial en la tabla de movimientos pero no asi en la
temporal.

Quizas podamos usar:

UPDATE
temporal
SET
temporal.exist = temporal.exist + ISNULL(
(
SELECT SUM(mvtoinv.cantidad * CASE WHEN entrada = 0 THEN -1 ELSE 1 END)
FROM mvtoinv
WHERE mvtoinv.codigo = @codigo AND mvtoinv.fecha < @fecha
), 0)

WHERE
temporal.codigo = @codigo

Si esta sentencia se adapta a tus necesidades, asegurate de tener un
indice
en la tabla temporal por la columna [codigo].

En la tabla de movimientos podriamos usar un indice clustered por fecha de
el movimiento, si es que vas a usar filtros abiertos por esta columna de
manera frecuente, quizas nos sirva mejor un indice clustered por (fecha,
codigo).

Todo esto lo debes probar, pues una cosa es lo que dice la teoria y otra
al
que nos dice la practica.


AMB



"German Lugo" wrote:

Apreciado Alejandro:

Cómo ha estado ?

Lo que busco es determinar la existencia de un producto o de todos los
productos en una fecha dada.

Siguiendo sus sugerencias diseñé una consulta que reemplazara el
recorrido
por el cursor. A continuacion la consulta:

UPDATE temporal SET temporal.exist = temporal.exist+mvto.total

FROM temporal INNER JOIN

(SELECT SUM(mvtoinv.cantidad) *

(CASE WHEN entrada 0 THEN -1 ELSE 1 END) AS total,mvtoinv.codigo

FROM mvtoinv WHERE mvtoinv.codigo LIKE @codigo AND mvtoinv.fecha<@fecha
GROUP BY mvtoinv.codigo) AS mvto

ON temporal.codigo=mvto.codigo

El tiempo que emplea la consulta es muy parecido al que emplea el
recorrido
por el cursor.

Será que está mal diseñada la consulta ?

La tabla de productos tiene 3.000 registros, la de movimientos 25.000
aproximadamente.

Quedo pendiente de las sugerencias.

Best regards,

GERMAN LUGO
PROVENET LTDA. CI
ADDRESS CALLE 13 No. 58-42
BOGOTA D.C. - COLOMBIA
PHONE : 57 1 4145832
PHONEFAX : 57 1 4467880
YAHOOMAIL :
WEBSITE :www.provenetci.com


"Alejandro Mesa" escribió en el
mensaje news:
> German Lugo,
>
> Por que mejor no nos explica lo que tratas de hacer y ver si podemos
> buscar
> una solucion basada en conjuntos y no en procesamiento fila a fila?
>
> Puedes usar un "while" para recorrer las variable tipo tabla, pero a la
> final es lo mismo. Como declarastes el cursor, static, fast_forward,
> etc.?
>
>
> AMB
>
>
> "German Lugo" wrote:
>
>> Apreciados amigos:
>>
>> Cómo estan ?
>>
>> En que forma puedo recorrer una variable tipo table, simulando que
>> fuera
>> un
>> cursor ?
>>
>> Ensayé con un cursor pero es demasiado lento.
>>
>> Agradezco anticipadamente la ayuda que me puedan brindar, que como
>> siempre
>> me ha sido de utilidad invaluable. Me parece que este el foro mas
>> serio
>> de
>> los que he conocido.
>>
>> Best regards,
>>
>> GERMAN LUGO
>> PROVENET LTDA. CI
>> ADDRESS CALLE 13 No. 58-42
>> BOGOTA D.C. - COLOMBIA
>> PHONE : 57 1 4145832
>> PHONEFAX : 57 1 4467880
>> YAHOOMAIL :
>> WEBSITE :www.provenetci.com
>>
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida