Delphi自动生成编码

本文介绍了使用Delphi自动生成单据编号的方法,包括基于时间与数据库记录的单据编号生成,以及根据已有记录生成下一个流水号。文章提供了具体函数实现,如Create_OrderNum和Create_RecordNum,适用于需要自动编码的Delphi应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:Delphi自动生成编码作者:Halu小红

unit CreateOrderNum;

interface

uses
 Windows,SysUtils,ADODB,StrUtils,Messages,Dialogs;

  Function Create_OrderNum(BH_FieldName,TableName,RQ_FieldName,orderFirst:string):string;
  Function Create_RecordNum(BH_FieldName,TableName,RecordFirst:string):string;
  Function GetNewBHStr(BHTableName, BHFieldName, BHFirst:string; BHLength:Integer):string;//获取唯一编号

implementation

// 注意: 此函数要通过DataModule中的ADOConnection1与数据库相连

uses DataModule;

 

Function Create_OrderNum(BH_FieldName,TableName,RQ_FieldName,orderFirst:string):string;
//-----------------------  Create_OrderNum 函数说明  ------------------------//
//----- 函数作用: 根据时间和数据库已有记录自动生成单据编号               ----//
//----- 参数说明: BH_FieldName(表的编号字段名),TableName(表名),          ----//
//-----           RQ_FieldName(日期字段名),orderFirst(单据开头标识)      ----//
//----- 调用方法: Create_OrderNum('YFK_BH','TDD_YFK','YFK_RQ','YFK');    ----//
//----- 返回值:  字符串类型 如:FKD_201008100001                        ----//
//----- 作者:   苏贵阳    2010-8-10                                    ----//
//-----------------------------------------------------------------------------//
var
  adoQ_temp : TADOQuery;
begin
  adoQ_temp:= TADOQuery.Create(nil);                    //生成临时的ADOQuery变量
  adoQ_temp.Connection := DataModule1.ADOConnection1 ;  //将adoQ_temp与ADOConnection1相连
  with adoQ_temp do
  begin
    Close;
   SQL.Clear;
   SQL.Add(Format('select %s from %s where %s=:rq',[BH_FieldName,TableName,RQ_FieldName]));
   Parameters.ParamByName('rq').Value := DateToStr(date());
    Open;
    if not adoQ_temp.IsEmpty then
   begin  //如果当天已有记录,则取出最大的编号,然后最后流水号加1
     Last;
     Result:=Format ('%s_%s',[orderFirst,IntToStr(StrToInt64(RightStr(Fields[0].AsString,12))+1)]);
    end
   else   //如果当天尚无记录,则生成一个当天的初始编号
    begin
      Result:=Format('%s_%s',[orderFirst,(FormatDateTime('yyyymmdd',date())+'0001')]);
    end;
    close;
  end;
 adoQ_temp.free;   //释放临时ADOQuery变量
end;
//---------------------------- 常见问题 -----------------------------//
//---- 问题:编号无法自动累加                                   ----//
//---- 解答:请检查该表中日期字段的格式                         ----//
//----      正确的格式如:  2010-08-10 00:00:00.000            ----//
//-------------------------------------------------------------------//

 


Function Create_RecordNum(BH_FieldName,TableName,RecordFirst:string):string;
//-----------------------  Create_RecordNum 函数说明  ----------------------//
//----- 函数作用: 自动生成单据编号,新生成的编号为已有最大编号的下一个   ----//
//----- 参数说明: BH_FieldName(表的编号字段名),TableName(表名),          ----//
//-----           orderFirst(单据开头标识)                               ----//
//----- 调用方法: Create_RecordNum('DTJ_BH','TCP_DTJ','DTJ')             ----//
//----- 返回值:  字符串类型 如:DTJ_0001                                ----//
//----- 作者:   苏贵阳    2010-8-12                                    ----//
//-----------------------------------------------------------------------------//
var
  str : string;
  adoQ_temp : TADOQuery;
begin
  adoQ_temp:= TADOQuery.Create(nil);                    //生成临时的ADOQuery变量
  adoQ_temp.Connection := DataModule1.ADOConnection1 ;  //将adoQ_temp与ADOConnection1相连
  with adoQ_temp do
  begin
    Close;
   SQL.Clear;
   SQL.Add(Format('select %s from %s',[BH_FieldName,TableName]));
    Open;
    if not adoQ_temp.IsEmpty then
   begin   //取出最大的编号,然后最后流水号加1
     Last;
     str := IntToStr(StrToInt64(RightStr(Fields[0].AsString,4))+1);
     case  Length(str) of
       1: str :=Format('000%s',[str]);
       2: str :=Format('00%s',[str]);
       3: str :=Format('0%s',[str]);
       4: str :=Format('%s',[str]);
     end;
     Result:=Format ('%s_%s',[RecordFirst,str]);
    end
   else   //如果尚无记录,则生成一个初始编号
    begin
      Result:=Format('%s_%s',[RecordFirst,'0001']);
    end;
    close;
  end;
  adoQ_temp.free;
end;

Function GetNewBHStr(BHTableName, BHFieldName, BHFirst:string; BHLength:Integer):string;//获取唯一编号
//-----------------------  GetNewBHStr 函数说明  ---------------------------//
//----- 函数作用: 自动生成单据编号,新生成的编号为已有最大编号的下一个   ----//
//----- 参数说明: BHTableName(表名),BHFieldName(表的编号字段名),         ----//
//-----           BHFirst(单据开头标识),BHLength(流水号长度)             ----//
//----- 调用方法: GetNewBHStr('TCP_CPXX','CPXX_BH','CPX',4);             ----//
//----- 返回值:  字符串类型 如:CPX_0001                                ----//
//----- 作者:                                                            ----//
//-----------------------------------------------------------------------------//
var
  BHStr, BHLen, BHNumStr: string;
  IPos, BHNum, I: Integer;
  adoQ_temp : TADOQuery;
begin
  adoQ_temp:= TADOQuery.Create(nil);                    //生成临时的ADOQuery变量
  adoQ_temp.Connection := DataModule1.ADOConnection1 ;  //将adoQ_temp与ADOConnection1相连
  with adoQ_temp do
  begin
    Close;
   SQL.Clear;
   SQL.Add(Format('select %s from %s',[BHFieldName,BHTableName]));
    Open;
    if not adoQ_temp.IsEmpty then
   begin  //如果当天已有记录,则取出最大的编号,然后最后流水号加1
     Last;
     BHStr:=Fields[0].AsString;
     IPos :=Pos ('_',BHStr);
     if IPos>0 then
     begin
       BHLen:=Copy (BHStr,IPos+1,Length (BHStr));
       BHStr:=Copy (BHStr,1,IPos);
       BHNumStr:=IntToStr(StrToIntDef(BHLen,1)+1);
       while Length (BHNumStr)
       BHStr:=BHStr+BHNumStr;
     end else
     begin
       BHStr:=Format ('%s_%d',[BHFirst,8888]);
     end;
    end
   else   //如果当天尚无记录,则生成一个当天的初始编号
    begin
     BHNumStr:=IntToStr (1);
     while Length (BHNumStr)
     BHStr:=Format('%s_%s',[BHFirst,BHNumStr]);
    end;
    close;
  end;
  Result:=BHStr;
  adoQ_temp.free;
end;
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值