SQL - Ayuda con un query

 
Vista:

Ayuda con un query

Publicado por ayuda con un query (42 intervenciones) el 16/06/2008 20:07:05
Hola Amigos, tengo dos tablas en sql una se llama detalle y la otra Movimientos, necesito sacar una consulta de movimientos e ir recorriendo los registros de esa consulta para que los parametros creados en este procedimeinto almacenado tomen los valores de cada registro de la consulta, y luego realice todo lo definido en este procedimiento almacenado¡¡¡
Como hago¿¿¿¿¿por favor ayudenme


CREATE PROCEDURE CARGA --Procedimiento almacenado para cargar el inventario
--Declaracion de parametros

@Pcod_orden Char(6),
@Pcod_producto char(4),
@Pcodigo_unidad char(3),
@Pprecio money,
@Pcanti money

AS

If exists(select * from movimientos where cod_orden=@Pcod_orden and codigo_p=@Pcod_producto and cod_unidad=@Pcodigo_unidad and precio_uni=@Pprecio)
begin
update movimientos
set existencia = existencia+@Pcanti where cod_orden=@Pcod_orden and codigo_p=@Pcod_producto and cod_unidad=@Pcodigo_unidad and precio_uni=@Pprecio
end
else if exists(select * from movimientos where cod_orden=@Pcod_orden and codigo_p=@Pcod_producto and( cod_unidad<>@Pcodigo_unidad or precio_uni<>@Pprecio))
begin
Insert into movimientos (cod_orden,codigo_p,cod_unidad,precio_uni,existencia) values ( @Pcod_orden,@Pcod_producto,@Pcodigo_unidad,@Pprecio,@Pcanti)
end
GO
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con un query

Publicado por pacopaz (143 intervenciones) el 16/06/2008 21:21:22
necesitas algo como esto:

CREATE PROCEDURE [Nombre]

AS

Declare
@vcod_orden Char(6),
@vcod_producto char(4),
@vcodigo_unidad char(3),
@vprecio money,
@vcanti money

Declare crDetalle Cursor For
select cod_orden, cod_producto, codigo_unidad, precio, canti
from Detalles

Fetch Next From crDetalle
Into @vcod_orden, @vcod_producto, @vcodigo_unidad, @vprecio, @vcanti

While @@Fetch_Status = 0
begin
exec carga(@vcod_orden, @vcod_producto, @vcodigo_unidad, @vprecio, @vcanti)
Fetch Next From crDetalle
Into @vcod_orden, @vcod_producto, @vcodigo_unidad, @vprecio, @vcanti
end

Close crDetalle
Deallocate crDetalle

GO

No lo he probado, por obvias razones (no tengo las tablas, ni la base de datos, ni los datos), pero es algo así lo que debes hacer, toda vez que ya tienes el sp de carga.

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con un query

Publicado por pacopaz (143 intervenciones) el 16/06/2008 21:22:00
Por cierto, no hace falta hacer spam para recibir una respuesta.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con un query

Publicado por Beatriz (42 intervenciones) el 16/06/2008 22:32:40
Hola PAco¡¡¡soy principiante de sql¡¡¡no te entiendo cuando me dices que no hace falta hacer spam???me explicas por favor¡¡¡voy a intentar programar otro sp....donde creo el cursor..y desde el cursor llamo al procedimeinto almacenado que es el que me hace la carga al inventario ..asi es verdad¡¡¡
atte Beatriz
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con un query

Publicado por pacopaz (143 intervenciones) el 16/06/2008 22:51:09
Así es, crear el sp para el cursor y que este mande llamar al otro sp es lo que te propongo.
Ahora, lo del spam, es por que no hace falta abrir 3 hilos para recibir una respuesta. Entenderás que los que aquí ofrecemos (y pedimos) ayuda no podemos estar todo el tiempo al pendiente de todas las preguntas.
Por esto, espero que para la próxima tengas un poquito más de paciencia, sobre todo, para no llenar el foro con temas repetidos y con requerimientos que pueden solucionarse en un solo hilo.
Entiendo que tengas la urgencia de resolverlo, pero no hace falta Esto de pedir 3 veces la misma ayuda en 3 hilos distintos.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con un query

