当前位置: 代码迷 >> PB >> 两个操作员不能再同一时间保存数据窗口中的数据,因为自动编号的关系,该怎么解决
  详细解决方案

两个操作员不能再同一时间保存数据窗口中的数据,因为自动编号的关系,该怎么解决

热度:70   发布时间:2016-04-29 10:10:27.0
两个操作员不能再同一时间保存数据窗口中的数据,因为自动编号的关系,急!!!
有个问题想请假一下大家
问题是这样的:我有一个输入数据的界面,用到了一个自动编号,当我点新增之后,通过从数据库里取得当前最大的自动编号,然后在此编号上加一来表示新增的自动编号,并且显示在数据窗口的自动编号列中,但是因为我的系统是网络版的,当同一个时间有两个或两个以上操作员都点了新增,并且其中一个操作员已经按了保存按钮,另一个操作员就无法插入数据,因为自动编号已经插入到数据库中,但是数据窗口中显示的自动编号还是原来的那个自动编号。请问大家该怎么解决这个问题?谢谢了。如果不清楚这个问题的话,可以qq语音,我的qq:317858068

------解决方案--------------------
1、数据库这个字段改成自增型
2、这个字段 自己生成,编号带上机器编号
3、如果一定要连续可写一个函数生成最大,作为缺少绑定这个列,应用程序不干预
4、锁定
------解决方案--------------------
如果你用sql server那可以设置连接参数

DbParm="Database='yur',Identity='SCOPE_IDENTITY()'"

其他数据库我也不太清楚。

不过有个统一的办法,在新增时通过数据库的函数提取一个自增值,返回给客户端,这样就不会有重复问题
------解决方案--------------------
保存时再取自动编号
------解决方案--------------------
我明白你的意思,你说的是比如单据号码,是自动编号的,是吧。 
你要想给单据自动编号,就不能把功能代码放在新增上,应该放在保存事件上更安全。
新增时,编号为空,当用户输完其他数据按保存时,这时就开始对它编个号,怎样编,我建议这样:

实现方法:
1。必须有个表做记录,表名:Serial_No
CREATE TABLE [dbo].[Serial_No] (
[Master] [varchar] (20) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL ,
[YYMM] [char] (4) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL ,
[DD] [char] (2) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL ,
[Serial_No] [int] NOT NULL ,
[Notes] [varchar] (30) COLLATE Chinese_Taiwan_Stroke_CI_AS NULL 
) ON [PRIMARY]
GO

2. 存儲過程: NewCode
-- 存儲過程作用﹕得到各master的當天的流水號
-- 參數:@master 是Serial_NO表里master字段
-- 返回: li_ret 流水號

--編碼規則﹕單號前綴 +YMMDD + 000(流水號)
-- 如成品入倉單: PI70421001 07年04月份21號+001流水號

CREATE PROCEDURE [NewCode]( @master varchar(20) OUTPUT) AS SET NOCOUNT ON

declare @li_ret int --- 默認返回值
declare @li_serial int --- 新值
declare @mm_dd_yyyy char(10)
declare @yymm char(4)
declare @dd char(2)

SELECT @mm_dd_yyyy = CONVERT(char(10), GETDATE(), 110) -- : MM-DD-YYYY
SELECT @yymm = RIGHT(@mm_dd_yyyy, 2) + LEFT(@mm_dd_yyyy, 2) -- : YYMM
SELECT @dd = RIGHT(LEFT(@mm_dd_yyyy, 5), 2) -- : DD
--IF @master= 'PROD_IN' 
BEGIN
IF Not exists (SELECT * from serial_no where master = @master )
BEGIN
[email protected]﹐那么就添加一筆記錄﹐流水號默認從1開始
INSERT INTO serial_no (master, yymm, dd, serial_no) VALUES(@master , @yymm, @dd, 2)
SELECT @li_ret = 1
SELECT @master = @yymm + @dd --作返回日期值
GOTO end_proc
END
ELSE
BEGIN
SELECT @li_serial = serial_no from serial_no where master = @master and yymm = @yymm and dd = @dd
--如果當天無記錄﹐則把現有資料設成當天記錄﹐流水號從1開始
IF @li_serial is null or @li_serial = 0 
BEGIN
UPDATE serial_no SET yymm = @yymm, dd = @dd, serial_no = 2 WHERE master = @master
SELECT @li_ret = 1
SELECT @master = @yymm + @dd --作返回日期值

END
ELSE
--如果當天有記錄﹐則得到一個流水號
BEGIN
UPDATE serial_no SET serial_no = serial_no + 1 WHERE master = @master
SELECT @li_ret = @li_serial
SELECT @master = @yymm + @dd --作返回日期值
END
END
END
--ELSE
--SELECT @li_ret = -1000

END_PROC:

RETURN @li_ret
GO

3。 在这个窗口上写个函数: wf_getcode() 
String ls_master, ls_yymmdd, ls_newno
Long ll_ret

ls_master = 'inv_no'

Declare new_no Procedure For @return = NewCode
@master = :ls_master OUTPUT Using SQLCA ;

Execute new_no;
If SQLCA.SQLCode < 0 Then
f_msgbox1('結果', '申請新流水號失敗﹐請稍后再試! ! ~n~n如確實不行﹐請通知系統管理員。~n~n' + SQLCA.SQLErrText, StopSign!)
Close new_no;
SQLCA.of_rollback()
Return ''
End If

Fetch new_no Into :ll_ret, :ls_yymmdd;
Close new_no;
SQLCA.of_commit()

If ll_ret = -1000 Then