Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

[5分]主子窗体自动编号的问题

zch  发表于:2012-08-11 09:36:28  
复制

由于采用主子窗体,主子窗体数据是采用自动编号的值对应的。

多用户采用主子窗体录入数据时碰到的问题:在填入数据没有保存的时候,后台记录里面是没有记录你正在输入的数据的,这时候另外一个人同时操作该表单的时候,自动生成的编号和你的一样,而且他抢先保存了。等你保存的时候,提示该编号已经使用,需要更改编号。问题就是你可以改变主窗体的编号,但对应子窗体里面的编号怎么办?

 

Top
煮江品茶 发表于:2012-08-11 10:17:01

不会吧?

如果对主窗体的新增记录没有信心的话,就在子窗体的获得焦点事件中对主窗体Refresh一下。



煮江品茶 发表于:2012-08-11 10:18:42
也可在主窗体的除id以外的其他某个字段更新后事件中me.Refresh 一下。

zch 发表于:2012-08-11 10:41:02

不是有没有小心的问题,数据录入本就是多用户录入的,编号呗占用是很有可能的事情。要是子窗体获得焦点的时候,该编号还没有占用,而是输入子窗体的过程中被占用的呢,Refresh也没用



dbaseIIIer 发表于:2012-08-11 15:32:12

这是有网络以来,编写软件的方法就不一样了!

 

打从1986年编写 dbaseIII+数据库的时候,用Novell Netware本地网络就要注意这个事的了!

 

你要搞清楚什么时候取得最新单号:

1. 点击“新建”按钮就获取?

2. 保存记录 时候 才获取?

3. 过账/打印 时候  才获取?

 

另外,获取的方法是什么?

1. 从单据的数据表里面找最大的号码再加1?

2. 以Access数据表的自动编号作为“主键”,并找出上一个“主键”来计算下一个单号?

3. 以Access数据表的自动编号作为“主键”,单号再从另一个“事件触发”决定?

4. 还是从另一个“下一个可用号码”的数据表里面获取?

5. 保存时候发现重复时有处理?(还是根本都不会重复)

 

这就是数据库设计。

多用户操作模式下的设计。

 

只可以说你设计的方案错误了!并不是什么方法可以解决的。

 



zch 发表于:2012-08-11 16:20:43
以 变速箱管理系统 里面的 采购订单 为例子吧,如果保存的时候,该订单号被别人占用了,怎么办

dbaseIIIer 发表于:2012-08-11 18:23:56

改变设计吧!这是设计的错误!

 

硬要用这个设计的话,就遇到重复,单号再加1!直到没有重复为止!



zch 发表于:2012-08-11 22:01:21
谁有好的设计,晒一下

dbaseIIIer 发表于:2012-08-12 01:04:50

说设计就要看你这个应用到底是怎样的了!

 

像银行刷卡的交易编号,就是用时间来生成的,不顺序的;

 

如果你一定要流水号,那就肯定是在用户确定保存后,查找表里面最后一个使用的编号再加一,然后就保存的了!

获取了编号,就没机会再获取一次的,哪里会有重复的机会!

 

设计里面就是不会获得编号之后不保存,然后等用户输入完数据以后才保存,这就是我说你的设计多用户应用的错误了!

 

 

当然,在代码里查找,最后编号,然后在加一并保存这个不够0.1秒的过程中,有用户又获取编号的机会还是有的!

所以88年写多用户程式需要锁表,dbaseIII 里面就需要 flock()!

在 ado, 或 dao 里面都有 lock 的处理,我不知道你的vba 是怎样处理的,

不过在任何 sql 服务器我们都会用 Transaction处理的,不行就滚吧!是回滚!

 

不过一般编写普通的网络应用,在半秒不够里面有同时建立编号的几率,我20年来开发的经验告诉你是 0 的!

 

除非你是开发几万人一起用的应用程序!

 

不过到那个地步的话,我们又会用 sql 的自动创建编号 identity(1,1) 来作主键的,或者 夸系统的服务器应用的,

我们就用 guid 作为主键的,交易编号就后来才添加的!

 

所以,你问设计的话,看你想用户用一个什么系统而已!

 

 

 

 



zch 发表于:2012-08-12 10:19:47
谢谢回复,其实我的要求并不是很高。还是以  变速箱管理系统 里面的 采购订单 为例子,之所以要流水号,是为了对订单便于管理。操作人员也就6~7个人,但这个编号难住我了

dbaseIIIer 发表于:2012-08-12 14:46:00

掌握什么时候生成号码,并保存。

一般在用户编辑完采购单按保存按钮 才 保存, 才生成 流水号的。

 

而在用友、管家婆 等大型ERP 就会可以保存“草稿”的,喜欢保存就保存吧,反正这个流水号不是 “主键”就不会有什么问题的了!

 

如果你的应用是需要 先拿下流水号,来做别的事,才能编辑内容的话,

就 点击“取号”按钮,像去银行轮候一样,马上保存到采购单的。用户取号后,不用这个采购单,不填数据,那就是用户的问题了。

 

 

这两种操作中,操作员就只有 一瞬间操作数据库,同一张采购单有了号码,以后也没有机会在触发这个“取号”代码的了,

 

 

哪有什么机会会重复号码的?  <-你问这个问题我就觉得有点奇怪,系统是不是你设计的呢?



zch 发表于:2012-08-12 15:31:02
版主找竹笛把  变速箱管理系统 里面的 采购订单 找来看看就知道我为什么会问这个问题了

dbaseIIIer 发表于:2012-08-12 16:23:42

你的情况就不是 竹笛兄 开发时的情况的了,看别人的不如你自己改为适合自己的!

 

原理和方法都告诉你了!



zch 发表于:2012-08-13 22:24:29
受益匪浅

总记录:13篇  页次:1/1 9 1 :