
## 实现原理
1.通过BeforeDoOperation事件捕获选单操作,将已选的单据传入e.Option对象。
2.目标单列表插件通过重写AfterCreateSqlBuilderParameter事件,处理e.sqlBuilderParameter对象的查询筛选条件。本方案主要是添加ExtJoinTable和增加where条件的形式实现已选数据去重。
## 参考插件(Python)
### 插件一:注册于缺料分析单表单插件属性
```python
import clr
clr.AddReference('System')
from System.Collections.Generic import List
from System import Int64
def BeforeDoOperation(e):
if e.Operation.FormOperation.Operation == "Draw":
prdIds=List[Int64]()
subreqIds=List[Int64]()
for entry in this.Model.DataObject["Entity"]:
if entry['RowType']<>'0':
continue
if entry['SelOrderType']=='A' and entry['MoEntryId']>0:
prdIds.Add(entry['MoEntryId'])
elif entry['SelOrderType']=='B' and entry['MoEntryId']>0:
subreqIds.Add(entry['MoEntryId'])
if subreqIds.Count>0:
e.Option.SetVariableValue('subreqIds',subreqIds)
if prdIds.Count>0:
e.Option.SetVariableValue("prdIds",prdIds)
```
### 插件二:注册于生产订单列表
```python
import clr
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS')
clr.AddReference('System.Core')
from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter
from Kingdee.BOS.Core.SqlBuilder import ExtJoinTableDescription
from Kingdee.BOS.Util import StringUtils
from Kingdee.BOS import SqlParam
from Kingdee.BOS import KDDbType
from System.Collections.Generic import List
from System.Linq import Enumerable
def AfterCreateSqlBuilderParameter(e):
if this.View.ParentFormView is None:
return
if this.View.ParentFormView.Session is None:
return
if this.View.ParentFormView.Session.ContainsKey('_DrawOperationOption_')==False:
return
option = this.View.ParentFormView.Session["_DrawOperationOption_"]
if option is None:
return
if option.ContainsVariable('prdIds')==False:
return
existIds = option.GetVariables()['prdIds']
extd= ExtJoinTableDescription()
extd.FieldName = "FID"
extd.TableName = StringUtils.GetSqlWithCardinality(existIds.Count, "@eids", 1)
extd.TableNameAs = "tls"
extd.ScourceKey = "FTreeEntity_FENTRYID"
extd.JoinOption = QueryBuilderParemeter.JoinOption.LeftJoin
e.sqlBuilderParameter.ExtJoinTables.Add(extd)
e.sqlBuilderParameter.SqlParams.Add(SqlParam("@eids", KDDbType.udt_inttable, existIds.ToArray()))
if e.sqlBuilderParameter.FilterClauseWihtKey is not None and e.sqlBuilderParameter.FilterClauseWihtKey.Length>0:
e.sqlBuilderParameter.FilterClauseWihtKey +=" And tls.FID is NULL"
else:
e.sqlBuilderParameter.FilterClauseWihtKey =" tls.FID is NULL"
```
## 注册到委外订单的列表插件
```python
import clr
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS')
clr.AddReference('System.Core')
from Kingdee.BOS.Core.SqlBuilder import QueryBuilderParemeter
from Kingdee.BOS.Core.SqlBuilder import ExtJoinTableDescription
from Kingdee.BOS.Util import StringUtils
from Kingdee.BOS import SqlParam
from Kingdee.BOS import KDDbType
from System.Collections.Generic import List
from System.Linq import Enumerable
def AfterCreateSqlBuilderParameter(e):
if this.View.ParentFormView is None:
return
if this.View.ParentFormView.Session is None:
return
if this.View.ParentFormView.Session.ContainsKey('_DrawOperationOption_')==False:
return
option = this.View.ParentFormView.Session["_DrawOperationOption_"]
if option is None:
return
if option.ContainsVariable('subreqIds')==False:
return
existIds = option.GetVariables()['subreqIds']
extd= ExtJoinTableDescription()
extd.FieldName = "FID"
extd.TableName = StringUtils.GetSqlWithCardinality(existIds.Count, "@eids", 1)
extd.TableNameAs = "tls"
extd.ScourceKey = "FTreeEntity_FENTRYID"
extd.JoinOption = QueryBuilderParemeter.JoinOption.LeftJoin
e.sqlBuilderParameter.ExtJoinTables.Add(extd)
e.sqlBuilderParameter.SqlParams.Add(SqlParam("@eids", KDDbType.udt_inttable, existIds.ToArray()))
if e.sqlBuilderParameter.FilterClauseWihtKey is not None and e.sqlBuilderParameter.FilterClauseWihtKey.Length>0:
e.sqlBuilderParameter.FilterClauseWihtKey +=" And tls.FID is NULL"
else:
e.sqlBuilderParameter.FilterClauseWihtKey =" tls.FID is NULL"
```