一个看似简单其实挺难的问题,有兴趣的朋友进来看看(10分)

  • 主题发起人 主题发起人 Fuweng
  • 开始时间 开始时间
F

Fuweng

Unregistered / Unconfirmed
GUEST, unregistred user!
用Query做查询将一个表中的所有记录显示出来,这很简单,但怎样显示每条记录
的序号呢?
比如: 表a有字段1,字段2 我想得到如下结果
序号 字段1 字段2
1 xxx xxx
2 xxx xxx
3 xxx xxx
4 xxx xxx
5 xxx xxx
若一屏显示不下,翻到下一屏时序号接着来,如这一屏的最后一条是5,下一屏的
第一条是6.

鉴于此题的难度,估计在一段时间内恐怕没人能回答出来,所以先拿出10分免得浪费,
若真有人回答得正确,重赏200分,决不失言!!!
 
New一个计算(calculated)字段,增加一个整型全局变量,在OnCalcFields事件中进行设置
if i < Query.RecordCount then
begin
Query1NewField.Value := i ;
i := i + 1 ;
end ;
这样做可以吗?
 
1.写程序。OnCalcFields. I have an example.

2.有控件。http://www.csdn.net/delphi/
数据库-->xgenrecordid.zip
 
如果是Oracle数据库一条SQL语句搞定!
Oracle数据库有一伪字段rownum-->行号

with query1 do
begin
Close;
Sql.Clear;
Sql.Add('SELECT ROWNUM,字段1,字段2,...,字段N FROM 表名');
Sql.Add('WHERE 条件');
Open;
end;


 
Add a new filed with field editor, eg 'ITEM', the field type is a calculated field, then on the query's OnCalcFields write down the following code:

DataSet['ITEM']:= DataSet.Recno;

please try.
 
Fuweng终于听我的劝告,来论坛提问题了?
可是回答问题的“不幸”还是我 :-)

而且你也太小看我了,此问题虽然很早就见过,
只是没兴趣研究,今天看见此题,竟然说:
“鉴于此题的难度,估计在一段时间内恐怕没人能回答出来”,
实在令我难过,因此研究了一下,没想到10分钟搞定 :-)

至于答案嘛!作为对你的"惩罚",过两天再宣布。
 
呵呵,是不是看不起各位大富翁了
 
对于数据要显示在何种控件中?
 
这种简单的问题也来提!!!!
 
1,不要打击别人的积极性,
2,提问的也不要太过分。
 
哇!救命啊!!怎么这么多人向我丢臭鸡蛋!!!(浑身落花流水的样子)
哈哈!终于把你们激怒了吧!我又不弱智,怎会不知"鉴于此题的难度,估计在一段
时间内恐怕没人能回答出来"此话的分量.因为现在不同以前了,如果你不把问题
的题目写得吸引人一点,内容不"刺激"一点,怎么会有人来认真回答?
我这招还挺灵!你瞧,连他自己都承认了吧!
>>而且你也太小看我了,此问题虽然很早就见过,
>>只是没兴趣研究,今天看见此题,竟然说:
>>“鉴于此题的难度,估计在一段时间内恐怕没人能回答出来”,
>>实在令我难过,因此研究了一下,没想到10分钟搞定 :-)
(嘻嘻!"激将法"成功后诡秘的一笑)
记得看以前的贴子时:过了好多天,问问题的人早已不知去向,而dwwang等几位大侠
还在孜孜不倦地讨论,那气氛,可真让人......

言归正传!首先,感谢各位的积极参与!
to DSM2000:
你这样做不行!且不说效率极低,问题是根本就不对呀!麻烦你再想一想.
to wumeng:
你这个例子若可行,麻烦给我发一份. fuweng@sina.com
控件我就不要了,一来我用的是C++Builder;二来我向来讨厌外来的控件.比如:
许多人都千方百计地绕开BDE,我却一直死抱着不放.(哎!别...好象又有人要丢臭
鸡蛋)
to wind2000:
Oracle的rownum似乎在以前的帖子上看过,真是不错!但我用的是MS SQL Server.
据说,财富论坛世界500强中有85%用的是IBM的DB2,用Oracle的也不少.老比呀,你的
SQL什么时候才能赶上人家啊!
to Delven Chan:
Recno只支持Paradox,dbase,foxpro,不支持Access,SQL...(怪我没说清楚)
to 刘素杰:
很简单,就是放在DBGrid中.
to lha,only you,SuperMMX:
话说重了,有得罪之处还请谅解!
to 温柔一刀:
希望就寄托在你身上了!别告诉我你用的也是"计算字段".老实说,我向来讨厌
"计算字段"这东西,最主要就是认为其效率低,操作本地表还将就,访问远程数据库
时我想都不想它.

to All:
"计算字段"我早就想过,不知是小弟水平低没想好,还是"计算字段"就不行,这样
看来,本问题确实不那么简单!

再次感谢各位,请继续讨论!!
 
>>别告诉我你用的也是"计算字段"
为什么不能用呢?难道犯法?
可以告诉你,我开始时用了计算字段,
刚刚看了你的帖子,改造了一下,不用了。
其实关键是不能用onCalcFields,因为这才是行不通的。

