什么是允许用户通过键入文本TEDIT箱点击一个按钮,然后将结果再显示到tcxgrid搜索记录保存在数据库表中的最佳途径。
我有一个tadquery /数据源是在看,它含有各种字段的表。如果用户能够在表格中搜索多个字段这将是很好。
谢谢。
您可以使用TDataSet.Locate
对于这一点,通过字段名的分号分隔的列表,不断字段值的阵列相匹配。通常情况下,这是很容易:
DataSet.Locate('Field1;Field2', ['Value1', 'Value2'], [loPartialKey]);
然而,因为你不知道提前多少列,你需要以不同的方式处理数组,使用VarArrayCreate
并分别设置每个数组值。
本例将来自Edit1
字段的列表(由分号分隔的),值从Edit2
匹配的列表中(再次,以分号分隔,与由'
字符包围的字符串值以使它们能够适当地包括在阵列中)。它分裂Edit1
的内容到一个数组中找出多少元素,分配适当大小的变量数组,填充它,然后通过这两个字段列表和值TDataSet.Locate
的阵列。它与Edit1.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;
对于德尔福之前的版本中包含TStringHelper
的(如XE2你使用,只需添加Types
和StrUtils
你使用条款,并使用SplitString
和TStringDynArray
改为:
procedure TForm5.Button1Click(Sender: TObject);
var
Temp: string;
Fields: TStringDynArray;
Vals: TStringDynArray;
FieldValues: Variant;
i: Integer;
begin
Temp := Edit1.Text;
Fields := SplitString(Temp, ';');
FieldValues := VarArrayCreate([0, Length(Fields)], VarVariant);
Temp := Edit2.Text;
Vals := SplitString(Temp, ';');
for i := 0 to High(Fields) do
FieldValues[i] := Vals[i];
DataSet1.Locate(Temp, FieldValues, [loCaseInsensitive]);
end;
我会用一个查询的数据源,并在按钮的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 + '%';
使用“%”允许字符串作为一个选项中的任何位置进行搜索。
Query1.Open;
我用这个技术很多次。