如何确定仓位的唯一性

zjh222 2008-07-05 08:58:04
一个很大A仓库中有许放置货的地点(区),如果相同的一批货,一个区放不下,需要放在邻近的区
如A仓库一区至四区放a货物,
 A仓库九区放c货物,
 A仓库五区至八区放b货物,。。。。。
如何对这些货物标识一个唯一的放货地点呢?
数据库表怎么设计????
...全文
161 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjh222 2008-07-06
  • 打赏
  • 举报
回复
续上:这样我可以通过触发器在结存表中修改数据呀
zjh222 2008-07-06
  • 打赏
  • 举报
回复
每次编程序时都要兼顾到如三个区都是相同的货物和相同的数量,有没有一种方法,把三个区作一个唯一标识

编号 区
001 1,2
002 3,4,5
003 6
004 7,8,9,10
........
那么要入库在3,4,5区的货物1001时,插入数据
是这样
区编号 货物号 数量
002 1001 30
...........
这样多好呀
tootto 2008-07-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zjh222 的回复:]
编号 区
001 1,2
002 3,4,5
003 6
004 7,8,9,10
[/Quote]
区里的内容只是字符串,而不是ID了。假如当组002里5区被清空,又被编入别组007,结果组002,007都包括区5,就不符合逻辑了。

重新设计了一下数据库:

一. 建‘仓库’表
仓库号(pk,fk) 名称 xxxxx
1 xx xx

二.建‘区’表
区号(pk, fk) 仓库号 名称 xxxxx
1 1 3区 xxx

三. 建‘区分组’ 表
区组编号(pk, fk) 描述 建立日期
001 为货1001入库建立 xxx
002 为货1001出库建立 xxx

四.建’区-区分组关联‘ 表
ID(pk) 区组编号 区号
1 001 3
2 001 4
3 001 5
4 002 3
5 002 4


五.建‘货物’表
货物编号(pk,fk) 名称 存货数量 xxx xxxx
001 A1001 0

六.建 ‘货物-区分组关联‘ 表
ID(pk), 货物编号, 区组编号(业务完成后货物所占用的区组), 入库/出库(bit, 0为入,1为出), 数量 日期 是否有效
1 001 001 0 30 xxxx 0
2 001 002 1 15 xxxx 1


现在看来货物的进出是以区组为存放单位,那么哪怕货物只占一个区,也要为这个区建立一个区组。

出库时也要建立一个区组来释放被占用的区,比如入库区编组为001(区3,4,5),出库时5区空了,那么建立一个新区编组002 (区3,4)。

通过表3,可以知道一个区组建立的目的;
通过表4,可知一区组所含的区。
通过表6,可知每种货物入库,出库时所占用的库区以及原始记录。

业务逻辑:
入库:
1.查询没被占用的库区(查询表6中 ’是否有效‘=1 的区组编号,再关联表4可查到被占用的区,再关联表2可找到空区)
2.建立新组,表3,表4插入新记录。
3.表6插入新记录,’是否有效‘=1

出库:
查询此货有效的区组,剔除将空的区并建立新组,同时将旧组’是否有效‘update为0(一种货只能有一个有效区组,其他都是原始记录)
zjh222 2008-07-06
  • 打赏
  • 举报
回复
我另起贴了,给你分了
zjh222 2008-07-06
  • 打赏
  • 举报
回复
有小费,把我的分全部给你,呵呵。。
tootto 2008-07-06
  • 打赏
  • 举报
回复
晕,原来是这么个占用法。让我想一下。有没有小费呀??我写了这么多了。
zjh222 2008-07-06
  • 打赏
  • 举报
回复
续上:
也就是说,区是任意组合的(是相邻的),也有可能出现1234区中的1,2区空了,34区还占着
因为,集装箱发出去一部分,另一部分就不能占那么多的区了。
zjh222 2008-07-06
  • 打赏
  • 举报
回复
我举个例,
A仓库很大,为了管理,分了1-50区
当然,货也很大,如大的集装箱,占了很多的区,如占了1,2,3,4区
但是这集装箱可以层层往上放
现在我想实在,只要找到这个集装箱(相同的货物),就知道放在1,2,3,4区,
那么只要查这个货物(唯一的编号),就可以知道是在1234区
那么要出库,只能在1234区出库,
那么库存,只能是1234区的库存,
但是我总觉得把1234区,作一个唯的标识是最好的办法
我有个想法,把1-50区个,按一位,二位,三位,四位数进行组个预备在一个表中,
象这样
编号 区
001 1,2
002 3,4,5
003 6
004 7,8,9,10
在这个表中加一索引列,不知是否可行?
tootto 2008-07-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zjh222 的回复:]
每次编程序时都要兼顾到如三个区都是相同的货物和相同的数量,有没有一种方法,把三个区作一个唯一标识

