Sql 结束 其他的 开始 如果@inv_数量>0 开始 插入@SPLITTABLE(ARTICLE,QUANTITY,LOCATION,IDORDER)值(@so_ARTICLE,@inv_QUANTITY,@inv_LOCATION,@so_IDORDER)
结束 其他的 开始 如果@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中选择*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; 关闭库存; 取消分配库存; ---------------------------------------
您试图实现的逻辑不清楚。这使得任何人都不太可能试图回答你的问题。逻辑对我来说不清楚。我编辑并修复了代码,我的问题请再次阅读,如果你有任何疑问,请告诉我谢谢你回答@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