Crystal 报告:如何制作包含月度、季度和年初至今字段总计的报告?
Crystal Reports: How to make a report with Monthly, Quarterly, and YTD field totals?
这是我正在使用的 table 的缩写示例:
Month ............ SiteID ........ Patients ....FundingSource.... Year
January ............ 1 ........... 13 .......... ABCD.......... 2019
February............ 1 ........... 223 ......... ABCD.......... 2019
February ........... 2 ........... 52 .......... ABCD.......... 2019
February ........... 3 ........... 21........... EFGH.......... 2018
March .............. 1 ........... 44 .......... EFGH.......... 2018
April .............. 1 ........... 12 .......... ABCD.......... 2019
May................. 1 ........... 34 .......... ABCD.......... 2018
May................. 1 ........... 51 .......... ABCD.......... 2019
June ............... 1 ............62 .......... EFGH.......... 2017
我正在尝试输出一份报告,显示根据给定参数就诊的每月、每季度和年初至今的患者总数。参数是 FundingSource、SiteID、Month 和 Year。因为报告应该看起来像一个表格,所以它必须将结果打印出一页 time/on。
编辑:季度总数应该是从 7 月到 6 月的财政季度。年列是日历年。
Patients 字段本身是一个字符串字段,表示当月就诊的患者数量。因此创建每月总计很容易,因为只需添加字段即可。
对于季度总计,我制作了一个 Cdbl 公式字段以将 table.Patients 转换为数字(它是我们数据库中的一个 nvarchar 字段——不能在 运行 中求和总字段),然后为该字段的每个季度创建一个 运行 总字段(通过使该 cdbl 字段评估 [January, February, March, April] 月份等,并在 SiteID 更改时重置)。然后我制作了另一个公式字段,它将输出相应的 运行 季度的总字段
例如
IF month IN [January, February, March, April] then
{#PatientsSeenQ1}
我遇到的问题是,给定这些参数字段,季度结果最终与月度结果相同,因为 Month = ?Month 并且无法缩小以捕获其他月份四分之一。我认为这也是获取年初至今总计的问题。
我已经为这个问题苦苦思索了一段时间,所以非常感谢您的帮助!!这对我的工作来说是一个重要的问题,所以我一定会及时回复。
编辑:
我被要求像这样格式化输出(为了示例目的假设日历年季度):
Reporting Period: May 2019
Funding Source: ABCD
Site: 1
........................... Monthly ... Quarterly ..... YTD
Number of patients seen:..... 51 ........ 63........... 299
我不必报告每个站点、年份和月份,只需报告输入的站点、年份、资金来源和月份(参数)。输出应该是用户将在网站上查看的报告的 printable 版本。
编辑:
根据用户 heringer 的以下内容,我找到了解决问题的方法。今年年初至今,我得到了外部帮助,所以这是答案:
我创建了一个公式字段@FiscalYear 来确定年份:
IF {@RowMonthCDate} IN [7,8,9,10,11,12] and {@ParMonthCDate} IN [1,2,3,4,5,6] THEN toText((ToNumber({?Year})-1),"#")
ELSE IF {@RowMonthCDate} IN [1,2,3,4,5,6] and {@ParMonthCDate} IN [7,8,9,10,11,12] THEN toText((ToNumber({?Year})+1),"#")
ELSE toText((ToNumber({?Year})),"#")
然后对于 YTD 运行 总字段,我将其用于评估公式:
{reporting_year} = {@FiscalYear} AND
(
if {@ParMonthCDate} = 7 then {@RowMonthCDate} = 7
else if {@ParMonthCDate} = 8 then {@RowMonthCDate} in [7,8]
else if {@ParMonthCDate} = 9 then {@RowMonthCDate} in [7,8,9]
else if {@ParMonthCDate} = 10 then {@RowMonthCDate} in [7,8,9,10]
else if {@ParMonthCDate} = 11 then {@RowMonthCDate} in [7,8,9,10,11]
else if {@ParMonthCDate} = 12 then {@RowMonthCDate} in [7,8,9,10,11,12]
else if {@ParMonthCDate} = 1 then {@RowMonthCDate} in [7,8,9,10,11,12,1]
else if {@ParMonthCDate} = 2 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2]
else if {@ParMonthCDate} = 3 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2,3]
else if {@ParMonthCDate} = 4 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2,3,4]
else if {@ParMonthCDate} = 5 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2,3,4,5]
else if {@ParMonthCDate} = 6 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2,3,4,5,6]
)
AND
{report.fundingsource} = {?FundingSource} AND
{report.Site_id} = {?Site_ID}
可能不够优雅,但它为我提供了该会计年度参数月份的字段总计。再次感谢 heringer 与我一起为此工作了大约一周!
您可以创建一个公式来使用年份和月份(并考虑第 1 天)构建日期。
然后按照这个公式创建3组。
使用小组专家对每个小组进行年度、季度、月度
然后将简单的摘要字段放在组页脚上。
我不确定它是否适合您的最终设计。如果没有,请出示。
编辑:
在新的评论之后,这是一个新的有目的的解决方案。我将保留上面的旧版本以供进一步参考。
基于 com 评论,我假设该报告将显示一年、一个月、一个资金来源和一个站点 ID 的数据。
我知道你的起点是正确的。我会尽力帮助解决细节问题。
- 创建参数:{?Year}、{?Month}、{?FundingSource?}、{?SideId}。
- 创建 运行 总字段 {#PatientsInMonth} 以求和 {Table.Patients} 并使用此公式设置 "evaluate / use a formula":
{Table.Year} = {?Year} AND
{Table.Month} = {?Month} AND
{Table.FundingSource} = {?FundingSource} AND
{Table.SiteId} = {?SiteId}
- 创建 运行 总字段 {#PatientsInQuarter} 以求和 {Table.Patients} 并使用此公式设置 "evaluate / use a formula":
numbervar rowNumberOfMonth := 0; //TODO i'm letting it up to you, since you said you did it
numbervar parNumberOfMonth := 0; //TODO
numbervar rowQuarter := (rowNumberOfMonth - 1) \ 4; //notice the integer divide, the symbol is not wrong
numbervar parQuarter := (parNumberOfMonth - 1) \ 4; //notice the integer divide, the symbol is not wrong
{Table.Year} = {?Year} AND
rowQuarter = parQuarter AND
{Table.FundingSource} = {?FundingSource} AND
{Table.SiteId} = {?SiteId}
- 创建 运行 总字段 {#PatientsInYear} 以求和 {Table.Patients} 并使用此公式设置 "evaluate / use a formula":
{Table.Year} = {?Year} AND
{Table.FundingSource} = {?FundingSource} AND
{Table.SiteId} = {?SiteId}
- 将 运行 个总字段放在报表页脚中。
这是我正在使用的 table 的缩写示例:
Month ............ SiteID ........ Patients ....FundingSource.... Year
January ............ 1 ........... 13 .......... ABCD.......... 2019
February............ 1 ........... 223 ......... ABCD.......... 2019
February ........... 2 ........... 52 .......... ABCD.......... 2019
February ........... 3 ........... 21........... EFGH.......... 2018
March .............. 1 ........... 44 .......... EFGH.......... 2018
April .............. 1 ........... 12 .......... ABCD.......... 2019
May................. 1 ........... 34 .......... ABCD.......... 2018
May................. 1 ........... 51 .......... ABCD.......... 2019
June ............... 1 ............62 .......... EFGH.......... 2017
我正在尝试输出一份报告,显示根据给定参数就诊的每月、每季度和年初至今的患者总数。参数是 FundingSource、SiteID、Month 和 Year。因为报告应该看起来像一个表格,所以它必须将结果打印出一页 time/on。
编辑:季度总数应该是从 7 月到 6 月的财政季度。年列是日历年。
Patients 字段本身是一个字符串字段,表示当月就诊的患者数量。因此创建每月总计很容易,因为只需添加字段即可。
对于季度总计,我制作了一个 Cdbl 公式字段以将 table.Patients 转换为数字(它是我们数据库中的一个 nvarchar 字段——不能在 运行 中求和总字段),然后为该字段的每个季度创建一个 运行 总字段(通过使该 cdbl 字段评估 [January, February, March, April] 月份等,并在 SiteID 更改时重置)。然后我制作了另一个公式字段,它将输出相应的 运行 季度的总字段
例如
IF month IN [January, February, March, April] then
{#PatientsSeenQ1}
我遇到的问题是,给定这些参数字段,季度结果最终与月度结果相同,因为 Month = ?Month 并且无法缩小以捕获其他月份四分之一。我认为这也是获取年初至今总计的问题。
我已经为这个问题苦苦思索了一段时间,所以非常感谢您的帮助!!这对我的工作来说是一个重要的问题,所以我一定会及时回复。
编辑:
我被要求像这样格式化输出(为了示例目的假设日历年季度):
Reporting Period: May 2019
Funding Source: ABCD
Site: 1
........................... Monthly ... Quarterly ..... YTD
Number of patients seen:..... 51 ........ 63........... 299
我不必报告每个站点、年份和月份,只需报告输入的站点、年份、资金来源和月份(参数)。输出应该是用户将在网站上查看的报告的 printable 版本。
编辑:
根据用户 heringer 的以下内容,我找到了解决问题的方法。今年年初至今,我得到了外部帮助,所以这是答案:
我创建了一个公式字段@FiscalYear 来确定年份:
IF {@RowMonthCDate} IN [7,8,9,10,11,12] and {@ParMonthCDate} IN [1,2,3,4,5,6] THEN toText((ToNumber({?Year})-1),"#")
ELSE IF {@RowMonthCDate} IN [1,2,3,4,5,6] and {@ParMonthCDate} IN [7,8,9,10,11,12] THEN toText((ToNumber({?Year})+1),"#")
ELSE toText((ToNumber({?Year})),"#")
然后对于 YTD 运行 总字段,我将其用于评估公式:
{reporting_year} = {@FiscalYear} AND
(
if {@ParMonthCDate} = 7 then {@RowMonthCDate} = 7
else if {@ParMonthCDate} = 8 then {@RowMonthCDate} in [7,8]
else if {@ParMonthCDate} = 9 then {@RowMonthCDate} in [7,8,9]
else if {@ParMonthCDate} = 10 then {@RowMonthCDate} in [7,8,9,10]
else if {@ParMonthCDate} = 11 then {@RowMonthCDate} in [7,8,9,10,11]
else if {@ParMonthCDate} = 12 then {@RowMonthCDate} in [7,8,9,10,11,12]
else if {@ParMonthCDate} = 1 then {@RowMonthCDate} in [7,8,9,10,11,12,1]
else if {@ParMonthCDate} = 2 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2]
else if {@ParMonthCDate} = 3 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2,3]
else if {@ParMonthCDate} = 4 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2,3,4]
else if {@ParMonthCDate} = 5 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2,3,4,5]
else if {@ParMonthCDate} = 6 then {@RowMonthCDate} in [7,8,9,10,11,12,1,2,3,4,5,6]
)
AND
{report.fundingsource} = {?FundingSource} AND
{report.Site_id} = {?Site_ID}
可能不够优雅,但它为我提供了该会计年度参数月份的字段总计。再次感谢 heringer 与我一起为此工作了大约一周!
您可以创建一个公式来使用年份和月份(并考虑第 1 天)构建日期。
然后按照这个公式创建3组。
使用小组专家对每个小组进行年度、季度、月度
然后将简单的摘要字段放在组页脚上。
我不确定它是否适合您的最终设计。如果没有,请出示。
编辑:
在新的评论之后,这是一个新的有目的的解决方案。我将保留上面的旧版本以供进一步参考。
基于 com 评论,我假设该报告将显示一年、一个月、一个资金来源和一个站点 ID 的数据。
我知道你的起点是正确的。我会尽力帮助解决细节问题。
- 创建参数:{?Year}、{?Month}、{?FundingSource?}、{?SideId}。
- 创建 运行 总字段 {#PatientsInMonth} 以求和 {Table.Patients} 并使用此公式设置 "evaluate / use a formula":
{Table.Year} = {?Year} AND {Table.Month} = {?Month} AND {Table.FundingSource} = {?FundingSource} AND {Table.SiteId} = {?SiteId}
- 创建 运行 总字段 {#PatientsInQuarter} 以求和 {Table.Patients} 并使用此公式设置 "evaluate / use a formula":
numbervar rowNumberOfMonth := 0; //TODO i'm letting it up to you, since you said you did it numbervar parNumberOfMonth := 0; //TODO numbervar rowQuarter := (rowNumberOfMonth - 1) \ 4; //notice the integer divide, the symbol is not wrong numbervar parQuarter := (parNumberOfMonth - 1) \ 4; //notice the integer divide, the symbol is not wrong {Table.Year} = {?Year} AND rowQuarter = parQuarter AND {Table.FundingSource} = {?FundingSource} AND {Table.SiteId} = {?SiteId}
- 创建 运行 总字段 {#PatientsInYear} 以求和 {Table.Patients} 并使用此公式设置 "evaluate / use a formula":
{Table.Year} = {?Year} AND {Table.FundingSource} = {?FundingSource} AND {Table.SiteId} = {?SiteId}
- 将 运行 个总字段放在报表页脚中。