在Visual FoxPro中实现AutoNumber

Author: dqzzb Date: 1998年 第31期 12版

  在用Visual FoxPro设计一对多的关系数据库时,我们需要在主表建立一个主索引,在子表建立一个普通索引。在主表中添加记录时,必须保证被设置为主索引的字段没有重复的值。如果让用户来手工添加记录,有可能在被设置为主索引的字段中出现重复的值,从而导致数据库出错。在Access中,有一个AutoNumber型的字段,由系统自动产生这些不可重复的值,避免了数据库的出错,也为用户带来了方便。
  那么在Visual FoxPro中如何实现这个功能呢?笔者的做法是编一个添加记录的小程序,当用户添加记录时,由自编的程序插入一个新记录,并产生新记录被设置为主索引的字段的值。示例如下:
  有如下二表,people.dbf(主表)结构为id n(3),name c(8),job.dbf(子表)结构为id n(3),job c(10),我们在二表之间建立一对多关系,将people.dbf的id设置为主索引,将job.dbf的id设置为普通索引。添加people.dbf记录的程序如下:
  ′insertpeople.prg:
  calculate max(id) to maxid ′查找现有id的最大值,存入maxid
  insert into people (id) values (maxid+1) ′插入新的记录,并使新记录的id=maxid+1
  实际应用时,设计一个添加按钮(CommandButton1),使其Caption=“添加”,在其Click事件中加入代码:
  ′CommandButton1.Click
  do insertpeople
  如表中记录不经常删除,这一方法比较适用。当表中的数据常常删除时,此方法有一个缺点,仍以people.dbf为例,假设people.dbf中有3条记录,id分别为1、2、3,当用户删除(Delete and Pack)id为2的记录后再添加记录,新添加的记录id为4,而这时的愿望是使其id为2,否则的话,为id分配的3位number空间可能不够用。此时可修改insertpeople.prg如下:
  ′insertpeople.prg:
  select people
  for i=1 to 999 ′让i在1~999之间循环
  locate for (i==people.id) ′在people中查找i值是否重复
  if found()=.f.
  insert into people (id) values (i)
  ′不重复的话,用此时的i值作为新记录的id值
  exit ′中断循环
  endif
  endfor
  在一对多关系中的多方(子表)添加记录时,为了实现与主表的关联,也可以用类似的方法实现。