Intraweb数据的通用查询方法

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

发表评论