生成具有特定格式的数字增加 ex 'PRT-00000'

generate a number increases with a specific format ex 'PRT-00000'

我想在 delphi 中为我的访问数据库创建自动编号 示例:

我有一个带有部件名称的数据库,我想创建一个自动 ID 来计算这些记录的数量并生成一个带有编号的名称 'PRT-00000' 并在每次添加记录时将其增加一个并保持这种五位数的格式,像这样 'PRT-00001'

请帮助我,非常感谢。

对不起我的英语不好

让我们假设您的 Access table 被命名为 'Parts' 并且有一个自动编号 名为 'ID' 的字段和一个名为 'PartNumber' 的短文本字段。一种生成方法 PartNumber 值将是获取 Access 来为您计算它,但由于您已经询问 Delphi,我将在 Delphi.

中解释一种方法

请开始一个新的、非常简单的项目,只需在主窗体上添加以下项目:

  • 配置为连接到您的数据库的 TAdoConnection;
  • 一个 TAdoQuery 配置为使用 TAdoConnection 及其 SQL.Text 属性 集 至 'select * from Parts'
  • 配置为显示 TAdoQuery 内容的 TDataSource 和 TDBGrid。
  • 一个 TButton

然后,将以下代码添加到表单的单元中:

procedure TForm2.Button1Click(Sender: TObject);
begin
  NewPart;
end;

procedure TForm2.NewPart;
const
  sSelect = 'select * from Parts';
  sPrefix = 'PRT-';
  iDigits = 5;
var
  PartNumber : String;
  ID : Integer;
begin
  qryParts.Insert;

  try
    //  First, set the new record's PartNumber field to a temporary value
    qryParts.FieldByName('PartNumber').AsString := 'xxxx';

    // save the record so that we can then read the ID value Access has allocated to the record
    qryParts.Post;

    // read the ID value

    ID := qryParts.FieldByName('ID').AsInteger;

    //  next, construct the desired value for the PartNumber field based on the ID
    PartNumber := qryParts.FieldByName('ID').AsString;

    //  left-pad the PartNumber with zeroes
    while Length(PartNumber) < iDigits do
      PartNumber := '0' + PartNumber;

    // pre-pend the PRT- prefix
    PartNumber := sPrefix + PartNumber;

    // put qryParts into its dsEdit state
    qryParts.Edit;
    qryParts.FieldByName('PartNumber').AsString := PartNumber;

  finally
     // post the record back to the Parts table
    qryParts.Post;
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  qryParts.Open;
end;

更新 我设法在新零件发布到数据库之前获得了新零件的自动编号 ID。要使用它,请添加 NewAutoNumber 函数并修改 NewPart 方法,如下所示。

function TForm2.NewAutoNumber(ATable, AColumn: String): Integer;
var
  vCat : OleVariant;
  vTable : OleVariant;
  vColumn : OleVariant;
begin
  vCat := CreateOleObject('ADOX.Catalog');
  vCat.ActiveConnection := AdoConnection1.ConnectionString;
  vTable := vCat.Tables[ATable];
  vColumn := vTable.Columns[AColumn];
  Result := vColumn.Properties['Seed'].Value;
end;

procedure TForm2.NewPart;
const
  sSelect = 'select * from Parts';
  sPrefix = 'PRT-';
  iDigits = 5;
var
  PrvSql : String;
  PartNumber : String;
  ID : Integer;
begin
  ID := NewAutoNumber('Parts', 'ID');
  try
    qryParts.Insert;
    qryParts.FieldByName('PartNumber').AsString := 'xxxx';
    qryParts.Post;

    if not qryParts.Locate('ID', ID, []) then begin
      raise exception.CreateFmt('Failed to create new Parts record with ID = %d', [ID]);
    end;

    PartNumber := qryParts.FieldByName('ID').AsString;

    while Length(PartNumber) < iDigits do
      PartNumber := '0' + PartNumber;
    PartNumber := sPrefix + PartNumber;

    qryParts.Edit;
    qryParts.FieldByName('PartNumber').AsString := PartNumber;
  finally
    qryParts.Post;
  end;
end;

更新 #2 作为获取新添加的部件记录的 ID 值的替代方法,使用 以上两种方式,都可以通过'select @@identity'方式获取。最简单的 这样做的方法是在表单中添加另一个 TAdoQuery、qryAutoNumber 并将此函数添加到 获取自动编号值:

function TForm2.NewAutoNumberFromIdentity : Integer;
begin
  if qryAutoNumber.Active then
    qryAutoNumber.Close;
  qryAutoNumber.SQL.Text := 'select @@identity';
  qryAutoNumber.Open;
  Result := qryAutoNumber.Fields[0].AsInteger;
end;

请注意,要获得正确的 ID 值,应在 调用 qryParts.Post 之后立即调用此函数 。但是,我已经包括了这个 只是为了完整性,但据我所知,这在很大程度上是毫无意义的 因为一旦发布了新的 Parts 记录,ID AutoNumber 值 可以直接从qryParts.

ID字段读取