编号 区
001 1,2
002 3,4,5
003 6
004 7,8,9,10
........
那么要入库在3,4,5区的货物1001时,插入数据
是这样
区编号 货物号 数量
002 1001 30
...........
这样多好呀
[/Quote]

如果把区分组,再加以编号(假设3,4,5区分组编号为002,每一区都入库货物30个),如一笔业务需要3区出库5个货,4区出库6个货,而且不是同一天,
或者3区15号来了一批货,16号又来了同样一批货,如何查询某一区哪天来了去了哪些货?如何来更新数据?

至于用户界面的可操作性,可以允许用多选的方式让用户一次选择多个区(ListBox),然后再输入相同的数量。你的代码在后台分离这一串区的id,然后将
它们作为单独的记录插入GoodRegionWarehouseLink这个表。

每一笔交易,每一次入库点都应该是独立的trasaction。

主要不太了解你们的业务逻辑,所以我的方案可能也不是最优的,但个人觉得在设计数据库时要遵循设计原则(E-R Modelling),而不是要数据库来适应
某一个想法,否则数据库结构不合理,后期会有很大麻烦,甚至需要重新设计。

可以继续讨论,呵呵。

zjh222 2008-07-05
  • 打赏
  • 举报
回复
还是不明白
tootto 2008-07-05
  • 打赏
  • 举报
回复
这里不知是否有错,如在A库1,2,3区入库1001货物,数量是一样的如30,只是1001货物的面积大占 用了1,2,3区了,所以不能分别插入不同的数量,数量是一样的
------------------------------------------------------------------------

上面是举个例子, 数量是可以任意的。比如写成
insert into GoodRegionWarehouseLink values (1, 1, 30, xxxx, xxxx) 第一个插入值为rwlID,第二个为good Id (gid), 第三个为货物数量
insert into GoodRegionWarehouseLink values (2, 1, 30, xxxx, xxxx) 同上
insert into GoodRegionWarehouseLink values (3, 1, 30, xxxx, xxxx) 同上
是没有问题的

rwid和gid两个的组合,再联合其它的表,可以确认任意货物的进出地点,还有数量。
tootto 2008-07-05
  • 打赏
  • 举报
回复
Tabel 1 Warehouse
wid (pk,fk), name, address, xxx

Table 2 Region
rid(pk, fk), name, description, xxx

Table 3 RegionWarehouseLink
rwlid(pk fk), wid, rid, description, date,xxxxx

Table 4 Good
gid(pk, fk), name, description, xxxx

Table 5 GoodRegionWarehouseLink
grwlid(pk), gid, rwlid, description, date, xxxx

我把所有的KEY都用粗体表示,你可以看得更清楚些。
zjh222 2008-07-05
  • 打赏
  • 举报
回复
TOOTO

第三步,查询到A库1区的rwlID值为1, A库2区rwlID为2, A库3区rwlID为3, 货物1001的gid为1,将grwlID设成主键,自增
insert into GoodRegionWarehouseLink values (1, 1, 30, xxxx, xxxx) 第一个插入值为rwlID,第二个为good Id (gid), 第三个为货物数量
insert into GoodRegionWarehouseLink values (2, 1, 20, xxxx, xxxx) 同上
insert into GoodRegionWarehouseLink values (3, 1, 50, xxxx, xxxx) 同上
这样就完成了插入表的操作。插入表的时候别忘了用transaction来处理,如果一处失败即roll back.
----------------------------------------------
这里不知是否有错,如在A库1,2,3区入库1001货物,数量是一样的如30,只是1001货物的面积大占 用了1,2,3区了,所以不能分别插入不同的数量,数量是一样的
tootto 2008-07-05
  • 打赏
  • 举报
回复
如果要查A库1区货物1001的结存,只要知道A库1区的rwlID即可。

declare @inComingGood int,
@outGoingGood int


select @inComingGood = sum(quantity) from GoodRegionWarehouseLink
where
rwlId = 1
and
status = 0
and
gid in (select gid from good where name ='1001')


select @outGoingGood = sum(quantity) from GoodRegionWarehouseLink
where
rwlId = 1
and
status = 1
and
gid in (select gid from good where name ='1001')


select @inComingGood - @outGoingGood



tootto 2008-07-05
  • 打赏
  • 举报
