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

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

在这里插入图片描述

第二步 新建一个过滤框

在这里插入图片描述

第三步 修改过滤窗口标识

在这里插入图片描述

第四步 注册插件

在这里插入图片描述

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 sBillDataTempTablesBillDataTempTable = 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"):continueheader.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 ENDAND 1 = CASE WHEN ISNULL(@Matter,0) = 0 THEN 1 ELSE CASE WHEN ISNULL(T3.FMATERIALID,'')  =  @Matter THEN 1 ELSE 0 END ENDIF OBJECT_ID(@TableName,N'U') is  nullBEGIN--不存在 新增表DECLARE @NEWTABLESQL VARCHAR(100)=N'SELECT * INTO '+@TableName+' FROM #DATA'EXEC(@NEWTABLESQL)ENDELSEBEGIN--存在 删除数据表重新插入EXEC(N'DROP TABLE '+ @TableName+'')DECLARE @UPDATESQL VARCHAR(100)=N'SELECT * INTO '+@TableName+' FROM #DATA'EXEC(@UPDATESQL) ENDSELECT * FROM #DATADROP TABLE #DATA
END

功能实现截图

在这里插入图片描述

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

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

原文链接传送门

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

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

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

相关文章

禁止ubuntu自动更新显卡驱动

​使用 apt-mark hold命令 apt-mark hold命令可以帮助我们锁定软件包的版本&#xff0c;防止 Ubuntu 自动更新该软件。 具体操作步骤如下&#xff1a; 1. 打开终端&#xff0c;使用以下命令来查看当前安装的显卡驱动软件包&#xff1a; dpkg -l | grep -i nvidia 2. 执行以…

Python 对中文名称逐字按字母表进行排序并输出

使用场景 代码适用于需要对中文名称进行排序并规范化输出的情景&#xff0c;具体为处理一个包含中文姓名的文本文件&#xff0c;按姓名的拼音首字母进行排序&#xff0c;并以规范的格式输出。 排序规则&#xff1a; 将名称按照姓氏首字母A-Z的次序&#xff0c;进行排序&#x…

LeetCode-164. 最大间距【数组 桶排序 基数排序 排序】

LeetCode-164. 最大间距【数组 桶排序 基数排序 排序】 题目描述&#xff1a;解题思路一&#xff1a;桶排序&#xff0c;这种方法比较简单&#xff0c;记住3个公式即可。如下&#xff1a;解题思路二&#xff1a;基数排序&#xff0c;其实和桶排序差不多&#xff0c;就是直接分为…

孩子都能学会的FPGA:第二十二课——用FPGA实现计数时钟的奇数次分频

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

使用SQL中的LIKE操作符进行模糊匹配:原理与用法

LIKE操作符的基本原理&#xff1a; LIKE操作符用于在SELECT语句中进行模糊匹配&#xff0c;通常与通配符%一起使用。%表示匹配任意长度的任意字符&#xff0c;例如%apple%可以匹配包含apple字符串的任意位置的字符串。而其他的通配符如下&#xff1a; _ 表示匹配一个任意字符[…

内核定时器

一、时钟中断 硬件有一个时钟装置&#xff0c;该装置每隔一定时间发出一个时钟中断&#xff08;称为一次时钟嘀嗒-tick&#xff09;&#xff0c;对应的中断处理程序就将全局变量jiffies_64加1 jiffies_64 是一个全局64位整型, jiffies全局变量为其低32位的全局变量&#xff0…

用pip更新、安装python的包

查看pip的版本&#xff1a;python -m pip --version 例如&#xff0c;查看下pip的版本&#xff0c;在cmd下输入命令python -m pip --version&#xff0c;可以发现当前安装的pip的版本是23.2.1&#xff1a; 查看一个包的详情&#xff1a;python -m pip show 例如&#xff0c…

Python 调用企业微信群机器人发送消息及文件

