NC开发笔记——NC63开发方法总结

时间:2022-12-28 18:22:17

   

1、提示信息输出

 

方法一:写在ToPanel里面的publicvoid valueChanged(ValueChangedEvent event) {方法中添加如下代码   

ShowStatusBarMsgUtil.showStatusBarMsg("—→  ★正在使用综合评定登记,祝您使用愉快★",getModel().getContext());

方法二:

//定义提示信息变量

        intsuccess = 0, fail = 0;

        success = success + 1;

        fail = fail + 1;

StringBuffermessage=new StringBuffer();

        message.append("当前选中的数据中\r\n");

        if(success != 0) {

            message.append("  "+success+"条数据转入下一阶段成功\r\n");

        }

 

        if(fail != 0) {

            message.append("  "+fail+"条数据转入下一阶段失败,原因:当前阶段为最后阶段\r\n");

        }

 

        if(success!=0){

            MessageDialog.showHintDlg(null, "提示",message.toString());

        }else{

            MessageDialog.showErrorDlg(null, "提示",message.toString());

        }

    }

 

 

2、Uap63出现的错误

没有授权破解,放入破解包重启。

3、发生两个不同VO对象转换的错误

@Override

    protectedboolean isActionEnable() {

        Object obj = this.model.getSelectedData();//获取选择数据

        if (!MMValueCheck.isEmpty(obj)) {

            if(obj instanceof EmployStageVO){  //判断选择的obj数据是否属于EmployStageVO对象的数据

                EmployStageVO vo=(EmployStageVO)obj;

            }else{

                FlightfiltrateVO vo = (FlightfiltrateVO)obj;

            }

            returntrue;

        }

        returnfalse;

    }

4、该错误是产品未授权

第一步启动sysconfig

 

把生成的hardkey.req文件考出来登录http://udn.yyuap.com找到产品授权页

把文件上传等待审核,文件发送回来后替换对应的文件

 

5、单据模版、查询模版sql脚本的导出

              单据模版sql脚本的导出

--查询单据模版出对应模块的pk_billtemplet

select* from pub_billtemplet where pk_billtypecode='60Hflight';

--查询出该pk_billtemplet模块下对应的字段

select* from pub_billtemplet_b where pk_billtemplet ='0001ZZ10000000005DOC' anditemkey in ('psnname','pk_post')

--1方法手动改成更新语句

updatepub_billtemplet_b set  REFTYPE='发布职位,code=N' where pk_billtemplet ='0001ZZ10000000005DOC' anditemkey='pk_post';

updatepub_billtemplet_b set  REFTYPE=''                where pk_billtemplet='0001ZZ10000000005DOC' and itemkey='psnname';

--2方法先删除对应模块的对应字段之后在插入该字段

deletefrom pub_billtemplet_b where  pk_billtemplet='0001ZZ10000000005DOC' and itemkey in ('psnname','pk_post');

insertinto pub_billtemplet_b ()values ();

                查询模版sql脚本的导出

6、登陆的时候no token seed  错误

要加入

如果ncsysconfig.bat启动不起来,请直接修改home\ierp\bin\prop.xml配置文件,添加如下内容:
<fdbPath>fdb</fdbbPath>
<tokenSeed>3120edfa482109ea52613b25ca330d66</tokenSeed>
<priviledgedToken>25318f1adafaaabef2ec3e430fe198a3</priviledgedToken>

1,将附件替换uaphome\ant\lib下的同名文件. 
  2,执行ncsysconfig.bat
  3,在系统配置--安全--令牌种子,点重置,保存
    在调试状态下再次重起中间件,登陆成功.

7、发布元数据增加一个页签后报没有定义查询根据pk查找的接口或者接口定义不规范,请检查

有可能是元数据一系列的VO类中有错误,或者该节点的表中缺少对应字段

8、数据会回写后台操作

Voupdate

PersistenceManager

管理连接会话的生命周期,并提供了对单表VO操作的常用实现

可以传递构造参数选择不同的数据源

JdbcSession

JDBCAPI封装和简化

SQLParameter

封装执行SQL的参数

ResultSetProcessor

结果集处理回调接口,封装结果集处理

DbException

封装不同数据库的异常,和统一处理不同数据库的Error Code

BaseDAO / IUAPQueryBS / IVOPersistence

管理连接会话的生命周期,提供了对单表VO操作的常用实现

 

8、java.lang.ClassNotFoundException: nc.md.model.MetaDataException

    atjava.net.URLClassLoader$1.run(URLClassLoader.java:200)

    atjava.security.AccessController.doPrivileged(Native Method)

    atjava.net.URLClassLoader.findClass(URLClassLoader.java:188)

    atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)

    atjava.lang.ClassLoader.loadClass(ClassLoader.java:252)

    atjava.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)

    atjava.lang.Class.getDeclaredMethods0(Native Method)

    atjava.lang.Class.privateGetDeclaredMethods(Class.java:2427)

    atjava.lang.Class.getMethod0(Class.java:2670)

    atjava.lang.Class.getMethod(Class.java:1603)

    atncmdp.project.MDPComponentsFactory.initProps(MDPComponentsFactory.java:159)

    atncmdp.project.MDPComponentsFactory.createCompProjects(MDPComponentsFactory.java:144)

    atncmdp.project.MDPComponentsFactory.getProjectData(MDPComponentsFactory.java:62)

    atncmdp.util.ProjectUtil.initTreeViewer(ProjectUtil.java:426)

    atncmdp.project.MDPExplorerTreeView.createPartControl(MDPExplorerTreeView.java:297)

    atorg.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:375)

    atorg.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:229)

    atorg.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:595)

    atorg.eclipse.ui.internal.WorkbenchPage$ActivationList.setActive(WorkbenchPage.java:4317)

    atorg.eclipse.ui.internal.WorkbenchPage$18.runWithException(WorkbenchPage.java:3359)

    atorg.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)

    atorg.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)

    atorg.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)

    atorg.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4140)

    atorg.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3757)

    atorg.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803)

    atorg.eclipse.ui.internal.Workbench$33.runWithException(Workbench.java:1600)

    atorg.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)

    atorg.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)

    atorg.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)

    atorg.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4140)

    atorg.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3757)

    atorg.eclipse.ui.internal.Workbench.runUI(Workbench.java:2609)

    atorg.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499)

    atorg.eclipse.ui.internal.Workbench$7.run(Workbench.java:679)

    atorg.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)

    atorg.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668)

    atorg.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)

    atorg.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)

    atorg.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)

    atorg.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)

    atorg.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)

    atorg.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)

    atorg.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)

    atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

 

 

 

 

 

 

9、从网页端登入NC系统选项为空

地址改成:

 

 

 

10java.lang.UnsupportedClassVersionError:nc/vo/pmpub/project/ProjectHeadVO

在对应的代码地方加上版本号

 

 

NC二开经验总结

公式相关

1.显示公式没执行

列表界面显示,卡片界面不显示:

 

HandleronBoCard执行:getBillCardPanel().execHeadLoadFormulas();

 

ControllerisLoadCardFormula返回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(newString[]{"hzdy38","hzdy39","hzdy40","hzdy41","hzdy42"});

 

5.AggVO显示到单据界面上

billCardPanel.setBillValueVO(aggvo);

 

系统变量相关

1.单据号

前置任务:配置单据号规则

 

创建单据号:new HYPubBO().getBillNo(单据类型, 组织, null, null);

 

或者:getVbillCode(单据类型,组织);

 

new BillcodeGenerater().getBillCode (单据类型, 组织,null,null);

 

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.xmlSysconfig下才能找到该模块

 

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.下拉字段

数据库里保存的是 0123.。。。所以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里找到相应的模块,将publicprivateclient下的代码导出的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.创建主键

newSequenceGenerator().generate(pk_corp,num);

 

6. 保留小数点后2位,并“四舍五入”

new UFDouble().setScale(2,UFDouble.ROUND_HALF_UP);

 

自定义查询方法

public voidqueryBodyData(String strWhere) throws Exception {

  doBodyQuery(strWhere != null ? strWhere :"");

 }

自定义查询方法的填充

protected voiddoBodyQuery(String strWhere) throws Exception,

   ClassNotFoundException,InstantiationException,

   IllegalAccessException {

  SuperVO queryVos[] =getBusiDelegator().queryByCondition(

   Class.forName(getUIController().getBillVoName()[2]),

    strWhere != null ? strWhere :"");

  getBufferData().clear();

  AggregatedValueObject vo =(AggregatedValueObject) Class.forName(

   getUIController().getBillVoName()[0]).newInstance();

  vo.setChildrenVO(queryVos);

  getBufferData().addVOToBuffer(vo);

  updateBuffer();

 }

自定义刷新方法¨

 @Override

 protected void onBoRefresh() throws Exception{

  queryBodyData(null);

 }

自定义删除方法

@Override

 protected void onBoDelete() throws Exception {

  //获得的选中的行数

  introw=getBillCardPanelWrapper().getBillCardPanel().getBillTable().getSelectedRow();

  System.out.println("选中的行数:"+row);

  if(row==-1){//判断是否选中行数

   MessageDialog.showErrorDlg(null, "错误", "必须选中一行信息,才能进行删除操作");

   return;

  }

 if(MessageDialog.showYesNoDlg(getBillUI(),"是否删除","确定要删除!")!=UIDialog.ID_YES){//是否确认删除

   return;

  }else{

   System.out.println("主键ID"+getBillCardPanelWrapper().getBillCardPanel().getBillModel().getValueAt(row,"pk_cpkcquzd"));

   //获得自定义的接口

   McKcQd_ManageItfmcKcQd_ManageItf=NCLocator.getInstance().lookup(McKcQd_ManageItf.class);

   StringBuffer sql=newStringBuffer("");

   sql.append("update cp_kcquzd set dr=1wherepk_cpkcquzd='"+getBillCardPanelWrapper().getBillCardPanel().getBillModel().getValueAt(row,"pk_cpkcquzd")+"'");

  mcKcQd_ManageItf.executeUpdateBySql(sql.toString());

   //执行删除后刷新

   queryBodyData(null);

  }

 }

 

7、插入数据

new HYPubBO().insertAry

 

8、生成编码的方法

getbillcode(billtype,pk_group,pk_org,null)