全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1613
推到 Plurk!
推到 Facebook!

請問TClientDataSet之AggregateField的GroupingLevel屬性如何用

答題得分者是:Rain
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-26 09:52:10 IP:61.218.xxx.xxx 未訂閱
請問TClientDataSet之AggregateField的GroupingLevel屬性如何用?
請問如何設定
cds:TClientDataSet;
no :TField
seq:TField
buy_no :TField
buy_qty :TField
sum(buy_qty) :TAggregateField
  要針對相同的buy_no作sum(buy_qty)
Delphi Man
------
Delphi
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-26 14:22:29 IP:218.16.xxx.xxx 未訂閱
AggragateFIeld 的設定參看一下這個例子的設定罷 : http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30526 至於 Grouping Level 看看這篇 : http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33087
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-26 15:09:10 IP:218.85.xxx.xxx 未訂閱
關於GroupingLevel在Delphi 的幫助文件中給出了很詳細的說明: GroupingLevel property (TAggregateField) Description    Use GroupingLevel to indicate the groups of records over which the field’s aggregate is calculated. When GroupingLevel is 0 (the default), the aggregate summarizes all the records in the client dataset. When GroupingLevel is greater than 0, the aggregate summarizes each group of records that has the same values on the first GroupingLevel fields of the index.    GroupingLevel can be any value from 0 to the number of fields in the index specified by IndexName.    當GroupingLevel為預設值0時,對所有的記錄進行合計,不為0時,大概正適合您的這個需求吧,根據您所要的,寫了一段代碼,參考看看:    
function xGetAddupValue(cds: TClientDataSet; const ASumField: string;
  const AIndexField: string = ''; const AGroupingLevel: Integer = 0): Variant;
const
  AIndexName = 'Index1';
var
  Addup: TAggregate;
begin
  Addup := TAggregate.Create(cds.Aggregates, cds);
  try
    Addup.Expression := Format('SUM(%s)', [ASumField]);
    if AIndexField <> '' then
    begin
      cds.AddIndex(AIndexName, AIndexField, [], '', '', 0);
      cds.IndexName := AIndexName;
      Addup.IndexName := AIndexName;
    end;
    Addup.GroupingLevel := AGroupingLevel;
    Addup.Active := True;
    Result := Addup.Value;
  finally
    Addup.Free;
  end;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := xGetAddupValue(ClientDataSet1, 'buy_qty', 'buy_no', 1);
end;
//非常抱歉,發現我的代碼中有一個地方寫錯了,把AIndexField弄成AIndexName了,剛改了過來(紅色部分),不好意思 發表人 - Rain 於 2003/07/28 17:13:27
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-28 16:27:38 IP:61.218.xxx.xxx 未訂閱
感謝各位先進的指導,請問Rain 您的function可否這樣用 xGetAddupValue(ClientDataSet1, 'buy_qty', 'cmpy_no;buy_no', 1); 由兩個Field當作index? Delphi Man
------
Delphi
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-28 16:53:17 IP:218.85.xxx.xxx 未訂閱
當然可以的,因為AddIndex支持這樣子的寫法一下子可增加好幾個Index,不然這裏邊的AGroupingLevel參數就沒有用了,只要AGroupingLevel參數值不大於Index數就可以,例如您這邊的xGetAddupValue(ClientDataSet1, 'buy_qty', 'cmpy_no;buy_no', 1);就不是合計相同buy_no的記錄,而是相對cmpy_no了,把最後一個參數改成2就好。
ying0515
中階會員


發表:90
回覆:168
積分:81
註冊:2003-01-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-28 17:28:42 IP:61.218.xxx.xxx 未訂閱
了解,感謝! Delphi follower
------
Delphi
系統時間:2024-05-18 19:11:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!