金蝶云苍穹-插件开发(一)加载数据

前言

此系列博客是进行金蝶云苍穹开发时的插件开发的教程,一是在明年要是还要参加软件杯金蝶A6赛题的话,可以看此系列教程的博客来进行复习,同时如果要是我实验室的学弟学妹要参加的话,我这个系列的博客可以给他们提供学习参考,因为插件开发学习的路上很艰难,我学习的时候,能参照的讲解少,要花费大量工夫去猜测去调试才能学会那些语法。在插件开发上,希望我这个系列的博客能帮助到别人。

这个系列的博客只专门讲解插件开发,基本的那些金蝶云苍穹的知识点在这里不多作讲解。

对于插件的 事件 ,金蝶官方文档中更为详细,我这只对一些常见的插件做业务处理的代码作一些笔记。

加载指定基础资料/单据的数据

在插件中,我们想要获得想要的基础资料/单据的信息,是通过load操作。

load操作常见的有两种:

  • BusinessDataServiceHelper.load()
  • BusinessDataServiceHelper.loadSingle()

二者的区别是,load是加载指定基础资料/单据的一些数据,loadSingle是加载一个数据。前者的返回值类型是DynamicObject[],后者的返回值类型为DynamicObject。基础资料和单据的实体在插件中都是放在DynamicObject类型的对象中。

QFilter过滤器

我也不清楚它的官方叫法,我喜欢叫它过滤器(不是web里面那个Filter)。在load操作时,要确保加载的是一些数据还是一个数据,就是对基础资料/单据中的数据进行过滤操作。在最常用的QFilter的构造器中,有三个参数:

第一个是要过滤的属性,第二个是属性过滤要的操作,第三个是如果操作涉及到另一个值,这个值就放到第三个参数里面。

第二个参数通常使用枚举类QCP类的枚举对象的方式,也可以使用操作对应的字符串。

例:

String name = "xxx";
QFilter qfilter = new QFilter("name", QCP.equals, name);
QFilter qfilter = new QFilter("name", QCP.is_notnull, null);

加载数据

接下来就可以讲解如何加载自己想要的基础资料/单据的数据了。

load和loadSingle方法有三个参数,第一个是基础资料/单据的标识,第二个是指定要加载那些字段,第三个是一个QFilter类型的数组,数组里面是一个个的QFilter过滤器。

第二个参数是一个字符串,里面写着一个一个的字段的标识名,每个标识名之间由逗号隔开,例:

"field1,field2,field3,field4"

具体的加载数据的代码案例:

