Manipular Registros

02/11/2006 - 17:41 por lucho | Informe spam
Buenos dias Grupo:

Tengo la siguiente pregunta:


Tengo en una tabla un conjungo de registros como el siguiente:

||
ID || CODIGO_PRODUCTO ||
== ||
1 || 1244 ||
==2 || 3366 ||
==3 || 1566 ||
==4 || 9932 ||
==


Necisito construir un procedimiento almacenado que tome como parámetro el
CODIGO_PRODUCTO y ejecute una serie de acciones en otras tablas (eso lo
tengo claro).

El problema es como puedo hacer para que el procemiento tome uno a uno los
registros y los procese ? es necesario utilizar cursores ?


Agradezco de antemano su colaboración


Atentamente



LUCHO

Preguntas similare

Leer las respuestas

#1 Javier Loria
02/11/2006 - 18:37 | Informe spam
Hola Lucho:
Eso que tienes claro es lo que tienes que "desaprender" para trabajar en
SQL.
Como buen programador estan pensando en una forma estructrada, y piensas
en construir un ciclo con una serie de operaciones que operan sobre cada una
de las filas. Esto debes "desaprenderlo".
SQL es un lenguaje que opera con conjuntos y esto lo hace de una forma
sorprendentemente rapida. Si nos pasas la serie de acciones tal vez te
podemos ayudar a construir las setencias.
Si quieres trabajar con cursores, SQL lo soporta, pero veras que son
lentos, complejos y dificiles de mantener.
Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning

"lucho" wrote in message
news:OTP1E2p$
Buenos dias Grupo:

Tengo la siguiente pregunta:


Tengo en una tabla un conjungo de registros como el siguiente:

||
ID || CODIGO_PRODUCTO ||
== ||
1 || 1244 ||
==> 2 || 3366 ||
==> 3 || 1566 ||
==> 4 || 9932 ||
==>


Necisito construir un procedimiento almacenado que tome como parámetro el
CODIGO_PRODUCTO y ejecute una serie de acciones en otras tablas (eso lo
tengo claro).

El problema es como puedo hacer para que el procemiento tome uno a uno los
registros y los procese ? es necesario utilizar cursores ?


Agradezco de antemano su colaboración


Atentamente



LUCHO


Respuesta Responder a este mensaje
#2 Salvador Ramos
02/11/2006 - 22:03 | Informe spam
Hola,

Te recomiendo que sigas los consejos de Javier. Cuentanos que necesitas
hacer exactamente, e intentaremos darte una solución, y si es posible evitar
el uso de cursores.

Un saludo
Salvador Ramos
Murcia - España

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


"lucho" escribió en el mensaje
news:OTP1E2p$
Buenos dias Grupo:

Tengo la siguiente pregunta:


Tengo en una tabla un conjungo de registros como el siguiente:

||
ID || CODIGO_PRODUCTO ||
== ||
1 || 1244 ||
==> 2 || 3366 ||
==> 3 || 1566 ||
==> 4 || 9932 ||
==>


Necisito construir un procedimiento almacenado que tome como parámetro el
CODIGO_PRODUCTO y ejecute una serie de acciones en otras tablas (eso lo
tengo claro).

El problema es como puedo hacer para que el procemiento tome uno a uno los
registros y los procese ? es necesario utilizar cursores ?


Agradezco de antemano su colaboración


Atentamente



LUCHO


Respuesta Responder a este mensaje
#3 lucho
03/11/2006 - 15:39 | Informe spam
Hola:


Muchas gracias a los dos por su interes. Les cuento lo que necesito hacer:

Tengo la tabla que les envie con anterioridad:

||
ID || CODIGO_PRODUCTO ||
== ||
1 || 1244 ||
== 2 || 3366 ||
== 3 || 1566 ||
== 4 || 9932 ||
==
Esta tabla aparece cada dia, dado que hay un procedimiento almacenado
programado que corre todos los dias a las 12 am, y me muestra en este
listado el codigo de los productos que vencen garantias.

