2013-03-23 31 views
2

所以,我遇到的問題是,我爲每個學生在圖上顯示兩個欄,我只想要其中的一個。他們是正確的身高,所以這很好。 這是我的Delphi源代碼;簡單的Delphi DBcharting

strlstField := TStringList.Create(); 
ADOQGetResults.SQL.clear; 
ADOQGetResults.SQL.Add(
         'SELECT Results.StudentID, SUM(Results.Rawmark) as TRM, StudentInfo.Fname '+ 
         'FROM (StudentInfo INNER JOIN Results ON StudentInfo.StudentID = Results.StudentID) '+ 
         'WHERE (((StudentInfo.StudentID)=Results.StudentID)) AND Results.TestID =12 '+ 
         'GROUP BY StudentInfo.Fname, Results.StudentID' 
        ); 
ADOQGetResults.Active := True; 
ADOQGetResults.Open; 

DBChart1.Title.Text.Clear; 
DBChart1.Title.Text.Add('Class leaderboard'); 
DBChart1.Title.Font.Size := 15; 
DBChart1.LeftAxis.Title.Font.Size := 12; 
DBChart1.LeftAxis.Title.Caption := 'Total marks'; 
DBChart1.BottomAxis.Title.Font.Size := 12; 
DBChart1.BottomAxis.Title.Caption := 'Student'; 

//Charting Series 
//To Remove Old Series 
for intCnt := DBChart1.SeriesCount -1 downto 0 do 
    DBChart1.Series[intCnt].Free; 
//To Add New Series 
for intCnt := 1 to ADOQGetResults.FieldCount - 1 do 
begin 
    strlstField.Add(ADOQGetResults.FieldList[intCnt].FieldName); 
    DBChart1.AddSeries(TBarSeries.Create(nil)); 
end; 
//To set source for Series 
for intCnt:= 0 to DBChart1.SeriesCount -1 do 
begin 
    with DBChart1 do begin 
     Series[intCnt].Clear; 
     Series[intCnt].Title := strlstField[intCnt]; 
     Series[intCnt].ParentChart := DBChart1; 
     Series[intCnt].DataSource := ADOQGetResults; 
     Series[intCnt].XLabelsSource := 'Fname'; 
     Series[intCnt].YValues.ValueSource := 'TRM'; 
    end; 
end; 

我一直在努力工作出什麼走錯了一整天,所以如果任何人都可以在所有幫助我會非常感激! 以下是圖表現在的樣子; http://oi48.tinypic.com/6qelba.jpg

回答

3
  1. 你爲什麼要遍歷每個字段的結果(返回在查詢3場),並在結果中添加一個系列的每場?這幾乎就像你認爲場數等於你的排數或什麼的。其次,我敢於猜測,查詢中的某些內容以及您的數據(我們無法看到)可能會導致您在查詢結果中獲得的行數比您預期的要多。

  2. 爲什麼當您的查詢總是返回3個字段,1個字段沒有繪製,1個字段是系列標籤源,1個字段是系列值源時,是否會銷燬和重新添加系列?只需靜靜地在dfm的設計時創建一個系列,並忘記所有這些瘋狂的運行時間的東西。你嘗試過雙擊dbchart並添加一個BarChart系列嗎?

  3. 這個工作,代碼少得多。順便說一下,您不需要兩次打開數據集。請注意,我在此使用Delphi附帶的DBDEMOS.mdb數據庫,以便每個人都可以一起玩。添加一個數據庫圖表,在DESIGNTIME中添加一個條形圖系列。按需要進行配置。使用此代碼。下面的數據集是一個TADODataset。

-

dataset.CommandText := 'select EmpNo,FirstName,Salary from employee'; 

dataset.Active := True; 

DBChart1.Title.Text.Clear; 
DBChart1.Title.Text.Add('Class leaderboard'); 
DBChart1.Title.Font.Size := 15; 
DBChart1.LeftAxis.Title.Font.Size := 12; 
DBChart1.LeftAxis.Title.Caption := 'Total marks'; 
DBChart1.BottomAxis.Title.Font.Size := 12; 
DBChart1.BottomAxis.Title.Caption := 'Student'; 


if DBChart1.SeriesCount<1 then 
begin 
    raise Exception.Create('Add series to your chart in the dfm ONCE.'); 
end; 


//To set source for Series 
    with DBChart1 do begin 
     Series[0].Title := 'Test'; 
     Series[0].DataSource := dataset; 
     Series[0].XLabelsSource := 'FirstName'; 
     Series[0].YValues.ValueSource := 'Salary'; 
    end; 

注意,這仍然是更多的代碼絕對比你必須寫。如果不是所有的dfm(表單設計者),你都可以做到這一點。

+0

「Crazy runtime stuff」LOL。但設計時間的東西只有在你只有一種類型的查詢和圖表時纔有用。 OP的文章可能只是一個更多變量場景的簡單例子。但對於所有其他評論/評論,請+1反饋:) – 2013-03-24 08:27:43

+0

如果您需要通過所有方法在運行時添加TBarChart。但如果你不這樣做,那最好不要。 「主動:真實」的方法跟隨着這種開放,重複的方式,讓我認爲這個人基本上是隨意妄爲的,而不是那麼有意。 – 2013-03-24 18:26:04

相關問題