Crystal Reports,将子报表链接到日期组

时间:2018-10-02 23:25:57

标签: crystal-reports

我正在尝试创建一个报告,以显示我们的整体质量在一个月或一个季度(几年的时间)内随时间变化的趋势。主报告将显示在指定时间段内按月/季度分组的所有发货,子报告将显示在该月/季度输入的所有导致报废或返工的退货。

我遇到的问题是将子报表链接到主报表中的日期组。在使用不同的方法进行了几次尝试之后,我能做的最好的事情就是显示每个组页脚中date参数内的所有返回值。

这是我的第一次发布,所以我不确定需要什么其他信息来协助。请让我知道是否还有需要。

*编辑以获取其他信息

我希望子报表显示给定时间段内每个月或每个季度的数据。因此,如果报表的日期范围是1/1/2018-9/30/2018,并且数据按月分组,我希望子报表仅显示每个月组的数据。总体布局如下。

一月
出货量
返回(子报告显示一月的数据)

2月
出货量
返回值(显示2月份数据的子报表)

*第二次编辑以添加屏幕截图和更多信息

我从子报表中删除了所有参数,因为我无法使用其中的任何参数。主报表上的唯一参数是“日期范围”,提示用户输入开始和结束日期。

主报告在详细信息部分中包含发货。

下面的当前布局。如果可以解决当前问题,我将添加从子报表传递来的值,以计算每个月的质量评级,然后将其传回第二个子报表以进行汇总和图表化。

Quality Trend Layout

*对数据源和示例数据进行第三次编辑

主报告和子报告从我们公司数据库中的表中提取。

用于主报告的SQL查询。仅使用“发布”表来显示每个零件的发货数量和时间。 DelType=0正在指定客户交货。日期范围由用户输入的参数定义。

主报告

SELECT 
"Releases"."DateComplete",  
"Releases"."DelType",  
"Releases"."PartNo",  
"Releases"."Qty",  
"Releases"."JobNo",  
"Releases"."PartDesc"  

FROM   "COMPANY"."dbo"."Releases" "Releases"  

WHERE  "Releases"."DelType"=0 AND  
("Releases"."DateComplete">={ts '2018-01-01 00:00:00'} AND  
"Releases"."DateComplete"<{ts '2018-10-01 00:00:00'})  

我试图使用CustReturn.DateEnt作为主报表中Releases.DateComplete的日期时间链接(由于无法正常工作,目前未在参数上链接),并且仅选择作为客户退货的记录导致返工,报废,分类或维修。

子报表

SELECT 
"CustReturn"."DateEnt",  
"CustReturn"."CustRMANo",  
"CustReturnDet"."OrigJobNo",  
"CustReturnDet"."PartNo",  
"CustReturnDet"."QtyReturned",  
"CustReturnDet"."QtyToRework",  
"CustReturnDet"."QtyToRestock",  
"NonConformance"."Disposition",  
"NonConformance"."ReturnType",  
"CustReturn"."IssueDate",  
"NonConformance"."NonConfDate",  
"CustReturnDet"."PartDesc"  

FROM   
("COMPANY"."dbo"."CustReturn" "CustReturn" INNER JOIN "COMPANY"."dbo"."CustReturnDet" "CustReturnDet" ON "CustReturn"."CustRMANo"="CustReturnDet"."CustRMANo")    
LEFT OUTER JOIN "COMPANY"."dbo"."NonConformance" "NonConformance" ON "CustReturnDet"."NonConfNo"="NonConformance"."NonConfNo"

WHERE  ("NonConformance"."Disposition"='REPAIR' OR  
"NonConformance"."Disposition"='REWORK' OR  
"NonConformance"."Disposition"='SCRAP' OR  
"NonConformance"."Disposition"='SORT') AND  
"NonConformance"."ReturnType"='CUSTOMER'

Quality Trend Example Data

2 个答案:

答案 0 :(得分:1)

首先,我要非常感谢Digital.Aaron。非常感谢您为解决此问题提供的帮助。

您的答案与我所需要的非常接近。在将其他行添加到SQL语句后,我仍然无法获得子报表来显示任何数据,因此我尝试了一些不同的操作。我在公式字段中添加了其他语句。

