一、業務描述:
如果具有某列的人的值均為零值(number型)或空(字元型),又或者不具有此列,那麼列印報表的時候該列不顯示,換一種說法就是:打列出的列都至少有乙個員工在此項有值。
二、現狀:
1、需要根據使用者許可權範圍內的「業務單位」,去關聯「集合 id」,而setid下是預列印列值的「全集」。
三、實現時技術難點:
1、所有列值與員工在實際表中,都是一項列值一條資料,造成不能一次查庫就能取到所有需列印的列。
2、列名先於列值列印,那麼在出列值前需確定需列印的所有列名,並且,列印列值時需要和列名對應上。
3、乙個員工的某一項按時間分段後可有多條,例如,某月1號到15號一條,16號到月最後一天又一條。
4、因多次查庫,可能效率不會太好,但由於業務上要求於此,此沒辦法提公升。
四、具體實現:
1、確定需列印的列名:寫sql,用sum、group來統計具體需列印出的列名,並按順序儲存列印項的code。
2、用步驟1的code,按順序取相應項的值,然後放在二維array裡,同時可用另外乙個二維陣列按樣式存資料,然後列印出來,具體**如下:
rem 根據給定支援元素pin_num,查詢員工支援元素;
for &i = 1 to &arroutpinnum.len
rem 查詢支援元素值;
&arr2returnpin = &ogputility.getemplsupportvar(&outemplid, &outemplrcd, &arroutpinnum [&i], &dtprdbgn, &dtprdend);
if &arr2returnpin.len < 1 then /*說明不包含此支援元素,存入空值*/
&arr2pin.push(createarrayany(" "));
else /*不為空,存入返回的支援元素值*/
for &i1 = 1 to &arr2returnpin.len
if &arr2returnpin [&i1][2] = "y" then /*支援元素為字元型*/
&arrtmppin.push(&arr2returnpin [&i1][1]);
end-if;
if &arr2returnpin [&i1][4] = "y" then /*支援元素為數值型*/
&arrtmppin.push(&arr2returnpin [&i1][3]);
end-if;
end-for;
rem 統計同一員工同一支援變數多次出現時的最大數,供後續設定輸出樣式用(主要針對同一員工同一支援元素時間上有分段的情況);
if all(&arrtmppin) and
&arrtmppin.len > &longestcount then /*始終儲存最大值*/
&longestcount = &arrtmppin.len;
end-if;
rem 儲存當前支援元素結果;
&arr2pin.push(&arrtmppin);
rem 清空臨時array,以備下次使用;
&arrtmppin = createarrayany();
end-if;
end-for;
rem 構造返回的支援元素排列樣式;
local number &j, &k, &l, &m; /*迴圈變數*/
local array of any &arrtmpgetpin = createarrayany(); /*構造支援元素輸出樣式臨時array*/
for &j = 1 to &arr2pin.len
if &arr2pin [&j].len < 1 then /*如果為空,則不包含此支援元素,存入&longestcount個空*/
for &k = 1 to &longestcount
&arrtmpgetpin.push(" ");
end-for;
else
for &l = 1 to &arr2pin [&j].len /*如果不為空,那麼取出所有包含的支援元素(主要處理同一員工同一支援元素分段的情況)*/
&arrtmpgetpin.push(&arr2pin [&j][&l]);
end-for;
if &arr2pin [&j].len < &longestcount then
for &m = &arr2pin [&j].len + 1 to &longestcount /*其他單元格設定為空*/
&arrtmpgetpin.push(" ");
end-for;
end-if;
end-if;
rem 儲存當前支援元素;
&arr2pinrslt.push(&arrtmpgetpin);
rem 清空,以便下條使用;
&arrtmpgetpin = createarrayany();
end-for;
/*填充結果資料*/
local number &j1, &j2;
for &j2 = 1 to &longestcount
&fileout.writeline("");
&oreport.writecelldata(&fileout, &business_descrshort, "30");
&oreport.writecelldata(&fileout, &outdeptid, "30");
&oreport.writecelldata(&fileout, &outdeptdescr, "30");
&oreport.writecelldata(&fileout, &outemplid, "30");
&oreport.writecelldata(&fileout, &outemplrcd, "30");
&oreport.writecelldata(&fileout, &outemplname, "30");
&oreport.writecelldata(&fileout, &outgppaygroup, "30");
&oreport.writecelldata(&fileout, &outgroupdescr, "30");
for &j1 = 1 to &arr2pinrslt.len
&oreport.writecelldata(&fileout, &arr2pinrslt [&j1][&j2], "30");
end-for;
&fileout.writeline("");
end-for;
員工所具有的列項圖示:
[img]
最終列印結果圖示:
查詢期間id:2011/01,故截止到2010/12/31的無效,沒有出現在結果中。
[img]
關於結果布局開發的時候,由於時間分段+員工可能有多個元素都分段,那麼顯示的行如何搞?
員工顯示的總條數由分段最多的支援元素決定,其他分段支援元素,盡量拼在一條顯示,拼不下就拼在下一條。
動態列報表的製作
在資料資訊系統中,常常會看到這樣一類報表需求,它們往往格式簡單,一般為列表式明細報表,但是要顯示的列很多。而不同終端使用者在不同時刻關心的資料又不同,這樣就要求報表能夠讓他們隨心所欲的選擇要顯示的列,以便直觀地檢視資料。最終效果如下圖所示 那怎麼實現這種需求呢?多做幾個典型報表,根據使用者不同進行不...
動態列報表的製作
在資料資訊系統中,常常會看到這樣一類報表需求,它們往往格式簡單,一般為列表式明細報表,但是要顯示的列很多。而不同終端使用者在不同時刻關心的資料又不同,這樣就要求報表能夠讓他們隨心所欲的選擇要顯示的列,以便直觀地檢視資料。最終效果如下圖所示 動態列效果圖 那怎麼實現這種需求呢?多做幾個典型報表,根據使...
不確定列報表sql的實現
在給金融行業做報表時,經常會遇到乙個問題,就是按照月份進行報表統計,那麼對於月份不確定的列該如何統計呢?思路如下 1 在儲存過程中拼接sql 2 將儲存過程中的結果集放在乙個臨時表中 3 在程式中呼叫儲存過程和該錶,用resultset獲取列數和列名。如下 label pro start 程式處理開...