dbgird的分页显示还是不行,请各位高手指教,谢谢(20分)

  • 主题发起人 主题发起人 playvc
  • 开始时间 开始时间
P

playvc

Unregistered / Unconfirmed
GUEST, unregistred user!
我的数据库服务是sql server 6.5,前台用的是BDE和ODBC连接。数据库别名是:hospital

我的程序代码如下:
procedure ShowPage(CurPage :integer;tag :integer);
procedure btnNextClick(Sender: TObject);
procedure btnPriorClick(Sender: TObject);
全局变量
var
frmYaoPing: TfrmYaoPing;
StateArray: TStateArray;
pagecount : integer = 0;
curpage : integer;
Const PageSize :integer = 50;

procedure TfrmYaoPing.ShowPage(CurPage, tag: integer);
var
sqlstr :string;
begin
// 显示收费标准查询的翻页查询
DM.qryYaoPing.Close;
DM.qryYaoPing.SQL.Clear;
DM.qryYaoPing.SQL.Add('select a.charge_name,');
DM.qryYaoPing.SQL.Add('a.specify,');
DM.qryYaoPing.SQL.Add('a.unit,');
DM.qryYaoPing.SQL.Add('a.sub_qty,');
DM.qryYaoPing.SQL.Add('a.sale_price,');
DM.qryYaoPing.SQL.Add('b.location_name,');
DM.qryYaoPing.SQL.Add('c.m_name,');
DM.qryYaoPing.SQL.Add('d.type_5 ');

DM.qryYaoPing.SQL.Add(' from yp_location a left outer join zd_location b on (a.location_no = b.location_no) ');
DM.qryYaoPing.SQL.Add(' left outer join yp_make c on a.menufacture = c.m_code ');
DM.qryYaoPing.SQL.Add(' left outer join yp_list d on (a.charge_id = d.charge_id and a.charge_name = d.charge_name) ');
DM.qryYaoPing.SQL.Add(' where (b.location_no like ''' + '02-001%'+ ''' or ');
DM.qryYaoPing.SQL.Add(' b.location_no like ''' + '02-002%'+ ''' or ');
DM.qryYaoPing.SQL.Add(' b.location_no like ''' + '02-003%'+ ''') ');

DM.qryYaoPing.SQL.Add(' and a.charge_name like ''' + '%'+edtCoding.Text+'%' + '''');
//Showmessage(DM.qryYaoPing.SQL.Text); // 显示输入的SQL语句
DM.qryYaoPing.Open;

// 显示门诊诊疗的翻页查询
DM.qryYaoPing1.Close;
DM.qryYaoPing1.SQL.Clear;
DM.qryYaoPing1.SQL.Add('select name,type1,amount,specify,office from zd_list');
DM.qryYaoPing1.SQL.Add(' where name like ''' + '%' + edtName.Text +'%' + '''');
DM.qryYaoPing1.SQL.Add(' and (specify <> '''') and (office <> '''') and (amount <> 0) ');
//Showmessage(DM.qryYaoPing1.SQL.Text); // 显示输入的SQL语句
DM.qryYaoPing1.Open;

// 显示住院诊疗的翻页查询
DM.qryYaoPing2.Close;
DM.qryYaoPing2.SQL.Clear;
DM.qryYaoPing2.SQL.Add('select order_name,order_gg,order_unit,price,ks_name,SUBSTRING(order_type,1,3) from yz_zd');
DM.qryYaoPing2.SQL.Add(' where order_name like ''' + '%'+edtName.Text+'%' + '''');
DM.qryYaoPing2.SQL.Add(' and (ks_name <> '''') and (order_gg <> '''') and (price <> 0) ');
//Showmessage(DM.qryYaoPing2.SQL.Text); // 显示输入的SQL语句
DM.qryYaoPing2.Open;

{计算页数}
pagecount := DM.qryYaoPing.RecordCount div pagesize;
if (DM.qryYaoPing.RecordCount / pagesize) <> 0 then
Inc(pageCount);
if (Curpage < 1) then
Curpage := 1;
if Curpage > pageCount then
curpage := pageCount;

{********************************************}
pagecount := DM.qryYaoPing1.RecordCount div pagesize;
if (DM.qryYaoPing1.RecordCount / pagesize) <> 0 then
Inc(pageCount);
if (Curpage < 1) then
Curpage := 1;
if Curpage > pageCount then
curpage := pageCount;

{********************************************}
pagecount := DM.qryYaoPing2.RecordCount div pagesize;
if (DM.qryYaoPing2.RecordCount / pagesize) <> 0 then
Inc(pageCount);
if (Curpage < 1) then
Curpage := 1;
if Curpage > pageCount then
curpage := pageCount;

{筛选当前页数据}
DM.qryYaoPing.Close;
DM.qryYaoPing.SQL.Clear;

// N确定开始的位置,M确定结束的位置。假如要去N=3,M=8的数据,可以直接这样写
DM.qryYaoPing.SQL.Add(' SELECT TOP M-N * FROM (SELECT * FROM Table WHERE NOT EXISTS(SELECT TOP N * FROM Table)) AS MY_TABLE
//DM.qryYaoPing.SQL.Add(' select * from Table where ID BETWEEN '+trim(inttostr((curpage-1)*pagesize))+' AND '+trim(inttostr(curpage*pagesize) );
//ShowMessage(DM.qryYaoPing.SQL.Text); // 显示SQL语句的内容
DM.qryYaoPing.Open;

{***********************************************************************}
DM.qryYaoPing1.Close;
DM.qryYaoPing1.SQL.Clear;

// N确定开始的位置,M确定结束的位置。假如要去N=3,M=8的数据,可以直接这样写
DM.qryYaoPing1.SQL.Add(' SELECT TOP M-N * FROM (SELECT * FROM Table WHERE NOT EXISTS(SELECT TOP N * FROM Table)) AS MY_TABLE
//DM.qryYaoPing1.SQL.Add(' select * from Table where ID BETWEEN '+trim(inttostr((curpage-1)*pagesize))+' AND '+trim(inttostr(curpage*pagesize) );
//ShowMessage(DM.qryYaoPing1.SQL.Text); // 显示SQL语句的内容
DM.qryYaoPing1.Open;

{***********************************************************************}
DM.qryYaoPing2.Close;
DM.qryYaoPing2.SQL.Clear;

// N确定开始的位置,M确定结束的位置。假如要去N=3,M=8的数据,可以直接这样写
DM.qryYaoPing2.SQL.Add(' SELECT TOP M-N * FROM (SELECT * FROM Table WHERE NOT EXISTS(SELECT TOP N * FROM Table)) AS MY_TABLE
//DM.qryYaoPing2.SQL.Add(' select * from Table where ID BETWEEN '+trim(inttostr((curpage-1)*pagesize))+' AND '+trim(inttostr(curpage*pagesize) );
//ShowMessage(DM.qryYaoPing2.SQL.Text); // 显示SQL语句的内容
DM.qryYaoPing2.Open;
end;

// 上翻页
procedure TfrmYaoPing.btnPriorClick(Sender: TObject);
begin
if curpage = 1 then
begin
//ShowMessage('已经到了第一页啦 (@_@)');
btnPrior.Enabled := false;
end
else
begin
btnNext.Enabled := true;
Dec(curpage);
self.ShowPage(curpage,0);
end
end;

// 下翻页
procedure TfrmYaoPing.btnNextClick(Sender: TObject);
begin
if curpage = pagecount then
begin
//ShowMessage('已经到了最后一页啦 (@_@)');
btnNext.Enabled := false;
btnPrior.Enabled := true;
end
else
begin
inc(curpage);
self.ShowPage(curpage,0);
end
end;
 
备注:

就是把查询出来的内容进行分页显示。

三个查询按钮。都在同一个窗体上,第一个查询按钮是药品查询,第二个按钮是门诊诊疗,第三个按钮是住院诊疗。三个查询出来的内容都要进行分页显示。
 
大家帮忙看一下了,谢谢,我这里真是急死了,帮忙看者有分(@_@)

第一页:
SELECT TOP 10 *
FROM yp_list
WHERE (charge_id NOT IN
(SELECT TOP 0 charge_id
FROM yp_list))
第二页:
SELECT TOP 10 *
FROM yp_list
WHERE (charge_id NOT IN
(SELECT TOP 10 charge_id
FROM yp_list))

当我用了第一次 TOP 10 SELECT 后,数据库的指针是否移动到 第一笔还是移动到 第十笔的位置,还是根本不确定.

不管是 top 10,还是top 20,指针始终都指向第一条记录

指针在每次上翻页和下翻页后,指针都指向当前页的第一条记录上

如果用sql语句的话,如果是顺序翻页还有办法计算,如果是倒着或是随意地翻页,就会出现指针定位的问题,,,不能保证每次选出来的数据在别的页中不重复显示……
 
大家快来帮忙看看,看者有分。。。。。。。。。。。。。。。。。。。。。。。。。。。
 
第一页时n为0,就是取1-10条记录,
第二页时n为10,就是取11-20条记录,
第三页时n为20,就是取21-30条记录

这个方法行不通
 
各位大虾,各位高手,请帮忙看看。。。小弟我先在这里谢谢您了
 
请帮忙,求救???
 
请教各路英雄看看。。。
 
各位豪杰英雄,大显身手吧
 
各位高手呢,好像都不在?
 
高手都睡觉去了
 
在SQL Server中建立一个用于翻页查询的存储过程,查询时传入一个PageNo参数即可。

CREATE PROCEDURE PageQuery
@PageNo int
AS
Select Identity(int,1,1) AS id, A.*
into #MyTemp A
From TableName

Select * From #MyTemp Where id >= (@PageNo-1)*10+1 and id <= (@PageNo-1)*10+10

至于效率问题就看数据库的大小了。
 
SELECT TOP M-N * FROM
(SELECT * FROM Table
WHERE NOT EXISTS(
SELECT TOP N * FROM Table
)) AS MY_TABLE

N是起点,M是终点

看来我得解释一下这个SQL语句
SELECT TOP N * FROM Table 它是什么意思呢????
它是找出所有表中的前N项记录。 (其实这个集合中的所有记录都是不要的,对吧)

然后:SELECT * FROM Table
WHERE NOT EXISTS(............) 这又是什么意思呢?
其实这就正是要排除前N项记录,这个简单吧。

再然后
SELECT TOP M-N * FROM ........
(M-N)从上面的表中选出要显示的记录数。
很巧妙的解答!

再看看您的写法:
DM.qryYaoPing.SQL.Add(' SELECT TOP M-N * FROM (SELECT * FROM Table WHERE NOT EXISTS(SELECT TOP N * FROM Table)) AS MY_TABLE
您还真把这句话照原样COPY上去了。这能对吗?
1. M、N都是变量,请在前面加个冒号
2. (M-N)是要显示的每页记录数,如果显示10条记录,那么不论是哪页都应该是10。

仔细想想吧。上面的SQL语句我还真的没调试过,但它真的行不通吗?嘿嘿
留下我的EMIAL给你联系吧 keyb@sohu,com
 
后退
顶部