可变列报表打印开发总结

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



员工所具有的列项图示:

可变列报表打印开发总结_第1张图片


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

可变列报表打印开发总结_第2张图片


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

你可能感兴趣的:(sql,J#)