簡單的陣列整理、統計資料的問題,複雜度好大?? |
答題得分者是:ccchen
|
c905165
中階會員 發表:50 回覆:120 積分:54 註冊:2002-09-29 發送簡訊給我 |
這幾天忽然遇到一個問題,乍看之下沒有什麼,但是想來想去,最後終於發現,這個程式如果寫起來,複雜度會變得異常的大,請問有沒有其他的思緒來處理這個問題。可能是我又進了死胡同了。 比如:
ax: array[0..10000,1..5] of string;
ax[n,1]:=存放零件名稱
ax[n,2]:=存放耗用日期
ax[n,3]:=存放耗用數量(可以用strtoint轉成數字來運算) 我們今天要將以上這一堆資料整理成以下陣列:
bx: array[0..1000,0..33] of string;
bx[n,0]:=存放零件名稱
bx[0,n]:=存放「日」(1~31)
bx[n,1到31]:=存放這個月各別日的耗用數量
bx[n,32]:=零件本月耗用總計
1.如果零件名稱相同,而且在同一天耗用,要加總在一起
2.如果某日都沒有耗用零件,則該欄就沒有了,也就是後面的欄整個shift往前 我這樣想來想去,發現居然要超過好幾層的迴圈。請問有沒有什麼比較好的方法來解決這個問題? 有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩 | ||
longjibo
一般會員 發表:18 回覆:18 積分:12 註冊:2002-11-08 發送簡訊給我 |
|||
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
我的建議:
用一個TClientDataSet就解決了, 程式也好寫多了
DesignTime: 放一個ClientDataSet. -> DoubleCLick此dataSet開啟FieldEditor->NewField ->分別Create"Part","SDATE","QTY"三個欄位 RunTime:
FormCreate 時ClientDataSet1.CreateDataSet;
然後你要建Array時, 改成將資料寫入此ClientDataSet就可以了 用ClientDataSet取代Array來存放資料, 讓你可以使用所有DataSet之功能, 而且還可直接存檔
|
||
c905165
中階會員 發表:50 回覆:120 積分:54 註冊:2002-09-29 發送簡訊給我 |
|||
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
用ClientDataSet做一個Sample給你參考
完整程式在
http://delphi.ktop.com.tw/loadfile.php?TOPICID=7537679&CC=168581 其中button1只為先用random方式產生data
button2執行實際加總後, 寫至另一個ClientDataSet
procedure TForm3.Button2Click(Sender: TObject); var oldpart:string; yr,m,d:word; begin oldpart:=''; with cd1 do begin IndexFieldNames:='PART'; //依part排序, 所以只須loop一次 first; while not eof do begin if fieldbyname('PART').asstring=oldpart then //part不變 cd2.Edit else begin //part改變, 須新增cd2 cd2.Append; cd2.fieldbyname('PART').asstring:=fieldbyname('PART').asstring; end; DeCodeDate(fieldbyname('SDATE').asdatetime, yr,m,d);//取得日期 cd2.Fields[d].asinteger:=cd2.Fields[d].asinteger FieldByName('QTY').asinteger; cd2.FieldByName('MSUM').asinteger:=cd2.FieldByName('MSUM').asinteger FieldByName('QTY').asinteger; oldpart:=fieldbyname('PART').asstring; cd2.post; next; end; end; end;[note]兩個ClientDataSet均在DesignTime定義完, 其實也可在RunTime 才Create, 故即使column數不知的情況也可使用. ClientDataSet好處太多, 應多加使用 |
||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: button2執行實際加總後, 寫至另一個ClientDataSet [note]兩個ClientDataSet均在DesignTime定義完, 其實也可在RunTime 才Create, 故即使column數不知的情況也可使用. ClientDataSet好處太多, 應多加使用ccchen兄: ClientDataSet還有一個Aggregate的功能,可做Sum, Avg, Count, Min, Max等功能,只要填入資料後,就可直接取用,不知是否可套用。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|||
jieshu
版主 發表:42 回覆:894 積分:745 註冊:2002-04-15 發送簡訊給我 |
引言: jieShu兄: 在這例子中我想是無法套用的, 因為結果之筆數與原始不同, 必須經過重整. 最後一個欄位MSUM是可以用, 不過既然已讓CD1整個LOOP了一遍, 使用Aggregate也沒意義了對不對. 如果須讓使用者更改CD2之資料那就有必要了, 你以為如何ccchen兄: 嗯!我沒有用力思考過,直覺以為可以,所謂筆數不同是否就是分組小計,Aggregate也有這個功能,不過設定有點難,看不太懂Help,因為這也是一項超強功能,提出給大家參考一下。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |