【问题标题】:How can I display Row Number in Cross-Tab?如何在交叉表中显示行号?
【发布时间】:2019-03-18 21:47:48
【问题描述】:

我正在寻找一种在我的交叉表中显示行号的方法。

我尝试在网上搜索有关如何操作的答案,但没有找到任何有用的信息。 所以我转向 Stack Overflow 上的好人。 我想这样做的原因(如果可能的话)是因为我开始工作的公司中的许多客户都要求在交叉表中有一个行号。 我正在使用 Visual Studio 2013 和 Crystal Reports。 那么在 Crystal Reports 中是否有任何基本(简单)的方法可以做到这一点?

例如,我有一个显示计量单位和金额的交叉表。

https://imgur.com/a/lOjCq

但我希望我的交叉表是这样的:

             Amount
1. Total        -38

2. KG 

3. kut            9

4. LIT.           4

5. m            -32

6. proc

7. Koм          -19

请记住,我这周才开始使用 Crystal Reports,所以这对我来说是全新的。而图片中的交叉表只是我为了说明我需要什么而随机制作的。

提前谢谢你。

【问题讨论】:

  • 您想在现有的交叉表中添加一个单独的列吗?
  • 我很伤心,我想在我的交叉表中有行号。如果我需要另一列,那么是的,我想添加一个单独的列来实现我所需要的。所以我要问你的下一个问题是如何添加一个单独的列来显示行号?

标签: visual-studio visual-studio-2013 crystal-reports crosstab


【解决方案1】:

为了在您的交叉表中显示行号,您需要首先将行号放入将数据发送到报表的存储过程中。

为了更好地理解它,我将首先向您展示我的数据在添加行号之前的外观(图 1)。

代码:

select 
     a.S_ID as ID,
     osn.sifra as BasicGoodsCode,
     osn.naziv as BasicGoods,
     null,
     a.RobaSifra as GoodsCode,
     a.Roba as Goods,
     a.Detalj as Detail,
     a.DetaljDodatak as DetailsAddon
from NP_Stavke s
     left join RobaGrupe osn on osn.id = s.RobaId
     left join #A a on a.S_ID = s.Id
order by BasicGoodsCode, ID

Pic 1: As you can see I have 3 different Ids for BasicGoods which means that I have 3 Rows in my CrossTab

列 ID、BasicGoodsCode 和 BasicGoods 将成为我的 CrossTab 中的行。

DetailsAddon 列中的值将成为我在 CrossTab 中的列。

GoodsCode、Goods 和 Detail 列将成为我的 CrossTab 中的值。

柱子并不重要。

现在您已经了解了所有内容的外观,我们可以从向 CrossTab 添加行号开始。

第 1 步:

您需要做的第一件事是在存储过程的表中添加行号。 为此,我使用了DENSE_RANK() 根据您的数据,您可能需要使用 ROW_NUMBER() 甚至其他东西。我使用 DENSE_RANK() 是因为我需要在 S_ID 更改后更改行号。

代码:

select 
     a.S_ID as ID,
     DENSE_RANK() OVER (ORDER BY osn.sifra, s.Id asc) as BasicGoodsRowNo, // THIS IS ADDED
     osn.sifra as BasicGoodsCode,
     osn.naziv as BasicGoods,
     null as Pieces,
     a.RobaSifra as GoodsCode,
     a.Roba as Goods,
     a.Detalj as Detail,
     a.DetaljDodatak as DetailsAddon
from NP_Stavke s
     left join RobaGrupe osn on osn.id = s.RobaId
     left join #A a on a.S_ID = s.Id
order by BasicGoodsCode, ID

让我们看看我们的数据现在的样子(Pic 2)

如您所见,我们添加了一个行号,该行号会随着 Id 的变化而变化。

重要提示: 您在报告中使用的数据表中的行号必须是整数或小数,否则将无法正常工作。

第 2 步:

我们已经完成了“困难”部分,现在是时候将行号放入我们的 CrossTab 中了。

当您创建 CrossTab 或右键单击 CrossTab 然后单击“Cross-Tab Expert...”时,它将打开一个类似 this one 的窗口,并在其中的“行”部分中插入行号列(就我而言,正如您在上面的代码中看到的,我的行号列的名称是“BasicGoodsRowNo”)。

第 3 步:

由于您不想在报告中仅显示行号,请左键单击您的行,然后单击“组选项...”(Pic 4)

出现新窗口后,点击“选项”选项卡,然后选中“自定义组名字段”,然后点击“使用公式作为组名”,然后点击“x-2”(Pic 5)

第 4 步:

输入这样的公式:

toText( {myTbl.BasicGoodsRowNo}, 0, "" ) + '. ' + {myTbl.BasicGoodsCode} + ' ' + {myTbl.BasicGoods}

当然,您的公式不会与我的完全一样,因为您不会拥有与我相同的列。您必须拥有此公式的唯一部分是 toText( {myTbl.BasicGoodsRowNo}, 0, "" ) 代替 {myTbl.BasicGoodsRowNo} 您将放置你的行号列。您将需要 toText,因为如果您没有它并且您想在行号之后显示一个字符串,它会给您一个错误,因为 RowNumber 是一个整数字段。

GJ,你已经完成了,这并不难

How My CrossTab looks once RowNumber is added

现在有一种方法可以简化这个过程,那就是:

第 1 步:

在您的存储过程中创建 2 列。一个将显示行号,另一个将显示将显示为 CrossTab 行的值。

代码:

select 
      a.S_ID as ID,
      DENSE_RANK() OVER (ORDER BY osn.sifra, s.Id asc) as BasicGoodsRowNo, // RowNumber
      CONVERT(varchar(10), DENSE_RANK() OVER (ORDER BY osn.sifra, s.Id asc)) + '. ' + osn.sifra + ' ' +osn.naziv as BasicGoods, // Value that will be displayed in CrossTab Row
      null as Pieces,
      a.RobaSifra as GoodsCode,
      a.Roba as Goods,
      a.Detalj as Detail,
      a.DetaljDodatak as DetailsAddon
from NP_Stavke s
      left join RobaGrupe osn on osn.id = s.RobaId
      left join #A a on a.S_ID = s.Id
order by BasicGoods, ID

如您所见,列 BasicGoodsRowNo 没有改变,仍将显示与以前相同的值,我删除了列 BasicGoodsCode 和 BasicGoods 并用此替换它们

CONVERT(varchar(10), DENSE_RANK() OVER (ORDER BY osn.sifra, s.Id asc)) + '. ' + osn.sifra + ' ' +osn.naziv as BasicGoods,

BasicGoods 列将显示 BasicGoodsRowNo + BasicGoodsCode + BasicGoods。

第 2 步:

第 2 步与之前相同。

第 3 步:

单击行并单击“组选项”后,再次转到“选项”选项卡,然后再次选中“自定义组名称字段”复选框,然后单击 “使用公式作为组名称' 点击“从现有字段中选择”,然后从组合框中选择要在交叉表中显示为行值的列。在我的案例中是“基本商品”列 (Pic 7)。

我使用第一种方法,因为根据用户的决定,我可能根本不会显示 CrossTab,也可能不会显示 BasicGoods,但如果您的报告中只有 CrossTab,您可以使用第二种更短、更简单的方法.

如果您有任何问题,请随时提出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多