超级通用型分页DELPHI 函数

------------------------------------
-- 超级通用型分页DELPHI 函数(过程)
--            可对Select 语句进行分页,可带 order 、group 等子句
--            可以使用Parameters 的参数
--            初级版,由于存在T1临时表,不能实现缓存更新
--            Dcopyboy 义乌科创计算机有限公司 软件部
--                      2012-02-28
---------------------------------------
procedure GetPageData(aAdoQuery: TAdoquery; Page, pagesize: integer; var RecCount, TotalPage: integer);
var
  Myado: TAdoquery;
  i: integer;
  s: string;
begin
  Myado := TAdoquery.Create(nil);
  Myado.Connection := aAdoQuery.Connection;
  s := trim(aAdoQuery.SQL.text);
  if lowercase(copy(s, 1, 6)) = 'select' then begin
    s := trim(copy(s, 7, 8000));
    if lowercase(copy(s, 1, 8)) = 'distinct' then begin
      s := trim(copy(s, 9, 8000));
      if lowercase(copy(s, 1, 4)) <> 'top ' then  //不能采用100 percent,会破坏原排序
        s := 'select distinct top 10000000 ' + s
      else
        s := 'select distinct ' + s;
    end
    else if lowercase(copy(s, 1, 4)) <> 'top ' then
      s := 'select top 10000000 ' + s
    else
      s := 'select ' + s;
  end;
  myado.sql.Text := 'declare @PageSize int,@pageno int,@RecordCount int,@t int ' +
    ' Set @PageSize=' + inttostr(pagesize) +
    ' set @pageno=' + inttostr(Page) +
    ' SELECT T1.*,IDENTITY(INT,1,1) AS rowNumber INTO #temp1 FROM (' + s + ') AS T1 left JOIN (select 1 as a) AS T2 ON 1=2 ' +
    ' select @RecordCount= @@rowcount ' +
    ' if @pageno<1 select @pageno=1 ' +
    ' select @T=(@PageNo-1)*@PageSize ' +
    ' if @T>=@RecordCount select @T=@RecordCount -@PageSize' +
    ' select * from #temp1 where rowNumber between @t+1 and @t+@PageSize order by rowNumber ' +
    ' drop table #temp1 ' +
    ' select @RecordCount as 记录数 ';
  myado.ParamCheck := true;
  for i := 0 to myado.Parameters.Count - 1 do
    Myado.Parameters[i].Value := aAdoQuery.Parameters.ParamValues[Myado.Parameters[i].Name];
  myado.open;
  aAdoQuery.Recordset := myado.Recordset;
  i := 1;
  myado.Recordset := myado.NextRecordset(i);
  RecCount := Myado.fieldbyname('记录数').asInteger;
  TotalPage := RecCount div pagesize;
  if TotalPage * pagesize < RecCount then inc(TotalPage);
  myado.close;
  myado.free;
end;

 ---- 下次公布 超级通用型分页DELPHI 函数(过程)全功能版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值