我正在寻找一种在交叉表中显示行号的方法。
我尝试在网上搜索有关如何操作的答案,但我还没有发现任何有用的东西。 所以我转向Stack Overflow上的好人。 我想要这样做的原因,如果它甚至可能,是因为我开始工作的公司中的许多客户要求在交叉表中有一个行号。 我正在使用Visual Studio 2013和Crystal Reports。 那么在Crystal Reports中有没有基本(简单)的方法呢?
例如,我有一个显示计量单位和金额的交叉表。
但我希望我的交叉表能像:
Amount
1. Total -38
2. KG
3. kut 9
4. LIT. 4
5. m -32
6. proc
7. Koм -19
请记住,我本周才开始使用Crystal Reports,所以这对我来说都是新手。图中的交叉表只是我用来解释我需要的随机数据。
提前谢谢你。
答案 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
在我的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,则可以使用更短,更容易的第二种方法
如有任何疑问,请随时提问。