以前的代码变量繁多,提炼一下:
先判断字段的类型,可以直接用Field.DataType属性得到。
有ftString, ftInteger, ftBoolean, ftFloat, ftDateTime...
得到以后:
if sFieldType='c' then // 字符型
begin
with cbMethod.Items do //cbMethod:TComboBox
begin
clear;
Add('等于');
Add('包含');
end;
end
else // 日期型、数字型和其它类型
with cbMethod.Items do
begin
clear;
Add('等于');
Add('大于');
Add('小于');
Add('不等于');
end;
当用户设好一个条件,按确定时,把该条件加入一个TStringList
var sFieldName, sFieldType, sMethod, sValue, sEnSql : string;
begin
if sFieldType='c' then // 字符运算
begin
if cbMethod.Text='等于' then
sEnSql := Format('(%s=''%s'')', [sFieldName, sValue])
else if cbMethod.Text='包含' then
sEnSql := '(' + sFieldName + ' like ''%' + sValue + '%'')';
if sValue = '' then sEnSql := Format('(%s or (%s is null))', [sEnSql, sFieldName]);
end
else if sFieldType='d' then // 日期运算
begin
if cbMethod.Text='等于' then sMethod := '='
else if cbMethod.Text='大于' then sMethod := '>='
else if cbMethod.Text='小于' then sMethod := '<='
else if cbMethod.Text='不等于' then sMethod := '<>';
if sValue = '' then
sEnSql := Format('((%s %s 0) or (%s is null))', [sFieldName, sMethod, sFieldName])
else
sEnSql := Format('(%s %s ''%s'')', [sFieldName, sMethod, sValue]);
end
else // 数字运算
begin
if cbMethod.Text='等于' then sMethod := '='
else if cbMethod.Text='大于' then sMethod := '>='
else if cbMethod.Text='小于' then sMethod := '<='
else if cbMethod.Text='不等于' then sMethod := '<>';
if sValue = '' then
sEnSql := Format('((%s %s 0) or (%s is null))', [sFieldName, sMethod, sFieldName])
else
sEnSql := Format('(%s %s %s)', [sFieldName, sMethod, sValue]);
end;
SqlLists.Add(sEnSql);
做完这些再把得到的多个条件做一个循环放到最后的SQL语句里面,
以上代码仅供参考,具体界面和功能的补充请根据需要进行扩充。