Crystal交叉表,删除零值的列

2020-09-24 01:27发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家

我正在使用一个SQL视图,从该视图中我将几个数据库的财务数据提取到Crystal Income Statement中。 专栏和其他公司。

我正在为收入,支出等使用多个交叉表。 并由他们合计。 该报告需要导出到Excel中-为此,我需要将列对齐。 我的问题是,当没有为该公司记录的收入时,该列不会显示,并且要导出到Excel,即使它为零,也需要显示。

根据屏幕截图,我没有在"交叉表"上选择"抑制"。

以下是一些屏幕截图:

(83.9 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家

我正在使用一个SQL视图,从该视图中我将几个数据库的财务数据提取到Crystal Income Statement中。 专栏和其他公司。

我正在为收入,支出等使用多个交叉表。 并由他们合计。 该报告需要导出到Excel中-为此,我需要将列对齐。 我的问题是,当没有为该公司记录的收入时,该列不会显示,并且要导出到Excel,即使它为零,也需要显示。

根据屏幕截图,我没有在"交叉表"上选择"抑制"。

以下是一些屏幕截图:

(83.9 kB)
付费偷看设置
发送
6条回答
Bunny_CDM
1楼-- · 2020-09-24 01:40

玛莉,你好

不幸的是,Crystal Reports无法显示数据库中不可用的内容。

公司B未出现在第一个交叉表中,因为该数据库中没有该公司的条目。

要解决此问题,您需要修改视图的SQL,以使其始终带入您需要在报表上显示的所有公司。

执行此操作的一种方法是创建一个列出公司的"查找"表。 然后,您可以从此查询表"左加入"到"收入"表。 这应该列出所有公司,无论其在何处都没有收入。

-阿比拉什

Violet凡
2楼-- · 2020-09-24 01:36

嗨,玛莉,

问题在于您有一个选择公式,该选择公式可以返回所选日期范围之间的数据。

由于ST_Canada在该日期范围内没有任何数据,因此报告不会返回该数据。

假设您的数据库没有列出所有日期的"日历"表,则可以在"视图"中自行构建一个。 修改后的SQL看起来像这样:

 DECLARE @开始日期
 DECLARE @结束日期
 SET @开始日期='2018-01-01'
 SET @enddate ='2018-12-31'
 ;与Calndr AS
 (
     选择@startdate AS DateValue
     全联盟
     SELECT DATEADD(DAY,1,DateValue)
     从Calndr
     在哪里DateValue  T1.Credit)和T3.OcrCode ='SRVC'
 GROUP BY T0.GroupMask,T0.FatherNum,T0.AcctName,T0.FormatCode,T3.OcrCode,T3.OcrName,T4.OcrCode,T4.OcrName,T2.RefDate,T0.Segment_1,T0.Segment_2,T0.Segment_3,  T5。[U_Master],T5。[U_Inguran],T5。[U_Master_Name]
 全联盟
 选择
 " ST_Canada" AS公司,
 T5。[U_Master],
 T5。[U_Master_Name],
 T5。[U_ST_Canada],
 T0.FatherNum,
 T0.FormatCode,
 T0.AcctName,
 SUM(T1.SYSCred-T1.SYSDeb)AS余额,
 T3.OcrCode,T3.OcrName,
 T4.OcrCode AS Expr1,
 T4.OcrName AS Expr2,
 T2.RefDate,
 T0.GroupMask,
 T0.Segment_1,
 T0.Segment_2,
 T0.Segment_3
 从
 ST_Canada.dbo.OACT AS T0内联接
 ST_Canada.dbo.JDT1 AS T1在T0.AcctCode = T1.Account INNER JOIN
 ST_Canada.dbo.OJDT AS T2上T1.TransId = T2.TransId左外联接
 ST_Canada.dbo.OOCR AS T3在T1.ProfitCode = T3.OcrCode左外部联接
 ST_Canada.dbo.OOCR AS T4在T1.OcrCode2 = T4.OcrCode左外部联接
 ST_Canada.dbo。[@ A_GL_MAPPING] T5打开T5。[U_ST_Canada] = T0.FatherNum
 在(T0.GroupMask IN(8,7,6,6,5))和(T1.Debit <> T1.Credit)中
 GROUP BY T0.GroupMask,T0.FatherNum,T0.AcctName,T0.FormatCode,T3.OcrCode,T3.OcrName,T4.OcrCode,T4.OcrName,T2.RefDate,T0.Segment_1,T0.Segment_2,T0.Segment_3,  T5。[U_Master],T5。[U_ST_Canada],T5。[U_Master_Name]
 )
 选择
 Compny.Company,
 DataT。[U_Master],
 DataT。[U_Master_Name],
 DataT。[U_Inguran],
 DataT.FatherNum,
 DataT.FormatCode,
 DataT.AcctName,
 DataT.Balance,
 DataT.OcrCode,
 DataT.OcrName,
 DataT.OcrCode AS Expr1,
 DataT.OcrName AS Expr2,
 Compny.DateValue RefDate,
 DataT.GroupMask,
 DataT.Segment_1,
 DataT.Segment_2,
 DataT.Segment_3
 从
 康尼
 左联接DataT ON Compny.Company = DataT.Company AND Compny.DateValue = DataT.RefDate
 OPTION(MAXRECURSION 0)

