有几种方法可以做到这一点。最简单的方法是在存储过程中执行此操作并仅测试是否已设置会计期间,如果已设置,则使用,如果不使用日期范围,但对用户而言可能不直观,因为他们可以选择会计期间和日期范围,而没有意识到日期范围将被忽略。
最优雅的解决方案是根据会计期间设置开始和结束日期,并在会计期间列表中添加另一个条目,称为“日期范围”或“任何”等。
这假设您可以查找或计算每个会计期间的开始日期和结束日期。在这个例子中为了简单起见,我们假设您有一个表格(比如myAccPeriodTable),其中包含期间和日期范围,如下所示..
AccPeriodID AccPeriod StartDate EndDate
1 2017-Q1 2017-01-01 2017-03-31
2 2017=Q2 2017-04-01 2017-06-30
3 2017=Q3 2017-07-01 2017-09-30
etc...
使用以下查询创建一个数据集(我们称之为dsAccPeriods)
SELECT AccPeriodID, AccPeriod FROM myAccPeriodTable
UNION SELECT -1, 'Use Date range'
ORDER BY StartDate
您的会计期间参数(假设这称为@AccPeriodID)Available Values 将来自查询并指向dsAccPeriods
Value 将是 AccPeriodID 字段,Label 字段将是 AccPeriod
现在再创建两个数据集,例如 dsDefaultStartDate 和 dsDefaultEndDate,分别使用以下查询。
SELECT ISNULL(StartDate, 1999-01-01) AS StartDate From myAccPeriodTable WHERE AccPeriodID = @AccPeriodID
和
SELECT ISNULL(EndDate, 2020-12-31) AS EndDate From myAccPeriodTable WHERE AccPeriodID = @AccPeriodID
对于您的 'StartDate' 参数(假设它称为 @StartDate),Default Value 将简单地指向 dsDefaultStartDate 数据集,并通过 @EndDate 指向 dsDefaultEndDate 执行相同的操作。
现在,当用户选择开始日期时,应使用正确的日期填充两个数据参数,以便您的存储过程可以简单地根据 @StartDate 和 @EndDate 参数进行过滤。如果用户选择use Date Range 选项,则默认日期将设置为您在dsDefaultStartDate 和dsDefaultEndDate 数据集中指定的任何日期。
当然,用户有可能选择一个真实的会计期间,然后更改日期范围。您可以采取一些措施来避免这种情况,但一步一步来!
我没有测试任何东西就写了这个答案,所以可能会有一些错误,但希望它能为你指明正确的方向。如果您有任何问题,请发表评论。