Publicado por Beatriz (42 intervenciones) el 16/06/2008 23:16:59
Ah ok, ya te entendi¡¡¡¡bueno...lo tomaré en cuenta y muchas gracias por tu amabilidad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Me funciono

Publicado por Beatriz (42 intervenciones) el 17/06/2008 18:08:21
Hola Paco....te quiero decir que tu respuesta me fue de gran ayuda¡¡¡funciona¡¡¡¡¡SOLO que creo que el cursor me cambio algunos datos de mi tabla detalle?????COMO PUEDO HACER PARA QUE ESTE CURSOR ME ALOJE LA CONSULTA PERO QUE SOLO SEA DE LECTURA YA QUE EN MI TABLA DETALLE NO TENGO QUE MODIFICAR NINGUN DATO¡¡
muchas gracias experto
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me funciono

Publicado por pacopaz (143 intervenciones) el 17/06/2008 19:34:35
Hola Bety (puedo?)
Por que crees que te cambia datos el cursor?
Lo pregunto por que nunca me ha pasado, pero también debo aclarar que las variables a las que inserto los datos del registro no son las variables donde hago calculos para luego hacer inserts o updates.
Si necesitas hacer cálculos a los campos que te trae el cursor, es mejor que hagas variables nuevas. Si, suena a muchas variables, pero es preferible.
En todo caso, lo que puedes hacer, para que sea Read Only, debes hacerlo de forma explícita.
Según la sintaxis de T-SQL debes hacer esto:

Declare [Nombre] cursor local read_only
for
select...

el 'local' es para que el cursor sólo pueda tener efecto dentro del store procedure en que se declaro y el 'read_only' hace que no se pueda modificar ningún valor en el cursor.

Espero que te sirva. Y no grites :-P

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me funciono

Publicado por Beatriz (42 intervenciones) el 17/06/2008 19:51:05
jajajajaja¡¡¡claro que si puedes llamarme Betty¡¡¡y perdon por el uso de las Mayusculas¡¡¡pero me has salvado mi trabajo¡¡¡Mil gracias Paco¡¡
Atte Beatriz
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me funciono

Publicado por pacopaz (143 intervenciones) el 17/06/2008 21:02:17
Pues me dá mucho gusto por ti, Bety.
No más una consideración: Utiliza los cursores lo menos posible. Son útiles en muchos casos, pero no para todos.
Lo que me gusta es que buscas la solución al tratamiento de datos en el servidor (como debe ser) y no en el aplicativo (que genera tráfico, es más lenta la imlementación y un largo etc).
Como sea, cualquier cosa, no dudes en preguntar.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me funciono

Publicado por Isaias (5072 intervenciones) el 18/06/2008 22:22:00
Sobre todo tomar en cuenta que el 99% de las cosas que se hacen con CURSORES se pueden hacer con T-SQL y que los cursores se crean en memoria, por tanto, depediendo del tamaño del cursor, afecta en el rendimiento del servidor, al grado, de que puede llegar a "tirarlo".

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Para isaias

Publicado por Beatriz (42 intervenciones) el 19/06/2008 20:48:27
Pero entonces Isaias???que opcion me propones utilizando transacc para recorrer los valores de una consulta, para no utilizar los cursores???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Para isaias

Publicado por Isaias (5072 intervenciones) el 20/06/2008 00:02:48
Hay muchas formas de hacerlo, por ejemplo, con tablas temporales (2000) y CTE (2005).

Insisto, todo depende de lo que deseas hacer.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Para isaias

Publicado por pacopaz (143 intervenciones) el 20/06/2008 01:08:04
Lo que se me ocurre, para este caso, usando tablas temporales, sería (en seudocódigo):

