線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4087
推到 Plurk!
推到 Facebook!

如何將SQL的查詢結果顯示在DBChart?

答題得分者是:cashxin2002
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-18 14:39:15 IP:219.145.xxx.xxx 未訂閱
各位先進好! 用SQL 中 group by 查詢後的結果,如下列: 姓名 曠課次數 張散 5 李斯 2 王武 6 請問如何將SQL的查詢結果用pie的圖形顯示在DBChart?
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-18 15:06:24 IP:61.155.xxx.xxx 未訂閱
设计的时候双击后设置: 我想不用多说的吧!
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-18 18:02:25 IP:61.134.xxx.xxx 未訂閱
Hi! SOS_admin 感謝前輩的回應. SQL 如下:  ADoquery1.SQL.text:='Select field1 as 姓名,count(Field2) AS 曠課次數 From table1 Group By Field2';     準備將count(Field2)拼成Pie 顯示. 在設計期,好像沒法將DBChart1.series.pie 設為count(Field2).     希望前輩多說幾句
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-18 18:18:17 IP:63.84.xxx.xxx 未訂閱
引言: Hi! SOS_admin 感謝前輩的回應. SQL 如下: ADoquery1.SQL.text:='Select field1 as 姓名,count(Field2) AS 曠課次數 From table1 Group By Field2'; 準備將count(Field2)拼成Pie 顯示. 在設計期,好像沒法將DBChart1.series.pie 設為count(Field2). 希望前輩多說幾句 < face="Verdana, Arial, Helvetica"> 您好﹗ 可能您的理解有些錯誤了﹐小弟將此步驟寫一下﹐請參考如下﹕ 1﹒請先完成ADOQuery元件的SQL﹐并開啟(Open) 2﹒雙擊DBChart﹐開啟其編輯器對話方塊 3﹒在Chart頁次中的Series附頁次中﹐點擊右邊的Add按鈕﹐新增一個Chart圖﹐如您所述選擇pie圖形 4﹒在Series頁次中的Data Souce附頁次中﹐選擇DataSet類型﹐而后在下方的DataSet中就會出現您所使用的ADOQuery﹐點選此ADOQuery1(如上面的圖示) 5﹒下方的Label和Pie中就會出現您在ADOQuery的SQL中查詢出的曠課次數欄位名﹐點選此欄位名﹒ ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-18 21:24:11 IP:61.150.xxx.xxx 未訂閱
感謝前輩cashxin2002 的回應! 晚輩剛才發問時沒把問題說明白,使得兩位前輩誤解了. 我想是 : 1)如果選RadioGroup1的itemindex 0 則用SQL:'Select field1 as 姓名,count(Field2) AS 曠課次數 From table1 Group By Field2'; 然後在DBchart1 顯示 2)如果選選RadioGroup1的itemindex 1 則用SQL: 'Select field1 as 姓名,count(Field3) AS 休假次數 From table1 Group By Field3'; 然後在DBchart1 顯示 即如何在Runtime 改變 DBChart1.series.pie 和 Label ,讓查詢結果在DBChart顯示. CODE: case RadioGroup1.itemindex of 0: begin ADoquery1.Close; ADoquery1.SQL.Clear; ADoquery1.SQL.add('Select field1 as 姓名,count(Field2) AS 曠課次數 From table1 Group By Field2'); ADoquery1.Open; DBGrid1.DataSource:=Datasource1; series1.DataSource:=Datasource1; end; 1:...
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-19 00:29:34 IP:63.84.xxx.xxx 未訂閱
您好﹗    原來您是要在執行時期來控制DBChart的變化﹐只是要在程式碼中來控制DBChart所得取的資料會比較麻煩一些﹐需要新增Series﹑指定資料來源﹑顯示的格式﹑色彩的控制等等﹒﹒﹒﹒    所以小弟有個建議﹐做一種變通的處理方法﹐就是在Form中利用兩個重疊的DBChart來分別對應ADOQuery1和ADOQuery2﹐這樣的好處是﹐可以直接在設計時期利用DBChart元件的編輯器功能來設定資料來源(SQL查詢也可先行完成于對應的ADOQuery元件中)﹐并做以其他顯示屬性的設計﹐減少程式碼的編譯﹐會比較簡單一些﹒在執行時期的時候﹐就利用RadioGroup元件之ItemIndex屬性來判斷需要使用哪一個DBChart﹐配合DBChart的Show(顯示)和Hide(隱藏)方法來控制其出現的時機﹒程式碼就可改為如下﹕
case RadioGroup1.itemindex of
0:begin 
  DataSource1.DataSet := ADOQuery1;
  DBChart2.Hide;
  DBChart1.Show;
  end;
1:begin
  DataSource1.DataSet := ADOQuery2;
  DBChart1.Hide;
  DBChart2.Show;
  end;
參考看看﹗ ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-08-19 19:44:37 IP:219.145.xxx.xxx 未訂閱
感謝前輩cashxin2002的回應! 真可惜昨天晚上沒看到前輩得回應(00:29:34的回應)! 從昨天晚上折騰到今早,晚輩已找到一個方法可以在Runtime改變 DBChart1.series.pie 和 Label. 不足是沒能設Legend的顏色及所代表的內容,如果那位先進知道,請告知,謝謝! Code如下: case RadioGroup1.itemindex of 0:begin ADoquery1.Close; ADoquery1.SQL.Clear; ADoquery1.SQL.add('Select field1 as 姓名,count(Field2) AS 曠課次數 From table1 Group By Field2'); ADoquery1.Open; DBGrid1.DataSource:=Datasource1; series1.DataSource:=ADOquery1; series1.XValues.ValueSource:='曠課次數'; DBChart1.Title.Text.Clear; DBChart1.Title.Text.Add('曠課次數統計'); end; 1:...
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-08-19 23:04:54 IP:219.129.xxx.xxx 未訂閱
引言: 感謝前輩cashxin2002的回應! 真可惜昨天晚上沒看到前輩得回應(00:29:34的回應)! 從昨天晚上折騰到今早,晚輩已找到一個方法可以在Runtime改變 DBChart1.series.pie 和 Label. 不足是沒能設Legend的顏色及所代表的內容,如果那位先進知道,請告知,謝謝! Code如下: case RadioGroup1.itemindex of 0:begin ADoquery1.Close; ADoquery1.SQL.Clear; ADoquery1.SQL.add('Select field1 as 姓名,count(Field2) AS 曠課次數 From table1 Group By Field2'); ADoquery1.Open; DBGrid1.DataSource:=Datasource1; series1.DataSource:=ADOquery1; series1.XValues.ValueSource:='曠課次數'; Series1.ColorEachPoint :=true; DBChart1.Title.Text.Clear; DBChart1.Title.Text.Add('曠課次數統計'); end; 1:...
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-08-20 08:51:32 IP:61.155.xxx.xxx 未訂閱
对于DBChart来说,如果操作其中第几个用Series[n]来指定 .... adoquery1.Open ; ... DBChart1.SeriesList.Series[0].DataSource:=adoquery1; DBChart1.SeriesList.Series[0].XValues.ValueSource:='aa'; DBChart1.SeriesList.Series[0].yValues.ValueSource:='bb';    动态指定XValues.ValueSource、yValues.ValueSource来设定就可以实现您的要求了
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-08-20 10:14:01 IP:61.185.xxx.xxx 未訂閱
感謝deity兄的回應! 'Series1.ColorEachPoint :=true;'能夠設定Legend的顏色,並且很簡潔, 謝謝! 現在還不能顯示Legend各顏色所代表的內容,如果那位先進知道,請告知,! 感謝sos_admin前輩提供了另一種動態設定的方法,謝謝!
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-08-21 00:55:58 IP:218.15.xxx.xxx 未訂閱
引言:
引言: 感謝前輩cashxin2002的回應! 真可惜昨天晚上沒看到前輩得回應(00:29:34的回應)! 從昨天晚上折騰到今早,晚輩已找到一個方法可以在Runtime改變 DBChart1.series.pie 和 Label. 不足是沒能設Legend的顏色及所代表的內容,如果那位先進知道,請告知,謝謝! Code如下: case RadioGroup1.itemindex of 0:begin ADoquery1.Close; ADoquery1.SQL.Clear; ADoquery1.SQL.add('Select field1 as 姓名,count(Field2) AS 曠課次數 From table1 Group By Field2'); ADoquery1.Open; DBGrid1.DataSource:=Datasource1; series1.DataSource:=ADOquery1; series1.XValues.ValueSource:='曠課次數'; Series1.ColorEachPoint :=true; DBChart1.Title.Text.Clear; DBChart1.Title.Text.Add('曠課次數統計'); end; 1:...
相应改改 DBGrid1.DataSource:=Datasource1; series1.DataSource:=ADOquery1; Series1.XLabelsSource :='姓名'; series1.YValues.ValueSource:='曠課次數'; Series1.ColorEachPoint :=true; 则利用Series自动的Color库,可以得到不同的Color对应不同的姓名,旷课次数。 试试看,是不是您所要的效果!
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-08-21 02:20:01 IP:63.84.xxx.xxx 未訂閱
引言: 感謝deity兄的回應! 'Series1.ColorEachPoint :=true;'能夠設定Legend的顏色,並且很簡潔, 謝謝! 現在還不能顯示Legend各顏色所代表的內容,如果那位先進知道,請告知,! 感謝sos_admin前輩提供了另一種動態設定的方法,謝謝!
您好! deity的做法可行, 小弟再補充一些: 請先雙擊DBChart, 開啟其編輯器, 將Chart頁次之Legend的Text Style屬性值設為Left Value或Right Value, 若需要以Percent(百分比)形式顯示, 可選擇屬性值為Left Percent或Right Value, 選擇Plane形態將不會顯示分類合計的值, 只會顯示姓名. Chart頁次之Legend的Legend Style屬性值使用Automatic即可. 倘若在Run時期還不能正常顯示Legend的圖示, 請將Chart頁次之Legend的Visible屬性打勾, 或者在程式碼中加如下一句: DBChart1.Legend.Visible := True; 參考看看! ===================== 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/08/21 02:33:48
------
忻晟
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-08-21 15:16:26 IP:63.84.xxx.xxx 未訂閱
您好﹗    小弟今早利用手頭的範例資料庫﹐做了一段類似于您需要的程式碼﹐如下﹕
procedure TForm1.Button1Click(Sender: TObject);
begin
  case RadioGroup1.ItemIndex of
  0:begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('Select 客戶編號, Count(客戶編號) As ');
    ADOQuery1.SQL.Add('總筆數 From 訂單 Group By 客戶編號');
    ADOQuery1.Open;
    Series1.DataSource := ADOQuery1;
    Series1.XLabelsSource :='客戶編號';
    series1.YValues.ValueSource:='總筆數';
    Series1.ColorEachPoint :=true;
    DBChart1.Title.Text.Clear;
    DBChart1.Title.Text.Add('總筆數統計');
    DBChart1.Legend.Visible := True;
    end;
  1:begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('Select 客戶編號, Sum(數量) As ');
    ADOQuery1.SQL.Add('總數量 From 訂單 Group By 客戶編號');
    ADOQuery1.Open;
    Series1.Clear;
    Series1.DataSource := ADOQuery1;
    Series1.XLabelsSource :='客戶編號';
    series1.YValues.ValueSource:='總數量';
    Series1.ColorEachPoint :=true;
    DBChart1.Title.Text.Clear;
    DBChart1.Title.Text.Add('銷售總數量統計');
    DBChart1.Legend.Visible := True;
    end;
  end;