Dado que la aplicacion que tengo es bastante inflexible, tengo que hacer la
tarea manualmenete, ingresando los valores en el procedimiento que aparece a
continuacion, el cual primero pasa los productos a una tabla de historicos y
luego hace un cambio para actualizar el producto en la tabla de productos
del cliente.
=ALTER PROCEDURE SP_HISTORICOPRODUCTOSVENCIDOS_VENCIDOS
@CODIGO_PRODUCTO NUMERIC (8)
AS
INSERT INTO HISTORICOPRODUCTOS
SELECT * FROM PRODUCTOSCLIENTES WHERE FECHAFINAL <= GETDATE () AND
CODIGOPRODUCTOCLIENTE = @CODIGO_PRODUCTO

UPDATE PRODUCTOSCLIENTES
SET CODIGOESTADOPRODUCTO = 4
WHERE CODIGOPRDOUCTOCLIENTE = @CODIGO_PRODUCTO


Este procedimiento toma cada uno de los codigos que aparece en la tabla uno
(CODIGO_PRODUCTO) y colocar dicho valor en la variable @CODIGO_PRODUCTO , y
el procedimiento basado en dicho valor, les debe aplicar las instrucciones
que aparecen dentro.

Es lo que necesito.

Agradezco si me puden comentar como puedo hacer esto.

Muchas gracias de antemano


ATTT


LUCHO



"Salvador Ramos" wrote in message
news:u5lvOJs$
Hola,

Te recomiendo que sigas los consejos de Javier. Cuentanos que necesitas
hacer exactamente, e intentaremos darte una solución, y si es posible


evitar
el uso de cursores.

Un saludo
Salvador Ramos
Murcia - España

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


"lucho" escribió en el mensaje
news:OTP1E2p$
> Buenos dias Grupo:
>
> Tengo la siguiente pregunta:
>
>
> Tengo en una tabla un conjungo de registros como el siguiente:
>
> ||
> ID || CODIGO_PRODUCTO ||
> == ||
> 1 || 1244 ||
> ==> > 2 || 3366 ||
> ==> > 3 || 1566 ||
> ==> > 4 || 9932 ||
> ==> >
>
>
> Necisito construir un procedimiento almacenado que tome como parámetro


el
> CODIGO_PRODUCTO y ejecute una serie de acciones en otras tablas (eso lo
> tengo claro).
>
> El problema es como puedo hacer para que el procemiento tome uno a uno


los
> registros y los procese ? es necesario utilizar cursores ?
>
>
> Agradezco de antemano su colaboración
>
>
> Atentamente
>
>
>
> LUCHO
>
>


Respuesta Responder a este mensaje
#4 Javier Loria
03/11/2006 - 17:52 | Informe spam
Hola Lucho:
Que tal algo como esto:
¾GIN TRAN
INSERT INTO HISTORICOPRODUCTOS
SELECT PRODUCTOSCLIENTES.* -- Seria mejor detallas las columnas
FROM PRODUCTOSCLIENTES
JOIN TablaProcedimiento
ON PRODUCTOSCLIENTES.CODIGO_PRODUCTO=TablaProcedimiento.CODIGO_PRODUCTO
WHERE FECHAFINAL <= GETDATE ()
AND CODIGOPRODUCTOCLIENTE = @CODIGO_PRODUCTO

UPDATE PRODUCTOSCLIENTES
SET CODIGOESTADOPRODUCTO = 4
FROM PRODUCTOSCLIENTES
JOIN TablaProcedimiento
ON PRODUCTOSCLIENTES.CODIGO_PRODUCTO=TablaProcedimiento.CODIGO_PRODUCTO

COMMIT TRAN
== Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning
"lucho" wrote in message
news:um5uhW1$
Hola:


Muchas gracias a los dos por su interes. Les cuento lo que necesito hacer:

Tengo la tabla que les envie con anterioridad:

