摘要

这个设计模式解释了如何通过queries来实现Select Distinct功能。 


说明

当我们操作表的时候,开发者往往需要实现Select Distinct(或者Select Unique)功能。因为NAV不提供这样的机能,所以我们通过Queries来去除重复的数据。

 

陈述问题

让我审视一下VAT Entry表

NAV开发模式之SELECT DISTINCT with Queries_设计模式


 

我们的目的是把每个分开的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. 

NAV开发模式之SELECT DISTINCT with Queries_设计模式_02


为了实现分组计算,添加一个栏位Method Type设置成Totals,这个字段添加之后会自动在上面三个字段的group by上打上勾。

请注意,group by字段是只读的,如果想要尝试修改回报下面的错误。

NAV开发模式之SELECT DISTINCT with Queries_NAV_03


运行这个query会为每个document生成一个record。你可以发现在下面的例子中的第二行中,SalesInvoice 103001有两个VAT Entries,但是在Query中只有一行数据。

NAV开发模式之SELECT DISTINCT with Queries_NAV_04

 

举个例子

有一件事情请注意一下:从这些Query中能取得多少信息有一个限制。比方说,如果我们想抽出更多栏位的数据,我们就需要添加一个Method Type = None的栏位。但是会对现有的grouping产生影响。


影响现有的Grouping

如果我们添加的栏位是VAT Entry No。在这个例子中,VAT Entry No.会自动变成Group By。

NAV开发模式之SELECT DISTINCT with Queries_设计模式_05


你可以注意到document 103001可以看到两行,但是这就和Select Distinct的原则相违背。

NAV开发模式之SELECT DISTINCT with Queries_设计模式_06


 

不影响现有的Grouping

如果我们添加了一个Posting Date就不行改变现有的Grouping,因为同一个Document只有一个,所以对原有的group并没有产生影响。

NAV开发模式之SELECT DISTINCT with Queries_NAV_07


下图就是添加了Posting date的效果。

NAV开发模式之SELECT DISTINCT with Queries_设计模式_08


 不影响现有的Grouping

添加一个Method Type=Totals的栏位也不会影响现有的grouping,但是只会对Decimal的栏位产生效果。


NAV的例子

Query 19:VAT Entries Base Amt.Sum

NAV开发模式之SELECT DISTINCT with Queries_NAV_09


-------------------------------------------------------------------------------------------

原文地址

http://blogs.msdn.com/b/nav/archive/2015/03/02/application-design-pattern-select-distinct-with-queries.aspx


nutcraker点评

这个设计模式实在有点水,后面一部分都是常识,写过SQL语句的都知道。