
# 部署操作
## 第一步 新建一个树形账表

## 第二步 新建一个过滤框

## 第三步 修改过滤窗口标识

## 第四步 部署插件

# python 插件代码
``` python
#作者: 老李头(Dean)
import clr
clr.AddReference("System")
clr.AddReference("System.Core")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.Contracts")
clr.AddReference("Kingdee.BOS.DataEntity")
#引入命名空间
from Kingdee.BOS import *
from Kingdee.BOS.App import *
from Kingdee.BOS.App.Data import *
from Kingdee.BOS.Core.Enums import *
from Kingdee.BOS.Contracts import *
from Kingdee.BOS.Contracts.Report import *
from Kingdee.BOS.Core.Report.PlugIn import *
from Kingdee.BOS.Core.Report import *
from Kingdee.BOS.Orm.DataEntity import *
from Kingdee.BOS.Util import *
from System import *
from System.Collections.Generic import *
#import datetime
#全局变量
global sBillDataTempTable;
sBillDataTempTable = "";
global _dtDateFrom; #存放开始日期数据
global _dtDateTo;#存放结束日期数据
def Initialize():
#账表类型
this.ReportProperty.ReportType = ReportType.REPORTTYPE_TREE;
this.ReportProperty.ReportName = LocaleValue("老李头的树形账表示例Python", this.Context.UserLocale.LCID);
#支持分组汇总
this.ReportProperty.IsGroupSummary = True;
this.ReportProperty.IsUIDesignerColumns = False;
#默认分组依据,此依据不支持动态级次分组,如果没有设置过滤方案分组,就默认以此条件分组
this.ReportProperty.GroupSummaryInfoData.DefaultGroupbyString = "单据号";
#获取过滤条件 用于数据源过滤
def GetFilter(filter):
dyFilter = filter.FilterParameter.CustomFilter;
global _dtDateFrom;
global _dtDateTo;
#global _matter;
#获取过滤框里的数据
_dtDateFrom = GetDataByKey(dyFilter, "FBeginDate").ToString() if GetDataByKey(dyFilter, "FBeginDate") != "" else "";
_dtDateTo = GetDataByKey(dyFilter, "FEndDate").ToString() if GetDataByKey(dyFilter, "FEndDate") != "" else "";
return dyFilter;
#构造取数Sql,取数据填充到临时表:tableName
def BuilderReportSqlAndTempTable(filter,tableName):
dyFilter = GetFilter(filter);
global sBillDataTempTable
sBillDataTempTable = tableName;
#创建【动态构建列存储过程】数据临时表
sql = "";
#数据源设置 使用存储过程后期可以不需要修改代码直接修改存储过程实现动态列展示
#使用SQL语句获取数据
sql =("""/*dialect*/SELECT T1.FBILLNO 单据号,T5.FNAME AS 单据类型 ,T2.FQTY 数量 ,T3.FNUMBER 物料代码 ,T4.FNAME 物料名称 ,T4.FDESCRIPTION 描述 ,ROW_NUMBER() OVER(ORDER BY T1.FID,T2.FENTRYID) FIDENTITYID into {0}
FROM T_PUR_POORDER t1
INNER JOIN T_PUR_POORDERentry t2 ON T2.FID=T1.FID
INNER JOIN T_BD_MATERIAL T3 ON T3.FMATERIALID=T2.FMATERIALID
INNER JOIN T_BD_MATERIAL_L T4 ON T4.FMATERIALID=T3.FMASTERID
INNER JOIN T_BAS_BILLTYPE_L T5 ON T5.FBILLTYPEID=t1.FBILLTYPEID AND T5.FLOCALEID={3}
WHERE 1=1
AND 1 = CASE WHEN ISNULL('{1}','') = '' THEN 1 ELSE CASE WHEN ISNULL(T1.FDATE,'') >= '{1}' THEN 1 ELSE 0 END END
AND 1 = CASE WHEN ISNULL('{2}','') = '' THEN 1 ELSE CASE WHEN ISNULL(T1.FDATE,'') <= '{2}' THEN 1 ELSE 0 END END
""").format(sBillDataTempTable,_dtDateFrom,_dtDateTo, this.Context.LogLocale.LCID);
#树形账表节点值
if filter.CurrentGroupID is not None and filter.CurrentGroupID.ToString() != "0" and filter.CurrentGroupID.ToString() != "-1":
sql = sql + " AND T1.FBILLTYPEID ='{0}' ".format(filter.CurrentGroupID.ToString());
DBUtils.ExecuteDynamicObject(this.Context, sql);
SetDataToRptTable(filter);
#设置树形节点
def GetTreeNodes(e):
nodeList = List[TreeNode]();
SQL = """ SELECT t1.FBILLTYPEID,t2.FNAME
FROM T_BAS_BILLTYPE t1
INNER JOIN T_BAS_BILLTYPE_L t2 ON t2.FBILLTYPEID=t1.FBILLTYPEID AND t2.FLOCALEID={0}
WHERE FBILLFORMID='PUR_PurchaseOrder'""".format(this.Context.LogLocale.LCID);
OBJs = DBUtils.ExecuteDynamicObject(this.Context, SQL);
if OBJs is not None:
for item in OBJs:
node = TreeNode();
node.id = item["FBILLTYPEID"].ToString();