金蝶EAS开发笔记

article/2025/8/26 15:24:11

1.界面介绍

1. 新建业务单位,若无需求,默认选用财务组织。

2. 在项目路径下的\metadata\com\kingdee\eas\custom\bill 可改单据名称。

3. 标准:默认先在用户自定义下面建立报表(rpt)、基础资料(basedata)和业务单据(bill),即在业务组别下面建业务单元,然后再在下面建业务组别,最后再建业务单元。总共四层结构。

rpt里面建一个项目名,再下面自建app和client。

4. 规范布局按钮,位于页面的上方,可一键规范布局。

5. 主要的元数据:

    1)entity(实体):设计开发视图->app->entity->属性。

    有两种类型,钥匙图标和园点图标。前者表示自有属性,后者表示关联属性,类似于数据库中的外键。也可以在属性右边的方法里面,添加自定义的方法。

    2)table(数据表):可直接理解为数据库里面的表,在此可以查看对应的字段名称、类型和长度等等。

    3)query(查询): 主要就是SQL语句。 在子对象(主对象下面的属性)里面可以选择连接方式,若连接方式为默认类型就相当于于内连接父对象所有行<---->左连接子对象所有行<---->右连接

6. 修改了单据的属性,一定要记得发布业务单元,发布完业务单元之后,接着一定要刷新Java代码。

7.info对象:类似于一般开发中的,POJO对象或者叫entity对象。

8.ListUI和EditUI属于前端页面,ControllerBean.java是负责处理后台的业务逻辑的。前后端所使用的代码不相同。


2.单据

  1. 使用钢铁基类后添加组织需要加上的代码:

   EditUI编辑界面:

  public KDBizPromptBox getMainOrgUnit() {return prmtFICompany;// 主业务组织控件}protected OrgType getMainBizOrgType() {return OrgType.Company;// 组织类型}

   ListUI序时簿界面:

 protected OrgType getMainBizOrgType() {return OrgType.Company;}protected String getPropertyOfBizOrg(OrgType orgType) {return "FICompany.id";}

3.取值和设值

(1)控件:

    获取值:

    this.控件名称.getValue或get类型(如getText),

    设置值:

    this.控件名称.setValue或set类型(如setText)。

(2)分录(kdtEntry):

    获取值:

  先获取单元格,再定位到列。

this.kdtEntry.getCell(rowIndex, kdtEntry.getColumnIndex("RowName")).getValue(值);

    或者

this.kdtEntry.getCell(rowIndex, "RowName").getValue(值);

    设置值:

this.kdtEntry.getCell(rowIndex, kdtEntry.getColumnIndex("RowName")).setValue(值);

    或者

this.kdtEntry.getCell(rowIndex, "RowName").setValue(值);

4.方法

    onload():类加载后调用此方法,在方法里面设置监听事件,设置初始值。操作的是控件。

    onshow():绑定控件。

    createNewDate():  在UI页面添加控件后会进入此方法,用于设置默认值。不能在onload()设置默认值,会被覆盖。操作的是对象。使用字段名称。

     createNewDetailData(): 操作分录,也是用来设置默认值。

  基本用法:

//此例子为DEP的采购订单
@Override
public IObjectValue createNewDetailData(KDTable arg0) {//获取到控件final KDFormattedTextField rate = (KDFormattedTextField)DEPUtils.findComponetByName(this, "控件名称");PurOrderEntryInfo vo = (PurOrderEntryInfo)super.createNewDetailData(arg0);vo.put("控件名称", rate.getValue());return vo;
}

     storeField() : 将控件的值绑定到数据库,方法触发的时机是在保存前、提交前、窗体关闭前。

     beforeStoreFields(): 用于绑定前的事件处理。

     verifyInput(): 校验数据,方法里面写保存和提交的操作。


  5.事件

最常用的就两个事件:editStarted和editStopped。如果是在分录上,则为kdtEntry_editStarted和kdtEntry_editStopped。

还有mouseClicked、properyChange。

添加事件的步骤:在UI界面的事件里面找到对应的事件名称,双击点进去,然后保存事件,将事件的名称复制到相应的Java代码里面。


  6.监听器

(1)addDataChangeListener:

  用法:

控件名称.addDataChangeListener(new DataChangeListener(){@Overridepublic void dataChanged(DataChangeEvent arg0){......}});

 (2)addActionListener:

 用法:

控件名称.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {......}});

  7. F7

  F7类型的控件命名为:pk+自定义的控件名称

  F7过滤:

EntityViewInfo viewInfo = new EntityViewInfo();//视图
FilterInfo filterInfo = new FilterInfo();      //过滤设置过滤条件
filterInfo.getFilterItems().add(new FilterItemInfo("xxx"='yyyy'));//相当于where1
filterInfo.getFilterItems().add(new FilterItemInfo("zzz"='kkkk'));//相当于where2
new FilterItemInfo("number","11111",CompareType.EQUALS);//比较,相当于苍穹的QFilter
filterInfo.setMaskString("#0 or #1");//将and替换成or,下表从0开始viewInfo.setFilter(filterInfo);
this.控件名称.setEntityViewInfo(viewInfo);

  8. 序时簿的常用方法

      refreshList:刷新页面

      refresh:刷新操作

      getSeletedValue:获取单据的id

      getSeletedList:获取下标


  9.Factory

    在app下面的ControlBean.java下面操作数据库,在对应的介入点写代码( _save() 增加 、 _submit 提交、_audit 审核、_unAudit 反审核和 _delete 删除 ),只有要上下文关系,就能调用其它的Factory。

     Factory:调用指定的属性,在entity里面查询方法,子类没有去父类查找。

    服务端通过工厂获取本地Controller实例:

 IProject iproj = ProjectFactory.getLocalInstance(ctx);

    客户端通过工厂获取远程Controller实例:

IProject iproj = ProjectFactory.getRemoteInstance();

10.Experience 

    获取分录的行数:this.kdtEntry.getRowCount()

    获取枚举类型的值:this.枚举类型的字段名称.getSelectedIndex(),返回的是int型,需要和自定义的枚举值比较是否相等。


11.监听器

F7字段:

this.F7字段.addDataChangeListener(new DataChangeListener(){@Overridepublic void dataChanged(DataChangeEvent event) {.......}
});

 分录删除行:

this.分录面板.addRemoveListener(new IDetailPanelListener(){@Overridepublic void afterEvent(DetailPanelEvent paramDetailPanelEvent)throws Exception {.......}}@Overridepublic void beforeEvent(DetailPanelEvent paramDetailPanelEvent)throws Exception {........}
});

12.异常处理

EASBIzException:业务异常。

throw new EASBizException(new NumericExceptionSubItem("error","提示信息的内容"));

BOSException:编程时的异常,SQL,空指针......

throw new BOSException(e);

handleException:在前端抛出的异常,在createNewDate方法里面,因为其父类没有抛出异常。

ps:在处理异常时,不能e.printStackTrace(),除非自己确保语句没有异常。

     也可以用如下方法,来弹出提示信息:

MsgBox.error("warning", "提示内容", this);
或者
MsgBox.info("warning", "提示内容", this);

 不过此方法有局限性。 


13.SQL

利用工厂:

查询数据:
SelectorItemCollection sic = new SelectorItemCollection();
sic.add("id");
sic.add("name");
XXXXXXFactory.getLocalInstance(ctx).getXXXXXXInfo(new ObjectUuidPK(),sic);
XXXXXXFactory.getLocalInstance(ctx).getXXXXXXInfo("此处填写少了from条件的SQL语句,因为已经确定了表对象");
或者
XXXXXXFactory.getLocalInstance(ctx).getXXXXXXInfo("where name = ");
//过滤
EntityViewInfo viewInfo = new EntityViewInfo();//视图
FilterInfo filterInfo = new FilterInfo();      //过滤
XXXXXXFactory.getLocalInstance(ctx).getXXXXXXCollection(viewInfo);
说明:XXXXXX为自命名的单据名称

 直接执行SQL:

前端:
增删改:FMIsqlFacadeFactory.getRemoteInstance().executeSql(sqlString);
查:IRowSet selectRowSet = SQLExecutorFactory.getRemoteInstance(sqlString).executeSQL();后台:
增删改:DbUtil.execute(ctx, sqlString);
查:IRowSet rowSet = DbUtil.executeQuery(ctx, sqlString);

14.标准改造(DEP)

用user登录系统,在动态扩展平台高级版。

在实体类里面添加字段,不会在页面上显示出来,适合开发人员。

在元数据校验或元数据检查里面复制PK(全类名),新建Java类,命名为:名称+CTEx。新建的类会自动进入继承的类的子类的onload方法。

DEP配置:

 标准扩展类:

命名:名称+Ex

二开扩展类要继承标准的controllerBean类,并且二开扩展类的路径要和标准类的路径保持一致。

在数据库中,以CF开头的列名为自添加的,以F开头的列名为本来就有。 

拿到控件名称:

DEPUtils.findComponentByName(this,"控件名称")

获取类型为KDCheckBox的值 : 

int xxx = 控件名称.getSelected();

ps:当值为32时, KDCheckBox为勾选状态。


15.WebSocket接口:

在金蝶BOS设计开发工具里面的目标路径下,先新建一个包,再新建功能,名称已Facede结尾,然后点击发布和发布WebSocket,点击发布WebSocket的时候选中路径,勾选追加到配置文件。发布完之后,会生成一个目录,一个wsdd文件,然后将把刚才生成的wsdd文件放到runtime\server\deploy\eas.ear里面的web-inf文件夹,并把wsdd文件里面的service标签内容复制到server-config.wsdd里面,保存,然后启动服务器打开http://localhost:56898/ormrpc/services,找到创建的Facede,右键复制的地址就是接口地址。


16.手工报表

继承检行分析的包。

_createTempTable方法,得到临时表,查询的列和显示的列要一致。

_query方法(四个参数),查询临时表。

新建用户页面,自建一个UI界面。

自定义弹窗:

说明:UrgentMaterial和Cause为分录的某一个列名,UrgentMaterialsUI为自定义的UI界面。aaaa为自定义的key值,get和put时,名称要保持一致。

int rowIndex = e.getRowIndex();
int colIndex = e.getColIndex();
if(colIndex == kdtEntry.getColumnIndex("UrgentMaterial")){//判断单元格是否为空ICell cell = this.kdtEntry.getCell(rowIndex,"UrgentMaterial");if(cell != null){//判断列是否为空Boolean value = (Boolean)this.kdtEntry.getCell(rowIndex,"UrgentMaterial").getValue();if(value){UIContext context = new UIContext(ui);context.put("aa","bb");//可往 UIContext 类的实例里 put 参数,这些参数可以带到被打开的界面上IUIWindow uiWindow = null;try {uiWindow = UIFactory.createUIFactory(UIFactoryName.MODEL).create(com.kingdee.eas.custom.bill.client.UrgentMaterialsUI.class.getName(), context, null, OprtState.VIEW);uiWindow.show();} catch (UIException uException) {handUIException(uException);}this.kdtEntry.getCell(rowIndex, "Cause").setValue(uiWindow.getUIObject().getUIContext().get("aaaa"));}else {this.kdtEntry.getCell(rowIndex, "Cause").setValue("");}}}

 自定义弹窗的Java代码:

@Override
public void ConfirmButton_mouseClicked(java.awt.event.MouseEvent e) {getUIContext().put("aaaa", this.kDTextArea.getText());//获取文本里面的内容this.disposeUIWindow();//关闭窗体
}

PS: 如果打开报表显示没有合法的许可而已过期,就在XXXUI.java的onLoad()里面加上

getUIContext().put(UIContext.CHECK_LICENSE, "false");

17.修改客户端地址

 参考路径如上图所示,更改配置文件里面的服务器地址即可,适用于IP地址发生改变时。


18.常用快捷键

ctrl + e:查看详细的报错信息。

alt + shift + d:打开debug panel  加上 ctrl + f  查找结点,查看返回值类型。

ctrl + shift + q : 分析执行器。

ctrl + alt + ] :选中要查询的SQL语句,点击录制,暂停,然后就能SQL查看SQL的运行时间。


19.查询分析器

删除查询分析器里面的内容只要删除下面这个文件里面的内容即可:


20.从客户端下载服务器下面的文件


21.操作日志

管理员登录客户端,搜索【上机日志】。



http://chatgpt.dhexx.cn/article/BwMIkXUw.shtml

相关文章

测试用例设计方法——因果图法

1.因果图  1.1考虑所有输入/输出条件的相互制约关系以及组合关系  1.2考虑输入条件之间的依赖关系&#xff1b;  1.3再根据分析的关系来转化为判定表的规则 2.条件与结果之间的关系  2.1恒等  2.2非&#xff08;~&#xff09;  2.3或&#xff08;V&#xff09;  2.4与 3…

实验4、黑盒测试:因果图法及测试用例设计

实验4、黑盒测试&#xff1a;因果图法及测试用例设计 一、实验目的 1、掌握因果图的概念。 2、掌握因果图测试用例设计法。 二、实验任务 以下三个任务、至少完成一个 1、某软件规格说明书包含这样的要求&#xff1a;第一列字符必须是A或B&#xff0c;第二列字符必须是一…

【测试入门】测试用例经典设计方法 —— 因果图法

01、因果图设计测试用例的步骤 1、分析需求 阅读需求文档&#xff0c;如果User Case很复杂&#xff0c;尽量将它分解成若干个简单的部分。这样做的好处是&#xff0c;不必在一次处理过程中考虑所有的原因。没有固定的流程说明究竟分解到何种程度才算简单&#xff0c;需要测试…

【测试】根据因果图法设计饮料售卖机的测试用例

【测试】根据因果图法设计饮料售卖机的测试用例 因果法设计测试用例的步骤&#xff1a; ① 分析所有可能的输入和可能的输出 ② 找出输入与输出之间的对应关系 ③ 画出因果图 ④ 把因果图转换成判定表 ⑤ 把判定表对应到每一个测试用例 产品说明&#xff1a; 有一个处理单价为…

软件测试用例设计方法-因果图法

边界值法是等价类划分法的补充&#xff0c;所以&#xff0c;它们是一对搭档。 那么&#xff0c;判定表法有没有它的搭档呢&#xff1f; 答案是&#xff0c;有的。那就是本篇文章分享的用例设计方法—— 因果图法 。 定义 因果图法&#xff1a; 用来处理等价类划分和边界值考…

测试用例设计方法---因果图法

学习目标 掌握因果图法的核心 掌握因果图的基本符号了解因果图的画法 1、什么是因果图法 因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适用于检查程序输入条件的各种组合情况 2、因果图法的核心 因 、 果 1、所谓的原因就是输入,所谓的结果就…

因果图法设计测试用例

等价类划分法、边界值分析法及错误推断法在对输入条件的考虑中并未重视输入条件的组合。事实上&#xff0c;当输入条件存在若干种可能的组合时&#xff0c;必须对这些组合加以考虑&#xff0c;以证实测试程序在某种输入组合的情况下恩能否完成规格说明书中预先规定的功能&#…

通俗的讲,Java后端到底是干什么的?语言工程师到底是啥?你是工程师吗?

新手程序员通常会走入一个误区 就是认为学习了一门语言&#xff0c;就可以称为是某某语言工程师了。但事实上真的是这样吗&#xff1f;其实并非如此。 今天我们就来聊一聊&#xff0c;Java 开发工程师到底开发的是什么东西。准确点来说&#xff0c;Java后端到底在做什么&…

Web开发从前端、后端、编程语言、到框架的初学指南

[导读] 作为一篇Web开发初学者指南&#xff0c;本文从学习什么出发到如何专攻。从前端、后端&#xff0c;到编程语言&#xff0c;再到框架&#xff0c;或许对打算进军Web开发的您有所帮助。如果你正在阅读这篇文章&#xff0c;你可能是对Web开发有某种兴趣&#xff0c;甚至你开…

数据库与后端语言

什么是数据库 数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期储存在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 什么是后端语言 后端语言&#xff0c;在Web应用中实际上就是向前端提供需要显示网页内容的数据&#xff0c;这些数据大多…

前端和后端分别是什么?

从技术工具来看&#xff1a; 前端&#xff1a;常见的 html5、JavaScript、jQuery... 后端&#xff1a;spring、tomcet、JVM&#xff0c;MySQL... 毕竟&#xff0c;如果这个问题问一个老后端&#xff0c;他掰掰手指可以给你罗列出一堆的名词来&#xff0c;比如设计模式、数据库…

前端 语言

前端语言 名称简介用法网址CSSCSS 是一种描述 HTML 文档样式的语言。CSS 描述应该如何显示 HTML 元素https://www.w3school.com.cn/css/index.aspCSS3CSS3 是最新的 CSS 标准。操作https://www.runoob.com/css3/css3-tutorial.htmlScss/SassScss是CSS的预处理器&#xff0c;一…

前后端语言简析

目录 什么HTML语言? 什么是CSS语言&#xff1f; 什么是Javascript语言&#xff1f; 什么是PHP语言&#xff1f; 什么是Mysql语言&#xff1f; 什么HTML语言? 作用&#xff1a;定义的是【网站显示的内容】。 表现形式&#xff1a;<标签名>内容</标签名> …

聊聊开发中经历的几种后端语言

前言 谈这个话题&#xff0c;没有任何语言之争&#xff0c;只是个人开发的经历。 适合 开发语言的选择只是当时条件下适合每个项目或者每个团队乃至每个公司的最佳选择&#xff0c;并不是说XXX公司也用这个我们用这个肯定没问题。 当时还在某手机公司&#xff0c;有次跟某公…

服务器后端的编程语言

本文为 csdn cedricliang 编纂翻译&#xff0c;如有转载&#xff0c;请于原文篇头出标明译者及原文出处&#xff0c;以示尊重&#xff01; 翻译&#xff1a;cedricliang 原文&#xff1a;http://blog.csdn.net/cedricliang/article/details/48437437 对于那些需要web服务的初创…

这么多语言,究竟哪个适合写后端,Java还是?

温馨提示 请拖动到文章末尾&#xff0c;长按识别「抽奖」小程序。现金红包等你来拿。 【公众号回复“1024”&#xff0c;送你一个特别推送】 9:10约会&#xff0c;真爱&#xff0c;请“星标” 前言 作为开发者我们都知道&#xff0c;开发后台语言可选择的方向会很多&#xff0c…

【编程语言】盘点当前主流的后端语言,随便选哪一种都能月薪过万!

当前主流后端开发语言如下&#xff1a; Java 笔者目前是Java开发工程师。Java一般用来做应用的&#xff0c;它作为热门服务端语言活跃多年了&#xff0c;很多公司都有找Java程序员&#xff0c;市场有很多需求。所以说&#xff0c;选择学习Java&#xff0c;也许不是最好的&…

2021最热门的后端编程语言排行榜出炉!

三足鼎立 截止2020年底&#xff0c;后端编程语言中&#xff0c;java依然是市场的王者&#xff0c;C/C、python和go占据一部分江山&#xff0c;从2021年开始&#xff0c;未来十年&#xff0c;在后端编程语言中&#xff0c;各位觉得哪个编程语言会越来越流行&#xff0c;java会一…

当前主流的后端语言,谁能夺得桂冠,果然是后生可畏!

主流后端语言 如今编程语言遍地开花&#xff0c;烟花迷乱&#xff0c;小编整理了最流行的几种编程语言如下&#xff1a; 这几种语言都是经久不衰&#xff0c;占领着后端编程界的半壁江山。TIOBE上的语言排名&#xff1a; C、Java、python&#xff0c;C&#xff0c; C#鏖战榜首…

【项目】前端如何与后端交互

在项目开发中使用了前后端分离&#xff0c;当分离后前后端如何进行交互呢&#xff1f;结合项目做一些简单的实践&#xff0c;经过晓风姐的点拨有了本篇分享。 结构 简单的来说是我发现现在写不下去了&#xff0c;我先补好 REST的博客再来更新~~~ RESTful架构 REST全称是Repre…