可变列报表打印开发总结

一、业务描述:
如果具有某列的人的值均为零值(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;




员工所具有的列项图示:

[img]http://dl.iteye.com/upload/attachment/382428/3639ec79-1cd5-3c3e-b796-c814a7f9b02a.png[/img]


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

[img]http://dl.iteye.com/upload/attachment/382426/1b355514-2e0f-3009-8543-51850fed5368.png[/img]


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值