我希望能够从用户在两个不同组合框中选择的内容中过滤数据库。
从组合框中选择某些内容
var i : integer;
begin
i := cmbA.ItemIndex;
bA := True; // global boolean variable
case i of
0 : strA := 'One'; //Global string variable
1 : strA := 'Two';
else bA:= False;
end;
此代码在第二个组合框中重复,除非有'A',否则有'B'。
用户点击按钮后
if bA then
dmDatabase.tblTable.Filter := 'A = ' + QuotedStr(strA);
if bSize then
dmDatabase.tblTable.Filter := 'B = ' + QuotedStr(strB);
此代码的问题是一个取消另一个。 例如,如果从A中选择某些内容,然后从B中选择,则只有B过滤器将显示在dbGrid中。
我想要的是过滤器只显示数据库中适用于'A'和'B'的那些。
答案 0 :(得分:1)
数据集的Filter属性能够改变复杂的标准 你可以例如有这样的承诺:
aField=1 and (bField Like 'Am%' or bField Like 'Bm%') AND cField is not NULL
由于您只想添加AND
条件而不需要复合,因此在公共部分中声明的简单生成可能对此有用:
Procedure dmDatabase.AddToFilter(const Expression: String);
Const
C_AndIfNotEmpty: Array [boolean] of String = ('', ' AND ');
begin
tblTable.Filter := tblTable.Filter + C_AndIfNotEmpty[TRIM(tblTable.Filter) <> '']
+ Expression;
end;
点着火,忘了叫:
if bA then
dmDatabase.AddToFilter('A = ' + QuotedStr(strA));
if bSize then
dmDatabase.AddToFilter('B = ' + QuotedStr(strB));