在Crystal报表中,您可以为报表参数定义默认值。
例如,我可能有一个日期范围,并设置默认开始时间为12/01/2008,默认结束时间为12/31/2008。
是否可以在运行时修改这些默认值?例如:
1 - 默认为当月的第一天和最后一天?
2 - 默认为专有公司财务日历的第一天和最后一天? (即在数据库中查找)
3 - First&今年的最后几天?
你明白了。这可能吗?我甚至愿意接受一个解决方案,该解决方案涉及运行外部应用程序以访问报告并修改它们,如果有人知道如何做到这一点。
编辑:
要回答Philippe Grondier提出的问题,大多数报告都是从应用程序内部运行的。我希望能比在运行时操作水晶对象更简单;我现在已经完全掌握了该API的其他部分。不过,我可能会看一看。
答案 0 :(得分:1)
您是打算从水晶报表界面运行水晶报表还是作为另一个程序中嵌入的加载项运行(例如,您可以在VB代码中使用Crystal Reports ActiveX Designer运行时支持 - craxdrt.dll)?在最后一种情况下,可以在启动报表之前操纵报表的每个对象。然后可以根据您的需要更新参数等对象。
作为此类运行时更新的简单示例,我的报告打印例程将始终检查报告中是否存在名为“printedBy”的字段。如果找到此字段,其值将结算为请求报告的用户的域名,并将打印出来。
在更高级别,您甚至可以重新整形报告SQL字符串,以添加可从您的代码继承的特定过滤器。通过这样做,您甚至可能不再需要参数:让您的代码“动态”添加过滤值
编辑:一些代码示例:
(m_rapport是一个CRAXDRT.report对象,ActiveSession是我当前的会话对象)
If m_rapport.ParameterFields.Count > 0 Then
For i = 1 To m_rapport.ParameterFields.Count
If m_rapport.ParameterFields(i).Name = "{?PUB_DateDebutPeriode}" Then
m_rapport.ParameterFields(i).AddCurrentValue CDate(DateValue(sessionActive.dateDebutPeriode))
End If
If m_rapport.ParameterFields(i).Name = "{?PUB_DateFinPeriode}" Then
m_rapport.ParameterFields(i).AddCurrentValue CDate(DateValue(sessionActive.dateFinPeriode))
End If
If m_rapport.ParameterFields(i).Name = "{?PUB_id_Personne}" Then
m_rapport.ParameterFields(i).AddCurrentValue StringFromGUID(clientActif.id_Personne)
End If
Next i
Endif
我还有另一个函数可以在运行时更改报表的数据源,以便报表可以在不同的服务器/位置上执行。
答案 1 :(得分:1)
阅读我的帖子Crystal Reports: Named-Date-Range Parameters。也许你可以将这种技术用于你的目的。