软件中,常常使用流水号,通常流水号是一组参数的组合,如:评估报告的编号结构:
区编号-机构类型-年份-性别-流水
如: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;
beginif 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>0then L:=DataModule1.ClientDataSet1.FieldByName('流水').AsInteger+1else 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='') thenbeginClientDataSet2.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 beginClientDataSet2.Edit;ClientDataSet2.FieldByName('流水').AsInteger:=L;ClientDataSet2.FieldByName('编号').AsString:=S9;ClientDataSet2.Post;endelse ShowMessage(sErr);UpDataClientOne(ClientDataSet2,'等级评估23_记录');
end;
第二种方式,软件代码比较复杂,略了,需要读取数据,再进行处理。