如何在交叉表中显示行号?
How can I display Row Number in Cross-Tab?
我正在寻找一种在交叉表中显示行号的方法。
我尝试在网上搜索有关如何操作的答案,但没有找到任何有用的信息。
所以我求助于 Stack Overflow 上的好人。
我想这样做的原因,如果可能的话,是因为我开始工作的公司中的许多客户要求在交叉表中有一个行号。
我正在使用 Visual Studio 2013 和 Crystal 报告。
那么在 Crystal 报告中是否有任何基本(简单)的方法来做到这一点?
例如,我有一个显示计量单位和金额的交叉表。
但我希望我的交叉表是这样的:
Amount
1. Total -38
2. KG
3. kut 9
4. LIT. 4
5. m -32
6. proc
7. Koм -19
请记住,我这周才开始使用 Crystal 报告,所以这对我来说是全新的。而且图中的交叉表只是我随便做的一个,用来说明我需要的。
提前谢谢你。
为了在交叉表中显示行号,您需要先将行号放入将数据发送到报表的存储过程中。
为了更好地理解它,我将首先向您展示我的数据的外观,然后再添加行号(图 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 将成为我的交叉表中的行。
DetailsAddon 列中的值将成为我在 CrossTab 中的列。
GoodsCode、Goods 和 Detail 列将成为我的 CrossTab 中的值。
专栏文章不重要。
现在您已经了解了所有内容,我们可以从向交叉表添加行号开始。
第 1 步:
您需要做的第一件事是在存储过程中的 table 中添加一个行号。
为此,我使用了 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 更改时更改。
重要提示: 您在报告中使用的 DataTable 中的行号必须是整数或小数,否则将无法正常工作。
第 2 步:
我们已经完成了 'hard' 部分,现在是时候将行号放入我们的交叉表中了。
当您创建一个交叉表或右键单击交叉表然后单击 'Cross-Tab Expert...' 时,它将打开一个 window,如 this one,您将在其中的行部分插入您的行号列(在我的例子中,正如您在上面的代码中看到的,我的行号列的名称是 'BasicGoodsRowNo')。
第 3 步:
因为您不想只在报告中显示行号,请左键单击您的行,然后单击 'Group Options...'(Pic 4)
一旦新的 window 出现,点击 'Options' 选项卡然后选中 'Customise group name field' 然后点击 'Use a formula as group name' 然后点击 '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 列。一个将显示行号,另一个将显示将显示为交叉表行的值。
代码:
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 步:
第二步同前
第 3 步:
单击行和 'Group Options' 后,再次转到 'Options' 选项卡,然后再次选中 'Customise group name field' 复选框,然后单击 'Use a formula as group name' 单击 'Choose from existing field' 并从组合框 select 中选择要在交叉表中显示为行值的列。在我的例子中是 'BasicGoods' 列 (Pic 7).
我使用了第一种方法,因为根据用户的决定,我可能根本不显示 CrossTab,也可能不显示 BasicGoods,但如果您的报告中只有 CrossTab,您可以使用第二种,更短更简单的方法。
如果您有任何问题,请随时提问。
我正在寻找一种在交叉表中显示行号的方法。
我尝试在网上搜索有关如何操作的答案,但没有找到任何有用的信息。 所以我求助于 Stack Overflow 上的好人。 我想这样做的原因,如果可能的话,是因为我开始工作的公司中的许多客户要求在交叉表中有一个行号。 我正在使用 Visual Studio 2013 和 Crystal 报告。 那么在 Crystal 报告中是否有任何基本(简单)的方法来做到这一点?
例如,我有一个显示计量单位和金额的交叉表。
但我希望我的交叉表是这样的:
Amount
1. Total -38
2. KG
3. kut 9
4. LIT. 4
5. m -32
6. proc
7. Koм -19
请记住,我这周才开始使用 Crystal 报告,所以这对我来说是全新的。而且图中的交叉表只是我随便做的一个,用来说明我需要的。
提前谢谢你。
为了在交叉表中显示行号,您需要先将行号放入将数据发送到报表的存储过程中。
为了更好地理解它,我将首先向您展示我的数据的外观,然后再添加行号(图 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 将成为我的交叉表中的行。
DetailsAddon 列中的值将成为我在 CrossTab 中的列。
GoodsCode、Goods 和 Detail 列将成为我的 CrossTab 中的值。
专栏文章不重要。
现在您已经了解了所有内容,我们可以从向交叉表添加行号开始。
第 1 步:
您需要做的第一件事是在存储过程中的 table 中添加一个行号。 为此,我使用了 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 更改时更改。
重要提示: 您在报告中使用的 DataTable 中的行号必须是整数或小数,否则将无法正常工作。
第 2 步:
我们已经完成了 'hard' 部分,现在是时候将行号放入我们的交叉表中了。
当您创建一个交叉表或右键单击交叉表然后单击 'Cross-Tab Expert...' 时,它将打开一个 window,如 this one,您将在其中的行部分插入您的行号列(在我的例子中,正如您在上面的代码中看到的,我的行号列的名称是 'BasicGoodsRowNo')。
第 3 步:
因为您不想只在报告中显示行号,请左键单击您的行,然后单击 'Group Options...'(Pic 4)
一旦新的 window 出现,点击 'Options' 选项卡然后选中 'Customise group name field' 然后点击 'Use a formula as group name' 然后点击 '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 列。一个将显示行号,另一个将显示将显示为交叉表行的值。
代码:
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 步:
第二步同前
第 3 步:
单击行和 'Group Options' 后,再次转到 'Options' 选项卡,然后再次选中 'Customise group name field' 复选框,然后单击 'Use a formula as group name' 单击 'Choose from existing field' 并从组合框 select 中选择要在交叉表中显示为行值的列。在我的例子中是 'BasicGoods' 列 (Pic 7).
我使用了第一种方法,因为根据用户的决定,我可能根本不显示 CrossTab,也可能不显示 BasicGoods,但如果您的报告中只有 CrossTab,您可以使用第二种,更短更简单的方法。
如果您有任何问题,请随时提问。