主报告字段

DisplayName : Office 365 Exchange Online ServicePrincipalNames : {https://manage.protection.apps.mil, https://ps.compliance.protection.outlook.com, https://autodiscover-s.office365.us/, https://outlook.office365.us/...}

子报告字段

DATEADD("D", -1*(DATEPART("D",{Releases.DateComplete})-1),{Releases.DateComplete})

我使用这些字段作为主报表和子报表之间的链接,但仍然无法显示数据。问题是在子报表的记录选择公式中将它们彼此设置为DATEADD("D", -1*(DATEPART("D",{CustReturn.DateEnt})-1),{CustReturn.DateEnt})。我将公式命名为=

原始记录选择

DatePeriod

修改的记录选择

{@DatePeriod} = {?Pm-@DatePeriod}

一旦我进行了更改,一切都准备就绪。

再次感谢

杰夫

答案 1 :(得分:0)

因此,您似乎正在Releases.DateComplete上分组。假设与给定月份关联的所有记录的该值均相同。我们还假设Shipments的以下(简化的)示例数据:

ShipmentDate | PartNo | Qty | DateComplete
01/01/2018   | 0001   | 1   | 01/31/2018
01/05/2018   | 0031   | 10  | 01/31/2018
01/31/2018   | A314   | 4   | 01/31/2018

您的Returns数据将需要看起来像这样:

ReturnDate   | PartNo | Qty | DateComplete
01/15/2018   | 0031   | 7   | 01/31/2018

请注意,它们两个都有一个DateComplete列。

现在,在Crystal Report模板中,您将使用主报告结果集中的DateComplete字段作为子报告参数的输入。您的设计布局看起来在这里是正确的,因为您希望在组页脚中调用子报表。

编辑:因此对于给定月份中的所有记录,DateComplete看起来并不相同。没关系。我们将在主查询和子报表查询中都添加一列,该列对于给定月份中的所有记录将是相同的,然后可以用来链接这些记录。

您的主要查询将变为:

SELECT 
    Releases.DateComplete,  
    Releases.DelType,  
    Releases.PartNo,  
    Releases.Qty,  
    Releases.JobNo,  
    Releases.PartDesc,
    DatePeriod = DATEADD(DAY, -1*(DATEPART(DAY,Releases.DateComplete)-1),Releases.DateComplete) 
FROM   COMPANY.dbo.Releases Releases  
WHERE  Releases.DelType=0 
    AND (Releases.DateComplete>={ts '2018-01-01 00:00:00'} AND  Releases.DateComplete<{ts '2018-10-01 00:00:00'}) 

您的子报表查询将变为:

SELECT 
    CustReturn.DateEnt,  
    CustReturn.CustRMANo,  
    CustReturnDet.OrigJobNo,  
    CustReturnDet.PartNo,  
    CustReturnDet.QtyReturned,  
    CustReturnDet.QtyToRework,  
    CustReturnDet.QtyToRestock,  
    NonConformance.Disposition,  
    NonConformance.ReturnType,  
    CustReturn.IssueDate,  
    NonConformance.NonConfDate,  
    CustReturnDet.PartDesc,
    DatePeriod = DATEADD(DAY, -1*(DATEPART(DAY,CustReturn.DateEnt)-1),CustReturn.DateEnt)  
FROM COMPANY.dbo.CustReturn CustReturn 
INNER JOIN COMPANY.dbo.CustReturnDet CustReturnDet ON CustReturn.CustRMANo = CustReturnDet.CustRMANo    
LEFT OUTER JOIN COMPANY.dbo.NonConformance NonConformance ON CustReturnDet.NonConfNo = NonConformance.NonConfNo
WHERE  NonConformance.ReturnType='CUSTOMER'
AND (   
        NonConformance.Disposition='REPAIR' 
        OR NonConformance.Disposition='REWORK' 
        OR NonConformance.Disposition='SCRAP' 
        OR NonConformance.Disposition='SORT'
    ) 

DatePeriod将始终是该月第一天的日期。现在,我们可以将其用作主报表和子报表之间的链接字段。您也可以考虑将此字段设置为您要分组的字段,而不是月份值。