数据表GTest
typea            daya      ssa
---------------------------------
101        1 0.20
101        2 0.60
101        3 0.63
101        4 0.89
101        5 0.71
102        1 0.36
102        3 1.00
102        4 0.96
102        5 0.56用如下程序DBCHART没有生成曲线,请教各位,如何处理?谢谢
我用的是delphi7+TeeChar7var
  qrytmp,qrytmpg:TAdoQuery;
  sqlstr:string;
  myseries:TLineSeries;
begin
  qrytmp:=TAdoQuery.Create(self);
  qrytmp.Connection:=mains.ADOConnection1;
  qrytmpg:=TAdoQuery.Create(self);
  qrytmpg.Connection:=mains.ADOConnection1;
  sqlstr:='select distinct typea from GTest';
  qrytmp.Close;
  qrytmp.SQL.Clear;
  qrytmp.sql.Add(sqlstr);
  try
    qrytmp.Open;
  except
    showmessage('处理数据出现错误');
    exit;
  end;
  while not qrytmp.Eof do
    begin
      sqlstr:='select * from GTest where typea like '''+trim(qrytmp.fieldbyname('Typea').AsString)+''' order by daya';
      qrytmpg.Close;
      qrytmpg.SQL.Clear;
      qrytmpg.SQL.Add(sqlstr);
      qrytmpg.Open;
      if qrytmpg.RecordCount>0 then
        begin
          myseries:=TLineSeries.Create(self);
          myseries.DataSource:=qrytmpg;
          myseries.XLabelsSource:='daya';
          myseries.XValues.ValueSource:='daya';
          myseries.YValues.ValueSource:='ssa';
          myseries.CheckDataSource;
          myseries.Repaint;
          DBChart1.AddSeries(myseries);
        end;
      qrytmp.Next;
    end;
  DBChart1.Refresh;
end;

解决方案 »

  1.   

    直接在属性中绑定数据集(代码也行) 
    另外你的代码问题很大,在 while循环中又对qrytmp进行重新的sql打开,没出问题,算你幸运 
    当然,如果不绑定数据集,可以循环数据集,然后将值填充到chart 
    DBChart1.SeriesList[0].AddXY(),还有很多类似Add的方法,都可以动态填充数值
      

  2.   

    有一语句的位置楼主写错了,在执行过程中会出错,导致例外之后语句就不执行了,所以不能显示数据
    另外:楼主的算法有问题,只能显示最后一组曲线(因为在分类之后你只有一个数据集),应该每条曲线对应一个数据集,即应该使用动态对象数组var
      qrytmp:TAdoQuery;
      qrytmpg:Array of TADOQuery;  //改为动态数组,这个数组需要是全局的,以便在正确的位置释放
      DataSetLen:Integer;
      sqlstr:string;
      myseries:TLineSeries;
    begin 
      qrytmp:=TAdoQuery.Create(self);
      qrytmp.Connection:=mains.ADOConnection1;
      //qrytmpg:=TAdoQuery.Create(self);
      //qrytmpg.Connection:=mains.ADOConnection1;
      sqlstr:='select distinct typea from GTest';
      qrytmp.Close;
      qrytmp.SQL.Clear;
      qrytmp.sql.Add(sqlstr);
      try
        qrytmp.Open;
      except
        showmessage('处理数据出现错误');
        exit;
      end;
      while not qrytmp.Eof do
        begin
          sqlstr:='select * from GTest where typea like '''+trim(qrytmp.fieldbyname('Typea').AsString)+''' order by daya';
          DataSetLen:=Length(qrytmpg);
          Setlength(qrytmpg,DataSetLen+1);      qrytmpg[DataSetLen]:=TAdoQuery.Create(self); //在这里创建曲线数据集对象
          qrytmpg[DataSetLen].Connection:=mains.ADOConnection1; //
          qrytmpg[DataSetLen].Close;
          qrytmpg[DataSetLen].SQL.Clear;
          qrytmpg[DataSetLen].SQL.Add(sqlstr);
          qrytmpg[DataSetLen].Open;
          if qrytmpg[DataSetLen].RecordCount>0 then
            begin
             myseries:=TLineSeries.Create(self);
             DBChart1.AddSeries(myseries);  //将这行语句放在这里
              myseries.DataSource:=qrytmpg[DataSetLen];
              myseries.XLabelsSource:='daya';
              myseries.XValues.ValueSource:='daya';
              myseries.YValues.ValueSource:='ssa';
              myseries.CheckDataSource;
              myseries.Repaint;
              //DBChart1.AddSeries(myseries);  //这行语句需要移动到上面
            end; 
          qrytmp.Next; 
        end; 
      DBChart1.Refresh;
      

  3.   

    对于1楼的问题另外你的代码问题很大,在 while循环中又对qrytmp进行重新的sql打开,没出问题,算你幸运说法是错误的,因为在循环中打开的不是qrytmp,而是qrytmpg,所以这点楼主的代码是正确的,没有问题!
      

  4.   

    完整的解决方案(已测试)unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, TeEngine, Series, ExtCtrls, TeeProcs, Chart, DbChart,
      StdCtrls;type
      TMains = class(TForm)
        DBChart1: TDBChart;
        ADOConnection1: TADOConnection;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        //在这里定义数据集对象
        qrytmp:TAdoQuery;
        qrytmpg:Array of TADOQuery;  //改为动态数组,这个数组需要是全局的,以便在正确的位置释放  public
        { Public declarations }
      end;var
      Mains: TMains;implementation{$R *.dfm}procedure TMains.Button1Click(Sender: TObject);
    var
      DataSetIdx,i:Integer;
      sqlstr:string;
      myseries:TLineSeries;
    begin
      if Not Assigned(qrytmp) then //判断对象qrytmp是否已创建,如果没有创建,则创建实例
      begin
        qrytmp:=TADOQuery.Create(self);
        qryTmp.Connection:=mains.ADOConnection1;
      end;
      sqlstr:='select distinct typea from GTest';
      qrytmp.Close;
      qrytmp.SQL.Clear;
      qrytmp.sql.Add(sqlstr);
      try
        qrytmp.Open;
      except
        showmessage('处理数据出现错误');
        exit;
      end;  while not qrytmp.Eof do
        begin
          //调整动态数组个数
          if qrytmp.RecNo>Length(qrytmpg) then
          begin
            DataSetIdx:=Length(qrytmpg);
            SetLength(qrytmpg,DataSetIdx+1);
          end
          else
          begin
            DataSetIdx:=qrytmp.RecNo-1;
          end;
          //判断本数据集对象是否创建
          if Not Assigned(qrytmpg[DataSetIdx]) then //判断对象qrytmp是否已创建,如果没有创建,则创建实例
          begin
            qrytmpg[DataSetIdx]:=TADOQuery.Create(self);
            qrytmpg[DataSetIdx].Connection:=mains.ADOConnection1;
          end;
          sqlstr:='select * from GTest where typea like '''+trim(qrytmp.fieldbyname('Typea').AsString)+''' order by daya';      qrytmpg[DataSetIdx].Close;
          qrytmpg[DataSetIdx].SQL.Clear;
          qrytmpg[DataSetIdx].SQL.Add(sqlstr);
          qrytmpg[DataSetIdx].Open;
          if qrytmpg[DataSetIdx].RecordCount>0 then
            begin
             myseries:=TLineSeries.Create(self);
             DBChart1.AddSeries(myseries);  //将这行语句放在这里
              myseries.DataSource:=qrytmpg[DataSetIdx];
              myseries.XLabelsSource:='daya';
              myseries.XValues.ValueSource:='daya';
              myseries.YValues.ValueSource:='ssa';
              myseries.CheckDataSource;
              myseries.Repaint;
              //DBChart1.AddSeries(myseries);  //这行语句需要移动到上面
            end; 
          qrytmp.Next; 
        end; 
      DBChart1.Refresh;
    end;procedure TMains.FormDestroy(Sender: TObject);
    var
      i:Integer;
    begin
      qrytmp.Close;
      qrytmp.Free;  for i:=0 to Length(qrytmpg)-1 do
      begin
        qrytmpg[i].Close;
        qrytmpg[i].Free;
      end;
    end;end.