首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > PB >

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

2012-03-07 
两个操作员不能再同一时间保存数据窗口中的数据,因为自动编号的关系,急!!!有个问题想请假一下大家问题是这

两个操作员不能再同一时间保存数据窗口中的数据,因为自动编号的关系,急!!!
有个问题想请假一下大家
问题是这样的:我有一个输入数据的界面,用到了一个自动编号,当我点新增之后,通过从数据库里取得当前最大的自动编号,然后在此编号上加一来表示新增的自动编号,并且显示在数据窗口的自动编号列中,但是因为我的系统是网络版的,当同一个时间有两个或两个以上操作员都点了新增,并且其中一个操作员已经按了保存按钮,另一个操作员就无法插入数据,因为自动编号已经插入到数据库中,但是数据窗口中显示的自动编号还是原来的那个自动编号。请问大家该怎么解决这个问题?谢谢了。如果不清楚这个问题的话,可以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
--沒有@master的記錄﹐那么就添加一筆記錄﹐流水號默認從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


f_msgbox1('信息', '無法獲得流水號, 請稍后再試! ! ~n~n如確實不行﹐請通知系統管理員。~n~n' + SQLCA.SQLErrText, StopSign!)
Return ''
End If

if ll_ret > 999 then
f_msgbox1('系統信息','注意﹐您今天的流水號已經超出了999個ID﹐您不能再開單了。' + '~n' + &
'一般來說﹐每天999個流水號已足夠用了﹐如果現在已經超出了這個范圍~n' + &
'唯一的解釋就是您亂開空頭單據﹐您只能找出那些空單據來利用了!!', StopSign!)
return ''
end if

//編號 (注﹕ls_yymmdd格式是如 071115, 071202, 080225)
ls_newno = 'INVOICE-ED8YX' + LEFT(ls_yymmdd, 2) + '-'//+ String(ll_ret)

Return ls_newno


4。保存前的代碼:
//====================================================================
// 產生一個新單號
//====================================================================
String ls_no
Long ll_row

ll_row = This.GetRow()

If ll_row > 0 Then
ls_no = GetItemString(ll_row, 'inv_no')
If Len(Trim(ls_no)) = 0 Or IsNull(ls_no) Then
SetItem(GetRow(), 'inv_no', wf_newcode())
End If
ls_no = GetItemString(ll_row, 'pack_no')
If Len(Trim(ls_no)) = 0 Or IsNull(ls_no) Then
SetItem(GetRow(), 'pack_no', wf_packno())
End If
End If

Return 1

===========================
以上只是个例子,你应该看得懂吧

热点排行