2014年8月19日 星期二

Crystal Report-自訂Array動態接值

剛看到一項限制~補充一下。陣列大小最大為 1000 個元素 。
看來array真的不好用@@~

因為報表本身並不會幫你處理RAW data...雖然在產生報表時,一定是有吃到~但是卻沒有提供給人隨意取資訊的method...所以真的很難用阿阿阿(回音)

繼前篇~那是對內容每份做個小計~
但是其實在最後的部分還得給一個全部的統計~
所以......眼看又要GG了~其實最後還是GG先用subquery解決~只是因為去db撈兩次感覺還好~GG的原因是因為這報表沒有提供Sort的function,硬要刻真是太難為我了Orz...

不過還是留一下寫出來的function~
排版示意圖:

細目      @sum_add
....
報表尾  (@sum_sort) @sum_show

作法,其實就也是建兩個array,一個放名稱(all_name),一個放累計筆數(all_cnt),另一個則放array的size(idx),其兩個array就是1:1做對應。

add時,會先比名稱,有的就累計舊的,沒有就兩個array各擴充一筆
最底下的 Sum (all_cnt);是拿來做debug用的~
@sum_add
Shared stringVar array all_name;
Shared NumberVar array all_cnt;
Shared NumberVar idx;

stringVar tmp := {XXXXXXXXX} ;
Local NumberVar i;
booleanVar isContains := false ;
For i := 1 To idx Do  (
    if all_name[i] = tmp then (
        all_cnt[i] := all_cnt[i]+1;
        isContains := true ;
    )       
);

if isContains = false then  (
    idx := idx+1;
    redim preserve all_name [idx];
    all_name[idx] := tmp;
    redim preserve all_cnt [idx];
    all_cnt[idx] := 1;
   
    Sum (all_cnt);
) else
Sum (all_cnt);


最後顯示相對簡單的~就照順序拿出來,但是就在這個摩門~我想起來這邊應該要依項目排序的Orz...
@sum_show
Shared stringVar array all_name;
Shared NumberVar array all_cnt;
Shared NumberVar idx;

stringVar showData := '';
NumberVar i;
for i := 1 to idx do (
    showData := showData +Chr(13)+Chr(10)+ all_name[i] +':'+all_cnt[i];
);
showData;

過了幾天~想一想還是做一個醜醜的排序好了~排序要在取值前先排。原理用最簡單的把資料拿起來一個一個排就是了,反正就賭他項目不會很多~
PS:有發現他的中文的順序和DB的算法不一樣~但是看起來還是有照筆畫就算了@@...反正之後有被念再說|||Orz...
雖說function裡有用MID(substring)來取第一個字排,不過偶發現跟用AscW來取的話~好像都一樣?!好像都一樣只會回傳第一個字的碼,就總之有被念後再想辦法改好了=_=|||...
@sum_sort
Shared stringVar array all_name;
Shared NumberVar array all_cnt;
Shared NumberVar idx;
Shared stringVar array sort;

NumberVar i;
NumberVar j;
NumberVar k;
StringVar output;
StringVar tmp;
sort := all_name;
for j := 1 to idx do (
    for i := 1 to j do (
        if (MID(sort[j],1) < MID(sort[i],1)) then (
            tmp := sort[j];
            for k := j to i+1 step -1 do (
                sort[k] := sort[k-1];
            );
            sort[i] := tmp;
            exit for;
        );
    );
);

for i := 1 to idx do (
    output := output+sort[i]+',';
);
output;

在排序後要取值的話~先比對有值後再顯示~
@sum_show
Shared stringVar array all_name;
Shared NumberVar array all_cnt;
Shared stringVar array sort;
Shared NumberVar idx;

stringVar showData := '';
NumberVar i;
NumberVar j;
for i := 1 to idx do (
    for j := 1 to idx do (
        if sort[i] = all_name[j] then (
            showData := showData +Chr(13)+Chr(10)+ all_name[j]+':'+ToText(all_cnt[j],'##,###,###,##0',0);
            exit for;
        );
    );  
);
showData;

沒有留言: