Skip to Content
avatar image
Former Member

Stored Procedure con dos cursores

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.

Add comment
10|10000 characters needed characters exceeded

  • Get RSS Feed

1 Answer

  • Oct 17, 2017 at 09:35 PM

    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

    Add comment
    10|10000 characters needed characters exceeded

    • 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