------------------------------------
-- 超级通用型分页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 函数(过程)全功能版