||
ID || CODIGO_PRODUCTO ||
== ||
1 || 1244 ||
==> 2 || 3366 ||
==> 3 || 1566 ||
==> 4 || 9932 ||
==>
Esta tabla aparece cada dia, dado que hay un procedimiento almacenado
programado que corre todos los dias a las 12 am, y me muestra en este
listado el codigo de los productos que vencen garantias.

Dado que la aplicacion que tengo es bastante inflexible, tengo que hacer
la
tarea manualmenete, ingresando los valores en el procedimiento que aparece
a
continuacion, el cual primero pasa los productos a una tabla de historicos
y
luego hace un cambio para actualizar el producto en la tabla de productos
del cliente.
=> ALTER PROCEDURE SP_HISTORICOPRODUCTOSVENCIDOS_VENCIDOS
@CODIGO_PRODUCTO NUMERIC (8)
AS
INSERT INTO HISTORICOPRODUCTOS
SELECT * FROM PRODUCTOSCLIENTES WHERE FECHAFINAL <= GETDATE () AND
CODIGOPRODUCTOCLIENTE = @CODIGO_PRODUCTO

UPDATE PRODUCTOSCLIENTES
SET CODIGOESTADOPRODUCTO = 4
WHERE CODIGOPRDOUCTOCLIENTE = @CODIGO_PRODUCTO

>
Este procedimiento toma cada uno de los codigos que aparece en la tabla
uno
(CODIGO_PRODUCTO) y colocar dicho valor en la variable @CODIGO_PRODUCTO ,
y
el procedimiento basado en dicho valor, les debe aplicar las instrucciones
que aparecen dentro.

Es lo que necesito.

Agradezco si me puden comentar como puedo hacer esto.

Muchas gracias de antemano


ATTT


LUCHO



"Salvador Ramos" wrote in message
news:u5lvOJs$
Hola,

Te recomiendo que sigas los consejos de Javier. Cuentanos que necesitas
hacer exactamente, e intentaremos darte una solución, y si es posible


evitar
el uso de cursores.

Un saludo
Salvador Ramos
Murcia - España

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


"lucho" escribió en el mensaje
news:OTP1E2p$
> Buenos dias Grupo:
>
> Tengo la siguiente pregunta:
>
>
> Tengo en una tabla un conjungo de registros como el siguiente:
>
> ||
> ID || CODIGO_PRODUCTO ||
> == ||
> 1 || 1244 ||
> ==>> > 2 || 3366 ||
> ==>> > 3 || 1566 ||
> ==>> > 4 || 9932 ||
> ==>> >
>
>
> Necisito construir un procedimiento almacenado que tome como parámetro


el
> CODIGO_PRODUCTO y ejecute una serie de acciones en otras tablas (eso lo
> tengo claro).
>
> El problema es como puedo hacer para que el procemiento tome uno a uno


los
> registros y los procese ? es necesario utilizar cursores ?
>
>
> Agradezco de antemano su colaboración
>
>
> Atentamente
>
>
>
> LUCHO
>
>






Respuesta Responder a este mensaje
#5 lucho
07/11/2006 - 17:32 | Informe spam
Muchas gracias Javier:

La idea tuya es buena, y de hecho la aplico; de pronto te pongo otro caso:

Tengo la misma Tabla de Contratos:

||
ID || CODIGO_CONTRATO||
== ||
1 || 1244 ||
== 2 || 3366 ||
== 3 || 1566 ||
== 4 || 9932 ||
==
ahora tengo un procedimiento almacenado que renueva cada contrato, corriendo
el procedimiento de manera manual, metiendo uno a uno estos valores:

=ALTER PROCEDURE SP_HISTORICOCONTRATOS_RENOVACION
@CONTRATO NUMERIC (8)
AS

DECLARE @NUEVOCONTRATO NUMERIC (8)

UPDATE NUMEROSAUTOMATICOS
SET ULTIMONUMERO9 = ULTIMONUMERO9 + 1
WHERE IDENTIFICACIONNUMERADOR = 'CODIGOCONTRATO'

