我做了个小型的入库程序.三台机子共用一个数据库
   我的编号的生成是从ini文件中取得
//新增.生成单号  初始是rk + 1000001
   var T:Tinifile;
    s:string;
begin
   s:='rk' ;
   button5.Enabled:=false;
   try
     T:=Tinifile.Create('.\djbh.ini');
     djbh.Text:='RK'+t.ReadString(s,'djbh','');
     finally
     T.Free;
     end;
gysmc.Enabled:=true;
tmsr.Enabled:=true;
button1.Enabled:=true;
button2.Enabled:=false;end;
//保存 然后编号保存至ini文件内尾数加1 
procedure Trk.Button1Click(Sender: TObject);
var listitem:tlistitem;
     i:integer;
      T:Tinifile;
    s,inidjbh:string;
begin
   inidjbh:=inttostr(strtoint(copy(djbh.Text,3,6))+1);
    s:='rk';
      try
      t:=Tinifile.Create('.\djbh.ini');
   T.WriteString(s,'djbh',inidjbh);
   finally
   T.Free;
   end;
button2.Enabled:=true;
djbh.Enabled:=false;
gysmc.Enabled:=false; 但现在的情况是.如果是一台机子操作,是没问题.但是如果多台操作.如何保证单据编号不会重复?希望高手能帮我解答一下.

解决方案 »

  1.   

    当你把单据保存后,数据库中当然也有个字段来表示单据编号的,那么你取得INI的号后,与数据库中最大单据号比较,小了就加1,再比较,再小再加1,一直到大于1为止,当然这只能在保存的时候。另外一种:
    可以在数据库中,建一个系统信息表,存一记录表示当前单据的最后一次单据号,当你新建单据的时候,给这个记录值加1,并作为单据编号。
      

  2.   

    如果当前ini中的数值是9
    而单据的最大编号是rk-2008-10-10-0010
    那么就需要先进行计算当前的单据号,得出编号:rk-2008-10-10-0009再与单据的最大编号比较,小了,对9+1,再计算,再比较,这样比较耗时,所以,建议在数据库中建一个信息表,存放最后一个单据的编号数值。如10,这样读出来后,直接对其+1,是11,就可以进行一次计算编号就可以了,
      

  3.   

    我做过一个这样的表...
    就是每次保存的时候,读取数据表中最后一条数据记录,取出编号字段,在此编号字段的基础上再加上'1'
    过程很复杂...由其是这种英文字母与数值相混合的,,,,用DELPHI我还没有做过,,,以前用别的做成过
    思路是先将数据以ID倒排序,取TOP 1的编号字段,,,,如你的编号是RK1000001,,,取文本右边7位转换成数值加上1,,,,再转换成文本当作编号写入数据表格....
    每个人保存时都这样操作一次.保证不会有数据编号是重复的....
      

  4.   

    如果你的编号只是数据库里区别其他记录的话(与业务无关),那么可以用GUID,不会重复的。
      

  5.   

      但是问题是.一台机子是可以的.但是如果两台机子同时操作.如果现在ini里面的单据号是rk100001,两台机子同时新增单据号
    ,读出来的不都是rk100001了吗?
      

  6.   

        你可以这样.在新增的时候.读取ini文件里的单据编号.然后让ini文件的单据号加一.这样其它机子读到的单据号就是下一个了.呵呵.
    (还要注意.如果取消单据的时候.要让ini文件减一.)这样就不会错了.给分吧.
      

  7.   

    ACCESS本身就不提供并发性操作.换数据库或用其它方式解决.