软件中,常常使用流水号,通常流水号是一组参数的组合,如:评估报告的编号结构:
区编号-机构类型-年份-性别-流水
如:03-01-2023-W-0001
03-01-2023-M-0002
03-01-2023-M-0003
。。。。。。
编程时,对于流水号的产生通常二种方式:
一种是由字段"流水”,读取最大号+1,这种方式,容易造成跳号。
另一种,是由字段"流水”,由1至Count循环,选取空位,无空位Count+1。这种方式,需要对流水号出现的重复,或无效流水,进行删除处理(人工处理,或软件代码判别)。
本人比较喜欢第一种方式,无需维护,不就是一种编号吗!
procedure TDJPG_23_Frame.sButton11Click(Sender: TObject);
var SQL,sDate,sDate1,sDate2,ID,S,S1,s2,S3,S4,s5,S6,S7,S8,S9,sErr:string;
L:integer;
begin
if Trim(sDBEdit1_1.Text)<>'' then Exit;
DateTimetoString(sDate1,'yyyy-01-01',sDateEdit1.Date);
DateTimetoString(sDate2,'yyyy-12-31',sDateEdit1.Date);
// 获取
SQL:='Select 流水 From 等级评估_流水 where 分支='+#39+sFCID+#39+' and '+
'日期>='+#39+sDate1+#39+' and 日期<='+#39+sDate2+#39+' order by 流水 DESC';
DataModule1.ClientDataSet1.Active:=False;
DataModule1.ClientDataSet1.DataRequest(SQL);
DataModule1.ClientDataSet1.Active:=True;
if DataModule1.ClientDataSet1.RecordCount>0
then L:=DataModule1.ClientDataSet1.FieldByName('流水').AsInteger+1
else L:=1;
DataModule1.ClientDataSet1.Active:=False;
// ShowMessage(S);
// 插入
DateTimetoString(ID,'yyyymmddhhnnsszzz',now);
sDate:=sDBEdit1_9.Text; // 日期
S1:=sDBEdit1_7.Text; // 姓名
S2:=sDBEdit3.Text; // 床号
S3:=sDBEdit7.Text; // 机构类型编号
S4:=sDBEdit1_10.Text; // 区编号
S5:=sDBEdit8.Text; // 性别
if s5='男' then S5:='M'
else S5:='W';
S6:=IntToStr(L); // 流水号
S7:=IntToStr(L); // 流水号
S8:=Copy(sDBEdit1_9.text,1,4); // 年份
while Length(S7)<4 do // 区-机构类型-年份-性别-流水
S7:='0'+S7;
S9:=S4+'-'+S3+'-'+S8+'-'+S5+'-'+S7;
if (S4='') or (S3='') or (S8='') or (S5='') or (S7='') then
begin
ClientDataSet2.Edit;
ClientDataSet2.FieldByName('流水').AsInteger:=L;
ClientDataSet2.FieldByName('编号').AsString:=S9;
ClientDataSet2.Post;
ShowMessage('流水号参数:“日期”“机构类型”“区编号”空缺!');
Exit;
end;
SQL:='INSERT INTO 等级评估_流水(流水,编号,日期,床号,姓名,分支,ID) VALUES('+
#39+S6+#39+','+
#39+S9+#39+','+
#39+sDate+#39+','+
#39+S2+#39+','+
#39+S1+#39+','+
#39+sFCID+#39+','+
#39+ID+#39+')';
if DataModule1.SocketConnection1.AppServer.MyQuery(sql,sErr)
then begin
ClientDataSet2.Edit;
ClientDataSet2.FieldByName('流水').AsInteger:=L;
ClientDataSet2.FieldByName('编号').AsString:=S9;
ClientDataSet2.Post;
end
else ShowMessage(sErr);
UpDataClientOne(ClientDataSet2,'等级评估23_记录');
end;
第二种方式,软件代码比较复杂,略了,需要读取数据,再进行处理。