SET @NUEVOCONTRATO = (SELECT ULTIMONUMERO9 FROM NUMEROSAUTOMATICOS
WHERE IDENTIFICACIONNUMERADOR = 'CODIGOCONTRATO')

INSERT INTO HISTORICOCONTRATOSMANTENIMIENTO
SELECT * FROM CONTRATOSMANTENIMIENTO WHERE CODIGOCONTRATO = @CONTRATO

INSERT INTO HISTORICOPRODUCTOSCONTRATOS
SELECT * FROM PRODUCTOSCONTRATOS WHERE CODIGOCONTRATO = @CONTRATO

UPDATE HISTORICOCONTRATOSMANTENIMIENTO
SET CODIGOESTADOCONTRATO = 4 --ESTADO TERMINADO
WHERE CODIGOCONTRATO = @CONTRATO

UPDATE CONTRATOSMANTENIMIENTO
SET CODIGOCONTRATO = @NUEVOCONTRATO
WHERE CODIGOCONTRATO = @CONTRATO
UPDATE CONTRATOSMANTENIMIENTO
SET FECHAINICIALCONTRATO = DATEADD(YEAR,1,FECHAINICIALCONTRATO),
FECHAFINALCONTRATO = DATEADD(YEAR,1,FECHAFINALCONTRATO),
CODIGOESTADOCONTRATO = 0
WHERE CODIGOCONTRATO = @NUEVOCONTRATO

con el nuevo número
UPDATE PRODUCTOSCONTRATOS
SET CODIGOCONTRATO = @NUEVOCONTRATO
WHERE CODIGOCONTRATO = @CONTRATO
UPDATE PRODUCTOSCONTRATOS
SET FECHAINICIALPRODUCTOCONTRATO DATEADD(YEAR,1,FECHAINICIALPRODUCTOCONTRATO), FECHAFINALPRODUCTOCONTRATO DATEADD(YEAR,1,FECHAFINALPRODUCTOCONTRATO)
WHERE CODIGOCONTRATO = @NUEVOCONTRATO

su vigencia
UPDATE PRODUCTOSCLIENTES
SET FECHAINICIALVINCULO = DATEADD(YEAR,1,FECHAINICIALVINCULO),
FECHAFINALVINCULO = DATEADD(YEAR,1,FECHAFINALVINCULO), CODIGOVINCULOTIPO @NUEVOCONTRATO, CODIGOESTADOVINCULO = 1
WHERE CODIGOVINCULOTIPO = @CONTRATO

Como veras es un poquito grande.

Ahora, lo que necesito es que la variable @CONTRATO tome cada uno de los
registros de la primera tabla y corra ( con este procedimiento renuevo un
contrato de un cliente ); al final me debe generar 4 contratos.

El procedimiento funciona bien, pero me falta la parte de tomar cada
registro y realizar el proceso.


Este caso de pronto debí enviarlo desde el principio, motivo por el cual
pido disculpas; es un ejemplo mas exacto de lo que necesito.

Javier nuevamente Agradezco tu colaboración


ATTT


LUCHO


"Javier Loria" wrote in message
news:%23ef43h2$
Hola Lucho:
Que tal algo como esto:
=> BEGIN TRAN
INSERT INTO HISTORICOPRODUCTOS
SELECT PRODUCTOSCLIENTES.* -- Seria mejor detallas las columnas
FROM PRODUCTOSCLIENTES
JOIN TablaProcedimiento
ON PRODUCTOSCLIENTES.CODIGO_PRODUCTO=TablaProcedimiento.CODIGO_PRODUCTO
WHERE FECHAFINAL <= GETDATE ()
AND CODIGOPRODUCTOCLIENTE = @CODIGO_PRODUCTO

UPDATE PRODUCTOSCLIENTES
SET CODIGOESTADOPRODUCTO = 4
FROM PRODUCTOSCLIENTES
JOIN TablaProcedimiento
ON PRODUCTOSCLIENTES.CODIGO_PRODUCTO=TablaProcedimiento.CODIGO_PRODUCTO

