如何在交叉表中显示行号?

时间:2018-03-03 00:36:53

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

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

我尝试在网上搜索有关如何操作的答案,但我还没有发现任何有用的东西。 所以我转向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,所以这对我来说都是新手。图中的交叉表只是我用来解释我需要的随机数据。

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

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

为了更好地理解它,在添加行号(图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

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

DetailsAddon列中的值将是我在CrossTab中的列。

商品代码,商品和详细信息列将成为我的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)< / p>

第4步:

输入这样的公式:

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

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

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步:

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

我使用了第一种方法,因为根据用户的决定,我可能根本不显示CrossTab,也可能不显示BasicGood,但是如果您的报表中只有CrossTab,则可以使用更短,更容易的第二种方法

如有任何疑问,请随时提问。