rdlc报告中的水平和自定义表

时间:2015-09-16 04:51:21

标签: reporting-services rdlc ssrs-tablix rdl

这是我的数据库(数据集)。"主要流程"可以分成很多"子流程"。

示例:A是主要流程。它有三个子流程。(a1,a2和a3)

  ----Main Process---|----SUB_PROCESS---|
          A          |        a1
          A          |        a2
          A          |        a3
          B          |        b1
          B          |        b2
          B          |        b3
          B          |        b4
          B          |        b5
          C          |        c1
          C          |        c2

报告将与上述数据集绑定。 下图是我的报告布局。

enter image description here

  • 水平制表符(将行更改为列)
  • 如果主要流程有"子流程"超过3个元素。写入子流程元素必须跳过下一条记录。

请帮帮我,这太难了。有可能吗?

1 个答案:

答案 0 :(得分:3)

这是一个非常艰难的一个,我真的不认为有一个简单的方法可以解决这个问题。我会通过创建一个新的数据源来解决这个问题。

动态地实现这一点真的很难。但下面是我如何为你的例子处理这个问题的一个例子。有固定数量的行(在你的情况下为4)所以我为每一行创建新的列表并动态填充它们,在空中用空字符串填充空白点。这样,表格将水平增长并保持4行。

var row1 = new List<string>();
var row2 = new List<string>();
var row3 = new List<string>();
var row4 = new List<string>();
var rowHeaders = new List<string>();

myDataList.OrderBy(p => p.MainProcess).ThenBy(p => p.SubProcess);
foreach (var proc in myDataList)
{
    if (!rowHeaders.Contains(proc.MainProcess))
    {
        row1.Add(proc.MainProcess);
        rowHeaders.Add(proc.MainProcess);
        if (row2.Count == row1.Count - 2)
            row2.Add("");
        if (row3.Count == row1.Count - 2)
            row3.Add("");
        if (row4.Count == row1.Count - 2)
            row4.Add("");
        row2.Add(proc.SubProcess);
    }
    else
    {
        if (row2.Count == row1.Count - 1)
        {
            row2.Add(proc.SubProcess);
        }
        else
        {
            if (row3.Count == row2.Count - 1)
            {
                row3.Add(proc.SubProcess);
            }
            else
            {
                if (row4.Count == row3.Count - 1)
                {
                    row4.Add(proc.SubProcess);
                }
                else
                {
                    row1.Add(proc.SubProcess);
                }
            }
        }
    }
}


if(row2.Count < row1.Count)
    row2.Add("");
if (row3.Count < row2.Count)
    row3.Add("");
if (row4.Count < row3.Count)
    row4.Add("");

var myDataSource = new List<List<string>>();
myDataSource.Add(row1);
myDataSource.Add(row2);
myDataSource.Add(row3);
myDataSource.Add(row4);

可能有更简洁的方法来过滤您的数据,但这绝对可以解决问题。要以粗体文本显示主进程,可以将“rowHeader”列表添加为参数并使用表达式。

我希望这对您有任何帮助,如果有人知道如何清理我的代码,请随时编辑。