end;
雖然說可以正常顯示出需要的Chart圖形﹐但發現另外的一個問題﹐就是RadioGroup中的兩個Item﹐只有被先選擇并連接ADOQuery1中資料執行顯示Chart的ItemIndex才可以反复正常顯示﹐但其后再點選到的ItemIndex就會出錯: ADOQuery1:Field'總筆數'not found 總覺得以上的程式碼中好像漏寫了什么才會造成這樣的錯誤﹗ ===================== 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/08/21 15:20:51
------
忻晟
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-08-22 10:38:20 IP:218.15.xxx.xxx 未訂閱
引言: 您好﹗ 小弟今早利用手頭的範例資料庫﹐做了一段類似于您需要的程式碼﹐如下﹕
procedure TForm1.Button1Click(Sender: TObject);
begin
  case RadioGroup1.ItemIndex of
  0:begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('Select 客戶編號, Count(客戶編號) As ');
    ADOQuery1.SQL.Add('總筆數 From 訂單 Group By 客戶編號');
    ADOQuery1.Open;
    Series1.DataSource := ADOQuery1;
    Series1.XLabelsSource :='客戶編號';
    series1.YValues.ValueSource:='總筆數';
    Series1.ColorEachPoint :=true;
    DBChart1.Title.Text.Clear;
    DBChart1.Title.Text.Add('總筆數統計');
    DBChart1.Legend.Visible := True;
    end;
  1:begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('Select 客戶編號, Sum(數量) As ');
    ADOQuery1.SQL.Add('總數量 From 訂單 Group By 客戶編號');
    ADOQuery1.Open;
    Series1.Clear;
    Series1.DataSource := ADOQuery1;
    Series1.XLabelsSource :='客戶編號';
    series1.YValues.ValueSource:='總數量';
    Series1.ColorEachPoint :=true;
    DBChart1.Title.Text.Clear;
    DBChart1.Title.Text.Add('銷售總數量統計');
    DBChart1.Legend.Visible := True;
    end;
  end;
end;
雖然說可以正常顯示出需要的Chart圖形﹐但發現另外的一個問題﹐就是RadioGroup中的兩個Item﹐只有被先選擇并連接ADOQuery1中資料執行顯示Chart的ItemIndex才可以反复正常顯示﹐但其后再點選到的ItemIndex就會出錯: ADOQuery1:Field'總筆數'not found 總覺得以上的程式碼中好像漏寫了什么才會造成這樣的錯誤﹗ ===================== 努力,相信會獲得美麗! 忻晟 發表人 - cashxin2002 於 2003/08/21 15:20:51
HI,前辈您好: 出现字段找不到是因为 Series1.XLabelsSource ; series1.YValues.ValueSource 的值没有刷新过来, 在case RadioGroup1.ItemIndex of之前加入 Series1.XLabelsSource :=''; Series1.YValues.ValueSource :=''; 应该可以解决问题; 即改为: begin Series1.XLabelsSource :=''; Series1.YValues.ValueSource :=''; case RadioGroup1.ItemIndex of 0:begin …… …… 试试看
cashxin2002
版主


