快来呀!悬赏200分(100分)

  • 主题发起人 主题发起人 bitzxs
  • 开始时间 开始时间
B

bitzxs

Unregistered / Unconfirmed
GUEST, unregistred user!
问题见:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=196103
 
我终于明白你的意思了:
我建议你把公司?和?科室*分在两个字段里,这样就好办多了.
不然用SQL是不可能实现的.
 
不用SQL语句能实现吗?
 
我又看了一半是不是要根据科名来排序 1科——〉 2 科
这需要用 ordeer buy name
 
你反应真快!
你的原意是不是这样:
1.如果把所有的Name按照关系画成一个森林的话,
排序的要求是分别中序遍历每一棵树.
(这个森林的每一层都满足字典排序)
2.各Name间的关系为公司1是1科A的PARENT,
而1科A是1科AA和1科AB的PARENT.
(PARENT字段的含义为对应NAME的PARENT的ID.
另外,如果是这个意思的话,那么你后来又给的数据中
的PARENT字段似乎有误)
 
TO 阿蒙:
不是的,如果按NAME排序,1科AB不应该排在1科AAA的前面.
TO bitzxs:
Sorry,是我看花眼了,你的数据没有错,我看要用递归比较好,
我上面说的那两点应该是对的.

 
看错了。
但按 两种条件排序: 安 1 科 2 科往下排
如果科相同在看谁的字数少谁在前面。是不是这样呢?
 
TO Thunderw:
用递归如何实现呢?
 
已经贴在那边了.
 
首先,必须有一个根节点,比如:
0,总公司,-1
然后,可以利用 connect by 子句 组成如下 sql 即可:

SQL> select * from tmp
2 start with id=0
3 connect by parent = prior id;

ID NAME PARENT
--------- ---------------------------------- ---------
0 总公司 -1
20 公司1 0
1 1科 20
4 1科A 1
9 1科AB 4
8 1科AA 4
10 1科AAA 8
12 1科AAAA 10
11 1科AAB 8
5 1科B 1
2 2科 20
6 2科A 2
3 3科 20
7 3科A 3
23 公司2 0
14 1科 23

查询到16记录.
 
补充:
不加根节点也可以,sql 需要改为:
...
start with parent=0
...

 
给出一段试用的程序,
先生成一个query1,order by name
在利用递归生成一个tclientdataset,用来存放排需后的数据集
unit Unit1;

interface

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

type
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBGrid2: TDBGrid;
DataSource2: TDataSource;
Query1: TQuery;
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
tcdsut:TClientDataSet;
procedure sortbyid(id:integer);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure Tform1.sortbyid(id:integer);
var icount :integer;
nrecno:integer;
begin
query1.First;
for icount := 0 to query1.RecordCount -1 do
begin
if (query1.Fields[2].value= id) then
begin
tcdsut.append;
tcdsut.Fields[0].value := query1.fields[0].value;
tcdsut.fields[1].value := query1.fields[1].value;
tcdsut.fields[2].value := query1.fields[2].value;
nRecno := query1.recordcount - query1.RecNo;
sortbyid(query1.fields[0].value);
query1.MoveBy(-nRecno);
end;
query1.next;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var icount:integer;
strsql ,strcondition:string;
curid:integer;
nrecno :integer;
begin
// add fieldsname
tcdsut.Close;
tcdsut.FieldDefs.Clear;
tcdsut.FieldDefs.Add('id',ftinteger,0,false);
tcdsut.FieldDefs.add('name',ftstring,10,false);
tcdsut.FieldDefs.Add('parent',ftinteger,0,false);
//add data
tcdsut.CreateDataSet;
tcdsut.Open;
query1.First;
sortbyid(-1); // -1 是最上一层的PARENT字段值


datasource2.DataSet := tcdsut;
dbgrid2.DataSource := datasource2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
tcdsut := TClientDataset.Create(application);
end;

end.

TO: 学生
connect by如何用,我在isql的帮助理查询不到,谢谢 !
 
connect by 好象没这样的sql命令吧?
 
对不起诸位大虾,connect by 是 Oracle 数据库专有的子句,
我查了一下其他数据库好象确实没有这个命令。(近期一直用Oracle,
便觉得天下人都在用。。。~O~)
 
接受答案了.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
785
DelphiTeacher的专栏
D
后退
顶部