查看了一些资料,自己初步完成的代码如下,刚刚写完,还没有进一步测试,请哪位前辈斧正指点一下:
分为两个表,表一是写入单据号等详细记录的的,表二是供取单据号用的。
begin
datamoduleform.ADOConnection1.begin
Trans;
try
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'Insert Into 表一(单据号,流水号,,姓名,日期)' +' Values
单据号,:流水号,::姓名,日期)';
ADOQuery1.Parameters.ParamValues['姓名'] := edit1.Text;
ADOQuery1.Parameters.ParamValues['日期'] := date;
ADOQuery6.Close;
ADOQuery6.SQL.Clear;
ADOQuery6.SQL.Add('select 流水号 from 表二 where 日期=:date');
//因为事务一开始就将表一上X锁,那么另一个相同的事务就不能再进行了,也就不怕这地方查询到相同的流水号了。
ADOQuery6.Parameters.ParamValues['date'] :=date;
ADOQuery6.Open;
if ADOQuery6.IsEmpty then
begin
ADOQuery6.Close;
ADOQuery6.SQL.Text:='Insert Into 表二(流水号,日期) Values
流水号,:日期)';
ADOQuery6.Parameters.ParamValues['流水号'] :=2;
//好象一定要等于2,否则下次取出的还是1
ADOQuery6.Parameters.ParamValues['日期'] :=date;
ADOQuery6.ExecSQL;
ADOQuery1.Parameters.ParamValues['流水号'] := 1;
ADOQuery1.Parameters.ParamValues['挂号单据号'] :=format('%s%.3d',[formatdatetime('yymmdd',date),1]);
end
else
begin
ADOQuery1.Parameters.ParamValues['流水号'] := ADOQuery6.Fields[0].AsInteger;
ADOQuery1.Parameters.ParamValues['挂号单据号'] :=format('%s%.3d',[formatdatetime('yymmdd',date),ADOQuery6.Fields[0].AsInteger]);
ADOQuery6.Close;
ADOQuery6.SQL.Clear;
ADOQuery6.SQL.Add('update 表二 set 流水号=流水号+1 where 日期=:date');//取到后在这里加上1,以便下次再取。
ADOQuery6.Parameters.ParamValues['date'] :=date;
ADOQuery6.ExecSQL;
end;
ADOQuery1.ExecSQL;
datamoduleform.ADOConnection1.CommitTrans