Python插件 - 动态 简单账表 通过SQL存储过程输出列实现动态展示

news2024/11/26 0:24:51

第一步 新建一个简单账表加上表头标签

在这里插入图片描述

第二步 新建一个过滤框

在这里插入图片描述

第三步 修改过滤窗口标识

在这里插入图片描述

第四步 注册插件

在这里插入图片描述

python代码实现

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.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 *
#import datetime
#全局变量
global sBillDataTempTable;
sBillDataTempTable = "";
global _dtDateFrom; #存放开始日期数据
global _dtDateTo;#存放结束日期数据
global _matter;#存放物料标识数据

def Initialize():
   this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL;
   this.ReportProperty.ReportName = LocaleValue("老李头的简单报表示例Python", this.Context.UserLocale.LCID);
   this.ReportProperty.IsGroupSummary = True;
   this.ReportProperty.IsUIDesignerColumns = False;

#获取过滤条件  用于数据源过滤
def GetFilter(filter):
  dyFilter = filter.FilterParameter.CustomFilter;
  global _dtDateFrom;
  global _dtDateTo;
  global _matter;
  #获取过滤框里的数据
  #GetBaseDataByKey 单选基础资料取值
  #GetMulBaseDataByKey 多选基础资料
  #GetDataByKey 文本,日期 取值
  _dtDateFrom = GetDataByKey(dyFilter, "FBeginDate").ToString() if GetDataByKey(dyFilter, "FBeginDate") != "" else "";
  _dtDateTo = GetDataByKey(dyFilter, "FEndDate").ToString() if GetDataByKey(dyFilter, "FEndDate") != ""  else "";
  _matter = GetBaseDataByKey(dyFilter,"F_MATTER","Id") if GetBaseDataByKey(dyFilter,"F_MATTER","Id") != ""  else "";
  return dyFilter;

#构造取数Sql,取数据填充到临时表:tableName
def BuilderReportSqlAndTempTable(filter,tableName):
  dyFilter = GetFilter(filter);
  global sBillDataTempTable
  sBillDataTempTable = tableName;
  CreatBillDataTempTable();
  SetDataToRptTable(filter);
 
#创建【动态构建列存储过程】数据临时表
def CreatBillDataTempTable():
  sql = "";
  #数据源设置 使用存储过程后期可以不需要修改代码直接修改存储过程实现动态列展示
  #使用存储过程获取数据参数:临时表名称,开始时间,结束时间,物料标识
  sql =("/*dialect*/ EXEC MindeeSimpleTable '{0}','{1}','{2}','{3}'").format(sBillDataTempTable,_dtDateFrom,_dtDateTo,_matter); 
  #使用SQL语句获取数据
  #sql =("""/*dialect*/SELECT T1.FBILLNO 单据号 ,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 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);
  DBUtils.ExecuteDynamicObject(this.Context, sql);

#动态构建列
def GetReportHeaders(filter):
  header = ReportHeader();
  localEid=this.Context.UserLocale.LCID; 
  sql = ("""SELECT T1.system_type_id as FDateTypeId , t3.name AS FDateType,t1.name AS FName FROM sys.columns t1   INNER JOIN sys.objects t2 ON t2.object_id = t1.object_id INNER JOIN sys.types t3 ON t3.user_type_id=t1.user_type_id  WHERE t2.name='{0}' AND  t2.type='u' """).format(sBillDataTempTable);
  RecordData = DBUtils.ExecuteDynamicObject(this.Context, sql);
  for item in RecordData:
    #隐藏不显示这个字段 FIDENTITYID
    #不知为什么报表格式会显示格式是  FIDENTITYID,FIDENTITYID (求解答)
    if item["FName"].ToString() == str("FIDENTITYID"):
      continue
    header.AddChild(item["FName"].ToString(),LocaleValue(item["FName"].ToString(), localEid), GetEnumByValue(SqlStorageType,item["FDateTypeId"].ToString()), True);
  return header;

#设置报表头
def GetReportTitles(filter):
  titles = ReportTitles();
  #把过滤框的日期放到报表头
  titles.AddTitle("FBeginDate", str(filter.FilterParameter.CustomFilter["FBeginDate"]));
  titles.AddTitle("FEndDate", str(filter.FilterParameter.CustomFilter["FEndDate"]));
  return titles;

#展示数据表到前台
def SetDataToRptTable(filter):
  sqlstr=("SELECT * FROM {0}").format(sBillDataTempTable);
  sqlstr2=("SELECT COUNT(*) AS Frow FROM sys.objects WHERE name='{0}' AND type='u'").format(sBillDataTempTable);
  ROWS = DBUtils.ExecuteDynamicObject(this.Context,sqlstr2);
  if str(ROWS[0]["Frow"]) != "0":
     DBUtils.Execute(this.Context, sqlstr); 

