首页 > 其他分享 >NC65二开经验总结

NC65二开经验总结

时间:2023-12-26 10:13:28浏览次数:37  
标签:String 二开 nc getBillCardPanel 单据 ui NC65 import 经验总结

公式相关

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();
    }
}

标签:String,二开,nc,getBillCardPanel,单据,ui,NC65,import,经验总结
From: https://www.cnblogs.com/kwoky/p/17927489.html

相关文章

  • Sliver 二开准备
    cs被杀麻了,最近打算看看一下sliver的源码进行一下二开,这篇是记录遇到的一些问题编译sliverWindows下官方说用MingW,但是我自己用他带的make不行,​​‍下载make搜了一下,记录编译make的过程:直接传送门下载需要的版本,比如这里下4.4的。​​‍编译make下载解压之后进入......
  • WebAPI局域网访问出错(经验总结)
    WebAPI局域网访问出错(经验总结)经验一:未设置入站规则方法:控制面板->系统和安全->WindowsDefender防火墙->高级设置->入站规则->新建规则->端口->,如图:下一页特定本地端口为WebAPI在IIS中设置的端口号。选择允许连接,最后起个名称完成即可。即可通过此设备......
  • redis实践经验总结
    Redis内存配置当Redis内存不足时,可能导致Key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率达到80%以上时就需要我们警惕,并快速定位到内存占用的原因。一般来说,会有以下几种占用内存的情况:数据内存是Redis最主要的部分,存储Redis的键值信息。主要问题是BigKey问题......
  • 分享一款基于jsplumb.js的二开工作流绘制工具
    lazyflow-modeler介绍基于jsplumb二开的模型绘制工具,jquery版,易拓展软件架构jsplumb+jquery+bootstrap安装教程1.直接访问drawer.html使用说明1.约定了上下左右4个端点2.允许回连3.拒绝自连4.无nodejs依赖5.本人非前端开发人员,js规范问题请无视giteehttps://gitee.com/fing......
  • 交友系统,APP小程序H5,三端源码交付,支持二开!交友系统:打造独具魅力的社交平台
    随着社交媒体的兴起,交友系统成为了现代社会不可或缺的一部分。人们希望通过网络结识新朋友,拓展社交圈,寻找志同道合的伙伴,甚至找到自己的爱情。本文将为您介绍交友系统的定义、功能以及如何打造一个独具魅力的社交平台。交友系统是一种基于互联网的社交平台,旨在让用户更便捷地认识......
  • 记账中心二开
    系统预设了这几种FSubSystem 为子系统T_VC_SubSystem  卡片显示的表 字段  FNeedRalteAccount设置为1的话,需要与总账连用系统将去查找系统状态控制表。 如果系统状态没有配置这个子系统将无法显示数据selectsysStaCtr.fidfromT_BD_SystemStatusCtrolsysStaCtr......
  • 基于Vue3.3 + TS4 ,让我们自主打造比肩 ElementPlus 的优质组件库的一些经验总结
    Vue.js作为一款流行的JavaScript框架,在前端开发中扮演着重要的角色。本文将分享在Vue3.3和TypeScript4的环境下,打造优质组件库的经验总结,并提供相关示例代码。一、创建项目并配置开发环境首先,我们需要创建一个新的Vue项目并配置好开发环境。具体步骤如下:使用VueCLI创建一个新的......
  • 分享一套适合二开的JAVA开源版本MES系统
    1、系统概述:万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES。1.万界星空开源MES制造执行系统的Java开源版本。开源mes系统包括系统管理,车间基础数据管理,计划管理,物料控制,生产执行,质量管理,库存管理,看板管理,数据分析等主体功能模块......
  • 经验总结
    总结项目"防御性编程"的思维。对于api、dao、service各自独立为一个模块将计算密集型与IO/存储密集型分割开来,提高资源利用率数据冗余:Coupon表多了一个shop_id字段。通过打破范式,应对高并发的场景,你必须尽可能提高系统的吞吐量和性能,以空间换时间业务Long来表示“金额”......
  • 金蝶云星空二开单据明细按钮绑定了权限项但是没控制到权限的问题排查
     明细按钮:行关闭和行反关闭,分别绑定了SCM_ROWCLOSE和SCM_ROWUNCLOSE 绑定这个,不管授权与否,都可操作成功。 解决方案:创建新的权限项 权限对象绑定权限项 BOS界面配置  授权后即可正常操作。已达到目的。......