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

前言

此系列博客是进行金蝶云苍穹开发时的插件开发的教程,一是在明年要是还要参加软件杯金蝶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,一经查实,立即删除!

相关文章

Spark SQL----内置函数Bitwise Functions

Spark SQL----内置函数Bitwise Functions Bitwise Functions 例子&#xff1a; -- & SELECT 3 & 5; ------- |(3 & 5)| ------- | 1| --------- ^ SELECT 3 ^ 5; ------- |(3 ^ 5)| ------- | 6| --------- bit_count SELECT bit_count(0); -----------…

谷粒商城学习-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…

深度解析:机器学习与深度学习的关系与区别

一、前言 在人工智能领域&#xff0c;机器学习与深度学习常常被提及并广泛应用。虽然它们在本质上都是通过数据训练模型以进行预测或分类&#xff0c;但两者之间存在着显著的区别和联系。本文将深入解析机器学习与深度学习的关系与区别&#xff0c;帮助读者更好地理解和应用这…

poetry使用经验汇总

什么是poetry Poetry 是一个 Python 依赖管理和打包工具,它旨在解决 Python 项目中常见的依赖问题,提供更简洁、更可靠的依赖管理方式。以下是 Poetry 的一些主要功能和特点的总结: 依赖解析:Poetry 使用 pyproject.toml 文件来管理项目依赖,它能够自动解析依赖关系,确保…

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

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

掌握 IPython 中的 %%bash 魔法命令:深入探索与实践

IPython 是一个强大的交互式 Python 解释器&#xff0c;它提供了丰富的功能来增强开发体验。其中一个非常实用的功能是 IPython 的“魔法命令”&#xff08;magic commands&#xff09;&#xff0c;这些命令以 %% 开头&#xff0c;用于执行特定的操作或改变 IPython 的行为。%%…

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;根据日期打开自己需要的文件就可以

基础物理-测量1(长度)

引言 科学和工程学基于测量和比较。因此&#xff0c;我们需要制定关于如何测量和比较事物的规则&#xff0c;并且需要实验来建立这些测量和比较的单位。 国际标准单位 1971年&#xff0c;第十四届国际计量大会选定了七个量作为基本量&#xff0c;表中列出了其中三个。 Quan…

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的二项分布是对称的 两…

找事,给年轻一代的就业解惑书

在这个快节奏、高压力的现代社会&#xff0c;我常常被一种声音所包围&#xff1a;“勤劳节俭致富”&#xff0c;仿佛这是通往幸福生活的唯一道路。然而&#xff0c;当我停下脚步&#xff0c;深入思考这背后的逻辑&#xff0c;不禁会发现&#xff0c;这不仅仅是对经济行为的简单…

剖析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…