Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 结束 其他的 开始 如果@inv_数量>0 开始 插入@SPLITTABLE(ARTICLE,QUANTITY,LOCATION,IDORDER)值(@so_ARTICLE,@inv_QUANTITY,@inv_LOCATION,@so_IDORDER) _Sql_Sql Server_Tsql - Fatal编程技术网

Sql 结束 其他的 开始 如果@inv_数量>0 开始 插入@SPLITTABLE(ARTICLE,QUANTITY,LOCATION,IDORDER)值(@so_ARTICLE,@inv_QUANTITY,@inv_LOCATION,@so_IDORDER)

Sql 结束 其他的 开始 如果@inv_数量>0 开始 插入@SPLITTABLE(ARTICLE,QUANTITY,LOCATION,IDORDER)值(@so_ARTICLE,@inv_QUANTITY,@inv_LOCATION,@so_IDORDER) ,sql,sql-server,tsql,Sql,Sql Server,Tsql,结束 其他的 开始 如果@inv_数量>0 开始 插入@SPLITTABLE(ARTICLE,QUANTITY,LOCATION,IDORDER)值(@so_ARTICLE,@inv_QUANTITY,@inv_LOCATION,@so_IDORDER) 设置@so\u数量-=@inv\u数量 结束 设置@nextInv=1; 结束 结束 结束 关闭sou cur; 取消分配so_cur; 关闭库存; 取消分配库存; ---------------------------------------

结束 其他的 开始 如果@inv_数量>0 开始 插入@SPLITTABLE(ARTICLE,QUANTITY,LOCATION,IDORDER)值(@so_ARTICLE,@inv_QUANTITY,@inv_LOCATION,@so_IDORDER) 设置@so\u数量-=@inv\u数量 结束 设置@nextInv=1; 结束 结束 结束 关闭sou cur; 取消分配so_cur; 关闭库存; 取消分配库存; ----------------------------------------------------------------------- 从@SPLITTABLE ORDER BY IDORDER,ARTICLE中选择*
您试图实现的逻辑不清楚。这使得任何人都不太可能试图回答你的问题。逻辑对我来说不清楚。我编辑并修复了代码,我的问题请再次阅读,如果你有任何疑问,请告诉我谢谢你回答@arundai,还有一件事,如何在不复制之前插入的行的情况下向splittable表添加另一个订单
 IDORDER   ARTICLE   QUANTITY
 ----------------------------
    1      ITEM01       25
    1      ITEM02       10
    2      ITEM01       20
    3      ITEM01       5
    3      ITEM03       4
  ARTICLE   QUANTITY   LOCATION   SEQUENCE
  ---------------------------------------
  ITEM01       10       LOC01        1
  ITEM01       30       LOC02        2
  ITEM01       30       LOC03        3
  ITEM02       2        LOC02        2
  ITEM02       10       LOC03        3
  ITEM03       1        LOC01        1
  ITEM03       5        LOC02        2
  ARTICLE   QUANTITY   LOCATION   IDORDER
  ----------------------------------------
   ITEM01      10        LOC01       1
   ITEM01      15        LOC02       1
   ITEM02       2        LOC02       1
   ITEM02       8        LOC03       1
   ITEM01      15        LOC02       2
   ITEM01       5        LOC03       2
   ITEM01       5        LOC03       3
   ITEM03       1        LOC01       3
   ITEM03       4        LOC02       3
DROP TABLE IF EXISTS SALESORDER

CREATE TABLE SALESORDER 
(
     IDORDER INT,
     ARTICLE VARCHAR(50), 
     QUANTITY INT
);

INSERT SALESORDER (IDORDER, ARTICLE, QUANTITY) 
VALUES (1, 'ITEM01', 25), (1, 'ITEM02', 10),
       (2, 'ITEM01', 20), (3, 'ITEM01', 5),
       (3, 'ITEM03', 4)
DROP TABLE IF EXISTS INVENTORY

CREATE TABLE INVENTORY 
(
     ARTICLE VARCHAR(50), 
     QUANTITY INT,
     LOCATION VARCHAR(50),
     SEQUENCE INT
);

