各位 大虾
我想请教各位 一下
我做的一个东西中
她有好几个分类 比如
a001-编号
b005-编号
c008-编号....
我现在要实现的是 当我从管理中输入一条记录的时候 他根据所属的类
首先用IF语句判断前4位匹配哪一类,生成前5位,用变量
用搜索来处理
加一个索引,如:index on ph to tag ph
使用的时候,要set order to tag ph DESCENDING
proc getnewph
para _code
local old_order,old_recno,newval
old_order=order(别名)
old_recno=recno(别名)
newval=1
set order to tag ph DESCENDING in 别名
if seek(_code,别名)
newval=val(substr(别名.ph,2))+1
endif
set order to old_order in 别名
do case
case old_recno=0
go top in 别名
case if between(old_recno,1,reccount(别名))
go old_recno
other
go bottom
endcase
return newval
不是很好,仅供参考,未经测试,可能有误
-------------------------
我流落在凄凉的世界里-孤苦伶仃
我过着动荡无助的生活-四处漂泊
***生成工号*******
func setworkerid(cmaxid,defaultheader,idlength) as string
LOCAL workerid as String,headerlength as Integer
headerlength=LEN(defaultheader)
IF ISNULL(cmaxid)
workerid=defaultheader+"-"++REPLICATE(0,idlength-headerlength-1)+"1"
ELSE
workerid=defaultheader+"-"+RIGHT(000+ALLTRIM(str(VAL(RIGHT(cmaxid,idlength-headerlength))+1)),idlength-headerlength)
endif
调用方法
先在产品表中找到该类别的最大编号
select max(id) as maxid from tablename where kindid=a001 into cursor tmaxid
sele tmaxid
cmaxid=allt(maxid)
sele tablename
appe blank
repl id with setworkerid(cmaxid,a001,8)
这里参数的含义是,cmaxid对应该类别的最大编号,如果没有可以为NULL,a001是该类的类别号,可以用变量代替,8是指你要生成编号的总位数
RETURN workerid
ENDFUNC
如果说在程序运行时去判断生成一个流水号,技术上是可以实现的,事实上是不可取的,一方面影响速度,另一方面容易出错,如果已经使用过的流水号记录被删除后,该流水号在下次可能将被重新启用,会导致数据紊乱。解决此类问题的办法是建立一个系统状态信息表,该表只有一条记录,用不同的字段记载每个类别的可用起始流水号,该流水号用数值记录,每用一个流水号后将该数值加1,一旦用过不再重复使用,举例如下:
系统状态表sysctrl有三个预置流水号no1、no2、no3,
use sysctrl in 0
use datatable in 0
appe blan
repl 流水号 with 类别前缀+padl(allt(str(sysctrl.no1)),10,0) &&流水号为类别前缀加上十位数字,流水号不足十位用“0”补足
sele sysctrl
repl no1 with no1+1
SELECT Data1
CALCULATE ALL MAX( 编号 ) TO cBH FOR LEFT( 编号, 1 ) == cLB && cLB 为类名
INSERT INTO Data1 ( 编号 ) VALUES ( cLB + RIGHT( "00" + STR( VAL( RIGHT( cBH, 3 ) ) + 1, 3 ), 3 ) )
可以另外建一个表个字段
类别名
fj_jiangqi(强盗) 在另一个贴子中提供了一个方法。他在那个贴子里说了他从不用PACK
你也不妨如此,将三个大类归到三个表中,然后流水号=大类代表字母+记录号,这种方式查找只需要找到对应的表即可,应该是最快的一种了。副做用就是,无法用PACK