一、业务描述:
如果具有某列的人的值均为零值(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("<tr>"); &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("</tr>"); End-For;
员工所具有的列项图示:

最终打印结果图示:
查询期间ID:2011/01,故截止到2010/12/31的无效,没有出现在结果中。

关于结果布局开发的时候,由于时间分段+员工可能有多个元素都分段,那么显示的行如何搞?
员工显示的总条数由分段最多的支持元素决定,其他分段支持元素,尽量拼在一条显示,拼不下就拼在下一条。