發表:231
回覆:2555
積分:1937
註冊:2003-03-28

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-08-22 18:35:02 IP:63.84.xxx.xxx 未訂閱
您好﹗    經deity前輩的指點﹐以下應該就是您需要的完整程式碼了﹕
procedure TForm1.Button1Click(Sender: TObject);
begin
  Series1.XLabelsSource :='';
  Series1.YValues.ValueSource :='';
  case RadioGroup1.ItemIndex of
  0:begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('Select 客戶編號, Count(客戶編號) As ');
    ADOQuery1.SQL.Add('總筆數 From 訂單 Group By 客戶編號');
    ADOQuery1.Open;
    Series1.DataSource := ADOQuery1;
    Series1.XLabelsSource :='客戶編號';
    series1.YValues.ValueSource:='總筆數';
    Series1.ColorEachPoint :=true;
    DBChart1.Title.Text.Clear;
    DBChart1.Title.Text.Add('總筆數統計');
    DBChart1.Legend.Visible := True;
    end;
  1:begin
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('Select 客戶編號, Sum(數量) As ');
    ADOQuery1.SQL.Add('總數量 From 訂單 Group By 客戶編號');
    ADOQuery1.Open;
    Series1.Clear;
    Series1.DataSource := ADOQuery1;
    Series1.XLabelsSource :='客戶編號';
    series1.YValues.ValueSource:='總數量';
    Series1.ColorEachPoint :=true;
    DBChart1.Title.Text.Clear;
    DBChart1.Title.Text.Add('銷售總數量統計');
    DBChart1.Legend.Visible := True;
    end;
  end;
end;
Try it please! ===================== 努力,相信會獲得美麗! 忻晟
------
忻晟
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-08-28 16:52:19 IP:219.145.xxx.xxx 未訂閱
再次感謝各位前輩的熱心指點!  特別前輩cashxin2002再三熱心指點!   晚輩還找到一些運行期可以變化的顯示效果,個人感覺比較好玩,如下:  對Pie的顯示效果改變:
 1: Chart3DPercent
    DBChart1.Chart3DPercent:=ScrollBar1.Position;
 2: RotationAngle
    Series1.RotationAngle:=ScrollBar2.Position;
 3: Zoom
    dbchart1.View3DOptions.Zoom:=ScrollBar3.Position;
 4: 將Pie變為Bar 
    ChangeSeriesType(TChartSeries(Series1), TBarSeries);
  (不過這個Bar顯示為2D效果,不知怎樣可以顯示為3D效果)
發表人 - mathewzhao 於 2003/08/28 17:00:42
JLATSTAR
一般會員


發表:8
回覆:16
積分:4
註冊:2007-05-08

發送簡訊給我
#17 引用回覆 回覆 發表時間:2007-07-31 14:25:55 IP:203.204.xxx.xxx 訂閱
編輯記錄
JLATSTAR 重新編輯於 2007-07-31 15:22:25, 註解 無‧
Stallion 重新編輯於 2007-07-31 19:10:20, 註解 該文章已重發,清理內文~‧
JLATSTAR 重新編輯於 2007-08-02 08:38:35, 註解 該文章已重發,清理內文‧
JLATSTAR 重新編輯於 2007-08-02 08:39:18, 註解 無‧
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#18 引用回覆 回覆 發表時間:2007-07-31 14:33:43 IP:60.248.xxx.xxx 未訂閱
原文已結案了,
請再發新文,貼出此文的參考URL

大長的討論串,看起來很累

P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#19 引用回覆 回覆 發表時間:2007-08-01 14:50:21 IP:61.67.xxx.xxx 未訂閱
我的經驗提供參考
不管要那種圖形(pie, bar, line...)
一個重點
每一個圖形數據都設定一組 series, 因為在Series 中幾乎可以完成各種所要的設定,與其在RunTime指定容易出錯,不如都先指定好,
例如 pie serial 指定好圖形,x value...
bar serial 指定好 x, y value , label ....
line serial 指定好 x, y value ...
如果要輸出 bar , 只要把 pie serial.Visible:= False, line serial.Visible:= False ,只保留 bar serial 出現就解決了
甚至同樣是 bar chart , 也可以有好多組 serial 做不同顯示方式,
試試看吧!
系統時間:2024-05-04 14:35:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!