[bo][un]yusfreedo[/un] 在 2008-9-10 09:20 的发言:[/bo]
我做了一个表单,其中有一个编号栏。编号是日期加上3个数字组成。我想把编号输入工作弄简单点,也就是说日期部分直接调用上个记录的日期,后3个数字的前2个,也调用上个记录的,光标移到到编号栏的时候,刚好落 ...
恕我直言,你的这种设想不甚合理,表现在“调用上个记录的日期”,如果在编号冠上一个日期值,应该是“单据”的日期,不应该是上个记录的日期!
如果都以上个记录的日期和尾号(+1),可能造成日期值偏多而使3位尾号不足(问题在于+1可能进位),容易造成重号或者断号!
我认为应该以单据的日期为准,同一个日期中有近千各数供给编号是足足有余!再假设你不删除记录,也就不会产生断号和重号!从财务制度看,编号应该是唯一的,也就是说不允许重号!
给你一段代码做参考吧(假设编号字段是字符型)
PARAMETERS driq && 录制单据输入的日期值
cjinu=select() && 记住当前工作区
select 表一 && 指定有编号字段的表为当前工作区
set index to 索引 && 以编号为关键字的索引
set SET FILTER TO left(编号,n)=substr(dtoc(driq),n1,n) && 筛选字段中前若干位与日期中间若干位相同的记录
* 假设n=4,那么:全日期字符型是8位,根据你设定日期的格式取出相应的4位。
count to nJinu && 有没有记录?
if nJinu>0 && 有记录
GO BOTTOM && 最后一条记录
cBianh=left(编号,n)+right("000000"+alltrim(str(val(right(编号,3))+1)),3)
else && 没记录——这个日期的单据是第一次输入
cBianh=substr(dtoc(driq),n1,n)+"001"
endif
set index to
set SET FILTER TO
select &cjinu
return cBianh
如果你确认在调用此函数之前,和调用本函数之后都在同一个工作区,则:可以省略以下代码:
cjinu=select() && 记住当前工作区
select 表一 && 指定有编号字段的表为当前工作区
select &cjinu
如果你还考虑断号和重号,必须另外做函数
[[it] 本帖最后由 午丁 于 2008-9-12 23:50 编辑 [/it]]