Skip to Content
0

Stored Procedure con dos cursores

Oct 17, 2017 at 06:27 PM

33

avatar image
Former Member

Buenas tardes tengan todos, mi problemática es la siguiente:
Intento hacer un SP que valide que el pedido de entradas de mercancías tenga los mismos artículos y cantidades que su pedido base, por lo tanto estoy intentando hacer el siguiente SP:

IF @object_type = '20' and @transaction_type in ('A','U')
BEGIN
DECLARE @itemENTnvarchar(20), @itemPEDnvarchar(20), @cantENTfloat(2), @cantPEDfloat(2), @DocBasenvarchar(19);

SET @DocBase = (SELECT ISNULL(T4.[BaseRef],'-1') FROM OPDN T3 INNER JOIN PDN1 T4 ON T3.[DocEntry] = T4.[DocEntry] WHERE T3.[DocNum] = @list_of_cols_val_tab_del)

DECLARE pedido CURSOR FOR (SELECT T1.ItemCode, T1.Quantity FROM OPOR T0 INNER JOIN POR1 T1 ON T0.DocEntry = T1.DocEntry WHERE T0.DocNum = @DocBase);

DECLARE entrada CURSOR FOR (SELECT T1.[ItemCode], T1.[Quantity] FROM OPDN T0 INNER JOIN PDN1 T1 ON T0.[DocEntry] = T1.[DocEntry] WHERE T0.[DocNum] = @list_of_cols_val_tab_del);

OPEN entrada
OPEN pedido

FETCH NEXT FROM entrada INTO @itemENT, @cantENT
WHILE (@@FETCH_STATUS = 0)
BEGIN
IF((@itemPED <> @itemENT) OR (@cantPED <> @cantENT))
BEGIN
SET @error=102;
SET @error_message='EL ARTICULO ' + @itemENT + ' DIFIERE EN RELACION CON EL PEDIDO.';
BREAK
END
else
FETCH NEXT FROM entrada INTO @itemENT, @cantENT
FETCH NEXT FROM pedido INTO @itemPED, @cantPED
END
CLOSE pedido;
CLOSE entrada;
DEALLOCATE pedido;
DEALLOCATE entrada;
END--FIN

El SP funciona cuando trabajo en el pedido y entrega con un solo artículo, pero al incluir mas de uno es donde viene el problema, aparece el siguiente error:

Subquery returned more than 1 value. This is not permitted when the subquery follows =,!=,<,<=,>,>= or when the subquery is used as an expression. (CINF).

Espero que alguien pueda ayudarme ya que llevo un buen rato sin poder solventarlo y no he conseguido respuesta en ningún foro.

De antemano gracias por sus comentarios, saludos.

Versión SAP 9.1 PL 07.
Versión SQL Server 2014.

10 |10000 characters needed characters left characters exceeded
* Please Login or Register to Answer, Follow or Comment.

1 Answer

DIEGO LOTHER Oct 17, 2017 at 09:35 PM
0

Hola Jhosser,

Esto sucede porque la siguiente declaración devolverá más de una línea cuando su documento tenga más de una línea, luego intente asignar múltiples valores a una única variable. Este es el motivo del error.

SET @DocBase = (SELECT ISNULL(T4.[BaseRef],'-1') FROM OPDN T3 INNER JOIN PDN1 T4 ON T3.[DocEntry] = T4.[DocEntry] WHERE T3.[DocNum] = @list_of_cols_val_tab_del) 

Acerca de su validación, creo que puede alcanzar su propósito sin usar cursores

Creo que esta lógica debe adaptarse a su propósito:

IF (@transaction_type IN ('A', 'U') AND @object_type = '20')
BEGIN
	
	IF (SELECT COUNT(*) FROM PDN1 WHERE DocEntry = @list_of_cols_val_tab_del AND (BaseType = -1 OR CASE WHEN BaseType <> -1 THEN Quantity ELSE BaseQty END <> BaseQty)) > 0
	BEGIN
		SET @error = '-10'
		SET @error_message = 'error description'
	END
END

Espero que ayude.

Atte,

Diego Lother

Show 3 Share
10 |10000 characters needed characters left characters exceeded
Former Member

Hola Diego, muchas gracias por tu comentario. Lamentablemente ya no estoy en la oficina para realizar la prueba, pero mañana a primera hora lo intentaré y te comento como ve fue.

De nuevo gracias.

0
Former Member

Buenos días Diego.

El SP que me pasaste funciona, sin embargo, si en el pedido tengo 4 artículos y en la entrega tengo 3 me permite guardarla y esto no debería suceder.

Ahora con respecto a los cursores, le coloqué un DISTINCT y me funciona correctamente, muchas gracias.

Si tienes alguna forma mas sencilla para validar que sea la misma cantidad de artículos y que todos los artículos sean iguales y con la misma cantidad te lo agradecería.

Saludos.

0

Hola Jhosser,

Una muestra para ajustarse a sus necesidades:

IF (@transaction_type IN ('A', 'U') AND @object_type = '20')
BEGIN
	IF (SELECT COUNT(*) FROM PDN1 WHERE DocEntry = @list_of_cols_val_tab_del AND (BaseType = -1 OR CASE WHEN BaseType <> -1 THEN Quantity ELSE BaseQty END <> BaseQty)) > 0
	BEGIN
		SET @error = '-10'
		SET @error_message = 'error description'
	END


	IF (SELECT COUNT(DocEntry) FROM PDN1 WHERE DocEntry = @list_of_cols_val_tab_del AND BaseType = 22) <> 
	   (SELECT COUNT(DocEntry) FROM POR1 WHERE DocEntry IN (SELECT DISTINCT BaseEntry FROM PDN1 WHERE DocEntry = @list_of_cols_val_tab_del AND BaseType = 22))
	BEGIN
		SET @error = '-11'
		SET @error_message = 'All items of purchase order should be copied'
	END
END

Espero que ayude.

Atte,

Diego Lother

0