INSERT INVENTORY (ARTICLE, QUANTITY,LOCATION,SEQUENCE) 
VALUES ('ITEM01', 10, 'LOC01',1), ('ITEM01', 30, 'LOC02',2),
       ('ITEM01', 30, 'LOC03',3), ('ITEM02', 2, 'LOC02',2),
       ('ITEM02', 10, 'LOC03',3), ('ITEM03', 1, 'LOC01',1),
       ('ITEM03', 5, 'LOC02',2)`
DROP TABLE IF EXISTS SPLITTABLE

CREATE TABLE SPLITTABLE 
(
     ARTICLE VARCHAR(50), 
     QUANTITY INT,
     LOCATION VARCHAR(50), 
     IDORDER INT,
     SEQUENCE INT
);
WITH RTE (Vals) AS
(
    SELECT 1 
    UNION ALL

    SELECT 1 + Vals 
    FROM RTE 
    WHERE Vals < 500
)
INSERT INTO SPLITTABLE (ARTICLE, QUANTITY, LOCATION, IDORDER,SEQUENCE) 
    SELECT ARTICLE,1 AS QUANTITY,LOCATIONS,0 AS IDORDER, SEQUENCE
    FROM INVENTORY INV
    INNER JOIN RTE R ON R.Vals <= INV.Quantity
    OPTION (maxrecursion 0);
SELECT * FROM SPLITTABLE

ARTICLE QUANTITY    LOCATION    IDORDER SEQUENCE
 ITEM01    1         LOC01         0       1
 ITEM01    1         LOC02         0       2
 ITEM01    1         LOC03         0       3
 ITEM02    1         LOC02         0       2
 ITEM02    1         LOC03         0       3
 ITEM03    1         LOC01         0       1
 ITEM03    1         LOC02         0       2
 ITEM01    1         LOC01         0       1
 ITEM01    1         LOC02         0       2
DECLARE @LIMIT INT =25;
DECLARE @ORDER INT = 1;
DECLARE @ARTICLE VARCHAR(50)='ITEM01';

WITH CTE AS 
(
   SELECT  
       ARTICLE, QUANTITY, LOCATION, IDORDER,
       RUNNINGTOTAL = SUM(QUANTITY) OVER (PARTITION BY ARTICLE ORDER BY 
LOCATION
                                       ROWS UNBOUNDED PRECEDING)
FROM 
    SPLITTABLE
WHERE 
    ARTICLE = @ARTICLE AND IDORDER =0
 ), TOTAL AS
 (
 SELECT 
     ARTICLE, QUANTITY, LOCATION, IDORDER = @ORDER
 FROM 
     CTE 
 WHERE 
     RUNNINGTOTAL <= @LIMIT
 )
 UPDATE CTE 
 SET IDORDER = T.IDORDER 
 FROM TOTAL AS T  
 WHERE RUNNINGTOTAL <= @LIMIT;
SELECT * FROM SPLITTABLE WHERE ARTICLE ='ITEM01' ORDER BY SEQUENCE ASC

ARTICLE QUANTITY    LOCATION    IDORDER SEQUENCE
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC01         1   1
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
ITEM01     1          LOC02         1   2
SELECT ARTICLE,SUM(QUANTITY) AS QUANTITY,LOCATION,IDORDER FROM SPLITTABLE 
WHERE IDORDER<>0 GROUP BY ARTICLE,IDORDER,LOCATION ORDER BY IDORDER ASC
DECLARE @SALESORDER  TABLE  
(
     IDORDER INT,
     ARTICLE VARCHAR(50), 
     QUANTITY INT
);

INSERT @SALESORDER (IDORDER, ARTICLE, QUANTITY) 
VALUES (1, 'ITEM01', 25), (1, 'ITEM02', 10),(1, 'ITEM14', 1),(2, 'ITEM00', 10),
       (2, 'ITEM01', 70), (3, 'ITEM01', 5),
       (3, 'ITEM03', 4)




DECLARE @INVENTORY TABLE  
(
     ARTICLE VARCHAR(50), 
     QUANTITY INT,
     LOCATION VARCHAR(50)
);

INSERT @INVENTORY (ARTICLE, QUANTITY,LOCATION) 
VALUES ('ITEM01', 10, 'LOC01'), ('ITEM01', 30, 'LOC02'),
       ('ITEM01', 30, 'LOC03'), ('ITEM02', 2, 'LOC02'),
       ('ITEM02', 10, 'LOC03'), ('ITEM03', 1, 'LOC01'),
       ('ITEM03', 5, 'LOC02'), ('ITEM01', 0, 'LOC04')

DECLARE @SPLITTABLE TABLE  
(
     ARTICLE VARCHAR(50), 
     QUANTITY INT,
     LOCATION VARCHAR(50), 
     IDORDER INT
);
---------------------------------------------------------------------------
DECLARE so_cur CURSOR local fast_forward
FOR
SELECT so.ARTICLE,so.QUANTITY,so.IDORDER FROM  @SALESORDER as so 
ORDER BY so.ARTICLE,so.IDORDER
;

DECLARE inv_cur CURSOR local fast_forward
FOR
SELECT inv.ARTICLE,inv.QUANTITY,inv.[LOCATION] FROM  @INVENTORY as inv 
ORDER BY inv.ARTICLE,inv.[LOCATION]
;


declare @so_ARTICLE varchar(50);
declare @so_QUANTITY int; 
declare @so_IDORDER int; 

declare @inv_ARTICLE varchar(50);
declare @inv_QUANTITY int; 
declare @inv_LOCATION varchar(50);

declare @nextOrder bit = 1;
declare @nextInv bit = 1;
declare @outOfInv bit = 0;

open so_cur
open inv_cur

WHILE 1=1
BEGIN

    IF @nextOrder = 1
    BEGIN
        FETCH NEXT from so_cur
        INTO
        @so_ARTICLE, 
        @so_QUANTITY,
        @so_IDORDER
        ;
        SET @nextOrder = 0;
        if @@FETCH_STATUS = -1 break;
    END

    IF @outOfInv = 0 AND @nextInv = 1
    BEGIN
        FETCH NEXT from inv_cur
        INTO
        @inv_ARTICLE, 
        @inv_QUANTITY,
        @inv_LOCATION
        ;
        SET @nextInv = 0;
        if @@FETCH_STATUS = -1 
        BEGIN
            SET @outOfInv = 1;
            PRINT N'NOT ENOUGH ITEMS IN INVENTORY'
        END
    END

    IF @outOfInv = 0 AND @inv_ARTICLE < @so_ARTICLE
    BEGIN
        SET @nextInv = 1;
    END
    ELSE IF @outOfInv = 1 OR @inv_ARTICLE > @so_ARTICLE
    BEGIN
        PRINT N'NOT ENOUGH ITEMS IN INVENTORY, YOU MIGHT WANT TO INSERT LOCATION=NULL TO THE SPLITTABLE';
        INSERT INTO @SPLITTABLE (ARTICLE,QUANTITY,LOCATION,IDORDER) VALUES (@so_ARTICLE,@so_QUANTITY,NULL,@so_IDORDER) 
        SET @nextOrder = 1;
    END
    ELSE
    BEGIN
        IF @so_QUANTITY < @inv_QUANTITY
        BEGIN
            IF @so_QUANTITY >0 
            BEGIN
                INSERT INTO @SPLITTABLE (ARTICLE,QUANTITY,LOCATION,IDORDER) VALUES (@so_ARTICLE,@so_QUANTITY,@inv_LOCATION,@so_IDORDER) 
                SET @inv_QUANTITY -= @so_QUANTITY
            END
            SET @nextOrder = 1;
        END
        ELSE IF @so_QUANTITY = @inv_QUANTITY
        BEGIN
            IF @so_QUANTITY >0 
            BEGIN
                INSERT INTO @SPLITTABLE (ARTICLE,QUANTITY,LOCATION,IDORDER) VALUES (@so_ARTICLE,@so_QUANTITY,@inv_LOCATION,@so_IDORDER)
            END
            SET @nextOrder = 1;
            SET @nextInv = 1;
        END
        ELSE
        BEGIN
            IF @inv_QUANTITY >0
            BEGIN
                INSERT INTO @SPLITTABLE (ARTICLE,QUANTITY,LOCATION,IDORDER) VALUES (@so_ARTICLE,@inv_QUANTITY,@inv_LOCATION,@so_IDORDER)
                SET @so_QUANTITY -= @inv_QUANTITY
            END

            SET @nextInv = 1;
        END
    END

END

CLOSE so_cur;
DEALLOCATE so_cur;
CLOSE inv_cur;
DEALLOCATE inv_cur;
-----------------------------------------------------------------------
SELECT * FROM @SPLITTABLE ORDER BY IDORDER,ARTICLE