按记录字段搜索数据库表并在cxgrid上显示记录

时间:2015-03-17 11:05:59

标签: delphi delphi-xe2 sybase-asa tcxgrid

允许用户通过在单击按钮的tedit框中键入文本来搜索数据库表中的记录的最佳方法是什么,然后结果将显示在tcxgrid上。

我有一个tadquery / datasource正在查看包含各种字段的表。如果用户能够在表格中搜索多个字段,那就太好了。

感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用TDataSet.Locate来传递分号分隔的字段名称列表和一组常量字段值以匹配。通常,这很容易:

DataSet.Locate('Field1;Field2', ['Value1', 'Value2'], [loPartialKey]);

但是,由于您事先并不知道有多少列,因此您需要使用VarArrayCreate以不同的方式处理数组,并分别设置每个数组值。

此示例获取Edit1的字段列表(以分号分隔),要匹配的Edit2值列表(再次,以分号分隔,字符串值由{{1}包围}字符,因此它们被正确地包含在数组中)。它将'的内容拆分为一个数组,以找出有多少元素,分配一个适当大小的变量数组,填充它,然后将字段列表和值数组传递给Edit1 。它已使用TDataSet.LocateEdit1.Text := 'Customer_No;Name';进行了测试。

Edit2.Text := '1;''Smith''';

对于包含procedure TForm5.Button1Click(Sender: TObject); var Temp: string; Fields: TArray<string>; Vals: TArray<string>; FieldValues: Variant; i: Integer; begin // Grab a copy so we can split it into separate values Temp := Edit1.Text; Fields := Temp.Split([';']); // Create the array of variants to hold the field values FieldValues := VarArrayCreate([0, High(Fields)], VarVariant); // Temporary copy to allow splitting into individual values Temp := Edit2.Text; Vals := Temp.Split([';']); for i := 0 to High(Fields) do FieldValues[i] := Vals[i]; // Use original field list from Edit1 for the Locate operation DataSet1.Locate(Edit1.Text, FieldValues, [loCaseInsensitive]); end; 之前的Delphi版本(例如您正在使用的XE2,只需将TStringHelperTypes添加到您的uses子句并使用{{1}而StrUtils改为:

SplitString

答案 1 :(得分:0)

我会使用查询数据源和按钮的onclick事件,使用WHERE子句重新加载查询

Query1.SQL.Add('WHERE Name LIKE :P1 OR Postcode LIKE :P2 OR Town LIKE :P3');

并添加参数

Query1.SQL.Parameters.ParamByName('P1').Value := '%' + Edit1.Text + '%';
Query1.SQL.Parameters.ParamByName('P2').Value := '%' + Edit1.Text + '%';
Query1.SQL.Parameters.ParamByName('P3').Value := '%' + Edit1.Text + '%';

使用&#39;%&#39;允许在字符串中的任何位置搜索作为选项。

Query1.Open;

我多次使用过这种技术。