COMMIT TRAN
==> Saludos,

Javier Loria
Costa Rica-MVP
Solid Quality Learning
"lucho" wrote in message
news:um5uhW1$
> Hola:
>
>
> Muchas gracias a los dos por su interes. Les cuento lo que necesito


hacer:
>
> Tengo la tabla que les envie con anterioridad:
>
> ||
> ID || CODIGO_PRODUCTO ||
> == ||
> 1 || 1244 ||
> ==> > 2 || 3366 ||
> ==> > 3 || 1566 ||
> ==> > 4 || 9932 ||
> ==> >
> Esta tabla aparece cada dia, dado que hay un procedimiento almacenado
> programado que corre todos los dias a las 12 am, y me muestra en este
> listado el codigo de los productos que vencen garantias.
>
> Dado que la aplicacion que tengo es bastante inflexible, tengo que hacer
> la
> tarea manualmenete, ingresando los valores en el procedimiento que


aparece
> a
> continuacion, el cual primero pasa los productos a una tabla de


historicos
> y
> luego hace un cambio para actualizar el producto en la tabla de


productos
> del cliente.
> => > ALTER PROCEDURE SP_HISTORICOPRODUCTOSVENCIDOS_VENCIDOS
> @CODIGO_PRODUCTO NUMERIC (8)
> AS
> INSERT INTO HISTORICOPRODUCTOS
> SELECT * FROM PRODUCTOSCLIENTES WHERE FECHAFINAL <= GETDATE () AND
> CODIGOPRODUCTOCLIENTE = @CODIGO_PRODUCTO
>
> UPDATE PRODUCTOSCLIENTES
> SET CODIGOESTADOPRODUCTO = 4
> WHERE CODIGOPRDOUCTOCLIENTE = @CODIGO_PRODUCTO
>
> > >
> Este procedimiento toma cada uno de los codigos que aparece en la tabla
> uno
> (CODIGO_PRODUCTO) y colocar dicho valor en la variable @CODIGO_PRODUCTO


,
> y
> el procedimiento basado en dicho valor, les debe aplicar las


instrucciones
> que aparecen dentro.
>
> Es lo que necesito.
>
> Agradezco si me puden comentar como puedo hacer esto.
>
> Muchas gracias de antemano
>
>
> ATTT
>
>
> LUCHO
>
>
>
> "Salvador Ramos" wrote in message
> news:u5lvOJs$
>> Hola,
>>
>> Te recomiendo que sigas los consejos de Javier. Cuentanos que necesitas
>> hacer exactamente, e intentaremos darte una solución, y si es posible
> evitar
>> el uso de cursores.
>>
>> Un saludo
>> Salvador Ramos
>> Murcia - España
>>
>> [Microsoft MVP SQL Server]
>> www.helpdna.net (información sobre SQL Server y .NET)
>>
>>
>> "lucho" escribió en el mensaje
>> news:OTP1E2p$
>> > Buenos dias Grupo:
>> >
>> > Tengo la siguiente pregunta:
>> >
>> >
>> > Tengo en una tabla un conjungo de registros como el siguiente:
>> >
>> > ||
>> > ID || CODIGO_PRODUCTO ||
>> > == ||
>> > 1 || 1244 ||
>> > ==> >> > 2 || 3366 ||
>> > ==> >> > 3 || 1566 ||
>> > ==> >> > 4 || 9932 ||
>> > ==> >> >
>> >
>> >
>> > Necisito construir un procedimiento almacenado que tome como


parámetro
> el
>> > CODIGO_PRODUCTO y ejecute una serie de acciones en otras tablas (eso


lo
>> > tengo claro).
>> >
>> > El problema es como puedo hacer para que el procemiento tome uno a


uno
> los
>> > registros y los procese ? es necesario utilizar cursores ?
>> >
>> >
>> > Agradezco de antemano su colaboración
>> >
>> >
>> > Atentamente
>> >
>> >
>> >
>> > LUCHO
>> >
>> >
>>
>>
>
>


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida