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

前言

此系列博客是进行金蝶云苍穹开发时的插件开发的教程,一是在明年要是还要参加软件杯金蝶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.xdnf.cn/news/1473540.html

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

相关文章

破解宇宙终极奥秘,战胜昊天无上束缚

在幽邃的暗夜下&#xff0c;细品着夫子与昊天跨越千年的智勇交锋&#xff0c;我的思绪不禁飘向了更加深远的宇宙边际&#xff0c;回响起那些关于人类如何挑战天命、战胜上天的过往。 宇宙奥秘 在浩瀚无垠的宇宙深渊中&#xff0c;隐藏着一段超越凡尘的规则。昊天&#xff0c;…

2024/7/6 英语每日一段

More than half of late-teens are specifically calling for more youth work that offers “fun”, with older teenagers particularly hankering for more jollity, according to a study carried out by the National Youth Agency. One in 10 said they have zero option…

【Go】excelize库实现excel导入导出封装(四),导出时自定义某一列或多列的单元格样式

大家好&#xff0c;这里是符华~ 查看前三篇&#xff1a; 【Go】excelize库实现excel导入导出封装&#xff08;一&#xff09;&#xff0c;自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头 【Go】excelize库实现excel导入导出封装&#xff08;二&…

AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)

AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …

新产品或敏捷项目过程 SOP,附带流程图及流程规范

一、项目启动 项目背景和目标明确 市场调研结果分析&#xff0c;确定新产品的需求和市场机会。制定明确的项目目标&#xff0c;包括产品特性、上市时间、预期收益等。 组建项目团队 确定项目经理、产品经理、开发人员、测试人员、市场人员等角色。明确各成员的职责和权限。 项目…

Java语言程序设计基础篇(第10版)编程练习题13.18(使用 Rational 类)

第十三章第十八题(使用 Rational 类) 题目要求&#xff1a; 编写程序&#xff0c;使用 Rational 类计算下面的求和数列: 你将会发现输出是不正确的 &#xff0c;因为整数溢出(太大了)。为了解决这个问题 &#xff0c;参见编程练习題13.15。代码参考&#xff1a; package cha…

蜂窝物联农业气象站,守护丰收每一步

现代农业的革新者——农业自动气象站&#xff0c;正以其多功能的传感器、高效的数据采集传输系统、智能的数据云平台以及可靠的供电供网系统&#xff0c;成为农业生产中的得力助手。这些传感器能够实时监测温度、湿度、风速、风向、气压、土壤温度、土壤湿度、土壤PH值、土壤盐…

CorelDRAW2024新版本来咯!你的设计神助手

&#x1f389; 设计界的朋友们&#xff0c;注意啦&#xff01;你们的新宠——CorelDRAW 2024 来咯&#xff01; &#x1f31f; 一、设计神器再进化 亲爱的设计小伙伴们&#xff0c;有没有感觉每天与那些不配合的软件战斗&#xff0c;像是在打怪升级&#xff1f;&#x1f409; …

Selenium的这些自动化测试技巧你知道几个?

Selenium自动化测试技巧 与以前瀑布式开发模式不同&#xff0c;现在软件测试人员具有使用自动化工具执行测试用例套件的优势&#xff0c;而以前&#xff0c;测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试&#xff0c;而是最大程度地减少…

js的作用域链

function test(){} 运行期上下文&#xff1a;当函数执行时&#xff0c;会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境&#xff0c;函数每次执行时对应的执行上下文都是 独一无二的&#xff0c;所以多次调用一个函数对导致创建多个执行上下…

leetcode力扣_排序问题

215.数组中的第K个最大元素 鉴于已经将之前学的排序算法忘得差不多了&#xff0c;只会一个冒泡排序法了&#xff0c;就写了一个冒牌排序法&#xff0c;将给的数组按照降序排列&#xff0c;然后取nums[k-1]就是题目要求的&#xff0c;但是提交之后对于有的示例显示”超出时间限制…

谷粒商城学习笔记-12-开发工具环境安装配置

文章目录 一&#xff0c;JDK的安装1.进入官网下载2&#xff0c;jdk安装3&#xff0c;Java环境验证 二&#xff0c;Idea安装插件1&#xff0c;lombok2&#xff0c;MybatisX 三&#xff0c;Maven的下载与配置1&#xff0c;下载Maven2&#xff0c;Idea配置Maven3&#xff0c;maven…

ESP32CAM物联网教学05

ESP32CAM物联网教学05 超级监控摄像头 点灯科技APP还能查看摄像头的视频呢&#xff01;这样&#xff0c;小智的物联网小车就变身成为超级监控摄像头啦。 测试摄像头视频图像 我们把前面的物联网小车的程序稍作修改&#xff0c;增加了摄像头的程序&#xff0c;去掉了按键组件程…

RocketMQ-订阅一致及解决方案

背景 这里借用Rocketmq官方的一句话来描述订阅关系一致: 订阅关系一致指的是同一个消费者分组Group ID下&#xff0c;所有Consumer实例所订阅的Topic和Tag必须完全一致。如果订阅关系不一致&#xff0c;可能导致消息消费逻辑混乱&#xff0c;消息被重复消费或遗漏。 具体的问题…

关于GIS的概念方面在前端编程中的理解

关于GIS的概念方面在前端编程中的理解 一. 什么是gis二. 关于地球的建模(了解)三. GIS坐标系表现形式四.GIS的数据4.1 矢量数据4.2 栅格数据4.3 矢量数据和栅格数据的不同 一. 什么是gis 地理坐标系统&#xff0c;其目的就是通过地理坐标系可以确定地球上任何一点的位置。 二. …

jenkins配置gitee源码地址连接不上

报错信息如下&#xff1a; 网上找了好多都没说具体原因&#xff0c;最后还是看jenkins控制台输出日志发现&#xff1a; ssh命令执行失败&#xff08;git环境有问题&#xff0c;可能插件没安装成功等其他问题&#xff09; 后面发现是jenkins配置git的地方git安装路径错了。新手…

215. 数组中的第K个最大元素(中等)

215. 数组中的第K个最大元素 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;215. 数组中的第K个最大元素 2.详细题解 快速排序算法在每一轮排序中&#xff0c;随机选择一个数字 x x x&#xff0c;根据与 x x x的大小关系将要排序的数…

设计小能手必备!CorelDRAW2024新功能大揭秘

&#x1f389; 设计小能手必备&#xff01;CorelDRAW 2024新功能大揭秘 嗨&#xff0c;亲爱的小红书的朋友们&#xff5e;&#x1f44b; 今天我要和大家安利一款让设计师们疯狂打call的设计软件——CorelDRAW 2024&#xff01;&#x1f31f; 作为一名资深的设计师&#xff0c;我…

VBA初学:零件成本统计之三(获取材料外协的金额)

第三步&#xff0c;从K3的数据库中获取金额 我这里是使用循环&#xff0c;通过任务单号将金额汇总出来&#xff0c;如果使用数组的话&#xff0c;还要按任务单写GROUP&#xff0c;还要去对应&#xff0c;不如循环直接一点 获取材料和外协金额的表格Sub getje()Dim rowcount A…

ctfshow-web入门-文件包含(web88、web116、web117)

目录 1、web88 2、web116 3、web117 1、web88 没有过滤冒号 : &#xff0c;可以使用 data 协议&#xff0c;但是过滤了括号和等号&#xff0c;因此需要编码绕过一下。 这里有点问题&#xff0c;我 (ls) 后加上分号发现不行&#xff0c;可能是编码结果有加号&#xff0c;题目…