回复
假设warehouse 和 region 表的已经都有内容了。

A库在warehouse表中的wid是1;

1,2,3区在region 表中的rid分别是1,2,3

货物在 good 表中的gid是1

现在场景开始:1001货物要入A库1,2,3区

首先操作RegionWarehouseLink 表, 将rwlID 设成主键,自增
insert into egionWarehouseLink values (1,1,xxx,xxx,....) //第一个插入值为region id(rid), 第二个插入值为warehouse id(wid),其他自定
insert into egionWarehouseLink values (2,1,xxx,xxx,....) //同上
insert into egionWarehouseLink values (3,1,xxx,xxx,....) //同上
现在已经完成了库和区的组合,并且有了rwlID

第二步,通过输入库和区的值,可以查询rwlId的值,如果rwiId返回值为空,说明库区组合还未建立,重做第一步即可。

第三步,查询到A库1区的rwlID值为1, A库2区rwlID为2, A库3区rwlID为3, 货物1001的gid为1,将grwlID设成主键,自增
insert into GoodRegionWarehouseLink values (1, 1, 30, xxxx, xxxx) 第一个插入值为rwlID,第二个为good Id (gid), 第三个为货物数量
insert into GoodRegionWarehouseLink values (2, 1, 20, xxxx, xxxx) 同上
insert into GoodRegionWarehouseLink values (3, 1, 50, xxxx, xxxx) 同上
这样就完成了插入表的操作。插入表的时候别忘了用transaction来处理,如果一处失败即roll back.


如果要出库1001货物,要在GoodRegionWarehouseLink表来标识,入库和出库应该是GoodRegionWarehouseLink 表的字段,
我们来改一下 GoodRegionWarehouseLink表的结构:
Table 5 GoodRegionWarehouseLink
grwlid(pk), gid, rwlid, quantity,status(出库或入库,可以用bit, 0为入,1为出),description, date

出库:
现在出A库1区20个货物1001,A库1区rwlID为1,货物1001 gid为1
insert into GoodRegionWarehouseLink values (1, 1, 20, 1, '2008-7-5', xx, x)//第一插入值为rwlId, 二为货物gid, 三为数量,四是出库,日期...


查询:货物1001的出货库和区
select w.Name as '出货库', r.Name as '出货区' from RegionWarehouseLink rwl
inner join Warehouse w on w.Wid = rwhl.Wid
inner join Region r on r.Rid = rwhl.Rid
where rwl.RwlId in
(select rwlId from GoodRegionWarehouseLink where
gid in (select gid from good where name='1001')
and status = 1
)



zjh222 2008-07-05
  • 打赏
  • 举报
回复
tooto

仓库A,B,C...
货物1001,1002,1003,1004
区有1到30个区,如果A库有1区,2区,。。。
现在要入库了。
1001货物 放A库的1,2,3区 //这个我搞明白,那么入库表中如何插入记录呢??
1002和1003货物 放A库的4区 //同上
1003货物放A库5区 //这个好办,区和货物编号都是唯一的
。。。。。。。
如果要出库1001货物,那么对那个区标识呢。。??
如果要1001查结存,是查1区库存呢,还是查2区库存呢。。。??
yuxianye1 2008-07-05
  • 打赏
  • 举报
回复
仓库表:
仓库编号
1
2
3

仓库区表:
仓库编号,区号
1,1
1,2
1,3
1,4



yuxianye1 2008-07-05
  • 打赏
  • 举报
回复
比较简单的把每个去分配个唯一的编号
tootto 2008-07-05
  • 打赏
  • 举报
回复
举个例:

Table Warehouse
wid, name, address, xxx
1 仓库A 河边 xxx
2 仓库B 海边 xxx

Tabel Region
rid name description, xxxx
1 一区 很大的地方 xxxx
2 二区 不是很大 xxxx

Table Good
gid name description, quantity, xxxx
1 大米 过期了 100 xxx
2 小米 新鲜的 200 xxx

Table RegionWarehouseLink
rwlId rid wid description, xxxxx
1 1 1 现在是一库一区 xxx
2 2 1 现在是一库二区 xxx


Table GoodRegionWarehouseLink
grwlId rwlid gid quantity description xxxx
1 1 1 30 xxxxx xxx
2 1 2 50 xxxxx xxx
3 2 1 60 xxxxx xxx

通过 GoodRegionWarehouseLink table 你可以找到哪些货存在哪些地点。
比如 grwlid 为1,你可以看到货物是30袋大米, 然后通过rwlid,查看RegionWareHouseLink talbe, 可以看到地点是一库一区



111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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