可變列報表列印開發總結

2021-08-25 15:19:15 字數 3453 閱讀 4644

一、業務描述:

如果具有某列的人的值均為零值(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 程式處理開...