请注意,必须将StartDate和EndDate变量保留到今年。

-阿比拉什

d56caomao
3楼-- · 2020-09-24 02:00

你好玛莉,

如果在您的sql视图中设置的数据没有" Comp B"的收入,则交叉表将不知道有" Comp B"的数据,并且也没有" Comp B"列。 Crystal Reports中的交叉表仅获取它从sql视图返回的内容,然后透视数据。

您可以尝试通过在SQL视图中添加" Comp B"的收入为" 0"的行来"愚弄"交叉表。 这就像从您的sql视图中创建一个占位符。 在合并来自多家公司的财务数字时,如果需要,可以为所有公司添加额外的行,并为所有公司添加" 0"收入。

干杯

Jimmy

三十六小时_GS
4楼-- · 2020-09-24 01:49

嗨Marli,

很抱歉,我一开始错过了"选择"。

查询是否在数据集中添加了另外两个" 0"收入行? 如果成功了,那可能是在这两行中硬编码的某些值与参数不匹配("排序"值或日期格式); 因此这些行仍然被过滤掉了。

我可以问一下"行"部分" @U_Master for Revenue"将为报表传递什么值?

而且,我只是想根据屏幕快照对日期字段中的其他行使用哪种格式进行故障排除? 如果您输入" 2018/02/01"而不是" 01/02/2018 00:00:00",对您有帮助吗?

谢谢

Jimmy

派大星 ヾ
5楼-- · 2020-09-24 01:38

Abhilash&Jimmy,

你们真棒!

非常感谢您的帮助-我知道要像我一样支持SQL的相对新手并不容易。

我用以下方法解决了这个问题,因为它同时使用了您的建议,但可能会过时了,但是它正在工作.....

使用[CompanyA]
 走
