NC65二开经验总结
公式相关
1.显示公式没执行
列表界面显示,卡片界面不显示:
Handler的onBoCard执行:
getBillCardPanel().execHeadLoadFormulas();
Controller的isLoadCardFormula返回true
另外,字段录入长度不够时,列表显示,卡片不显示
2.带出数据执行公式
表头显示公式,执行
getBillCardPanel().execHeadLoadFormulas();
表体显示公式,执行
getBillCardPanel().getBillModel().execLoadFormula();
补充:上面是最简单的方法,其它自己测试。比如,指定表体行执行公式:
// 下面的方法必须设置编辑公式 –- 用for循环效果等于上面的方法
getBillCardPanel().execBodyFormula(i, "pk_supdoc");
UI
1.列表界面设置可多选
public ClientUI(){
super();
getBillListPanel().setMultiSelect(true);
}
2.查询条件
UIDialog dlg = getQueryUI();
if(dlg.showModal() != 1) return;
INormalQuery query = (INormalQuery)dlg;
String sql = query.getWhereSql();
3.隐藏表体字段
BillData bs = getBillCardPanel().getBillData();
BillItem[] items = bs.getBillModel().getBodyItems();
for (int i = 0; i < items.length; i++) {
items[i].setShow(false);
}
getBillCardPanel().setBillData(bs); // 必须有这一行
4.隐藏表头字段
// 方法一
billCardPanel.getHeadItem("hzdy42").getComponent().setVisible(false);
billCardPanel.getHeadItem("hzdy42").getCaptionLabel().setText("");
// 方法二
billCardPanel.hideHeadItem(new String[] {"hzdy38","hzdy39","hzdy40","hzdy41","hzdy42"});
5.将AggVO显示到单据界面上
billCardPanel.setBillValueVO(aggvo);
系统变量相关
1.单据号
前置任务:配置单据号规则
创建单据号:
new HYPubBO().getBillNo(单据类型, 组织, null, null);
或者:
getVbillCode(单据类型,组织);
new BillcodeGenerater ().getBillCode (单据类型, 组织,null,null);
或者
// 调用系统编码规则生成单据号
IBillcodeManage iBillcodeManage = (IBillcodeManage) NCLocator.getInstance().lookup(IBillcodeManage.class.getName());
String billNo = iBillcodeManage.getBillCode_RequiresNew("YX72", "集团主键", "组织主键", new BXHeaderVO());
2.主键
KeyGenerator.getInstance().getKey(20);
3.获取nchome路径
RuntimeEnv.getInstance().getNCHome();
4.系统变量
InvocationInfoProxy
WorkbenchEnvironment
ClientEnvironment
5.设置客户端背景色
F:\NC63\AceHome\ierp\sf\themeconf.xml
模块相关
1.添加模块
META-INF里面必须有module.xml,Sysconfig下才能找到该模块
2.单据类型没有定义所属模块
产生这个异常的原因是:单据类型没在添加在项目模块里,而是在自己的模块里,在单据类型表里:bd_billtype,把单据的systemcode改为项目模块即可
单据动作相关
1.动作注册
从pub_billaction表里复制其它单据的动作,修改单据类型、ID即可
2.动作代码路径
modules -> 单据类型所在模块 -> META-INF -> var -> source
3.按钮显示
只显示isEnabled()==true的按钮:
int[] btnAry = ((LController) getUIManageController()).getCardButtonAry();
for (int i = 0; i < btnAry.length; i++) {
getBillUI().getButtonManager().getButton(btnAry[i]).setVisible(getBillUI().getButtonManager().getButton(btnAry[i]).isEnabled());
}
单据模版相关
1.下拉字段
数据库里保存的是 0、1、2、3.。。。所以vo里对应Integer
getBillCardWrapper().initHeadComboBox("vname", new String[]{"A","B","C"}, true);
2.日期型字段
单据模板是日期型时,vo要为UFDate
3.日期型默认取值
4.查询所有的默认查询条件
5.调用模板
数据库操作相关
1. HYPubBO_Client
findColValue方法只能查询字符型字段(因为这个方法内嵌了String强转)
2.JdbcSession
JdbcSession session = null;
session = PersistenceManager.getInstance().getJdbcSession();
session = JdbcSessionUtil.createJdbcSession();
密码相关
1.root密码修改
补丁相关
1.如何打补丁
在modules里找到相应的模块,将public、private、client下的代码导出的jar包放到模块的lib文件夹下,开发工具重新加载下即可(怎么重新加载?--重启,再重启,直到开发工具能加载到刚导入的jar包里的类)
运行相关
1.启动中间件报错
2.startup.bat启动服务卡着不动
元数据相关
1.单据日期
配置文件相关
1.配置文件变量名写错
节点相关
1.打开其它节点
直接点开指定的节点,没有数据:SFClientUtil.openFrame("ZZ0102"); // 下面的还没测试
参照相关
1.表头参照多选取值
((UIRefPane) billCardPanel.getHeadItem("hzdy41").getComponent()).getRefModel().getPkValues();
2.动态指定参照类
((UIRefPane)(getBillCardPanelWrapper().getBillCardPanel().getHeadItem("段").getComponent())).setRefModel(参照类.class);
3.设置参照是否支持多选
((UIRefPane)editor.getBillCardPanel().getHeadItem("vpsn").getComponent()).setMultiSelectedEnabled(true);
4. 设置参照只显示一级
5.参照字段实现手输
6.如何知道一个字段的参照类型:
Object obj = ((UIRefPane)getBillCardPanel().getHeadItem("").getComponent()).getRefModel();
Syttem.out.println(obj);
下拉相关
1. 下拉去掉空白选项
预警
1.配置
其它
1.命名规则
2.表空间的概念
3.获取用户有权限的组织
实用方法
1.获取表体所有页签名
getBillCardPanel().getBillData().getBodyTableCodes();
2.获取表体指定行的vo
getBillModel("页签名").getBodyValueRowVO(rownum, className);
3.单据状态栏打印消息
ShowStatusBarMsgUtil.showStatusBarMsg
4.获取ts
CurTime.getCurrentTimeStampString();
5.创建主键
// uuid生成工具
SequenceGenerator uidUtils = new SequenceGenerator();
uidUtils.generate();
6. 保留小数点后2位,并“四舍五入”
new UFDouble().setScale(2, UFDouble.ROUND_HALF_UP);
7. 处理按钮控制是否可用
在新建按钮组中添加如下方法
/***
* 重写控制是否可用
* @Kwoky
*/
@Override
protected boolean isActionEnable() {
if ((getModel().getSelectedOperaDatas() == null) || (getModel().getSelectedOperaDatas().length == 0)) {
return false;
}
return true;
}
重点在setModel中时一定要添加
model.addAppEventListener(this);
public void setModel(PsndocMdmModel model) {
this.model = model;
model.addAppEventListener(this);
}
8. ComBox设置方式以及常用方法
nc.ui.uif2.components.CommonConfirmDialogUtils --- 处理弹框显示
showConfirmDeleteDialog()
MessageDialog.showErrorDlg(this.getBillForm(), "警告", "请先选择发货仓库再进行替代品选择!!");
// 编辑自己得弹框信息
// 可以在工程目录的resources下面lang.simpchn.ht100101包下的配置文件自行配置
// 注意点编辑完该文件后需要执行转码操作(UTF-16)
String TITLE = ResHelper.getString("ht100101", "ht100101006");
String QUESTION = ResHelper.getString("ht100101", "ht100101006");
int msg = MessageDialog.showYesNoDlg(getParent(), TITLE, QUESTION, 8);
String stryear = comyear.getSelectedItem().toString();
// 定义ComBox类型
comyear = new UIComboBox();
// 组装ComBox显示
comyear.addItem("执行ComBox显示的内容 --- 可以参考上面方法写到配置文件中");
9.逻辑更新页面字段值
// 第一种方式只适合当前鼠标选定的行
getEditor().getBillCardPanel().setHeadItem("state", state);
// 第二种方式
// 只刷新鼠标点击的那个行画面
"不同的地方在于调用的方法"
this.model.directlyUpdate(this.getModel().getSelectedData());
// 更新选择的多行画面
this.model.directlyUpdate(this.getModel().getSelectedOperaDatas());
10.物理刷新页面字段值
// 在需要刷新的画面的XML中配置属性
<property name="dataManager"><ref bean="bmModelModelDataManager"/> </property>
//在按钮中定义字段获取get/set方法
private (bmModelModelDataManager -- 对应的class类) dataManager
// 在按钮方法中调用刷新方法
getDataManagers().refresh();
11.按钮方法重写
afterDoActionFailed //方法意思:按钮执行失败后执行
afterDoActionSuccessed //方法意思:按钮执行成功后执行
beforeDoAction //方法意思:按钮执行前执行
12.元数据升级操作
// 以本地账号为例
// 需要使用管理员账号lz登陆
// 登陆后搜索 -- 元数据管理
// 即可进行升级操作
13.NC65加减乘除计算函数
ufDouble.add(1.0);//加1
ufDouble.sub(1.0);//减1
ufDouble.multiply(1.0);//乘
ufDouble.div(1.0);//除
13.NC65登录信息获取
//获取当前系统登录集团
InvocationInfoProxy.getInstance().getGroupId()
//获取当前系统登录用户
InvocationInfoProxy.getInstance().getUserId()
// 获取当前用户编码
WorkbenchEnvironment.getInstance().getLoginUser() .getUser_code()
//获取当前系统时间
new UFDateTime(System.currentTimeMillis())
//clent端获取登录用户VO
UserVO user = WorkbenchEnvironment.getInstance().getLoginUser();
14.页面查询功能添加自定义查询条件
package nc.ui.yxzy.yx.depositpool.action;
import nc.ui.pubapp.uif2app.query2.action.DefaultQueryAction;
import nc.ui.querytemplate.querytree.IQueryScheme;
public class NewQueryAction extends DefaultQueryAction {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final String QUERY_CONDITION = "all_condition";
/** Key:返回查询条件where语句 */
public static final String KEY_SQL_WHERE = "where";
/** Key:返回表列表式(逗号分隔式)from-where语句 */
public static final String KEY_SQL_TABLE_LIST = "tablelist";
/** Key:返回表列表式(逗号分隔式)from-where语句 */
public static final String KEY_SQL_TABLE_JOIN = "tablejoin";
@Override
protected void executeQuery(IQueryScheme queryScheme) {
// 判断页面查询条件数据是否存在。
if (queryScheme != null) {
// 获取当前页面节点ID
String funnode = getFunNode();
// 根据实际情况判断是否为需要处理的查询节点
if (funnode.equals("YX601010")) {
// 获取当前页面查询条件
Object sql = queryScheme.get(KEY_SQL_TABLE_JOIN);
// 判断查询条件是否存在
if (sql instanceof nc.ui.querytemplate.querytree.FromWhereSQLImpl) {
// 将获取页面的查询条件转换给fsi
nc.ui.querytemplate.querytree.FromWhereSQLImpl fsi = (nc.ui.querytemplate.querytree.FromWhereSQLImpl) sql;
// 获取sql便于条件追加赋值
String fromsql = fsi.getWhere();
// 判断SQL是否存在
if (fromsql != null) {
// 拼接所需查询条件
fromsql = fromsql + " and pk_id = '1001G11000000000222R' and YXZY_DEPOSITPOOL_B.vbdef1 = '1'";
}
// 查询条件返回给页面通用查询
fsi.setWhere(fromsql);
}
}
}
// 返回查询结果集
super.executeQuery(queryScheme);
}
}
15.前台查询使用方法
IUAPQueryBS bs = NCLocator.getInstance().lookup(IUAPQueryBS.class);
Object countMap = bs.executeQuery(sql, new MapProcessor());
16、读取以及修改数据源
// 获取数据源
String oldDataSourceName = InvocationInfoProxy.getInstance().getUserDataSource();
// 设置新的数据源
InvocationInfoProxy.getInstance().setUserDataSource("数据源");
17.按钮快捷键功能
// 导包
import javax.swing.Action;
import javax.swing.KeyStroke;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
//这一行是定义一个KeyStore对象,并指定快捷键为"Ctrl+L"
KeyStroke keyStore = KeyStroke.getKeyStroke(KeyEvent.VK_L, InputEvent.CTRL_MASK);
//这一行代码为为该按钮设置定义好的快捷键
this.putValue(Action.ACCELERATOR_KEY, keyStore);
18.导入导出按钮组
<bean id="importExportMenu" class="nc.funcnode.ui.action.MenuAction">
<property name="code" value="importExport" />
<property name="name" value="导入/导出" />
<property name="actions">
<list>
<ref bean="ImportData" /> <!-- 导入Excel -->
<ref bean="ExportData" /> <!-- 导出Excel -->
<ref bean="ExportTemplate" /> <!-- 导出模板 -->
</list>
</property>
</bean>
<!-- 导入Excel(根据模板填充数据) -->
<bean id="ImportData" class="nc.ui.uif2.excelimport.ImportAction">
<property name="model" ref="bmModel" />
<property name="importableEditor" ref="ImportExportEditor" />
<property name="btnName" value="导入Excel" />
</bean>
<!-- 导出模板到Excel -->
<bean id="ExportTemplate" class="nc.ui.uif2.excelimport.ExportExcelTemplateAction">
<property name="model" ref="bmModel" />
<property name="importableEditor" ref="ImportExportEditor" />
<property name="btnName" value="导出模板" />
</bean>
<!-- 导出数据到Excel -->
<bean id="ExportData" class="nc.ui.uif2.excelimport.ExportAction">
<property name="model" ref="bmModel" />
<property name="importableEditor" ref="ImportExportEditor" />
<property name="btnName" value="导出Excel" />
</bean>
<!-- 导入项目编辑器 -->
<bean id="ImportExportEditor" class="nc.ui.ic.eneryconsumption.excel.EneryConsumeImportableEditor">
<property name="billcardPanelEditor" ref="billForm" />
<property name="addAction" ref="addAction" />
<property name="cancelAction" ref="cancelAction" />
<property name="saveAction" ref="saveScriptAction" />
<property name="appModel" ref="bmModel" />
</bean>
EneryConsumeImportableEditor文件代码
package nc.ui.ic.eneryconsumption.excel;
import java.util.List;
import nc.ui.trade.excelimport.InputItem;
import nc.ui.pubapp.uif2app.view.util.BillPanelUtils;
import nc.ui.tmpub.field.affect.util.FieldValueUIUtil;
import nc.ui.trade.excelimport.Uif2ImportablePanel;
import nc.ui.uif2.excelimport.DefaultUIF2ImportableEditor;
import nc.vo.pub.ExtendedAggregatedValueObject;
/**
* 导入时校验
* @author wsj
* @date 2022-12-09
*
*/
public class EneryConsumeImportableEditor extends DefaultUIF2ImportableEditor{
@Override
protected void setProcessedVO(ExtendedAggregatedValueObject eavo) {
//标准产品导入时,需填写组织信息,需以下代码,否则部分字段无法带出
getAppModel().getContext().setPk_org(FieldValueUIUtil.getPkOrg(eavo,getBillcardPanelEditor()));
BillPanelUtils.setOrgForAllRef(getBillcardPanelEditor().getBillCardPanel(), getAppModel().getContext());
super.setProcessedVO(eavo);
}
@Override
public List<InputItem> getInputItems() {
return super.getInputItems();
}
}
NC65二开经验总结的更多相关文章
- NC57,NC63-NC二开经验总结
版主2010级市场营销专业本科生 2013年8月入达内培训Java相关技术 12月入职,做用友NC的二次开发工作 2015年4月离职,4中下旬入职一家互联网金融企业 下面是做NC二开期间积累的一些常用 ...
- 还在写SQL做SAP二开?通过RFC调用NetWeaver,让HANA数据库操作更可靠
相比于从零开始构建全套信息化系统,基于成熟的ERP等行业软件做二次开发是更多中大型企业应对个性化软件需求的首选方案.如何在二开模块中,可靠地对成品软件的数据库进行读写操作,以满足单据自动创建.元数据自 ...
- Odoo:全球第一免费开源ERP库龄表的简单实现方法(无需二开)
问题背景 希望查看库龄超过30天的货物,该如何实现?此种简单数据查询需要二开吗? 解决方案 方法一:Stock Quant列表视图增加过滤器 <filter string="库龄超30 ...
- odoo导入功能二开
原来有的导入功能相信很多小伙伴对其功能不是很满意,不过没关系,我们可以二开啊,把它的功能改造成你想要的样子,接下来让我们看看怎么办吧 例如我想把员工导入功能中添加上用户同步注册功能 首先,我要找到原模 ...
- 分享一个非常屌的eazyui二开demo
eazyui二开Demo非常吊,里面各种非常吊的样例,最喜欢的是 多文件进度条上传,一次可多选,还有流程,还有文本编辑器 非常简洁的 不像一些官网各种复杂的东西.主要为自己保留一份, 在线demo在 ...
- 关于用友 U8-UAP二开的一些事
这是关于一个刚刚接触用友U8的二次开发的一些小心得. 首先就是用友二开的论坛,http://u8dev.yonyou.com/ 当然这个论坛做得不怎么样,提出了好几个问题,都没有回复的. 以下是关于二 ...
- S-HR二开基础
检测是否某个类部署上去了:http://10.3.0.115:6888/easportal/tools/getclassurl.jsp?className=com.kingdee.eas.hr.ser ...
- Revit二开---Schemachema扩展数据
一.什么是Schema Schema是Revit扩展数据的技术关键词,revit到这里,需要对Revit二开基础有一定了解. 二.Schema架构 建立revit扩展数据第 ...
- 金蝶k/3 cloud 生产用料清单下推生成调拨单二开记录
系统默认的生产用料清单下推生成调拨单功能,是根据调拨选单数量来的,有库存和没有库存的都混在一起,导致业务人员审核调拨单的时候需要删除没有库存的分录行,严重影响工作效率. 现通过二开程序,根据生产用料清 ...
- Redash 二开 - 后端环境搭建
Redash 二开 - 后端环境搭建 一.操作系统选择 官方文档有一句话:Windows users: while it should be possible to run Redash on a W ...
随机推荐
- IOS 16 无法打开开发版或者企业版本APP解决方案 - 需要开启开发者模式
在IOS 16系统上,打开开发版本APP,或者企业版本APP时,会看到如下的提示信息: 需要开启开发者模式, xxx 需要在开发者模式下运行. 启用开发者模式前, 此App不可用 这个时由于IOS 1 ...
- Kong网关
Kong网关 一.kong网关核心概念 1. Upstream upstream 对象表示虚拟主机名,可用于通过多个服务对传入请求进行负载远的 2. Target 目标ip地址/主机名,其端口表示后端 ...
- 「loj - 3022」「cqoi 2017」老 C 的方块
link. good题,考虑像 国家集训队 - happiness 一样在棋盘上搞染色,我毛张 @shadowice1987 的图给你看啊 你像这样奇数层以 red -> blue -> ...
- 「sdoi2019 - D2T2」移动金币
对 @command_block 没有 implementation 做法的细化.理论来说可以通过,但因为我实现得较劣无法通过.:( 把金币中的空隙看作石子,就是一个阶梯 Nim 的模型(有总共 \( ...
- Linux/Unix-CPU-SuperPI-Unixbench性能测试
测试服务器CPU单核及多核SuperPI圆周率测试real和user值,SuperPI是利用CPU的浮点运算能力来计算出π(圆周率),测试系统稳定性和测试CPU计算完后特定位数圆周率所需的时间:及Un ...
- Django框架项目之上线——docker、部署上线
文章目录 Docker CentOS安装Docker 设置管理Docker的仓库 安装Docker Engine-Community Docker基础命令 开启关闭 镜像操作 容器操作 Docker安 ...
- 2023_10_09_MYSQL_DAY_01_课后题
2023_10_09_MYSQL_DAY_01_课后题 #第三章 #1. 查询每名员工的员工姓名,入职时间. SELECT ename, hiredate FROM emp; #2. 查询部门表中部门 ...
- 深度学习 YOLO v1 源码+笔记
""" Yolo V1 by tensorflow """ import numpy as np import tensorflow._ap ...
- Mac OS安装Python的pip
最近牛牛的同学在学习python,但当他使用numpy时出现了报错(。•́︿•̀。) 原因为他的python没有numpy这个库(这个故事很典).然鹅雪上加霜的是,他的电脑是Mac,没有Windows ...
- VS Code C# 开发工具包正式发布
前言 微软于本月正式发布Visual Studio Code C#开发工具包,此前该开发套件已经以预览版的形式在6月份问世.经过4个月的测试和调整,微软修复了350多个问题,其中大部分是用户反馈导致的 ...