Intraweb + MSSQL控件开发WEB应用服务,能完美实现数据的增删查改操作。数据查找是WEB应用中使用最多的功能,开发人员针对每个界面设计查询代码,会费时费力。建立一个母FORM,母FORM中设计好数据通用查询代码,再继承给实例FORM,将能事半功倍。
WEB应用服务天生对网络带宽敏感,所以每次不能取太多的数据,并且数据要分段下载分页显示,执行查询时动态编辑SQL语句重取数据,是最佳方案。下面是实际应用场景的代码。
动态生成过滤条件的函数:
function TIWUserSession.getWhere(sField,sValue:String):string;
var
sWhere,sValu2,sSign:String;
iPosit:Integer;
begin
sWhere:='';
if (pos(',',sValue)>0) then
begin
while pos(',',sValue)>0 do
begin
iPosit:=pos(',',sValue);
sValu2:=copy(sValue,1,iPosit-1);
if sWhere='' then
sWhere:='(['+sField+']'+'='+''''+sValu2+''''
else
sWhere:=sWhere+' or '+'['+sField+']'+'='+''''+sValu2+'''';
sValue:=copy(sValue,iPosit+1,length(sValue));
end;
if sValue>'' then sWhere:=sWhere+' or '+'['+sField+']'+'='+''''+sValue+'''';
sWhere:=sWhere+')';
end else
begin
sValu2:='';
if(copy(sValue,1,2)='>=')or(copy(sValue,1,2)='<=') then
begin
sSign:=copy(sValue,1,2);
sValue:=copy(sValue,3,length(sValue)-2);
end else if(copy(sValue,1,1)='>')or(copy(sValue,1,1)='<') then
begin
sSign:=copy(sValue,1,1);
sValue:=copy(sValue,2,length(sValue)-1);
end else if(pos('..',sValue)>0) then
begin
iPosit:=pos('..',sValue);
sSign:='between';
sValu2:=copy(sValue,iPosit+2,length(sValue)-iPosit-1);
sValue:=copy(sValue,1,iPosit-1);
end else if (pos('Date',sField)>0) or (pos('Qty',sField)>0) or (pos('Price',sField)>0) then
sSign:='='
else
sSign:='like';
if sSign='between' then
sWhere:=sField+' '+sSign+' '+''''+sValue+''''+' and '+''''+sValu2+''''
else if sSign='like' then
sWhere:='CharIndex('+''''+sValue+''''+','+sField+')>0'
else
sWhere:=sField+' '+sSign+''''+sValue+'''';
end;
Result:=sWhere;
end;
执行查询的代码:
procedure TfmwiqInsRep.btnTop1Click(Sender: TObject);
var
sWhere:String;
begin
//inherited;
//240906搜索不用Filter改用新SQL重取数据
sWhere:=UserSession.getWhere(cbbField.SelectedValue,trim(edtFind.Text));
try
qMaster.Close;
if rdgStatu.ItemIndex = 0 then
qMaster.SQL.Text:=sFixSql+' and IqcStatu<''3'' and '+sWhere+' '+sOrderSql
else
qMaster.SQL.Text:=sFixSql+' and IqcStatu=''3'' and '+sWhere+' '+sOrderSql;
qMaster.Open;
except on E:Exception do
begin
webApplication.ShowMessage(E.Message);
end;
end;
end;
SqlServer2008开始,对Decimal类型的栏位很友好,下述SQL都正确:
select * from w_IqcTempCk where ckMax>700
select * from w_IqcTempCk where ckMax>'700'
select * from w_IqcTempCk where ckMax like '1220%'
select * from w_IqcTempCk where CharIndex('1220',ckMax)>0
