摘要
这个设计模式解释了如何通过queries来实现Select Distinct功能。
说明
当我们操作表的时候,开发者往往需要实现Select Distinct(或者Select Unique)功能。因为NAV不提供这样的机能,所以我们通过Queries来去除重复的数据。
陈述问题
让我审视一下VAT Entry表
我们的目的是把每个分开的document产生的VAT Entries,分别合并成一条数据。换句话说我们想把数据按照Type和Document Type 和 Document No.分组。如果有多条数据但是他们的Type和Document Type 和 Document No.的值是一样的话,我们只想看到一条数据。
解决方案
创建一个query object取名VAT Entry Distinct Document No.。添加一个source table为VAT Entery的DataItem。添加三个准备group-by的字段分别是 Type和Document Type和Document No.
为了实现分组计算,添加一个栏位Method Type设置成Totals,这个字段添加之后会自动在上面三个字段的group by上打上勾。
请注意,group by字段是只读的,如果想要尝试修改回报下面的错误。
运行这个query会为每个document生成一个record。你可以发现在下面的例子中的第二行中,SalesInvoice 103001有两个VAT Entries,但是在Query中只有一行数据。
举个例子
有一件事情请注意一下:从这些Query中能取得多少信息有一个限制。比方说,如果我们想抽出更多栏位的数据,我们就需要添加一个Method Type = None的栏位。但是会对现有的grouping产生影响。
影响现有的Grouping
如果我们添加的栏位是VAT Entry No。在这个例子中,VAT Entry No.会自动变成Group By。
你可以注意到document 103001可以看到两行,但是这就和Select Distinct的原则相违背。
不影响现有的Grouping
如果我们添加了一个Posting Date就不行改变现有的Grouping,因为同一个Document只有一个,所以对原有的group并没有产生影响。
下图就是添加了Posting date的效果。
不影响现有的Grouping
添加一个Method Type=Totals的栏位也不会影响现有的grouping,但是只会对Decimal的栏位产生效果。
NAV的例子
Query 19:VAT Entries Base Amt.Sum
-------------------------------------------------------------------------------------------
原文地址
nutcraker点评
这个设计模式实在有点水,后面一部分都是常识,写过SQL语句的都知道。