- Crear una tabla temporal, cuya primera columna sea un identity y los demás, los campos que deseas mandar al sp.
- Luego, hacer un insert into... select, a la tabla, sólo con los campos a mandar.
- Luego, hacer un query para obtener el número máximo de la primera columna (identity) de la tabla.
- Hacer un ciclo con el valor obtenido del query anterior donde:
-- Haga un select into a la tabla temporal, aprovechando el campo identity para hacer la búsqueda secuencial, para obtener los campos a ingresar al sp
-- Mandar llamar al sp los camos obtenidos en el query anterior.
- Cerrar el ciclo.
- Borrar y tirar la tabla temporal.

Es lento (bastante más lento que el cursor, según mi experiencia), pero funciona. No pongo el código, por que sería un buen ejecicio para que lo practicaras y además, a fuerza de ser franco, me da flojera hacerlo.

Lo que te puedo decir es que no se trata de satanizar a los cursores. Digo, el SQL Server 2000, venía con más de 200 cursores en su implementación de fábrica y la versión 2005 con más de 100, así que no dejan de ser una buena herramienta para hacer cosas.
La versión 2005 introduce las variables tipo TABLE como la gran novedad, pero hacen uso de memoria (y no del tempdb), así que tampoco es el gran miedo utilizar memoria. La diferencia, en todo caso es que las variables TABLE son eliminadas de la memoria una vez que se sale del sp, mientras que los cursores necesitan del deallocate para salir.
Además, las tablas temporales, toda vez que se almacenan en el tempdb, o sea, en disco duro, implementan mucho I/O en disco duro para su ejecución, aúnque dicha implementación es mucho más limpia que la utilización de memoria. El problema es que pueden llegar a bloquear registros en tu base de datos, mientras se ejecuta lo que sea en ellas, en su relación con las tablas de tu propia base de datos, así que pueden hacer el acceso, para otros usuarios que buscan la misma información, lenta, mientras desbloquea estos registros.
Pros y contras hay en cualquiera de las implementaciones. Un buen DBA (cosa que no soy) sabrá como sacar partido de ello y encontrar la mejor respuesta para solucionar cualquier cosa.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Gracias

Publicado por Beatriz (42 intervenciones) el 20/06/2008 18:37:46
Excelente paquito¡¡¡y lo que te puedo decir es que la aplicaccion que estoy desarrollando en un sistema de inventario y hasta ahora solo he tenido la necesidad de utilizar un cursor¡¡¡no creo que por ese bendito cursor se me quede la aplicacion¡¡¡bueno la verdad no se que causaria el uso de ese cursor,
Mil gracias a ambos¡¡
Atte beatriz¡¡¡
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Gracias

Publicado por Isaias (5072 intervenciones) el 21/06/2008 15:10:52
Creo que (insistiendo) quien deberia sumar o restar tus inventarios es el store que hace el INSERT de tus partidas de tus factuas (documentos).

De esa forma te aseguras que esta dentro de la misma transaccion.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

hola Isaias¡¡¡

Publicado por Beatriz (42 intervenciones) el 23/06/2008 21:11:15
Hola isaias¡¡¡¡muchas gracias por tu observacion, la verdad no lo hago en el mismo sp..ya que la carga al inventario es un proceso que administrativamente se maneja hasta después que se ha creado una orden de compra, que es el detalle de los productos que se han solictado a determinado proveedor, hasta que los productos entran fisicamente al inventario fisico es que los debo cargar al inventario de la base¡¡¡
Esa es la causa del porque los cargo despues y en un sp aparte¡¡
Saludos atte Beatrzi
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:hola Isaias¡¡¡

Publicado por Isaias (5072 intervenciones) el 23/06/2008 22:36:41
entonces debes hacerlo al momento del registro de la ENTRADA del material.

Estoy de acuerdo que coloques una ORDEN DE COMPRA, esta se queda en espera hasta la recepcion del material, cuando este se SURTE por parte del proveedor, deberas hacer un REGISTRO DE ENTRADA al alamacen, en ese preciso momento y solo lo que esta entrando, deberas SUMARLO a tu inventario.

¿Cierto?

(Creo que ya le dimos mucho tiempo a esta posta)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar