Author: Tomas Rutkauskas
On a form, I have a TCheckListBox with records (fields code and name, strings) of a
TTable (emp.DB).
[ ] 001 - aaaaaaaaaaa
[ ] 002 - bbbbbbbbbbb
[ ] 003 - ccccccccccc
etc.
How to build an SQL with only the checked items of the CheckListBox? For example,
SELECT * FROM emp WHERE code = (???)...
Answer:
You need to inspect all of the items in the TCheckListBox and, for each one
checked, add the text of the item (with quotation marks) to a string to be used for
an IN predicate in the WHERE clause of your statement.
Written manually, your SQL statement might look like this (for the first two items
checked):
SELECT *
FROM emp
WHERE code in ("aaaaaaaaaaa", "bbbbbbbbbbb")
Done programmatically, it would look something like this:
1 var
2 InPredicate: string;
3 i: Integer;
4 begin
5 InPredicate := '';
6 with Query1 do
7 begin
8 for i := 0 to (CheckListBox1.Items.Count - 1) do
9 if CheckListBox1.Checked[i] then
10 InPredicate := InPredicate + '"' + CheckListBox1.Items[i] + '",';
11 System.Delete(InPredicate, Length(InPredicate), 1);
12 Close;
13 SQL[2] := Format('WHERE State IN (%s)', [InPredicate]);
14 Open;
15 end;
16 end;
Of course, this assumes the SQL statement starts out with a WHERE clause and this
filter will always be on the third line. At any rate, that routine demonstrates
dynamically building the values list for the IN predicate.
If you have too many items in that TCheckListBox, it might be possible to exceed the maximum length of a line in the TQuery.SQL property (255 characters). In such cases, you would need to add checking for this and account for building the filter across multiple lines in the SQL statement.
|