公式相关

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二开经验总结的更多相关文章

  1. NC57,NC63-NC二开经验总结

    版主2010级市场营销专业本科生 2013年8月入达内培训Java相关技术 12月入职,做用友NC的二次开发工作 2015年4月离职,4中下旬入职一家互联网金融企业 下面是做NC二开期间积累的一些常用 ...

  2. 还在写SQL做SAP二开?通过RFC调用NetWeaver,让HANA数据库操作更可靠

    相比于从零开始构建全套信息化系统,基于成熟的ERP等行业软件做二次开发是更多中大型企业应对个性化软件需求的首选方案.如何在二开模块中,可靠地对成品软件的数据库进行读写操作,以满足单据自动创建.元数据自 ...

  3. Odoo:全球第一免费开源ERP库龄表的简单实现方法(无需二开)

    问题背景 希望查看库龄超过30天的货物,该如何实现?此种简单数据查询需要二开吗? 解决方案 方法一:Stock Quant列表视图增加过滤器 <filter string="库龄超30 ...

  4. odoo导入功能二开

    原来有的导入功能相信很多小伙伴对其功能不是很满意,不过没关系,我们可以二开啊,把它的功能改造成你想要的样子,接下来让我们看看怎么办吧 例如我想把员工导入功能中添加上用户同步注册功能 首先,我要找到原模 ...

  5. 分享一个非常屌的eazyui二开demo

    eazyui二开Demo非常吊,里面各种非常吊的样例,最喜欢的是 多文件进度条上传,一次可多选,还有流程,还有文本编辑器  非常简洁的 不像一些官网各种复杂的东西.主要为自己保留一份, 在线demo在 ...

  6. 关于用友 U8-UAP二开的一些事

    这是关于一个刚刚接触用友U8的二次开发的一些小心得. 首先就是用友二开的论坛,http://u8dev.yonyou.com/ 当然这个论坛做得不怎么样,提出了好几个问题,都没有回复的. 以下是关于二 ...

  7. S-HR二开基础

    检测是否某个类部署上去了:http://10.3.0.115:6888/easportal/tools/getclassurl.jsp?className=com.kingdee.eas.hr.ser ...

  8. Revit二开---Schemachema扩展数据

    一.什么是Schema        Schema是Revit扩展数据的技术关键词,revit到这里,需要对Revit二开基础有一定了解. 二.Schema架构        建立revit扩展数据第 ...

  9. 金蝶k/3 cloud 生产用料清单下推生成调拨单二开记录

    系统默认的生产用料清单下推生成调拨单功能,是根据调拨选单数量来的,有库存和没有库存的都混在一起,导致业务人员审核调拨单的时候需要删除没有库存的分录行,严重影响工作效率. 现通过二开程序,根据生产用料清 ...

  10. Redash 二开 - 后端环境搭建

    Redash 二开 - 后端环境搭建 一.操作系统选择 官方文档有一句话:Windows users: while it should be possible to run Redash on a W ...

随机推荐

  1. Salesforce LWC学习(四十五) lwc支持Console App控制Tab了

    本篇参考:https://help.salesforce.com/s/articleView?id=release-notes.rn_lwc_workspaceAPI.htm&release= ...

  2. Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例

    Unity 性能优化之Shader分析处理函数ShaderUtil.HasProceduralInstancing: 深入解析与实用案例 点击封面跳转到Unity国际版下载页面 简介 在Unity中, ...

  3. 【matplotlib基础】--动画

    matplotlib的动画一直是一个强大但使用频率不高的功能,究其原因,一方面展示动画需要一定的媒介,没有图形和文字展示方便:二来大家更关心的是分析结果的最终图表,图表的动态展示则没有那么重要. 不过 ...

  4. 噢耶!字节后端Offer,拿到了

    很多同学反馈多搞点面经,说来就来! 今天分享一位拿到字节跳动实习Offer的面经,没错,Java转Go. 别问我选Java还是选Go,成年人不做选择题.先搞定一个语言,再学第二语言从来不是难事. 无论 ...

  5. Redis系列之——Redis介绍安装配置

    文章目录 第一章 redis初识 1.1 Redis是什么 1.2 Redis特性(8个) 1.3 Redis单机安装 1.3.1下载安装 1.3.2三种启动方式 1.3.2.1 最简启动 1.3.2 ...

  6. 判断两个数a,b,输出较大数的平方值。所谓平方值就是两个相同的数相乘的积。

    平方值   描述 判断两个数a,b,输出较大数的平方值.所谓平方值就是两个相同的数相乘的积. 输入 两个数a和b 输出 输出较大数的平方值. 输入样例 1 1 2 输出样例 1 4 a,c = map ...

  7. win10系统单独编译和使用WebRTC的回声消除(AEC)、音频增益(AGC)、去噪(NS)模块

    一.简介 本人想单独编译并使用WebRTC的音频回声消除模块,奈何技术有限,于是在百度的海洋里大海捞针,发现了https://www.cnblogs.com/mod109/p/5827918.html ...

  8. [ABC212E] Safety Journey 题解

    Safety Journey 题目大意 给定一张缺少了 \(m\) 条边的 \(n\) 个点的完全图和一个正整数 \(k\),你需要求出满足以下条件的序列 \(A\) 的数量: \(A\) 的长度为 ...

  9. 17.1 隐藏执行CMD命令

    本章内容涉及使用Socket API和CMD命令行工具实现本地CMD命令执行.无管道正向CMD和无管道反向CMD三种功能.执行本地CMD实现使用CreateProcess函数创建一个新的CMD进程,并 ...

  10. bootstrap响应式原理

    Bootstrap 框架的网格系统工作原理如下:1 .数据行 (.row) 必须包含在容器( .container )中,以便为其赋予合适的对齐方式和内距 (padding) . 如: <div ...