#获取DynamicObject数据包中指定key的值
def GetDataByKey(doFilter, sKey):
  sReturnValue = "";
  if doFilter is not None and doFilter[sKey] is not None and len(str(doFilter[sKey])) > 0:
    sReturnValue = doFilter[sKey].ToString();
  return sReturnValue;

#获取DynamicObject数据包中指定key的基础资料的指定属性的值
def GetBaseDataByKey(doFilter,sKey,sItem):
  sReturnValue="";
  if doFilter is not None and doFilter[sKey] is not None and len(str(doFilter[sKey])) > 0:
    doTemp = doFilter[sKey];
    sReturnValue = doTemp[sItem].ToString();
  return sReturnValue;

#枚举操作
def GetEnumByValue(enumType,value):
  return Enum.Parse(enumType, value);

SQLSERVER 存储过程

-- =============================================
-- Author:		敏蝶老李头
-- Create date: 2023-04-11
-- Description:	简单报表演示
-- =============================================
ALTER PROCEDURE [dbo].[MindeeSimpleTable]
	-- Add the parameters for the stored procedure here
	@TableName varchar(50),
	@FBeginDate varchar(50),
	@FEndDate varchar(50),
	@Matter int
AS
BEGIN 

	SELECT T1.FBILLNO 单据号 ,T2.FQTY 数量 ,T3.FNUMBER 物料代码  ,T4.FNAME 物料名称 ,T4.FDESCRIPTION 描述  
	,ROW_NUMBER() OVER(ORDER BY T1.FID,T2.FENTRYID)  FIDENTITYID 
	INTO #DATA 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 
	WHERE 1=1 
	AND 1 = CASE WHEN ISNULL(@FBeginDate,'') = '' THEN 1 ELSE CASE WHEN ISNULL(T1.FDATE,'')  >=  @FBeginDate THEN 1 ELSE 0 END END 
	AND 1 = CASE WHEN ISNULL(@FEndDate,'') = '' THEN 1 ELSE CASE WHEN ISNULL(T1.FDATE,'')  <=  @FEndDate THEN 1 ELSE 0 END END
	AND 1 = CASE WHEN ISNULL(@Matter,0) = 0 THEN 1 ELSE CASE WHEN ISNULL(T3.FMATERIALID,'')  =  @Matter THEN 1 ELSE 0 END END

	 
IF OBJECT_ID(@TableName,N'U') is  null
 BEGIN
 --不存在 新增表
 DECLARE @NEWTABLESQL VARCHAR(100)=N'SELECT * INTO '+@TableName+' FROM #DATA'
 EXEC(@NEWTABLESQL)
 END
 ELSE
 BEGIN
 --存在 删除数据表重新插入
 EXEC(N'DROP TABLE '+ @TableName+'')
 DECLARE @UPDATESQL VARCHAR(100)=N'SELECT * INTO '+@TableName+' FROM #DATA'
 EXEC(@UPDATESQL) 
 END
 SELECT * FROM #DATA

DROP TABLE #DATA
END

功能实现截图

在这里插入图片描述

***在这里插入图片描述

作者:敏蝶老李头
来源:金蝶云社区

原文链接传送门

著作权归作者所有。未经允许禁止转载,如需转载请联系作者获得授权。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1288534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

思腾云计算中心 | 5千平米超大空间,基础设施完善,提供裸金属GPU算力租赁业务

2021年&#xff0c;思腾合力全资收购包头市易慧信息科技有限公司&#xff0c;正式开启云计算业务。思腾云计算中心占地2400平米&#xff0c;位于包头市稀土高新区&#xff0c;毗邻多家知名企业&#xff0c;地理位置优越&#xff0c;交通便利&#xff0c;是区内重要的信息化产业…

数据结构实验—宿舍管理系统(C,Python,Java三种代码版本)

目录 实验课程 实验内容 数据结构类型定义 模块划分 &#xff08;C语言&#xff09;详细代码设计 &#xff08;python&#xff09;详细代码设计 &#xff08;Java&#xff09;详细代码设计 测试数据及结果 实验总结 实验课程 课程名称&#xff1a;数据结构 实验名称&…

