cancel
Showing results for 
Search instead for 
Did you mean: 

consulta con WHILE

former_member220991
Participant
0 Kudos

buenas tardes foro estoy realizando la siguiente consulta donde esto ocupando un WHILE que me regresa los renglones según las cantidades

WHILE @i <= (select B.Quantity/B.PackQty from ORDR A INNER JOIN RDR1 B on A.DocEntry = B.DocEntry where A.DocNum = 3828)

      BEGIN;

            IF (@i%1000!=0)

                  PRINT @i

            SET @i=@i+1;

      END;

todo jala bien solo cuando mi orden de compra es de una linea cuando es de dos me marca error como puedo resolver esta situación?

Subconsulta devuelve más de 1 valor. Esto no está permitido cuando la subconsulta sigue =! =, <, <=,>,> = O cuando se utiliza la subconsulta como una expresión.

Accepted Solutions (0)

Answers (3)

Answers (3)

former_member220991
Participant
0 Kudos

encontré esto pero no entiendo muy bien

Printing multiple labels based on a quantity field | SCN

de crear la tabla etc.

former_member220991
Participant
0 Kudos

tengo algo asi

SELECT B.packQty,B.Quantity,B.Itemcode,B.Quantity/B.packQty
FROM RDR1 B
CROSS JOIN ORDR A
WHERE Itemcode='AA116243-5000' and A.DocNum = 3828 --Aqui en teoria deberias establecer tu campo llave unica
AND B.Quantity/B.packQty<= (CASE WHEN B.Quantity=1 THEN B.Quantity-1
   ELSE(B.Quantity)
END)

y tengo esta también

/***************** cosnulta temporal*/

-- Crear tabla temporal con los valores actuales del campo EnEjecucion

-- eliminando si existe

IF OBJECT_ID( N'tempdb..#ProyectoEnejecucionEstado') IS NOT NULL

DROP TABLE #ProyectoEnejecucionEstado;

GO

-- creando la tabla temporal

CREATE TABLE #ProyectoEnejecucionEstado (

PoID INT,

  DocNum CHAR(1000),

  packQty CHAR(1000),

  Itemcode VARCHAR(25)

);

GO

-- insertando los datos actuales de la tabla proyecto

INSERT INTO #ProyectoEnejecucionEstado(DocNum,packQty,Itemcode)

SELECT A.DocNum,B.packQty,B.Itemcode

FROM ORDR A INNER JOIN RDR1 B on A.DocEntry = B.DocEntry

             WHERE

                 A.DocNum = 3828

GO

-- comprobando

SELECT * FROM #ProyectoEnejecucionEstado

GO

pero me regresa lo mismo

former_member220991
Participant
0 Kudos

buenos días ya le realice unas correcciones y ya no me marca error pero no me devuelve datos solo me dice que se ejecuto con éxito?

DECLARE @ORDEN INT,

        @i INT = 0

DECLARE CR_1 CURSOR

     FOR select B.Quantity/B.PackQty from RDR1 B

OPEN CR_1

FETCH CR_1 INTO @ORDEN

WHILE @@FETCH_STATUS = 0

BEGIN

        IF (@i%1000!=0)

                  PRINT @i

  FETCH CR_1 INTO @ORDEN

END

CLOSE CR_1

Former Member
0 Kudos

Así es, ya que todo lo estas mandando a la Consola de SQL, deberías verlos en la pestaña de Messages de los resultados.

Otra cosa que podrías hacer seria que en la sentencia del PRINT @i poder remplazarla por un SELECT o insertarlo en una variable tipo tabla y al final del cursor realizar un select *, así ya lo mostraría en la pestaña de Resultados.

Saludos

former_member220991
Participant
0 Kudos

como seria ese codigo

Former Member
0 Kudos

En si que es lo que necesitas?, solo obtener las cantidades ....

former_member220991
Participant
0 Kudos

es que estoy imprimiendo unas etiquetas y documentos de compra.

tengo mi orden de compra

con esta consulta

select A.CardName,A.DocNum,A.DocDate,A.DocDueDate,

B.ItemCode,B.Dscription,B.U_RI,B.U_RSG_OC,B.U_Ln,B.U_DL,B.Quantity,

B.UnitMsr,B.U_DD,B.U_VN,B.U_PL,B.U_BU,B.PackQty,B.U_SI,B.Project,B.U_DS,B.U_Sl,B.price,B.U_FC,

B.U_OR,B.U_Ventana,B.Quantity/B.PackQty

from ORDR A INNER JOIN RDR1 B on A.DocEntry = B.DocEntry

después la paso a mi CRYSTAL y hay quiero que me imprima el numero de documentos que me da el valor de B.Quantity/B.PackQty

ejemplo si el valor de B.Quantity/B.PackQty  = 3 ,quiero que me imprima 3 documentos numerados

1

2

3

si el valor de B.Quantity/B.PackQty  = 5 , requiero que me imprima 5 documentos numerados

1

2

3

4

5


tengo esto con WHILE


DECLARE @i INT = 0;

WHILE @i <= (select B.Quantity/B.PackQty from ORDR A INNER JOIN RDR1 B on A.DocEntry = B.DocEntry where A.DocNum = 3828)

      BEGIN;

            IF (@i%1000!=0)

                  PRINT @i

            SET @i=@i+1;

      END;

pero cuando la orden de compra solo es de una linea me sale bien, pero si la orden de compra es de dos o mas artículos me marca error por que  devuelve más de 1 valor

Former Member
0 Kudos

Ok, por lo que veo primero haces una consulta para traer las Ordenes de Compra con su detalle (partidas) y luego en Crystal haces otra consulta para numerarlas de acuerdo a las partidas que tiene.

Si en la segunda consulta de Crystal seleccionas los datos que necesitas pintar, también puedes usar el comando de SQL ROW_NUMBER() que te numera las filas obtenidas en tu consulta de acuerdo a un criterio de Ordenamiento, por ejemplo:

select ROW_NUMBER() OVER(Order By DocNum) 'No', CardName, DocNum from ORDR

Obtendrá las Ordenes de Compra y las numerara. igual en vez de usar tu WHILE podrías hacer una sub consulta con ese comando, así te evitas iterar, porque supongo que tienes otra iteracion de tu primer consulta.

Saludos

former_member220991
Participant
0 Kudos

creo que no me di a entender

tengo mi orden por 30 piezas y mi empaque es de 10 entonces mi operaciona B.Quantity/B.PackQty = 3

entonce yo tengo que imprimir 3 documentos numerados

documento impresoarticuloDocNumorden de compracantidad
1XXXA11q10
2XXXA11q10
3XXXA11q10
Former Member
0 Kudos

Hola Antonio,

Has intentado realizar un CURSOR, para todas las ordenes de compras, seria algo como

DECLARE @ORDEN INT

DECLARE CR_1 CURSOR

     FOR select B.Quantity/B.PackQty from ORDR A INNER JOIN RDR1 B on A.DocEntry = B.DocEntry

OPEN CR_1

FETCH NEXT CR_1 INTO @ORDEN

WHILE @@FETCH_STATUS = 0

BEGIN

        IF (@i%1000!=0)

                  PRINT @i

  FETCH NEXT CR_1 INTO @ORDEN

END

DEALLOCATE CR_!

CLOSE CR_1

Espero que te sirva

former_member220991
Participant
0 Kudos

me marca error en los NEXT y en DEALLOCATE CR_!