如何在 DBGrid 中显示与数据库中不同的值?
How do I display values in a DBGrid that are different from those in the database?
问题
我有 DBGdrid
并且有些列显示来自 MS Access 数据库的 ID's
。我怎样才能将它们更改为像 item name, client name, employee name
这样的真实值?
我有代码(测试代码,我只是试图从 table 中获取所有项目名称,我可以将它们保存到数组或变量中,并用 DBGrid
值更改显示 id 的值),但是我不知道如何更改 DBGrid
值字段。
procedure TForm2.Button1Click(Sender: TObject);
var i,j:integer; mas:string;
begin
Button1.Enabled := false;
Button2.Enabled := true;
Button3.Enabled := true;
Form1.ADOQuery1.SQL.Text := 'SELECT * FROM items_specification';
Form1.ADOQuery1.Open;
j:= Form1.ADOQuery1.RecordCount;
Form1.ADOQuery1.Close;
i:=1;
repeat
Form1.ADOQuery1.SQL.Text := 'SELECT * FROM items_specification WHERE item_id = :ID';
Form1.ADOQuery1.Parameters.ParamByName('ID').Value := i;
Form1.ADOQuery1.Open;
mas:= Form1.ADOQuery1['item_name'];
Form1.ADOQuery1.Close;
inc(i);
ShowMessage(mas) ;
until (i = j+1);
也许你有任何解决问题的建议,我将不胜感激。
在 MS Access 中,我已经查找以显示名称 there,mby 在 DBGrid
中有一些方法可以做到这一点吗?
已更新
但代码并不重要..我的大问题是如何在 DBGrid
中设置项目名称、客户名称和员工名称(在值中而不是列标题中)?!在 MS Access 中,id 是数字的那些字段,所以如果我什至编辑 DBGrid
它不允许我将值更改为字符串。我能想象的唯一方法是破坏 MS Access 中的关系并更改字段to ShortText
,但我认为这不是最好的方法。
要在 DBGrid
单元格中显示实际上不在数据库中的值,您可以添加 calculated field
。
您双击来源:ADOQuery1
并将您想要的所有字段添加到可用字段列表中。然后你添加一个新字段。
(我把其他字段留空了,因为我很懒,但是你应该确保添加你想要列出的数据库中的所有字段)
您根据需要设置属性(不要忘记对话框中间的单选按钮)。
在您的表单中,将添加一个与您在 Name
框中输入的名称匹配的新字段 (以数据集名称为前缀).
然后双击数据集 (ADOQuery1
) 的 OnCalcFields
事件并插入代码以填充计算字段,例如:
procedure TForm44.ADOQuery1CalcFields(DataSet: TDataSet);
begin
ADOQuery1ExampleCalc1.AsString:= 'Prefix:'+DataSet.FieldByName('Field1').AsString;
ADOQuery1ExampleCalc2.AsInteger:= DataSet.FieldByName('Amount').AsInteger+100;
end;
备注
如果你显示很多行,你会发现它可能显示的很慢。在这种情况下,将 FieldByName
替换为实际的字段引用,例如ADOQuery1Field1
.
FieldByName 每次调用时都会进行查找,这会减慢速度。
注2
您还可以在 OnCalcFields 事件中组合来自 2 个数据库表的数据,但要注意该事件会针对显示的每一行调用一次,因此请确保您的查找是快速的。
如果不是,最好更改查询中的 SQL 语句。
进一步阅读
请参阅此处(如果您想在 运行 时间执行此操作):Adding a calculated field to a Query at run time
官方文档如下:http://docwiki.embarcadero.com/RADStudio/Seattle/en/Defining_a_Calculated_Field
示例代码:http://docwiki.embarcadero.com/RADStudio/Seattle/en/Programming_a_Calculated_Field
问题
我有 DBGdrid
并且有些列显示来自 MS Access 数据库的 ID's
。我怎样才能将它们更改为像 item name, client name, employee name
这样的真实值?
我有代码(测试代码,我只是试图从 table 中获取所有项目名称,我可以将它们保存到数组或变量中,并用 DBGrid
值更改显示 id 的值),但是我不知道如何更改 DBGrid
值字段。
procedure TForm2.Button1Click(Sender: TObject);
var i,j:integer; mas:string;
begin
Button1.Enabled := false;
Button2.Enabled := true;
Button3.Enabled := true;
Form1.ADOQuery1.SQL.Text := 'SELECT * FROM items_specification';
Form1.ADOQuery1.Open;
j:= Form1.ADOQuery1.RecordCount;
Form1.ADOQuery1.Close;
i:=1;
repeat
Form1.ADOQuery1.SQL.Text := 'SELECT * FROM items_specification WHERE item_id = :ID';
Form1.ADOQuery1.Parameters.ParamByName('ID').Value := i;
Form1.ADOQuery1.Open;
mas:= Form1.ADOQuery1['item_name'];
Form1.ADOQuery1.Close;
inc(i);
ShowMessage(mas) ;
until (i = j+1);
也许你有任何解决问题的建议,我将不胜感激。
在 MS Access 中,我已经查找以显示名称 there,mby 在 DBGrid
中有一些方法可以做到这一点吗?
已更新
但代码并不重要..我的大问题是如何在 DBGrid
中设置项目名称、客户名称和员工名称(在值中而不是列标题中)?!在 MS Access 中,id 是数字的那些字段,所以如果我什至编辑 DBGrid
它不允许我将值更改为字符串。我能想象的唯一方法是破坏 MS Access 中的关系并更改字段to ShortText
,但我认为这不是最好的方法。
要在 DBGrid
单元格中显示实际上不在数据库中的值,您可以添加 calculated field
。
您双击来源:ADOQuery1
并将您想要的所有字段添加到可用字段列表中。然后你添加一个新字段。
(我把其他字段留空了,因为我很懒,但是你应该确保添加你想要列出的数据库中的所有字段)
您根据需要设置属性(不要忘记对话框中间的单选按钮)。
在您的表单中,将添加一个与您在 Name
框中输入的名称匹配的新字段 (以数据集名称为前缀).
然后双击数据集 (ADOQuery1
) 的 OnCalcFields
事件并插入代码以填充计算字段,例如:
procedure TForm44.ADOQuery1CalcFields(DataSet: TDataSet);
begin
ADOQuery1ExampleCalc1.AsString:= 'Prefix:'+DataSet.FieldByName('Field1').AsString;
ADOQuery1ExampleCalc2.AsInteger:= DataSet.FieldByName('Amount').AsInteger+100;
end;
备注
如果你显示很多行,你会发现它可能显示的很慢。在这种情况下,将 FieldByName
替换为实际的字段引用,例如ADOQuery1Field1
.
FieldByName 每次调用时都会进行查找,这会减慢速度。
注2
您还可以在 OnCalcFields 事件中组合来自 2 个数据库表的数据,但要注意该事件会针对显示的每一行调用一次,因此请确保您的查找是快速的。
如果不是,最好更改查询中的 SQL 语句。
进一步阅读
请参阅此处(如果您想在 运行 时间执行此操作):Adding a calculated field to a Query at run time
官方文档如下:http://docwiki.embarcadero.com/RADStudio/Seattle/en/Defining_a_Calculated_Field
示例代码:http://docwiki.embarcadero.com/RADStudio/Seattle/en/Programming_a_Calculated_Field