Python开发简单账表原创
金蝶云社区-CQ周玉立
CQ周玉立
31人赞赏了该文章 5295次浏览 未经作者许可,禁止转载编辑于2022年07月14日 17:07:47

对于公有云发布.NET插件不方便,用Python脚本开发简单账表服务插件,以便快速开发,快速迭代。

简单账表开发教程可参考:https://vip.kingdee.com/article/1094

简单总结一下,需要用代码拼接SQL拼接来构建报表数据源时,就需要用到用简单账表,对于常用场景,对报表不做其他复杂设置的情况下,简单账表的开发一般就是以下几个步骤就OK。

1.新建->空白对象->简单账表。

2.如果需要的话:添加表头字段。添加报表字段(通常都是在取数服务插件中构建,可以不做)

3.新建过滤界面继承->BOS->应用框架->动态表单->公共过滤

4.开发取数服务插件,看后面的Python脚本参考代码。核心的报表逻辑都在这一步。

5.权限配置。


分享一下如何用Python脚本开发简单账表的取数服务插件。老版本可能不支持,我开发的版本是[V7.6.0.202103],也是比较旧的版本了,高于此版本的环境应该都是可以的。

复制代码,可下载附件

import clr
clr.AddReference("System")
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
clr.AddReference("Kingdee.BOS.DataEntity")
clr.AddReference("Kingdee.BOS.App")
clr.AddReference("Kingdee.BOS.Contracts")
clr.AddReference("Kingdee.BOS.ServiceHelper")
from Kingdee.BOS import*
from Kingdee.BOS.Contracts import*
from Kingdee.BOS.Contracts.Report import*
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Metadata import *
from Kingdee.BOS.Core.Report import*
from Kingdee.BOS.Core.SqlBuilder import*
from Kingdee.BOS.App.Data import*
from Kingdee.BOS.Orm.DataEntity import*
from System import*
from System.ComponentModel import*
from System.Collections.Generic import*
from System.Text import*
from System.Threading.Tasks import*
from Kingdee.BOS.ServiceHelper import *
#初始化
def Initialize():
	this.ReportProperty.ReportType=ReportType.REPORTTYPE_NORMAL;
	this.IsCreateTempTableByPlugin=True;
	this.ReportProperty.IsGroupSummary=True;
#设置标题
def GetReportTitles(Filter):
	reportTitles=ReportTitles();
	#customFiler=Filter.FilterParameter.CustomFilter;
	return reportTitles;
	
#设置单据列
def GetReportHeaders(Filter):
	header=ReportHeader();
	localEid=this.Context.UserLocale.LCID;
	header.AddChild("FNumber",LocaleValue("员工编号",localEid));
	header.AddChild("FID",LocaleValue("员工ID",localEid));
	return header;
#创建临时报表
def BuilderReportSqlAndTempTable(rptfilter,tableName):
	custFilter = rptfilter.FilterParameter.CustomFilter;
	whereFempId="";
	if(custFilter<>None):
		empObj=custFilter["F_ora_EmpId"];
		if(empObj<>None):
			whereFempId=(" and FID={0} ").format(empObj["Id"]);
	##!!!!! FIDENTITYID 一定要从1开始,不然前台显示没数据!!!!
	sql=("""/*dialect*/ 
SELECT FIDENTITYID=row_NUMBer() over(order by t1.FID ASC),t1.*
	INTO {0} 
FROM (
	select FNumber,FID from T_HR_EMPINFO  where 1=1 {1}
) t1 
	""").format(tableName,whereFempId);
	DBServiceHelper.Execute(this.Context,sql);

#关闭清空临时表
def CloseReport():
	this.DropTempTable();


赞 31