需求数计算

TGZ 2012-08-21 05:21:10
表1:库存表
---------------------------------
料号 库存数量
----------------------------------
AAA1 10000
AAA2 20000
AAA3 10000
BBB1 50000


表2:
--------------------------------------------------------
料号 替代料 需求量 最终申购量
--------------------------------------------------------
AAA1 100000 ?
AAA2
AAA3

BBB1 200000 ?
AAA2

---------------------------------------------------------




计算需求数:

根据BOM生成物料需求,但现在有一批呆料从需要中扣除,生成最终的申购量
另外,BOM里面会有替代料的问题,可以不能的料也有不同的替代料,不知道有没有好的方法实现?


...全文
236 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
TGZ 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

HTML code
BOM结构(已生成,这里是替代部分)
料号 是否替代料 原料号 用量
A 否 1
A1 是 A
A2 是 A ……

你这个还有问题吧 A1 怎么既在A下面 又在AA下面呢
[/Quote]

大哥,没有错,A1就是在AA下面,这个可以替代A或者AA,问题就是在这里。
筱筱澄 2012-08-22
  • 打赏
  • 举报
回复
我把测试数据做了调整 你看一下 我写的有问题没

你可以看着改一下






--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([料号] VARCHAR(10),[是否替代料] VARCHAR(10),[原料号] VARCHAR(10))
INSERT [ta]
SELECT 'A','否','1' UNION ALL
SELECT 'A1','是','A' UNION ALL
SELECT 'A2','是','A' UNION ALL
SELECT 'B','否','1' UNION ALL
SELECT 'B1','是','B' UNION ALL
SELECT 'AA','否','1' UNION ALL
SELECT 'AA1','是','AA'


--> 测试数据:[呆料表]
IF OBJECT_ID('[呆料表]') IS NOT NULL DROP TABLE [呆料表]
GO
CREATE TABLE [呆料表]([料号] VARCHAR(10),[呆料数量] INT)
INSERT [呆料表]
SELECT 'A',100 UNION ALL
SELECT 'A1',5000 UNION ALL
SELECT 'A2',3000 UNION ALL
SELECT 'AA1',200 UNION ALL
SELECT 'B1',2000

--> 测试数据:[tb]
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
CREATE TABLE [tb]([料号] VARCHAR(10),[需求数] INT)
INSERT [tb]
SELECT 'A',6500 UNION ALL
SELECT 'B',6500 UNION ALL
SELECT 'AA',6500


;WITH cte AS
(
SELECT a.[料号],a.[是否替代料],a.[料号] AS [原料号],[呆料数量]=ISNULL(b.[呆料数量],0) FROM [ta] AS a LEFT JOIN [呆料表] b ON a.[料号]=b.[料号]
WHERE a.[原料号]='1'
UNION ALL
SELECT a.[料号],a.[是否替代料],a.[原料号],[呆料数量]=ISNULL(b.[呆料数量],0) FROM [ta] AS a
INNER JOIN [呆料表] b ON a.[料号]=b.[料号]
INNER JOIN cte AS t ON t.[料号]=a.[原料号]
)
SELECT [料号],[需求数],[申购数]=CASE WHEN [呆料数量]>=[需求数] THEN 0 ELSE [需求数]-[呆料数量] END
FROM [tb] AS a,
(
SELECT [原料号],SUM([呆料数量]) AS [呆料数量] FROM cte GROUP BY [原料号]
) AS b
WHERE a.[料号]=b.[原料号]
筱筱澄 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

HTML code
BOM结构(已生成,这里是替代部分)
料号 是否替代料 原料号 用量
A 否 1
A1 是 A
A2 是 A ……
[/Quote]
你这个还有问题吧 A1 怎么既在A下面 又在AA下面呢
TGZ 2012-08-22
  • 打赏
  • 举报