我用D5+SQL server7,没问题了吧?
不过还有两点要说明,
第一,只能显示于dbcontrol,不能用asstring来获得
(遗憾,但鉴于此题的难度,我只有这个水平了)
第二,解决的方法真是效率低得可以,以至于要挖空心思
优化代码来提高速度。

好了,说了这么多,越来越象自吹自擂了,不过由于
前面有人提出这个问题很简单,我还是“信守诺言”,
星期一再把答案贴出来吧。
(如果有人有更好的答案,我也就免得丢人了:-)
 
小弟水平低,发表一下愚见,请勿见笑:
with query1 do
begin
Close;
Sql.Clear;
Sql.Add('SELECT * FROM 表名');
Open;
end;
在表单上放6行label,第一排做字段名。
把query1的1-5个记录取出付给1-5行label.
显示下一页时依次类推:
不知是否可行。


 
to 温柔一刀:
>>(遗憾,但鉴于此题的难度,我只有这个水平了)
好啊!你!你!你!......(气得晕倒)
 
恕我愚笨,没明白为什么"气得晕倒" :-)
 
靠,看了半天。不知道啥意思
三刀砍你,还不给答案?:)
 
我也碰过这个问题,后经分析方知与数据库及驱动程序有关

1. 可用dataset.Recno但只支持Paradox,dbase,foxpro,不支持Access,SQL...
若要支持Access,SQL...数据库,则要用ADO连接即可
2. 也可用 DSM2000 的方法,但要花时间...
 
ADOquery确实可行,我试验了,不过还有一点问题,看样子象是
Delphi bug,但还没找到原因。
当然,如果fuweng同志用ado,也就不会到这里来问这个问题了。

(突然想出来一个"笑话",如果我现在说我的方法就是用ADOquery,
会有几个人气得把鼠标扔到计算机屏幕上 :-)

我的方法如下:

做一个field:recno,计算字段也可以,通过SQL产生的也可以。
我这里使用sql产生:
例如:query1.sql.text:='select -1 as recno, a.* from table1 a where ...'

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, StdCtrls, DBTables, Grids, DBGrids, DBCtrls;

type
TForm1 = class(TForm)
Query1: TQuery;
Button1: TButton;
ds1: TDataSource;
DBGrid1: TDBGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
bklist:tlist;
procedure RecnoGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
bklist:=tlist.Create;
with query1 do
begin
open;
first;
while not query1.eof do
begin
bklist.Add(getbookmark);
next;
end;
ds1.dataset:=query1;
FieldByName('recno').OnGetText:=RecnoGetText;
First;
end;
end;

procedure TForm1.recnoGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
var
i:Smallint;
ab:TBookMark;
begin
text:='-1';
with Sender.DataSet do
begin
ab:=getbookmark;
for i:=0 to bkList.count-1 do
if comparebookmarks(ab,bkList)=0 then
begin
Text:=IntToStr(i+1);
Break;
end;
freebookmark(ab);
end;
end;

end.

以上代码还可以优化,并且bklist在程序结束时要free,等等...
有什么问题,等大家试验了再说吧。
 
to 温柔一刀:
我确实没有用过ADO,但昨天试用之后怎么感觉效率很低呢!我这个人对程序
的效率极其看重,有时不惜用空间换时间.生活中的其它方面也是如此,难怪那么
愿意玩"极品飞车".ADO的事情以后再讨论,你这段代码我回去看看,若效率低干脆
就不用序号了,代码只做经验收藏起来.
下面是我的SQL代码,现在还没用序号效率就不太高,请帮助分析一下.
Select count_fee.answer as 节目代号,
game.name as 节目名称,
时长_分钟 =sum((case
when (DateDiff(second,count_fee.starttime,count_fee.endtime)<6) then 0
when (DateDiff(second,count_fee.starttime,count_fee.endtime)%60=0)
then (DateDiff(second,count_fee.starttime,count_fee.endtime)/60)
else (DateDiff(second,count_fee.starttime,count_fee.endtime)/60+1)
end)),
费率_元 =sum((case
when (DateDiff(second,count_fee.starttime,count_fee.endtime)<6) then 0
when (DateDiff(second,count_fee.starttime,count_fee.endtime)%60=0)
then (DateDiff(second,count_fee.starttime,count_fee.endtime)/60)
else (DateDiff(second,count_fee.starttime,count_fee.endtime)/60+1)
end)*convert(money(10),game.price))
from count_fee inner join game on(count_fee.answer='239'+game.code)
where (count_fee.Starttime>='7/1/2000' and count_fee.Starttime<'7/10/2000')
group by count_fee.answer,game.name
order by 费率_元 DESC
 
fuweng同志啊,我说的效率低只不过是"自谦"之词嘛!
你怎么能当真呢? :-)
我那个方法只与查询的结果集有关,因此不管你的查询
有什么问题,都不会影响效率。

返回结果在10000条左右我试验过,dbgrid滚动时
根本看不出来速度受影响(在再次优化的条件下)。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部