Python 操作企业微信群机器人。 企业微信群创建机器人 &#xff1a; 安装 requests json &#xff1a; pip install requests pip install json发送消息&#xff08;markdown&#xff09; import requests import json# 企业微信机器人发送文字 def send_markdown (message, …

【信息安全】-个人敏感信息、个人信息、个人金融信息

文章目录 个人敏感信息个人敏感信息判定举例 个人信息个人信息判定举例 个人金融信息内容a) 账户信息指账户及账户相关信息b) 鉴别信息c) 金融交易信息d) 个人身份信息e) 财产信息f) 借贷信息g) 其他信息: 出处 个人敏感信息 个人敏感信息判定 个人敏感信息是指一旦泄露、非法…

xxl-job简单实用

仅仅为了记录一下xxl-job的使用&#xff0c;针对新手而言&#xff01; 1.开始准备 源码仓库地址Release Downloadhttps://github.com/xuxueli/xxl-jobDownloadhttp://gitee.com/xuxueli0323/xxl-jobDownload

cmd下查看python命令的用法

在cmd下&#xff0c;可以运行python --help或者py --help来查看python命令的用法。例如&#xff1a;

C++11改进观察者模式

观察者模式定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。 先看一个简单的观察者模式是如何实现的&#xff1a; #include <iostream> #include <vector> #include <map> …

《计算机算法设计与分析(第5版)》笔记

文章目录 [toc]第一章&#xff1a;算法概述1.1|算法与程序算法性质 程序 1.2|算法复杂性分析算法复杂性时间复杂性最坏情况下的时间复杂性最好情况下的时间复杂性平均情况下的时间复杂性 渐进复杂性 O O O表示法、 Ω \Omega Ω表示法、 θ \theta θ表示法、 o o o表示法 O O …

一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析

目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中&#xff0c;容器编排工具的选择对于简化流程、提高效率至关重要。本…

24、pytest通过xfail将测试函数标记为预期失败

官方实例 # content of test_xfail.py import pytest import syspytest.mark.xfail def test_function():print("test_function was invoked.")def valid_config():return Falsedef test_function_02():if not valid_config():pytest.xfail("failing configura…

集体建筑业总产值数据,shp/excel格式,1990-2021年,可直接下载

建筑业总产值指以货币表现的建筑业企业在一定时期内生产的建筑业产品和服务的总和。建筑业总产值包括建筑工程产值、安装工程产值和其他产值三部分内容&#xff0c;不包括境外产值。 建筑业总产值是指以货币表现的建筑业企业在一定时期内生产的建筑业产品和服务的总和。 建筑…

代数学笔记8: Sylow定理

Sylow定理 ∣ G ∣ p r ⋅ m |G|p^r\cdot m ∣G∣pr⋅m, ( m , p ) 1 (m,p)1 (m,p)1, 则 G G G中必有 p r p^r pr阶子群. 证明: 应用 例子: 15阶群必定是循环群. 因为 15 3 5 153\times 5 1535, 所以15阶群有 3 3 3阶群或 5 5 5阶群, 设3阶群有 n 3 n_3 n3​个, 5阶群有…

金蝶EAS从哪里查看 即使库存的金额?

【财务会计】——【存货核算】——【报表分析】——【存货收发存汇总表】 从这里能看到即使库存的金额

机器人制作开源方案 | 自主型收集餐盘机器人

作者&#xff1a;蔡佳怡、朱启会、郭晨杰、杨昊天、焦家辉 单位&#xff1a;西安外事学院 指导老师&#xff1a;杜喜昭、张燕 1. 产品说明 1.1 设计目的 对于如学校、工厂这种大型食堂&#xff0c;一般的收餐盘模式为用餐人用餐完毕后&#xff0c;把餐盘拿到最近的收餐盘点&…

【算法】对二分搜索的理解

二分搜索大家都很熟悉&#xff0c;首先我们先来看看基本框架 func binarySearch(nums []int, target int) int {left, right : 0, ...for ... {mid : left (right-left)/2if nums[mid] target {...} else if nums[mid] < target {left ...} else if nums[mid] > targ…