回复
BOM结构(已生成,这里是替代部分)							
料号 是否替代料 原料号 用量
A 否 1
A1 是 A
A2 是 A
......
B 否 1
B1 是 B
AA 否 1
A1 是 AA
......

呆料表
料号 呆料数量
A 100
A1 5000
A2 3000
B1 2000

现要求生产T6500套,求物料申购数
(申购数是需求数减去可以替代的数量)
料号 需求数 申购数
A 6500 0 (6500-A_100-A1_5000-A2_1400-->A2余1600)
B 6500 4500 (6500-B1_2000)
AA 6500 4900 (6500-A2余_1600)



不好意思,题目没有讲明白,重新把需求说了一下,不知道各位明白了没有
zhiming2076 2012-08-22
  • 打赏
  • 举报
回复
首先,你要知道BOM是什么,在SQL表中是如何组织的,又是通过什么手段取出来的(递归)
其次,你要知道怎么处理你那个常规的需求、库存业务
最后,再处理那些特殊的需求,比如排除呆滞库存等

不要上来就只看见一堆问题,要善于分割,我就不信,分割出来的问题点,你一个也解决不了呢?是不呀
TGZ 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

引用 4 楼 的回复:

引用 3 楼 的回复:

HTML code
BOM结构(已生成,这里是替代部分)
料号 是否替代料 原料号 用量
A 否 1
A1 是 A
A2 是 A ……

你这个还有问题吧 A1 怎么既在A下面 又在AA下面……
[/Quote]

分给谁都没有关系,先保证原料号分完,再分替代料,这个是实际上有的问题,不是设计问题。
筱筱澄 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:

引用 3 楼 的回复:

HTML code
BOM结构(已生成,这里是替代部分)
料号 是否替代料 原料号 用量
A 否 1
A1 是 A
A2 是 A ……

你这个还有问题吧 A1 怎么既在A下面 又在AA下面呢


大哥,没有错,A1……
[/Quote]
设计问题啊,那A1 是先分给A 呢还是先分给AA呢?
ws_hgo 2012-08-21
  • 打赏
  • 举报
回复
你的业务都没有描述清楚

如果是BOM递归参考

create table #EnterPrise
(
Department nvarchar(50),--部门名称
ParentDept nvarchar(50),--上级部门
DepartManage nvarchar(30)--部门经理
)
insert into #EnterPrise select '技术部','总经办','Tom'
insert into #EnterPrise select '商务部','总经办','Jeffry'
insert into #EnterPrise select '商务一部','商务部','ViVi'
insert into #EnterPrise select '商务二部','商务部','Peter'
insert into #EnterPrise select '程序组','技术部','GiGi'
insert into #EnterPrise select '设计组','技术部','yoyo'
insert into #EnterPrise select '专项组','程序组','Yue'
insert into #EnterPrise select '总经办','','Boss'
--查询部门经理是Tom的下面的部门名称
;with hgo as
(
select *,0 as rank from #EnterPrise where DepartManage='Tom'
union all
select h.*,h1.rank+1 from #EnterPrise h join hgo h1 on h.ParentDept=h1.Department
)
select * from hgo
/*
Department ParentDept DepartManage rank
--------------- -------------------- ----------------------- -----------
技术部 总经办 Tom 0
程序组 技术部 GiGi 1
设计组 技术部 yoyo 1
专项组 程序组 Yue 2
*/
--查询部门经理是GiGi的上级部门名称
;with hgo as
(
select *,0 as rank from #EnterPrise where DepartManage='GiGi'
union all
select h.*,h1.rank+1 from #EnterPrise h join hgo h1 on h.Department=h1.ParentDept
)
select * from hgo
/*
Department ParentDept DepartManage rank
-------------------- ---------------------- ----------- -----------
程序组 技术部 GiGi 0
技术部 总经办 Tom 1
总经办 Boss 2
*/
筱筱澄 2012-08-21
  • 打赏
  • 举报
回复
没看懂

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