2

ですから、私が抱えている問題は、生徒ごとにグラフに2つのバーを表示していることです。私は、そのうちの1つだけが必要です。しかし、それらは正しい高さなので、それは良いことです。これは私のDelphiソースコードです。

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

4

1 に答える 1

3
  1. 結果のすべてのフィールドをループして(クエリで3つのフィールドを返す)、結果に1つのシリーズPERフィールドを追加するのはなぜですか?これは、フィールド数が行数などに等しいと考えるようなものです。次に、クエリ内の何かとデータ(表示できない)によって、クエリ結果に予想よりも多くの行が含まれる可能性があると思い切って推測します。

  2. クエリが常に3つのフィールドを返し、1つのフィールドがグラフ化されておらず、1つのフィールドがシリーズラベルのソースであり、1つのフィールドがシリーズの値のソースであるのに、なぜシリーズを破棄して再度追加するのですか?dfmでデザイン時に1つのシリーズを静的に作成し、このクレイジーなランタイムのものをすべて忘れてください。dbchartをダブルクリックして、そこに1つの棒グラフシリーズを追加してみましたか?

  3. これは機能し、コードははるかに少なくなります。ちなみに、データセットを2回開く必要はありません。ここではDelphiに付属しているDBDEMOS.mdbデータベースを使用しているので、誰もが一緒に遊ぶことができます。dbチャートを追加し、DESIGNTIMEに1つの棒グラフシリーズを追加します。必要に応じて構成します。このコードを使用してください。以下のデータセットは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(フォームデザイナー)で実行できます。

于 2013-03-23T22:47:39.020 に答える