Crystal 报表,Link 子报表截止日期组

Crystal Reports, Link Subreport To Date Group

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

我遇到的问题是 link 将子报告添加到主报告中的日期组。经过多次尝试使用不同的方法,我能做的最好的就是在每个组页脚的日期参数中显示所有 returns。

这是我第一次发帖,所以我不确定需要哪些额外信息来提供帮助。如果还需要,请告诉我。

*编辑以获取更多信息

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

一月
出货量
Returns(显示 1 月份数据的子报表)

二月
出货量
Returns(显示 2 月份数据的子报表)

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

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

主报告在详细信息部分有发货量。

当前布局如下。如果我能解决当前的这个问题,我将添加从子报表传递过来的值以计算每个月的质量评级,然后将它们传递回第二个子报表以进行总结和绘制图表。

Quality Trend Layout

*数据源和示例数据的第三次编辑

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

SQL 用于主报告的查询。只有 "Releases" table 用于显示每个零件的发货数量和时间。 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 作为 link 到 Releases.DateComplete 的日期时间(目前没有在参数中 linked,因为它没有工作),并且只有 select 条客户记录 returns 导致返工、报废、分类或维修。

子报表

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

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

编辑:所以看起来 DateComplete 对于给定月份的所有记录都不相同。没关系。我们将向主查询和子报表查询添加一个列,该列对于给定月份的所有记录都是相同的,然后我们可以将其用于 link 记录。

您的主要查询将变为:

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 将始终是该月第一天的日期。现在我们可以将其用作主报表和子报表之间的 Link 字段。您还可以考虑将其作为您分组的字段,而不是月份值。

首先,我要非常感谢Digital.Aaron。非常感谢您帮助解决这个问题。

您的回答非常接近我的需要。在 SQL 语句中添加额外的行后,我仍然无法让子报表显示任何数据,所以我尝试了一些不同的东西。我将附加语句添加到公式字段中。

主要报表字段

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

子报表字段

DATEADD("D", -1*(DATEPART("D",{CustReturn.DateEnt})-1),{CustReturn.DateEnt})

我将这些字段用作主报表和子报表之间的 link,但仍然无法显示数据。问题原来是在子报表的记录 select 公式中将它们设置为彼此 =。我将公式命名为 DatePeriod

原始记录Select

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

修改记录Select

{@DatePeriod} in Date({?Pm-@DatePeriod})

一旦我做出改变,一切就都准备就绪了。

再次感谢,

杰夫