Consulta sobre Stored Procedures

SQL, mySQL, postgreSQL y otros motores
Responder
SDigitales
Novato
Mensajes: 26
Registrado: Mar Feb 08, 2011 2:50 pm
Contactar:

Consulta sobre Stored Procedures

Mensaje por SDigitales » Mié Oct 19, 2011 8:57 pm

Hola..
Estoy empezando con Stored Procedures (de hecho, estos son los primeros que hago), y me encuentro en dificultades... (pueden haber visto los post en el foro de softvelocity)

El tema es el siguiente...
(Uso C63 y MSSQL Express 2005)
Tengo que hacer un SP para actualizar STOCK. Tengo que recorrer la tabla MovimientosStock por Fecha y Hora, para un articulo en particular.
Durante la recorrida, calcular y actualizar el campo stock, en funcion del tipo de concepto que corresponda al movimiento (E/S)
El SP que hice, si lo invoco como Query desde el motor, anda perfecto.
El problema se dá cuando lo llamo desde una APP clarion. EN este caso, solo recorre unos pocos registros (actualizandolos), e ignora el resto.

Adjunto el SP:

Código: Seleccionar todo

USE [Pierabella]
GO
/****** Objeto:  StoredProcedure [dbo].[RecalculoStockArticulo]    Fecha de la secuencia de comandos: 10/19/2011 17:55:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Description:	RecalculoStockArticulo
-- =============================================
ALTER PROCEDURE [dbo].[RecalculoStockArticulo]
@CodArticulo AS Int
AS
BEGIN
	SET NOCOUNT ON
	DECLARE @xStock_Normal AS Decimal(13,2)
	DECLARE @Resultado Varchar(10)
	DECLARE @Error Int
	DECLARE @Contador Int
	DECLARE @ErrorVar INT
    DECLARE @RowCountVar INT
	SET @Resultado = 'Error'
	set @xStock_Normal = 0
	set @Contador = 0
	set @Error = 0

	DELETE FROM StupidTable
	UPDATE StupidTable SET C1 = '--', C2 = '--', C3 = '--';
	UPDATE MovimientosStock SET Stock_Normal = 0 WHERE Cod_Articulo = @CodArticulo;
	DECLARE cursor1 CURSOR LOCAL SCROLL_LOCKS FOR 
			SELECT Cod_Concepto,Cantidad_Un,Stock_Normal
			FROM MovimientosStock Where Cod_Articulo = @CodArticulo AND Devolucion = 0 Order By Cod_Articulo, Fecha, Hora FOR UPDATE;
	OPEN cursor1;
	WHILE (@Error = 0)
	BEGIN 
		FETCH NEXT FROM cursor1 ;
		IF (@@fetch_status = 0)
		BEGIN
			UPDATE MovimientosStock SET Stock_Normal = dbo.CalculaStock(@xStock_Normal,Cantidad_Un,(SELECT TipoConcepto FROM ConceptosMovStock WHERE ConceptosMovStock.Cod_Concepto = MovimientosStock.Cod_Concepto)) WHERE CURRENT OF cursor1;
			UPDATE MovimientosStock SET @xStock_Normal = Stock_Normal WHERE CURRENT OF cursor1;
			SET @Contador = @Contador + 1;
			set @Error = @@Error;
			IF @Error <> 0
			BEGIN
				BREAK;
			END
		END
		ELSE
		BEGIN
			BREAK;
		END
	END
	CLOSE cursor1;
	DEALLOCATE cursor1;
	UPDATE Articulos SET Stock_Unidades = @xStock_Normal WHERE Cod_Articulo = @CodArticulo;
	If @Error = 0
		begin
			Set @Resultado = 'Ok';
		END
	UPDATE StupidTable SET C1 = @Resultado, C2 = @Error, C3 = @Contador;
	Return @Contador;
END
y asi lo invoco desde el app clarion (incluyo todo el codigo)

Código: Seleccionar todo

    DO OpenFiles
    !
    LOC:Cod_Articulo = Codigo
    StupidTable{PROP:SQL} = 'CALL RecalculoStockArticulo(' & LOC:Cod_Articulo & ')'
    if errorcode()=90 then message(fileerror()).
    next(StupidTable)
    IF ErrorCode()
        Message('MovimientosStock (SQL) - Error al Correr el Query = ' & FileError() & ' - ' & ErrorCode())
        DebugOut(StupidTable{PROP:SQL})
    ELSE
        Message(SQL:C1)
    END

    !
    DO CloseFiles
Probe distintas formas de invocarlo, pero siempre hace lo mismo.
Agradezco cualquier ayuda!!!
Muchas gracias..
Saludos...


SDigitales
Novato
Mensajes: 26
Registrado: Mar Feb 08, 2011 2:50 pm
Contactar:

Re: Consulta sobre Stored Procedures (SOLUCIONADO)

Mensaje por SDigitales » Lun Oct 24, 2011 3:22 pm

Hola...
Pude hacerlo andar.
Posteo el SP y la rutina de llamada, para que quede para el que lo necesite...

Stored Procedure

Código: Seleccionar todo

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ProcesoStock]
@CodArticulo AS Int
AS
BEGIN
	DECLARE @xStock_Normal AS Decimal(13,2);
	DECLARE @xStock_Devolucion AS Decimal(13,2);
    SET NOCOUNT ON;
	set @xStock_Normal = 0;
	set @xStock_Devolucion = 0;
  	Update MovimientosStock SET Stock_Normal = 0 Where Cod_Articulo = @CodArticulo;
	CREATE TABLE #Actualizar (Cod_MovStock Int, MSTCod_Articulo Int, MSTCantidad_Un Decimal(13,2),MSTDevolucion TinyInt, MSTStock_Normal Decimal(13,2), MSTStock_Devolucion Decimal(13,2), CMSTipoConcepto Char(1), CMSCod_Concepto Int)
	INSERT INTO #Actualizar SELECT mst.Cod_MovStock, mst.Cod_Articulo, mst.Cantidad_Un, mst.Devolucion, mst.Stock_Normal, mst.Stock_Devolucion, cms.TipoConcepto, mst.Cod_Concepto 
		   FROM MovimientosStock AS mst 
		   INNER JOIN ConceptosMovStock AS cms ON cms.Cod_Concepto = mst.Cod_Concepto 
		   Where Cod_Articulo = @CodArticulo
		   ORDER By mst.Cod_Articulo,mst.Fecha,mst.Hora			
	Update #Actualizar SET @xStock_Normal = dbo.CalculaStock(@xStock_Normal,MSTCantidad_Un,CMSTipoConcepto), MSTStock_Normal = @xStock_Normal Where MSTDevolucion = 0
	Update #Actualizar SET @xStock_Devolucion = dbo.CalculaStockDevolucion(@xStock_Devolucion,MSTCantidad_Un,MSTDevolucion), MSTStock_Devolucion = @xStock_Devolucion  Where MSTDevolucion = 1
	UPDATE MovimientosStock SET Stock_Normal = (SELECT MSTStock_Normal FROM #Actualizar WHERE #Actualizar.Cod_MovStock = MovimientosStock.Cod_MovStock), Stock_Devolucion = (SELECT MSTStock_Devolucion FROM #Actualizar WHERE #Actualizar.Cod_MovStock = MovimientosStock.Cod_MovStock) 
		WHERE Cod_Articulo = @CodArticulo;
	UPDATE Articulos SET Stock_Unidades = @xStock_Normal, Stock_Devolucion = @xStock_Devolucion WHERE Cod_Articulo = @CodArticulo;
END
Llamada Clarion:

Código: Seleccionar todo

    DO OpenFiles
    !
    LOC:Cod_Articulo = Codigo
    StupidTable{PROP:SQL} = 'CALL ProcesoStock(' & LOC:Cod_Articulo & ')'
    IF ErrorCode()
        Message('MovimientosStock (SQL) - Error al Correr el Query = ' & FileError() & ' - ' & ErrorCode())
        DebugOut(StupidTable{PROP:SQL})
    END
    !
    DO CloseFiles
Muchas gracias a todos!!!
Saludos...

Adrián E. Santarelli
Soluciones Digitales
Pueyrredon 935
(2630) - Firmat - Santa Fe - R. Argentina
Tel./Fax: 03465-420494
email: asantarelli@sdigitales.com.ar
Web: http://www.sdigitales.com.ar
ICQ: 75886755
MSN: bcrcaes@hotmail.com
Yahoo: s_digitales
Google: bcrcaes@gmail.com

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados