1

我有一个关于水晶报表的问题。我有一个现有的报告,其数据取自存储过程。数据可能如下所示:

部门|组级别 1|组级别 2 |组级别 3|值
--------+-------------+-------+-------- ------+--------
IT |资产 |流动资产 |现金 |100
公司 |资产 |流动资产 |现金 |200
IT |资产 |流动资产 |应收账款 |300
公司 |资产 |流动资产 |应收账款 |400
IT |资产 |固定资产 |土地 |500
公司 |资产 |固定资产 |土地 |600
IT |负债 |流动负债|工资 |100
公司 |负债 |流动负债|工资 |200
IT |负债 |流动负债|税收 |100
公司 |负债 |流动负债|税收 |100
IT |负债 |长期 |债券 |300
公司 |负债 |长期 |债券 |400

实际数据可能有更多的划分(不仅仅是两个)。在新报告中,我希望报告如下所示:

                          | 资讯科技 | 公司
流动资产
现金 | 100 | 200
应收账款 | 300 | 400
流动资产总额 | 400 | 600

固定资产
土地 | 500 | 600
固定资产总额 | 500 | 600

总资产 | 900 | 1200

流动负债       
工资 | 100 | 200
税收 | 100 | 100
流动负债总额 | 200 | 300

长期
债券 | 300 | 400
总长期 | 300 | 400

总负债 | 500 | 700

因此,报表将根据分区数向右扩展。假设一页最多可以容纳 10 个分区。那么如果有15个分区,那么第一页显示1到10分区,第二页显示11到15分区。第一页和第二页显示的项目相同,只是分区不同。分区的数量是灵活的。而且项目很多(可能有很多流动资产、负债等)。

现在,我尝试在存储过程中进行一些格式化,因此返回的数据将如下所示:

页码 | 组 1 级 | 组 2 级 | 组 3 级 | 第 1 部分 | 值 1 | 第 2 部分 | 价值 2
--------+----------------+---------------+--------- ------+-------+---------+--------+--------
1 | 资产 | 流动资产 | 现金 | 资讯科技 | 100 | 公司 | 200
1 | 资产 | 流动资产 | 应收账款 | 资讯科技 | 300 | 公司 | 400

等等。对于 11 到 15 分区,我将页码设置为 2。然后在水晶报表中,我将按:页码、组级别 1、组级别 2 和组级别 3 进行分组。所以水晶报表将显示所有内容在基于页码的页面上。

问题是:
- 如果有很多项目,那么它也可能不适合一页。例如,假设一页最多可以容纳 30 行,那么如果我有 40 行,则 10 行将显示在第二页中。但是我希望第二页仍然显示第 11-15 部分的前 30 个项目,第三页将显示第 1-10 部分的最后 10 行,第四页将显示第 11-15 部分的最后 10 行.
- 每次更改组时,都会重置 Crystal Report 中的运行总计。假设我有 40 个资产。然后在第三页和第四页上的 40 个资产之后,它应该显示资产的总数。如何计算运行总数以使其正确显示?(考虑到我不能直接总结,因为第三页和第四页应该显示不同部门的总数)。

有没有解决这个问题或更好的方法来格式化数据?

谢谢。

4

3 回答 3

0

我建议使用交叉表。

设置:

  • 列:Division
  • 行:Group Level 1, Group Level 2,Group Level 3
  • 汇总字段:Value

您必须尝试使用​​行分组字段以获得正确的间距。对列的大小执行相同的操作。

于 2013-08-13T20:55:13.073 回答
0

你的确切问题是什么?

  1. 格式化报告或计算运行总计?

实施以下流程

  1. 使用“Grouplevle1”创建一个组,不要抑制 Group1 Header
  2. 使用“Grouplevel2”创建一个组,不要抑制 Group2 标题。创建两个文本字段并写上“IT”和“Corp”并放在报告上
  3. 使用“Grouplevel3”创建一个组,现在抑制 group3 标题
  4. 写一个公式并添加以下代码

    If Divison="IT" Then Value Else 写另一个公式并添加以下代码

    IF Divison="Corp" 然后值为 Else 0

详细放置两个论坛并为所有部分添加摘要。同时抑制详细部分

对于所有组页脚,写下所需的文本

这将解决您的问题。

于 2013-08-13T05:38:20.380 回答
0

一般来说,这就是我最终解决问题的方式:

1. Define how many divisions (NumColumn) to be displayed in a single page.
2. Create a table to store the mapping of the division. The table has column that stores PageOffset and ColumnNo. PageOffset stores the number of page to be added when displaying a particular division. For example, if there are 15 divisions, and a page can only accommodate 10 divisions, then the first 10 divisions will have `PageOffset = 0` and the last 5 divisions will have `PageOffset = 1`. The ColumnNo is the position of a division in the report column. So first division will have value of 1, second division will have value of 2 and so on. 11th division will have the value of 1, etc.
3. Create a result table. For each column in the report, we have 2 database field, value and total.
4. Loop for each record, sorted by the group.
    Select the position of the division from the table in step 2. If `ColumnNo = 1` insert a row in the result table. E.g. for division 1 and 11 it will create rows in result table.
    After that update the row data, based on the position of the division. So for division 1-10 will update the row created by division 1, division 11-15 will update row created by division 11.
5. Count the number of items in each group and store it into a table.
6. Define how many rows (RowsInPage) to be displayed in a single page.
7. Set PageAdd = 0 and RowsLeft = RowsInPage
8. Loop for each group
    Retrieve the number of rows needed for this group
    Add the page number of each row with PageAdd
    Decrement RowsLeft
    If RowsLeft = 0
        Increment PageAdd
        Set RowsLeft = RowsInPage
    End If
9. Loop for each group
    Loop from 1 to NumColumn
        Update the total field for each division. This total field value will be put in the report as the running group total for that particular division.
于 2013-11-07T07:46:08.330 回答