生成具有特定格式的数字增加 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
字段读取
我想在 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
字段读取