DynamicObject[] dynamicObjectArray = BusinessDataServiceHelper.load("abq2_schedule_form", //日程安排的基础资料的实体名"name," +  //任务名"abq2_done_time," + //执行时间///单据体部分"abq2_task_context," +  //任务内容"abq2_expect_minute," +  //预期时间"abq2_diff," +  //任务难度"abq2_true_minute," +  //真实花费时间"abq2_finish," +   //完成情况"abq2_task_entryentity"   // 加载单据体,new QFilter[]{new QFilter("name", QCP.is_notnull, null)});
DynamicObject thisCourse = BusinessDataServiceHelper.loadSingle("abq2_my_course","abq2_my_course_stu," + //课程内码"name," + //课程名称"abq2_textfield3," + //星期"abq2_textfield1," + //教室"abq2_textfield," + //教师"abq2_textfield4," + //年级"creator," + //学生"abq2_textfield2",  //课节new QFilter[]{new QFilter("id", QCP.equals, primaryKeyValue)});

获取指定的基础资料/单据实体的字段值

一级字段

获取到对应的实体的DynamicObject类型的对象后,只要是以上load中第二个参数中加载过的字段,都可以获取到其对应的字段值。

若其对象的变量名为dynamicObject

文本类型的字段:dynamicObject.getString("字段标识")

整型类型的字段:dynamicObject.getInt("字段标识")

其他类型的比如getDate、getLong也是以此类推

要额外说的是getDynamicObject,这个是用来获取基础资料字段的字段值,返回值是DynamicObject,就是获取到了这个字段对应的实体了,是默认所有的一级字段都获取到了,可以直接get它的所有一级字段。

单据体的字段

如果不是一级字段,又该如何获取呢?这里以单据体的里面的二级字段为例。

要想获取一个基础资料/单据里面的单据体的信息,首先要先加载出其基础资料/单据的实体的信息,再获取其实体的单据体的信息,类似于先进大门才能进卧室的意思,还有,在load中的第二个参数中,不管要写好单据体的标识,也要写好单据体中的要加载的二级字段的标识,如上面的第一个例子

DynamicObject[] dynamicObjectArray = BusinessDataServiceHelper.load("abq2_schedule_form", //日程安排的基础资料的实体名"name," +  //任务名"abq2_done_time," + //执行时间//以下下是单据体部分"abq2_task_entryentity,"   // 加载单据体//以下是单据体的二级字段的标识,即单据体的“列”的标识"abq2_task_context," +  //任务内容"abq2_expect_minute," +  //预期时间"abq2_diff," +  //任务难度"abq2_true_minute," +  //真实花费时间"abq2_finish" +   //完成情况,new QFilter[]{new QFilter("name", QCP.is_notnull, null)});

在get单据体中的二级字段的时候,也要讲究步骤。 要先getDynamicObjectCollection("单据体标识"),获取单据体中的分录(就是单据体的行)的数据的集合,集合中的一个元素就是一个分录(就是一行),再对应去get获取其行的字段的数据即可,例:

//获取DynamicObject列表,即获取学生的单据头的信息DynamicObject[] dys = BusinessDataServiceHelper.load("abq2_int","abq2_billnofield," +"abq2_textfield5," +          //学校"abq2_textfield2," +            //学生的班级"stu_name," +     //学生姓名"abq2_textfield3," +      //学生学号"abq2_decimalfield1111," +   //学生成绩总分"abq2_textfield8," +     //考试名称//把单据体和单据体里的字段加进load里面"abq2_entryentity," + //科目成绩的单据体"abq2_textfield," +   //考试科目"abq2_decimalfield111," +   //科目对应的成绩"abq2_daterangefield_startdate",           //考试日期(new QFilter("stu_name", QCP.is_notnull, null)).toArray());//创建一个JsonArrayJSONArray jsonArray = new JSONArray();for (DynamicObject dynamicObject : dys) {//将学生的考试基本的信息加入JSONArrayJSONObject jsonObject = new JSONObject();jsonObject.put("stu_name", dynamicObject.getString("stu_name"));jsonObject.put("school_name", dynamicObject.getString("abq2_textfield5"));jsonObject.put("stu_id", dynamicObject.getString("abq2_textfield3"));jsonObject.put("class_name", dynamicObject.getString("abq2_textfield2"));jsonObject.put("exam_time", new SimpleDateFormat("yyyy-MM-dd").format(dynamicObject.getDate("abq2_daterangefield_startdate")));jsonObject.put("exam_name", dynamicObject.getString("abq2_textfield8"));jsonObject.put("exam_all_score", dynamicObject.getBigDecimal("abq2_decimalfield1111"));jsonArray.add(jsonObject);//获取学生的成绩信息中的单据体信息,获取学生的各门科目的成绩信息//先把单据体的collection创建出来,再获取这个单据体的collection的字段(按照字段名),如下DynamicObjectCollection dynamicObjectCollection = dynamicObject.getDynamicObjectCollection("abq2_entryentity");for (DynamicObject dynamicObject2 : dynamicObjectCollection) { //遍历分录数据//将各科目的的信息加入JSONArrayJSONObject jsonObject2 = new JSONObject();jsonObject2.put("subject", dynamicObject2.getString("abq2_textfield"));  //考试科目jsonObject2.put("sub_score", dynamicObject2.getBigDecimal("abq2_decimalfield111"));  //考试成绩jsonArray.add(jsonObject2);}}}

案例

以一个GPT的自定义操作为例,展示数据的加载和获取:

public class ScoreSumAnalysis implements IGPTAction {@Overridepublic Map<String, String> invokeAction(String action, Map<String, String> params) {Map<String , String> result = new HashMap<>();if ("GET_ALL_Score".equalsIgnoreCase(action)) {//获取DynamicObject列表,即获取学生的单据头的信息DynamicObject[] dys = BusinessDataServiceHelper.load("abq2_int","abq2_billnofield," +"abq2_textfield5," +          //学校"abq2_textfield2," +            //学生的班级"stu_name," +     //学生姓名"abq2_textfield3," +      //学生学号"abq2_decimalfield1111," +   //学生成绩总分"abq2_textfield8," +     //考试名称"abq2_entryentity," + //科目成绩的单据体"abq2_textfield," +   //考试科目"abq2_decimalfield111," +   //科目对应的成绩"abq2_daterangefield_startdate",           //考试日期(new QFilter("stu_name", QCP.is_notnull, null)).toArray());//创建一个JsonArrayJSONArray jsonArray = new JSONArray();for (DynamicObject dynamicObject : dys) {//将学生的考试基本的信息加入JSONArrayJSONObject jsonObject = new JSONObject();jsonObject.put("stu_name", dynamicObject.getString("stu_name"));jsonObject.put("school_name", dynamicObject.getString("abq2_textfield5"));jsonObject.put("stu_id", dynamicObject.getString("abq2_textfield3"));jsonObject.put("class_name", dynamicObject.getString("abq2_textfield2"));jsonObject.put("exam_time", new SimpleDateFormat("yyyy-MM-dd").format(dynamicObject.getDate("abq2_daterangefield_startdate")));jsonObject.put("exam_name", dynamicObject.getString("abq2_textfield8"));jsonObject.put("exam_all_score", dynamicObject.getBigDecimal("abq2_decimalfield1111"));jsonArray.add(jsonObject);//获取学生的成绩信息中的单据体信息,即获取学生的各门科目的成绩信息DynamicObjectCollection dynamicObjectCollection = dynamicObject.getDynamicObjectCollection("abq2_entryentity");for (DynamicObject dynamicObject2 : dynamicObjectCollection) {//将各科目的的信息加入JSONArrayJSONObject jsonObject2 = new JSONObject();jsonObject2.put("subject", dynamicObject2.getString("abq2_textfield"));  //考试科目jsonObject2.put("sub_score", dynamicObject2.getBigDecimal("abq2_decimalfield111"));  //考试成绩jsonArray.add(jsonObject2);}}System.out.println(jsonArray.toJSONString());//加入resultDynamicObject参数,将JsonArray加入到这个参数当中,然后返回result.put("resultDynamicObject", jsonArray.toJSONString());}return result;}
}

加载数据的插件到此讲解结束,有疑问可以在评论区提出。

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

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

相关文章

谷粒商城学习-10-docker安装mysql

文章目录 一&#xff0c;拉取MySQL镜像1&#xff0c;搜索MySQL的Docker镜像2&#xff0c;拉取MySQL镜像3&#xff0c;查看已经拉取的镜像 二&#xff0c;创建、启动MySQL容器1&#xff0c;使用docker run创建启动容器2&#xff0c;使用docker ps查看运行状态的容器3&#xff0c…

SpringBoot新手快速入门系列教程:基于JPA的一个Mysql简单读写例子

现在我们来做一个简单的读写Mysql的项目 1&#xff0c;先新建一个项目&#xff0c;我们叫它“HelloJPA”并且添加依赖 2&#xff0c;引入以下依赖&#xff1a; Spring Boot DevTools (可选&#xff0c;但推荐&#xff0c;用于开发时热部署)Lombok&#xff08;可选&#xff0c…

【C++】 解决 C++ 语言报错:Use of Uninitialized Variable

文章目录 引言 使用未初始化的变量&#xff08;Use of Uninitialized Variable&#xff09;是 C 编程中常见且危险的错误之一。它通常在程序试图使用尚未赋值的变量时发生&#xff0c;导致程序行为不可预测&#xff0c;可能引发运行时错误、数据损坏&#xff0c;甚至安全漏洞。…

SpringMVC:SpringMVC执行流程

文章目录 一、介绍二、什么是MVC 一、介绍 Spring MVC 是一种基于Java的Web框架&#xff0c;它采用了MVC&#xff08;Model - View - Controller&#xff09;设计模式&#xff0c;通过吧Model、View和Controller分离&#xff0c;将Web层进行职责解耦&#xff0c;把复杂的Web应…

NAS 必备导航页 Homepage 外观简约但功能丰富

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 NAS 上的应用部署多了之后,不同的服务对应的端口很难记住,在内网中使用,一般也不会绑定域名。 此时就需要有一个导航页将 NAS 上部署的所有服务都罗列出来,方便我们直接点击访问对应的服务。 今天给大家介绍的…

【HICE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通

anaconda中下载压缩包并用conda安装包

有时直接conda安装包时会出错&#xff1b;报错PackagesNotFoundError: The following packages are not available from current channels 比如 conda install -y bioconda::ucsc-gtftogenepred #直接安装报错 #直接下载压缩包安装https://blog.csdn.net/weixin_45552562/ar…

C++初学者指南-4.诊断---基础:警告和测试

C初学者指南-4.诊断—基础知识&#xff1a;警告和测试 文章目录 C初学者指南-4.诊断---基础知识&#xff1a;警告和测试1. 术语和技术记住&#xff1a;使用专用类型&#xff01; 2.编译器警告Gcc/CLang 编译器选项MS Visual Studio 编译器选项 3.断言运行时断言静态断言&#x…

macOS查看系统日志的方法

1、command空格键打开搜索框&#xff0c;输入‘控制台’并打开 2、选择日志报告&#xff0c;根据日期打开自己需要的文件就可以

c++习题06-ljc的储蓄计划

目录 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;思路1 2&#xff0c;思路2 三&#xff0c;代码 1&#xff0c;思路1代码 2&#xff0c;思路2代码 四&#xff0c;用例输入输出 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;思路1 定义变量&#x…

统计是一门艺术(非参数假设检验)

1.定义 当总体分布未知&#xff0c;那么就需要一种与分布具体数学形式无关的统计推断方法&#xff0c;称为非参数方法 只能利用样本中的一般信息包括位置和次序关系等 稳健性强 2.符号检验 考虑问题&#xff1a; 小样本情况&#xff1a; 以概率为1/2的二项分布是对称的 两…

剖析DeFi交易产品之UniswapV3:交易路由合约

本文首发于公众号&#xff1a;Keegan小钢 SwapRouter 合约封装了面向用户的交易接口&#xff0c;但不再像 UniswapV2Router 一样根据不同交易场景拆分为了那么多函数&#xff0c;UniswapV3 的 SwapRouter 核心就只有 4 个交易函数&#xff1a; exactInputSingle&#xff1a;指…

Java技术栈总结:kafka篇

一、# 基础知识 1、安装 部署一台ZooKeeper服务器&#xff1b;安装jdk&#xff1b;下载kafka安装包&#xff1b;上传安装包到kafka服务器上&#xff1a;/usr/local/kafka;解压缩压缩包&#xff1b;进入到config目录&#xff0c;修改server.properties配置信息&#xff1a; #…

Buuctf之SimpleRev做法

首先&#xff0c;查个壳&#xff0c;64bit&#xff0c;那就丢进ida64中进行反编译进来之后&#xff0c;我们进入main函数&#xff0c;发现里面没什么东西&#xff0c;那就shiftf12搜索字符串&#xff0c;找到关键字符串&#xff0c;双击进入然后再选中该字符串&#xff0c;ctrl…

Python爬取股票信息-并进行数据可视化分析,绘股票成交量柱状图

为了使用Python爬取股票信息并进行数据可视化分析&#xff0c;我们可以使用几个流行的库&#xff1a;requests 用于网络请求&#xff0c;pandas 用于数据处理&#xff0c;以及 matplotlib 或 seaborn 用于数据可视化。 步骤 1: 安装必要的库 首先&#xff0c;确保安装了以下P…

【C语言】指针(1):入门理解篇

目录 一、内存和地址 1.1内存 1.2 深入理解计算机编址 二、指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量和解应用操作符 2.2.1 指针变量 2.2.2 解引用操作符 2.3指针变量的大小 三、指针变量类型的意义 3.1 指针的解引用 3.1指针-整数…

Micron近期发布了32Gb DDR5 DRAM

Micron Technology近期发布了一项内存技术的重大突破——一款32Gb DDR5 DRAM芯片&#xff0c;这项创新不仅将存储容量翻倍&#xff0c;还显著提升了针对人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、高性能计算&#xff08;HPC&#xff09;以及数…

2024年最新运维面试题(附答案)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 一&#xff0e;选择题 1.HTTP协议默认使用哪个端口…

科普文:构建可扩展的微服务架构设计方案

前言 微服务架构是一种新兴的软件架构风格&#xff0c;它将单个应用程序拆分成多个小的服务&#xff0c;每个服务都运行在自己的进程中&#xff0c;这些服务通过网络进行通信。这种架构的优势在于它可以提高应用程序的可扩展性、可维护性和可靠性。 在传统的应用程序架构中&…

高效管理个人日程,智慧校园行政办公全指南

在智慧校园的行政办公体系里&#xff0c;个人日程管理功能担当起协调与优化每位教职员工日常安排的角色&#xff0c;它像一位贴心的时间助理&#xff0c;确保工作与私人生活的和谐并进。这一功能设计得既直观又灵活&#xff0c;让使用者能以自己偏好的视角审视时间规划&#xf…