在网络编程中,自动编号的问题

wjjzjl 2004-01-12 09:17:25
在保存按钮里的click事件中做
sele hhdj(数据库名)
go bottom
bh1=hhdj.bh+1(hhdj为数据库的编号字段)
append blank
repl bh with bh1

这样在网络里,两个人在按保存按钮时,在几乎同时点击保存时,编号就会是相同的,如果差上个两三秒钟就没什么问题,但我想,及便是两个人同时按下,肯定会有先有后的,这个问题该怎么解决才能让网络中的人保存时不存在重复编号?
...全文
77 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
meizibbs1 2004-01-15
  • 打赏
  • 举报
回复
实现自动编写流水号的2个程序
luweikan的实现自动编写流水号

oldalias=alias()
sele 编号 from &oldalias order by 编号 desc into cursor temp
sele temp
go top
m.maxno=编号 &&编号 必须是字符型
m.oldno=val(m.maxno)
m.newno=str(m.oldno+1,4)
m.newno=strtran(m.newno," ","0")
sele temp
use
sele(oldalias)
appe blank
repl 编号 with m.newno


如果填补空号:


oldalias=alias()
sele 编号 from &oldalias order by 编号 desc into cursor temp
sele temp
go top
n=0
do while !eof()
n=n+1
m.maxno=val(编号)
if n<>m.maxno
m.maxno=val(编号)-1
exit
endif
skip
enddo
m.oldno=m.maxno
m.newno=str(m.oldno+1,4)
m.newno=strtran(m.newno," ","0")
sele temp
use
sele(oldalias)
appe blank
repl 编号 with m.newno

倦猫的

*- 终于忍不住技痒了,哈哈,做点好事吧,这可是全自动的。支持有单据索引头标识与无标识。自动填充到与字段等宽。生成速度极快。不知能否是最优解。

*- 关于在网络重复单据字问题,一般在存盘时,先记录当前单据字,再重新生成一次,如果重新生成后的单据字与将保存的单据字不相同,提示操作员单据字己被争用,请重新点击保存。

*- 讨厌啦,某某某环境会影响它的运行,第三次修正。真丢人。:(
*----------
* 好大喜功 :(,未经周密调试,结果犯错误了(不好意思),修正结果如下:
* 40万条记录测试结果报告: 无字母前缀生成为 2 秒,有字母前缀生成为 4 秒。
*----------
* 重要提示
* 如果一个表内存为多种形式的单据,请尽量保持单据的前缀都是等长的字母

LPARA lcAlias , lcFieldName , lcSign
IF Type("lcAlias") = "C" AND USED(lcAlias) AND ;
Type("lcFieldName") = "C" AND !Empty(lcFieldName) AND ;
Type(lcAlias + "." + lcFieldName) = "C" AND Type("lcSign") = "C"

PRIVATE nMax_no , cSign_key , cOldCompatible , cOldFixed , nMaxLength , aTempArray , nSignLength
Local nMax_no , cSign_key , cOldCompatible , cOldFixed , nMaxLength , aTempArray
DIME aTempArray[1]

cOldCompatible = SET("Compatible")
cOldFixed = SET("FIXED")
set compatible off
set fixed off

m.nMax_no = 0
m.cSign_key = ""
m.nSignLength = LEN(m.lcSign)

m.nMaxLength = FSIZE( m.lcFieldName , m.lcAlias )
aTempArray[1] = SPACE(m.nMaxLength)
m.nMaxLength = m.nMaxLength - m.nSignLength

IF nMaxLength < 2
= Messagebox("指定的字段太小,请适当增大单据字的宽度..." , 0 , '信息')
SET Compatible &cOldCompatible
SET FIXED &cOldFixed
Return ""
Endi
IF m.nSignLength <= 0
SELECT MAX(&lcFieldName) AS Max_No FROM (lcAlias) INTO ARRAY aTempArray
m.nMax_no = Val( SUBST(aTempArray[1] , 1 )) + 1
Else
SELECT MAX(&lcFieldName) AS Max_No FROM (lcAlias) ;
WHERE SUBST(&lcFieldName, 1 , m.nSignLength ) == m.lcSign ;
INTO ARRAY aTempArray

m.nMax_no = Val( SUBST(aTempArray[1] , m.nSignLength + 1 )) + 1
Endi

m.cSign_key = TRANSFORM( ABS(m.nMax_no) )
IF Len(cSign_key) < m.nMaxLength
m.cSign_key = PADL( m.cSign_key , m.nMaxLength , '0' )
Else
IF Val( REPLICATE("9", m.nMaxLength ) ) - m.nMax_no < 100
= Messagebox("警告:单据字的己临界,即将溢出!" , 0 , '警告')
Endi
Endi

SET Compatible &cOldCompatible
SET FIXED &cOldFixed
This.value = m.lcSign + m.cSign_key
Return m.lcSign + m.cSign_key
Else
= Messagebox("无法生成单据字" , 0 , "错误")
Return ""
Endi


更多精彩内容尽在梅子论坛http://www.meizibbs.3322.org
xuzuning 2004-01-14
  • 打赏
  • 举报
回复
对于vfp6可以用设置字段的默认值来变通解决,当然表要放在库中
落单枫叶 2004-01-13
  • 打赏
  • 举报
回复
用VFP8,它有自动编号功能字段,就不必这样麻烦了。
coolfoxer 2004-01-13
  • 打赏
  • 举报
回复
如何使用VFP8中的自动编号功能字段呀?
pyouxin 2004-01-13
  • 打赏
  • 举报
回复
解决办法
sele hhdj(数据库名)
do while .t.(设定一个循环)
if flock()(先把数据库锁起来)
go bottom
bh1=hhdj.bh+1(hhdj为数据库的编号字段)
append blank
repl bh with bh1
exit(退出循环)
endif
enddo
这样其他用户只能等你取完“自动编号”才到下一个,这个动作很快大家感觉不到的。
乐不 2004-01-13
  • 打赏
  • 举报
回复
oracle当然是用序列了
create sequence seq_bh
minvalue 1
maxvalue 9999999999999999999999999999
start with 1
increment by 1
nocache;
这样每次取值select seq_bh.nextval into v_bh from dual;
其中v_bh为要定义变量

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