两个操作员不能再同一时间保存数据窗口中的数据,因为自动编号的关系,急!!!
有个问题想请假一下大家
问题是这样的:我有一个输入数据的界面,用到了一个自动编号,当我点新增之后,通过从数据库里取得当前最大的自动编号,然后在此编号上加一来表示新增的自动编号,并且显示在数据窗口的自动编号列中,但是因为我的系统是网络版的,当同一个时间有两个或两个以上操作员都点了新增,并且其中一个操作员已经按了保存按钮,另一个操作员就无法插入数据,因为自动编号已经插入到数据库中,但是数据窗口中显示的自动编号还是原来的那个自动编号。请问大家该怎么解决这个问题?谢谢了。如果不清楚这个问题的话,可以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('系信息','注意您今天的流水已超出了999ID您不能再了。' + '~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
===========================
以上只是个例子,你应该看得懂吧