小弟初学delphi,现在开发中遇到一个小问题,还请大家帮忙,在此先道声谢!
我就举个简单的例子吧。数据库里可以查到这样一笔数据:Period Qty
1 1200
2 1402
3 4365
4 0
5 2300现在我要以这样的形式在DBGrid里显示:8:00-10:00 10:00-12:00 12:00-14:00 14:00-16:00  16:00-18:00
   1200             1402     4365   0             2300第一行是标题行,每个时间段对应数据库中的period,如何做让DBGrid显示这样的数据?

解决方案 »

  1.   

    难,自己组合成横表吧,或者弃用dbgrid,用其他表格控件
      

  2.   

    用其他的表格控件吧,dbgrid表格控件的功能不完善。
      

  3.   

    http://hi.baidu.com/qzrc/blog/item/952686184634e0b44aedbcea.html
      

  4.   

    如果一定要用dbgrid,可以將這些資料重新組合,放到一個dataset當中,datasource指向這個dataset。
    dataset可以是clientdataset或memorydataset,根據Period的值來創建相關欄位.....
      

  5.   

    这个不复杂定义一个TAdoQuery,如MyQuery:TAdoQuery;
    DbGrid的数据集指向MyQuery
    MyQuery:=TAdoQuery.create(nil);
    with MyQuery do
    begin
      sql.clear;
      sql.text:='select a.qty,b.qty,c.qty,d.qty,e.qty from '+
                '(select Qty from test where Period=1) a,'+
                '(select Qty from test where Period=2) b,'+
                '(select Qty from test where Period=3) c,'+
                '(select Qty from test where Period=4) d,'+
                '(select Qty from test where Period=5) e';
      open;
    end;DbGrid的标题栏要设为相应的日期8:00-10:00,这要写代码(不要告诉我你不会写)
      

  6.   


    我用这种方法试了一下,用的是ClientDataset。
    然后创建相关栏位,名字是那些时间段,类型是TFloatField 
    关键是下面这个sql语句该怎么写呢?
    就是说怎么把相关的值赋值到栏位呢?
      

  7.   


    Tks!
    下午试一下你这个方法,现在该吃饭了。
      

  8.   

    你可以dbgrid當中判斷修改的欄位(此時,你可以知道是哪一時間段),當編輯完畢就執行寫入數據庫
      

  9.   

    但事实上,我只是举了一个简单的例子。
    我把我的SQl语句贴出来吧。
    OutputPeriod     Qty 
    1                1200 
    2                1402 
    3                4365 
    4                  0 
    5                2300 光查询这个结果的SQL就这么长:  
    SELECT OutputPeriod,SUM(OutputQty) AS Qty 
    FROM DPrintingDetail INNER JOIN DBCTicket 
    ON BCNO = BC_No  INNER JOIN DTimePeriod 
    ON OutputPeriod = Period
    Where OutputDate ='20090115' 
    Group By OutputPeriod 
    依照8楼的方法,我的SQL语句不知道要写多长,天哪
      

  10.   

    在你的数据集控件的afteropen事件中写入下面的代码:
    procedure Tdm.qu9AfterOpen(DataSet: TDataSet);
    const
      cp:array[0..4] of string=('8:00-10:00','10:00-12:00','12:00-14:00','14:00-16:00','16:00-18:00');
    var
      i:integer;
    begin
      for i:=0 to 4 do
        dataset.Fields[i].DisplayLabel:=cp[i];
    end;
      

  11.   

    在你的数据集控件的afteropen事件中写入下面的代码:
    procedure Tdm.qu9AfterOpen(DataSet: TDataSet);
    const
      cp:array[0..4] of string=('8:00-10:00','10:00-12:00','12:00-14:00','14:00-16:00','16:00-18:00');
    var
      i:integer;
    begin
      for i:=0 to 4 do
        dataset.Fields[i].DisplayLabel:=cp[i];
    end;
      

  12.   

    需要列转行,在sql语句中实现吧
    delphi里干这个,费力不讨好
      

  13.   

    做这种格式的一般不用DbGrid,你试下StringGrid吧。
      

  14.   

    我也觉得StringGrid好操作点
    我都不怎么用DBgrid