/******对象:StoredProcedure [dbo]。[yRptSP_IncomeStatementService]脚本日期:2018年3月7日下午12:00:28 ******/
 设置ANSI_NULLS ON
 走
 将QUOTED_IDENTIFIER设置为ON
 走

 更改过程[dbo]。[yRptSP_IncomeStatementService]
 -@ BegDate为datetime = '01 -01-2017',
 -@ EndDate为datetime = '01 -01-2018'
 @BegDate作为日期时间,
 @EndDate作为日期时间
 如


 开始
 -添加了SET NOCOUNT ON以防止产生额外的结果集
 -干扰SELECT语句。
 开启NOCOUNT;

 使用DataT AS
 (选择'CompanyA'AS公司,T5.U_Master,T5.U_Master_Name,T5.U_Inguran,T0.FatherNum,T0.FormatCode,T0.AcctName,SUM(T1.Credit-T1.Debit)AS余额,T3.OcrCode,T3  .OcrName,T4.OcrCode AS Expr1,T4.OcrName AS Expr2,T2.RefDate,T0.GroupMask,T0.Segment_1,T0.Segment_2,T0.Segment_3
                      来自dbo.OACT AS T0内部联接
                                    dbo.JDT1 AS T1在T0.AcctCode = T1.Account INNER JOIN
                                    dbo.OJDT AS T2在T1.TransId = T2.TransId左外部联接
                                    dbo.OOCR AS T3在T1.ProfitCode = T3.OcrCode左外部联接
                                    dbo.OOCR AS T4在T1.OcrCode2 = T4.OcrCode左外部联接
                                    dbo。[@ A_GL_MAPPING]为T5,T5.U_CompanyA = T0.FatherNum
                      在哪里(T0.GroupMask IN(8,7,6,6,5,4))
 AND(T1。借方<> T1。贷方)
 AND(T3.OcrCode ='SRVC')
 AND T2.RefDate @BegDate和@EndDate之间
                      GROUP BY T0.GroupMask,T0.FatherNum,T0.AcctName,T0.FormatCode,T3.OcrCode,T3.OcrName,T4.OcrCode,T4.OcrName,T2.RefDate,T0.Segment_1,T0.Segment_2,T0.Segment_3,  T5.U_Master,T5.U_CompanyA,T5.U_Master_Name
 
  全联盟
  选择
 " CompanyB" AS公司,
 '排序中',-T5。[U_Master],
 '排序中',-T5。[U_Master_Name],
 '排序中',-T5。[U_ST_Canada],
 '排序',-T0.FatherNum,
 '',-T0.FormatCode,
 '',-T0.AcctName,
 0,--SUM(T1.SYSCred-T1.SYSDeb)AS余额,
 '',-T3.OcrCode,
 '',-T3.OcrName,
 '',-T4.OcrCode AS Expr1,
 '',-T4.OcrName AS Expr2,
 @BegDate,-T2.RefDate,
 4,-T0.GroupMask,
 '',-T0.Segment_1,
 '',-T0.Segment_2,
 ''--T0.Segment_3
 全联盟
 选择
 " CompanyA" AS公司,
 '排序中',-T5。[U_Master],
 '排序中',-T5。[U_Master_Name],
 '排序中',-T5。[U_ST_Canada],
 '排序',-T0.FatherNum,
 '',-T0.FormatCode,
 '',-T0.AcctName,
 0,--SUM(T1.SYSCred-T1.SYSDeb)AS余额,
 '',-T3.OcrCode,
 '',-T3.OcrName,
 '',-T4.OcrCode AS Expr1,
 '',-T4.OcrName AS Expr2,
 @BegDate,-T2.RefDate,
 4,-T0.GroupMask,
 '',-T0.Segment_1,
 '',-T0.Segment_2,
 ''--T0.Segment_3

 全联盟
                     
 选择'CompanyB'AS公司,T5.U_Master,T5.U_Master_Name,T5.U_ST_Canada,T0.FatherNum,T0.FormatCode,T0.AcctName,SUM(T1.SYSCred-T1.SYSDeb)AS余额,T3.OcrCode,T3。  OcrName,T4.OcrCode AS Expr1,T4.OcrName AS Expr2,T2.RefDate,T0.GroupMask,T0.Segment_1,T0.Segment_2,
                                   T0.Segment_3
                      来自CompanyB.dbo.OACT AS T0内部联接
                                   CompanyB.dbo.JDT1 AS T1在T0.AcctCode = T1.Account INNER JOIN
                                   CompanyB.dbo.OJDT AS T2在T1.TransId = T2.TransId左外部联接
                                   CompanyB.dbo.OOCR AS T3在T1.ProfitCode = T3.OcrCode左外部联接
                                   CompanyB.dbo.OOCR AS T4在T1.OcrCode2 = T4.OcrCode左外部联接
                                   CompanyB.dbo。[@ A_GL_MAPPING] AS T5上T5.U_ComapnyB = T0.FatherNum
                      在哪里(T0.GroupMask IN(8,7,6,6,5,4))
 AND(T1。借方<> T1。贷方)
 AND T2.RefDate @BegDate和@EndDate之间
                      GROUP BY T0.GroupMask,T0.FatherNum,T0.AcctName,T0.FormatCode,T3.OcrCode,T3.OcrName,T4.OcrCode,T4.OcrName,T2.RefDate,T0.Segment_1,T0.Segment_2,T0.Segment_3,  T5.U_Master,T5.U_ST_Canada,T5.U_Master_Name)
 ,

 Comp AS
 (选择" Inguran" AS公司
     全联盟
  选择
  'ST_Canada'AS Company)
 
  SELECT Comp_1.Company,DataT_1.U_Master,DataT_1.U_Master_Name,DataT_1.U_Inguran,DataT_1.FatherNum,DataT_1.FormatCode,DataT_1.AcctName,DataT_1.Balance,DataT_1.OcrCode,DataT_1.OcrName,DataT_1.OcrCode AS Expr1,DataT_1。  AS Expr2,DataT_1.RefDate,DataT_1.GroupMask,DataT_1.Segment_1,
                 DataT_1.Segment_2,DataT_1.Segment_3
    从Comp AS Comp_1左外联接
                 DataT AS DataT_1 ON Comp_1.Company = DataT_1.Company

 结束


 
DafaDDDa
6楼-- · 2020-09-24 01:37

嗨,玛莉,

很高兴知道它对您有效。

干杯

吉米

一周热门 更多>