C-11练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1,在C语言中,合法的长整型常数是(&#xff09; A. OxOL B. 4962710M C. 324562& D. 216D 2,设有定义: int a[10],*pa6,*q…

封装PoiExcelUtils

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 为什么要封装PoiExcelU…

Python实现FA萤火虫优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

基于c++版本的数据结构改-python栈和队列思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…

python+django企业物流配送管理系统a3t2w

本物流管理系统采用python技术&#xff0c;Mysql数据库开发&#xff0c;充分保证了系统稳定性、完整性。 物流管理系统的设计与实现的设计思想如下&#xff1a; 1、操作简单方便、系统界面安全良、简单明了的页面布局、方便查询物流管理系统相关信息。 2、即时可见&#xff1…

Ubuntu18.04 本地安装CVAT标注工具

写在前面&#xff1a; 1、如果直接clone最新版本的cvat&#xff0c;python版本最好安装3.8的&#xff0c;因为其中部分代码的语法只有高版本的python才可以支持。 2、安装完成以后本地登陆可能出现"cannot connect to cvat server"的错误&#xff0c;可以从Cannot …

全面解决Error: Uncaught SyntaxError: Invalid Unicode escape sequence

是因为.js文件中的路径转义&#xff08;\&#xff09;错误&#xff0c;可能是windows内的相对路径放到linux中有问题 直接看图&#xff1a; (上面是修改后的&#xff0c;下面的则是原来的) 解决方式&#xff1a; 先在报错浏览器按f12打开调试&#xff0c;选择console窗口查看…

c++函数模板STL详解

函数模板 函数模板语法 所谓函数模板&#xff0c;实际上是建立一个通用函数&#xff0c;其函数类型和形参类型不具体指定&#xff0c;用一个虚拟的类型来代表。这个通用函数就称为函数模板。 凡是函数体相同的函数都可以用这个模板来代替&#xff0c;不必定义多个函数&#xf…

pre标签展示代码块

pre样式 添加背景色、边框、以及调整了字体大小。 pre { border: 1px solid #999; page-break-inside: avoid; display: block; padding: 3px 3px 2px; margin: 0 0 10px; font-size: 13px; line-height: 20px; word-break: break-all; word-wrap: break-word; /* white-space:…

​HTML代码混淆技术:原理、应用和实现方法详解

​HTML代码混淆技术&#xff1a;原理、应用和实现方法详解 HTML代码混淆是一种常用的反爬虫技术&#xff0c;它可以有效地防止爬虫对网站数据的抓取。本文将详细介绍HTML代码混淆技术的原理、应用以及实现方法&#xff0c;帮助大家更好地了解和运用这一技术。 一、HTML代码混淆…

C++ 指针进阶

目录 一、字符指针 二、指针数组 三、数组指针 数组指针的定义 &数组名 与 数组名 数组指针的使用 四、数组参数 一维数组传参 二维数组传参 五、指针参数 一级指针传参 二级指针传参 六、函数指针 七、函数指针数组 八、指向函数指针数组的指针 九、回调函…

stm32项目(11)——基于stm32的俄罗斯方块游戏机

1.功能设计 使用stm32f103zet6平台&#xff0c;以及一块LCD屏幕&#xff0c;实现了一个俄罗斯方块游戏机。可以用按键调整方块的位置、还可以控制方块下降的速度&#xff01; 2.视频演示 俄罗斯方块 3.俄罗斯方块发展史 俄罗斯方块是一种经典的拼图游戏&#xff0c;由苏联俄罗…

隧道施工废水工艺设备需要哪些

隧道施工废水工艺设备是保障隧道施工过程中废水处理的关键装备。它们能够有效处理施工废水中的悬浮物、悬浮油、重金属等污染物&#xff0c;确保废水排放符合相关环保标准。以下是隧道施工废水工艺设备常见的几种类型&#xff1a; 1. 隧道施工废水沉淀池&#xff1a;沉淀池是废…

销售经理应该具备哪些能力?

销售经理应该具备哪些能力&#xff1f; 俗话说火车跑的快&#xff0c;全靠车头带&#xff0c;这句话虽然有些片面&#xff0c;但是也说明作为团队直接领导的销售经理担当者重要的角色&#xff0c;他们不仅要学会管理自我&#xff0c;更重要的是要管理团队&#xff0c;激发他人…

【开源】基于Vue和SpringBoot的衣物搭配系统

项目编号&#xff1a; S 016 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S016&#xff0c;文末获取源码。} 项目编号&#xff1a;S016&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣…

数字孪生 LNG 终端,海上液化天然气三维可视化

液化天然气 (Liquefied Natural Gas&#xff0c;简称 LNG) 在能源转型过程中被广泛认可为相对较清洁的能源选择。相对于传统的煤炭和石油燃料&#xff0c;LNG 的燃烧过程产生的二氧化碳 (CO2) 排放较低。LNG 的燃烧释放的二氧化碳排放较少&#xff0c;因此对应对气候变化和减少…

深度学习在单线性回归方程中的应用--TensorFlow实战详解

深度学习在单线性回归方程中的应用–TensorFlow实战详解 文章目录 深度学习在单线性回归方程中的应用--TensorFlow实战详解1、人工智能<-->机器学习<-->深度学习2、线性回归方程3、TensorFlow实战解决单线性回归问题人工数据集生成构建模型训练模型定义损失函数定义…

制作木制纹理的黄鹤楼3D模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 黄鹤楼主楼为四边套八边形体、钢筋混凝土框架仿木结构&#xff0c;从…