我们在PB中的解决方法,供参考:
xhb 序号表的结构
名称 空? 类型
----------------------------------------- -------- ------------
LBDM 类别代码 NOT NULL CHAR(2)
LBMC 类别名称 NOT NULL VARCHAR2(20)
NF 年份 NOT NULL VARCHAR2(8)
QZ 前缀 NOT NULL VARCHAR2(2)
XH 序号 NOT NULL NUMBER(8)
Unique Index = LBDM + NF + QZ
f_xh //定义一个取序号的函数,主要目的是锁记录和取新序号值
参数说明:
String as_lbdm 类别代码 传值 value
String as_lbmc 类别名称 传值 value
String as_nf 年份 传值 value
String as_qz 前缀 传值 value
Integer an_xh 序号 传址 reference
UPDATE xhb SET xh = xh + 1 WHERE lbdm = :as_lbdm AND nf = :as_nf AND qz = :as_qz USING SQLCA;//更新序号值,锁定记录,但不提交
IF SQLCA.SQLCode = 0 THEN
IF SQLCA.SQLNRows = 0 THEN
//如果没有相关记录,则插入新的序号记录
INSERT INTO xhb ( lbdm,lbmc,nf,qz,xh ) VALUES (:as_lbdm,:as_lbmc,:as_nf,:as_qz,1 );
IF SQLCA.SQLCode <> 0 THEN
ROLLBACK USING SQLCA;
RETURN FALSE
END IF
an_xh = 1//序号初始值为1
ELSE
SELECT xh INTO :an_xh FROM xhb WHERE lbdm = :as_lbdm AND nf = :as_nf AND qz = :as_qz USING SQLCA;//取出序号
END IF
ELSE
ROLLBACK USING SQLCA;
RETURN FALSE
END IF
RETURN TRUE
在程序中取序号则这幺写:
变量说明:
Integer li_xh 序号
String ls_xh 序号
Date gd_date 当前日期
String is_htlb 合同类别
DataWindow dw_kh 数据窗口
IF f_xh("01","虚拟计斤单号",String(gd_date,"YYYY"),is_htlb,li_xh) = False THEN
MESSAGEBOX("提示信息","取号失败!")
RETURN
END IF
// 如果f_xh执行成功,则li_xh中存放的应该是新的序号值,并且此时对此序号的记录锁并没有释放,别的用户不很再取新的序号值,这样,避免了重复取号的可能。
ls_xh = is_htlb+RIGHT(String(gd_date,"YYYY"),2)+f_padl(string(li_xh),5,'0') //组合出序号
//数据窗口数据更新
IF dw_kh.update() = 1 THEN
COMMIT USING SQLCA;
//如果数据窗口数据更新成功
//则提交整个事务(包括数据窗口更新和序号记录更新)
//对此序号记录的锁也被释放,其它用户可以继续取新的序号值
MESSAGEBOX("提示信息","合同配置成功!")
ELSE
ROLLBACK USING SQLCA;
//如果数据窗口数据更新失败
//则回滚整个事务(包括数据窗口更新和序号记录更新)
//序号保持原值,对此序号记录的锁被释放,其它用户可以继续取新的序号值
//避免了用sequence取过值就不能回滚的缺点
MESSAGEBOX("提示信息","合同配置失败!")
END IF
将流水号设为主键,在itemchanged中加入代码:
select count(*) into :ll_count from table where colunmname = :data;
if ll_count > 0 then
messagebox('提示信息','咔叽随风倒的')
return 1
end if
自动增量是数据库里的东东,有数据库自己加一,用户无法改变。