你好,游客 登录 注册 搜索
背景:
阅读新闻

用友NC二次开发问题汇总【转】 - 小李专栏

[日期:2013-03-30] 来源:  作者: [字体: ]

一、供应链采购订单问题
在采购订单参照请购单时,若选择了10行请购单的记录,采购订单的表体也就显示了10条记录,如何才能实现还可以再弹出请购单的参照,追加一条记录,而不需要取消单据后重现选择请购单。

答:截止最新版本,你这个问题只能是退回去,重新选择11条过来,不能如你希望那样10条不动再追加第11条.这是个易用性改进的需求,我转给SCM开发部门.

二、3.1的XML导入文档

只有项目基本档案、客商基本档案,现在客户在5.0的基础上导入
而且人员档案也分成了集团级和公司级。请问
1、项目基本档案和项目管理档案是否只用一个XML文件即可
2、客商基本档案和客商档案是否需要分别导入
3、人员基本档案和人员档案是否需要分别导入
如果有文,请提供(导入文档和XML交换文件格式)

答:1 、RE: 50中可以导入项目基本档案,导入时如果指定导入的公司时,基本档案会自动分配生成项目管理档案。
2、RE:客商基本档案导入时,如果指定了分配的公司,可以自动把基本档案分配到公司生成客户档案和供应商档案
3、RE:人员基本档案和人员档案不需要分别导入,是在一个完成的XML文件中表示数据的

三、关于NCv5的代码部署

自己完成了一个NCv5的程序,需要部署,我是把public、private、client、gen分别打包,然后把jar和xml在一个一个分类拷贝到对应的文件夹,好麻烦,为什么不能在eclipse中直接就部署到nchome呢?.

答:eclipse里面 uap有个工具,右键mde tools 下 export module可以将代码打包,不用一个个来打jar包。
导出来的目录直接考到nchome下module 就可以

四、nc5中下拉框不能返回其内容的问题
在单据模板和查询模板中,将一个字段的数据类型设置为"下拉框",并且设置参照名称为"I,01,02,03,04,05"。运行时下拉框的内容可以显示出来,
但是返回的却是所选值的索引序号,即0,1,2,3,4。 在查询模板中设置了返回类型和显示类型都没有效果。
求助:这是V5的bug还是哪里设置的不对?
我用的是V501

答:换成 SX,01,02,03,04,05

前面设置的参数都有哪些?分别有什么作用?

答:设置查询模板某一字段的数据类型是"下拉" ,然后在参照类型中输入字符串"IX,自由态,游离态,..."
  IX,UPP10080806-000024=外部单位,UPP10080806-000040=内部核算单位,UPP10080806-000041=内部法人单位,UPP10080806-000042=内部渠道成员
  CX,UC000-0001589=客户,UC000-0000275=供应商,UC000-0001574=客商
  I,工行,招行,人行,建行
  字符串的前缀有 I IX C CX S SX 六种代表不同的含义:
  I  将下拉框的索引号作为整型返回
  IX  将下拉框的索引号作为整型返回
  C  将下拉框的索引号作为Char类型返回
  CX  将下拉框的索引号作为Char类型返回
  S  返回下拉框中显示的内容
  SX  可设置返回值和显示内容的对应关系,选择某一个显示值则会返回该显示值对应的返回值 格式 "SX,自由态=6,审核通过=7,审核不通过=9"
  以上六种类型中两个字母的(IX、CX、SX)可通过"="号设置对应关系,而剩下的类型会把整个字符串包括"="号都显示出来。

五、关于树的问题一个左树右表结构的管理界面的单据不知道如何把树的ROOT根结点改成其它的名字,  还有我对右表里面的数据增加、保存、删除后'如何能同一时间刷新左边的树''用的是V501

答:对于树卡片类界面,调用父类BillTreeCardUI的modifyRootNodeShowName方法修改根节点名称,
对于树管理类界面,调用父类BillTreeManageUI的modifyRootNodeShowName方法修改根节点名称,

UI类对应的Control类的isAutoManageTree方法返回值是true可以在编辑卡片或列表界面后自动刷新树的节点。

在ui类中 可以  ((TableTreeNode)getBillTree().getModel().getRoot()).setUserObject("name");

六、怎样编写代码在待办事务中发送一条消息?
答:可以参考下, 后台代码,就是往数据库插入一条记录
//////////////////////////////
        PFMessageBO pfm = new PFMessageBO();
        CommonMessageVO comvo = new CommonMessageVO();
        UserNameObject usvo = new UserNameObject("a");
        usvo.setUserPK("0001ZZ100000000000VJ");
        usvo.setUserCode("a");
        usvo.setUserName("a");
       
        comvo.setSender("a");
        comvo.setReceiver(new UserNameObject[]{usvo});
        comvo.setMessageContent("导入数据演示");
        comvo.setTitle("外部平台导入数据");
        comvo.setType(MessageTypes.MSG_TYPE_INFO);
        pfm.insertCommonMessage(comvo);
       
        ///////////////////////////////


参见类  nc.ui.uap.sf.SFClientUtil
    showNode(String nodecode)

七、报表开发中遇到的问题在报表中,需要对 XX率(比如兑现率) 进行小计合计, 兑现率 = 实发量 / 计划量 , 是一个百分比数, 现在点击"小计合计"按钮,对该列进行统计,是将所有的兑现率加起来,这样算法是错误的,应该是
兑现率合计 = 累计实发量 / 累计计划量.

错误的结果:

                兑现率(%)
存货1          50
存货2          90
-小计-          140
-合计-          140
现在不知道修改哪个方法能够修改这个问题,使点击"小计合计"按钮后,将小计合计数由自己来计算.

答:添加 2列内容累计实发量 , 累计计划量 在设置公式列 ( 兑现率)=累计实发量/累计计划量

八、制作报表穿头规则的时候自动生成的代码出现编译类错误制作支持穿透的报表时候,利用左侧的"查询间穿透"代码生成向导生成的规则片段报编译类错误,
生成的代码片段如下:
String value = getPeneValue("SUBJNAME");
getHashParam().put("subj", new ParamVO(value));
StorageDataSet ds = ModelUtil.getQueryResult("gldetail4pene", getHashParam(), "design");
setId("gldetail4pene");
setDataSet(ds);

出现的错误如下:
nc.vo.uap.queryengine.QEBusinessException: 编译类错误....

at nc.bs.pub.querymodel.PenetrateRuleUtilBO.check(PenetrateRuleUtilBO.java:49)
at nc.impl.uap.queryengine.EmbedCodeUtilImpl.checkPenetrateRule(EmbedCodeUtilImpl.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at nc.bs.framework.comn.serv.ServiceDispatcher.a(ServiceDispatcher.java:320)
at nc.bs.framework.comn.serv.ServiceDispatcher.execCall(ServiceDispatcher.java:129)
at nc.bs.framework.comn.serv.CommonServletDispatcher.doGet(CommonServletDispatcher.java:76)
at nc.bs.framework.comn.serv.CommonServletDispatcher.doPost(CommonServletDispatcher.java:95)

使用的开发环境,版本是nc501,我使用system.out.print();它也报编译类错误

答:在起中间件服务的JAVA项目的构建路径中增加以下外部JAR就可以了:
%JDK%/lib/tools.jar

九、启动NC客户端时报错每次启动NC的客户端时总会提示
Java.lang.ClassNotFoundException:nc.bs.framework.comn.NetStreamConstants错误?
但是这个错误似乎并不是很影响运行

答:是在V5.011后版本去掉.你可以不管这个信息,不影响使用

十、在哪个方法中增加查询条件在哪个类里面增加查询条件.我现在想增加一个条码的查询条件

答:你说的查询条件是指查询对话框中的条件吗?
如果是 只需配置查询模版即可

十一、总账如何查询某个会计月是否已结账答:ICreateCorpQueryService  cc=  (ICreateCorpQueryService)getLocator().lookup(ICreateCorpQueryService.class.getName()); 
  //查询总帐的最小未结帐月份
    String[] sYearMonth = cc.querySettledPeriod(dwbm, "GL");

//再用sYearMonth 与当前月份比较,即可判断是否结帐

十二、关于持久化事务在预警平台中调用了

JdbcSession session = sessionManager.getJdbcSession();
  conn = session.getConnection();
  conn.setAutoCommit(false);

程序里做了分段提交。 但是运行后发现似乎还是最后所有数据一起提交。
由于操作的数据量比较大,所以不想以整个包所有数据为一个事务。
而且程序中有这样的片段。统计一组数据,生成xml文件,打标志位。如果是所有数据一个事务的话会造成一部分数据文件已经生成,但是标志位没有打上的情况。最后就形成了xml文件重复的问题。
有没什么方法,或哪里设置能让程序在调用 conn.commit后就真的进行数据提交。

答:事务型的组件是指该组件的方法调用中事务处理会自动参与,这类组件的开发与远程组件类一样,也是基于接口的,同样我们对接口没有任何的特别要求,
普通借口就可以了。
V5.0中的事务参与模型通过方法名后缀进行判断,判断的方法如下:
?
方法名后缀RequiresNew: 新事物
?
方法名后缀Mandatory: 必须在一个已有的事务环境中运行改方法
?
方法名后缀Supports: 只是支持事务,不建议使用
?
方法名后缀NotSupported:不支持事务,不建议使用
?
方法名后缀Never:不能有事务,否则出错
?
没有方法名后缀:
如果有事务,就在该事务环境下工作,否则新启事务,这是大部分事务型组件的情况

十三、NC缓存出现的问题
修改后的代码更新到服务器上后,3.5以上的版本应该是不需要重新启动应用服务器客户端就应该自动更新,即支持动态部署...但为什么在客户哪里我都把应用服务器重新起到了,可客户端代码还是不更新...在缓存目录删除对应的代码后,界面还是可以运行,应该说明是没有用到这里的代码,这是为什么呢?代码是自己写的,没有使用单据模板...


答:这里可能有些不稳定,不过手工清一下缓存还是放心一些

十四、在NC中使用过web service ?能不能介绍下经验
答:NC的外部交换平台就是NC的一个典型的web service 的应用


十五、WAS 部署问题
NC501版本,配置了 WAS 集群,有主从两台服务器。目前开发了一个模块需要部署到WAS上,可是一直不能正确部署,新注册的功能节点根本就打不开。
新的模块概述:
                                                                                                                                           
1、模块名称为 imptool。
2、需要后台完成的功能就是查询会计科目,在 imptool.module 文件中把相关的类配置为 public 形式,而不是 private 。
3、生成 ejb 代码:使用 eclipse MDE 的 module 工具根本就不对 public 形式的组件生成 ejb 代码,所以不生成 imptool_proxy.module 文件。
总上所述,我认为不需要部署 ejb。或是应该部署 ejb,那如何进行部署呢 ??
另外,

是否在部署模块到 WAS 上需要两个步骤,1、部署 ejb,2、部署模块的代码 ?? 都需要怎么操作??

答一:1.如果没有ejb或者proxy确实不需要生成ejb。
2.但向was中重新部署过程还是需要的,部署过程会更新classpath路径。新增加的module才能正常访问。
正常的部署过程应该是
1.生成ejb。这过程会先生成nc50.ear,根据proxy描述文件生成对应proxy。
2.部署ejb。根据ear包和其内的描述文件将ejb和war包部署到was中。帮助文件的变化也是需要重新部署的。

答二:我这么做部署成功过:
    1 先把自己的代码用MDE Tools-〉Export Module 导出。
    2 通过FTP或其他方式把刚才导出的模块放到was服务器上的nchome/modules里面。
    3 使用X-Manager或者其他可视化客户端工具连接服务器。停was服务后,运行nchome/bin/wasSysConfig.sh。选择Deployment做如下操作:读取、修改、全选、保存、生成EJB、部署EJB。
    4 启动was服务。
    5 如果存在was集群,将第2、3步操作在集群中的其他机器上同样进行一遍。在所有服务器上操作完成后,启动服务器。

    注意:如果新的模块中没有使用ejb则不用执行第3步操作。将模块拷贝到nchome/modules后直接重启was服务即可。
            如果新的模块中使用了ejb,这nc.itf.xxxx.XXX接口的方法中一定不能使用jdk1.5的语法如:ArrayList<String>。如果使用了会导致ejb部署失败,因为was使用IBM的jdk,还可能有版本问题。

十六、开发节点的授权问题比如说 客户化的节点编码是10,财务是20,供应链是40,我想增加一个 80 的一级节点可以吗?是否会受产品授权的制约?
现在测试时好像没什么问题,但怕开发完了以后,最后上线实施时,放到小型机的正式产品中用不起来怎么办?

答:二次开发和行业开发的模块,要以H开头,可以不受产品授权控制.'80'不可以,部署到正式系统上是不能用的.

十七、Active Directory 作为LDAP用java访问
问:我们的 J2EE 应用程序目前正通过我们在内部开发的 LDAPAuthentication 类访问 Domino LDAP Server 进行认证。这一 LDAPAuthentication 类将使用 JNDI API 来搜索 Domino LDAP Server。然而,我们无法使用这个 LDAPAuthentication 类来搜索 Active Directory,因为 Active Directory 不支持 JNDI API。有没有另一个 JAVA API(Active Directory 支持)可供我们用来定制 LDAPAuthentication 类以访问 Active Directory 进行认证?

答:ActiveDirectory 支持 LDAP 协议,您可以在 Java 中使用标准的 Java JNDI API 来访问它。LDAP 服务器并非真的必须支持 JNDI API,只要支持 LDAP 协议就可以了。如果您
有问题,最有可能是关于您打算如何访问 ActiveDirectory 的配置问题。我已经提供了一个简单的测试案例程序来认证一个 LDAP 服务器的识别名。请确认您的 LDAPAuthentication 类与它基本相同。一般情况下,您对待 ActiveDirectory 不必与对待任何其他的 LDAP 服务器有什么不同。
import java.util.Properties;
import javax.naming.*; 
import javax.naming.directory.*;

//include the JNDI in the classpath. You should use the same JDK used by WebSphere Application server.

class wasLdapAuth
{
public static void main(String[] args)
{
    //***************** user information to be authenticated ********************************
    //*****************Please modify the following three properties accordingly ************
    String ldapHost= "ldap://cliang1.austin.ibm.com:389"; //ldap host + port number
    String DN = "cn=user1, ou=Austin,o=ibm,c=us";  // DN to be authenticated
    String password = "security";  //  DN's password   
    //***************** End of user information
   
    Properties props = new Properties(); 
    props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");   
//for websphere 4.0 and 5.0
    //props.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.jndi.LDAPCtxFactory");   
// for WebSphere 3.5 release
    props.put(Context.SECURITY_AUTHENTICATION, "simple");    //use simple authentication mechanism
    props.put(Context.SECURITY_CREDENTIALS, password); 
    props.put(Context.SECURITY_PRINCIPAL, DN);   
    props.put(Context.PROVIDER_URL, ldapHost); 

    long start = System.currentTimeMillis();
    long end=0;
    long time =0;

    try
        {
        System.out.println("authenticating");

DirContext ctx = new InitialDirContext(props);
        System.out.println("authenticated");
        end = System.currentTimeMillis();
        time = end - start;
        System.out.println( "authentication takes = " + time + " millis");   
        System.out.println("successfully authenticate DN: "+DN);

    }
        catch (Exception ex)
    {
        end = System.currentTimeMillis();
        time = end - start;
        System.out.println("Exception is "+ex.toString());
        ex.printStackTrace();
        System.out.println( "authentication takes = " + time + " millis");   
        System.out.println("fail to authenticate DN: "+DN);
    }
}
}

十八、几个NC二次开发中常用的方法//取得单据号(从NC取,服务器端)
String billNo = new nc.bs.trade.business.HYPubBO().
getBillNo(ISYYSBilltype.CTRLDDEPT_BGT_BILL, parentVo.getPk_corp(), null, null); // 设置单据号

//取得单据号(从NC取,客户端)
return HYPubBO_Client.getBillNo(getUIControl().getBillType(), _getCorp().getPrimaryKey(), null, null);

//在UI中设置按钮状态
getButtonManager().getButton(nc.ui.trade.button.IBillButton.Add).setEnabled(false);

//取系统参数
从 pub_sysinit 表取
"select pk_sysinit, pk_corp, sysinit, sysindex, initcode, initname, makedate, value, editflag, controlflag, remark, defaultvalue, valuelist, stateflag, domainflag, paratype, groupcode,groupname,mainflag,mutexflag,showflag,jzflag,valuetype,sysflag,checkclass,editclass,dataclass,pkvalue,afterclass from v_pub_sysinit where  initcode = '" + paraCode + "' and pk_corp = ? order by sysindex ";
select * from pub_sysinit where initcode='SYYS601';

//刷新页面上的数据
SuperVO[] queryVos = queryHeadVOs(str_sqlwhere); 

//查询数据
updateBuffer(queryVos); 
//修改缓存
((nc.ui.trade.treemanage.BillTreeManageUI) getBillUI()).setListHeadData(getBufferData().getAllHeadVOsFromBuffer());

十九、调用外部交换平台返回类SendResult的问题在代码中调用PostFile中的方法sendFileWithResults
SendResult result = PostFile.sendFileWithResults(newfile, url,"D://", "D://", true);
谁知道第四个参数是什么意思?
放回类SendResult怎么从中得到是否发送成功的信息?

答:parameter1: 要发送的文件.
parameter2: 要调用的servlert 的服务器路径
parameter3: 返回文件的存放路径
parameter4: 发送成功后,文件移动备份的地址
parameter5: 是否压缩传送

SendResult result = PostFile.sendFileWithResults(docfile, url, "[url=file:////backFiles]//backFiles[/url]", "[url=file:////moveFiles]//moveFiles[/url]", false);
Document rtnDoc = result.getBackDoc();

rtnDoc 是一个有格式的 xml 回执文件;里边有一个 <resultcode>1</resultcode> 为 1 的时候为成功.否则 就是错误编号.
<resultdescription>成功或错误信息</resultdescription>;
方法中间的参数, 是回复时网页自动生成的 ,就是两个路径

二十、NC50做的树卡界面 开发环境没问题 部署到中间件上树没了用二次开发工具配置的一个卡片UI单据,手工改成树卡单据 开发环境没问题,但部署到运行环境上之后 树没了

答:因为我在开发环境中开的中间件 然后通过IE作为客户端来访问
只要从命令行启动中间件就没有问题了

二十一、NC5.0开发环境配置问题开发环境和数据库在同一个机器上,数据库用的是orcale9i。配置好环境后,启动JStarter后报如下错误:
但是直接启动产品则没有任何问题,在MDE中测试链接数据库也可以测试成功。换了一个环境,重新配置也遇到这样的问题。有谁碰到过这样的问题,帮助小弟解决一下,非常感谢!

java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.Socket.connect(Socket.java:516)
at java.net.Socket.connect(Socket.java:466)
at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:365)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:477)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:214)
at sun.net.www.http.HttpClient.New(HttpClient.java:287)
at sun.net.www.http.HttpClient.New(HttpClient.java:299)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:796)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:748)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:673)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:840)
at nc.starter.test.JStarter.getMyAppletStub(JStarter.java:239)
at nc.starter.test.JStarter.StartNC(JStarter.java:114)
at nc.starter.test.JStarter.bnStart_ActionPerformed(JStarter.java:97)
at nc.starter.test.JStarter.connEtoC1(JStarter.java:140)
at nc.starter.test.JStarter.access$100(JStarter.java:26)
at nc.starter.test.JStarter$IvjEventHandler.actionPerformed(JStarter.java:42)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:5488)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
at java.awt.Component.processEvent(Component.java:5253)
at java.awt.Container.processEvent(Container.java:1966)
at java.awt.Component.dispatchEventImpl(Component.java:3955)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
at java.awt.Container.dispatchEventImpl(Container.java:2010)
at java.awt.Window.dispatchEventImpl(Window.java:1778)
at java.awt.Component.dispatchEvent(Component.java:3803)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

答:有使用插件自带的NC Middleware 用的是自己配置的StartDirectServer,这样的话就要配置启动参数

二十二、NC50二次开发工具做的模块 可以挂到其他节点上吗?用50二次开发工具 新做一个模块 里边有一张单据 功能代码都已经写好 怎么把这个模块 挂到供应链模块的某一个节点上, 以前3.X 只要在供应链模块新增一个节点 把UI类挂上去就好了 我找了一下好像都没有配置的地方

答:目前的版本是你所说的这样,
只能先在自己建的项目下增加功能,再修改其节点编号,挂在"供应链"下面

二十三、关于表的增行保存问题
在表单的行操作中,选择"增行",如果不填任何数据就保存的话.是保存了空行还是系统自动去除了空行?怎么控制的?我在开发过程中这两种情况都遇到了.当然可以写判断方法.只是想知道为什么会出现这两种情况?

答:如果你未加任何判断,数据库表结构又允许这些字段为空,那就保存一条空记录了。
应该在UI类中增加判断,若某些字段为空,并且是最后一行,可以调用表单模板的删除行的方法在保存前自动删掉

二十四、关于50应收应付金额校验问题
客户要求在做应收应付单据的时候不仅要输入借方金额还需输入贷方金额,而应收应付单都有金额校验,如应收必须录入借方金额,这样就无法满足客户在同一张单据上即要录入借方又要录入贷方的需求,现想将NC中这个金额校验的功能去掉,和录入划账单一样,可任意录入借贷方金额;

借:应收账款-无营业部代理人XX客商  300
          应收账款-无营业部代理人XX客商    1700
销售费用-代理手续费-XXX收入类型,3U和非3U
        贷:国内票证结算      2000
其他应交款-机场建设费
        主营业务收入-退票费收入
这是一笔具体的业务,是不能拆分的,按NC目前的情况要做一个应收单,应付单,付款单三个单据才能完成这笔业务,而在实际中,这个业务是不能拆分的,必要在一张单据反应

答:请修改 nc/vo/arap/global/DjVOTreater

二十五、NClicense问题在功能注册中,注册节点为01开头,申请license后,打开节点提示"该产品的用户数已达到产品授权数",因为已建500个帐套,帐套中已有大量数据,不好更改节点号

答:以后不能再这样注册二次开发的节点了,必须要以H0开头

二十六、NC50单据上图片字段如何处理
在单据上有个字段是图片类型的 这个字段和其他字段一样是需要保存的 请问 VO 和 数据库如何处理

答:两个方案: 

    1: 单据上(数据库表)保存图片文件的路径信息,自己再实现一个图片加载显示的panle,根据这个路径加载图片

    2: 数据库表里设置一个blob字段,可以直接存放图片。
自己实现一个能显示图片的 rander
//首先在模版上设置此字段数据类型为: 图片类型
//在节点上新增单据时,双击此字段可以选择图片(和参照类似),选择后界面会自动显示
//单据保存时:
//得到路径
String path  = getBillCardPanel().getHeadItem("userphoto").getImagePath();

//取道文件名然后上传到服务器(默认路径是 nchome/webapps/nc_web/ncupload )
File file = new File(path);
FileManagerUtil.saveFileToServer("USERIMAGE/",file.getAbsolutePath());

//然后可以把服务器存取此 图片的路径和文件名 赋值到VO保存到数据库.


//以后查询的时候转载图片:
//首先取道此单据 VO 中的: 图片路径和文件名

File file = new File(vo.getUserPhoto);

//用下边方法把图片下载到 本地(默认是在 和缓存同级的 NCCODE/ 下)

FileManagerUtil.saveFileToLocal("USERIMAGE/", file.getName());

//构造 URL
URL url = FileManagerUtil.getFileURLLocal("USERIMAGE/", file.getName());
//为图片字段赋值
ImageIcon = new ImageIcon(url);
((UILabel)getBillCardPanel().getHeadItem("userphoto").getComponent()).setIcon(new ImageIcon(url));


直接构造远程的 URL 不把文件保存到本地也能显示,但测试时发现有时能显示,有时不能显示.

二十七、gl_voucher 凭证表,怎么判断是否记帐是根据 记帐日期 tallydate 和 记帐人 pk_manager 这两个条件来判断吗? pk_manager 默认值是 N/A 是啥意思


答:pk_manager 默认值是 N/A是未记账的意思
记账的话pk_manager 是记账人的PK

二十八、在50里 数据权限 如何设置
记得在35里 有个节点可以设置数据权限,即可以为每个用户设置不一样基础档案的参照内容。(以部门档案为例:共有两个部门,A用户的部门档案参照只能看到其中一个部门,而B用户只能看到另外一个部门)。

在 50里 该怎么设置啊???? 没有找到可以设置的节点啊。


答:可以把权限分配给角色,然后用户关联角色。
权限管理 - 资源权限控制:选择要控制的资源(部门档案),然后选择要权限控制的公司。
然后到权限分配里边,选择角色,公司和资源(部门档案),把具体数据权限分配给角色就ok了

二十九、NC50公司档案录入界面的字段名可以改吗?有个需求 要修改公司档案录入界面上字段的名称,如"公司名称" 改为 "项目名称" "公司编码" 改为"项目编码" 请问是否可行 如可行在哪里进行修改。

答:V5版本支持多语言,你可以在 resources/lang/simpchn 下搜索出目前的字段名称,然后修改成你想要的名称,重启服务即可

三十、如何取到当前登陆的帐簿信息
每个公司有多账簿的时候怎么取到当前登陆的帐簿信息?

答:BDGLOrgBookAccessor  使用这个类就可以,前后台都可调用

三十一、网银对账单生成凭证的可行性讨论
客户需求:
1.将NC50网上银行模块下载的银行对账单,自动到总账生成收付类凭证.
2.凭证分录上的科目根据对账单摘要的不同而改变.(有凭证模版的概念)。
3.一条对账单数据对应一张凭证。
问题:
1.可否通过将对账单数据发送至会计平台。通过配置会计平台的凭证模版根据NC【常用摘要】的不同而生成不同的凭证。
因为对账单也是一种单据,是否可通过配置单据类型、单据VO对照、单据影响因素等等条件来向会计平台靠拢。
2.手动下载对账单时,比如同样的下载条件下载2次,那在数据库中第一次下载的对账单记录主键和第二次下载的记录主键是一样的吗?
我看了一下 好像是一样的,但不是很肯定。
3.会计平台能否生成单边凭证.
4.银行对账单手动下载可否一次批量下载多个账套 多个账户的数据。

答:对帐单可以通过会计平台生成凭证,并且可以利用会计平台的一切功能,可动态生成摘要、科目等

NC50不支持单式凭证
可以将对帐单视为一种单据,给它定义一个单据类型、系统类型等,再保存对帐单时,将数据发送到会计平台,示例代码:

public void sendDAP(AggregatedValueObject vo) {
 
  DapMsgVO msgVO = new DapMsgVO();
 
  ResCostVO header=(ResCostVO) vo.getParentVO();
  ResCostdetailVO[] items=(ResCostdetailVO[]) vo.getChildrenVO();
 
  msgVO.setMsgType(DapMsgVO.ADDMSG);
  msgVO.setCorp(header.getPk_corp());
  msgVO.setSys("demo");
  msgVO.setProc("FY");
  msgVO.setBillCode(header.getVbillno());
  msgVO.setProcMsg(header.getPrimaryKey());
  msgVO.setBusiDate(header.getDmakedate());
  msgVO.setComment("办公费用");
  msgVO.setCurrency("00010000000000000001");
  msgVO.setMoney(items[0].getVmoney());
  msgVO.setOperator(header.getVoperatorid());
 
  try{
        IDapSendMessage bo = (IDapSendMessage)NCLocatorProxy.getLocator().lookup(IDapSendMessage.class.getName()); 
       
        bo.sendMessage(msgVO, vo);
       
     
       
    }catch(Exception e){
        e.printStackTrace();
       
    }
 
}

三十二、请问怎样在代码中取得中间件所在服务器上的文件路径或目录?
请问怎样在代码中取得中间件所在服务器上的文件路径或目录?


答:RuntimeEnv.getInstance().getNCHome()

三十三、审批流问题,为何审批人看不到消息
PfUtilClient.processAction("SAVE", "KCSP", this._getDate().toString(), (AggregatedValueObject)hYBillVO,
      FAPfUtil.UPDATE_SAVE);

kcsp是审批的单据的单据类型,以上代码写在申请单里面,审批单据配置了审批流,申请单未做其它处理,这样的写法对吗,后台vbillstatus改变了,但是审批人未收到消息

答:检查一下是否启动了审批流。
可查看wf-log.log日志跟踪原因

三十四、JAVA 可以直接从串口读数据吗?
项目要求直接从地磅上读取数据,请问有相关的资料吗?

答:可以考虑使用DLL接入,与硬件相关的,一般都采用本地码编写。
使用DLL,或者UNIX的so等文件接入。
网上找了一个程序,你也可以参考一下。

/** *//******************************************
* 程序文件名称:SendComm.java
*  功能:从串行口COM1中发送数据
******************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;

class S_Frame extends Frame implements Runnable,ActionListener
...{
  /**//*检测系统中可用的通讯端口类 */
  static CommPortIdentifier      portId;
  /**//*Enumeration 为枚举型类,在util中  */
  static Enumeration            portList;
  OutputStream                  outputStream;
  /**//*RS-232的串行口  */
  SerialPort                    serialPort;   
  Thread                        readThread;
  Panel                          p=new Panel();
  TextField in_message=new  TextField("打开COM1,波特率9600,数据位8,停止位1.");
  TextArea  out_message=new TextArea();
  Button    btnOpen=new Button("打开串口,  发送数据");
  Button    btnClose=new Button("关闭串口, 停止发送数据");
  byte      data[]=new byte[10240];
    /**//*设置判断要是否关闭串口的标志*/
  boolean  mark;

/**//*安排窗体*/
S_Frame()
...{ super("串口发送数据");
  setSize(200,200);
  setVisible(true);
  add(out_message,"Center");
  add(p,"North");
  p.add(btnOpen);
  p.add(btnClose);
  add(in_message,"South");
  btnOpen.addActionListener(this);
  btnClose.addActionListener(this);
} //R_Frame() end

/**//*点击按扭打开串口.*/
public void actionPerformed(ActionEvent event) ...{
if (event.getSource()==btnClose)...{
      serialPort.close();//关闭串口
      mark=true;  //用于中止线程的run()方法
        in_message.setText("串口COM1已经关闭,停止发送数据.");
  }
else ...{  mark=false;
    /**//*从文本区按字节读取数据*/
    data=out_message.getText().getBytes();
        /**//*打开串口*/
    start();
        in_message.setText("串口COM1已经打开,正在每2秒钟发送一次数据.....");
      }
} //actionPerformed() end

  /**//*打开串口,并调用线程发送数据*/
public void start()...{
  /**//*获取系统中所有的通讯端口  */
  portList=CommPortIdentifier.getPortIdentifiers();
  /**//* 用循环结构找出串口 */
  while (portList.hasMoreElements())...{ 
  /**//*强制转换为通讯端口类型*/
    portId=(CommPortIdentifier)portList.nextElement();
    if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL)...{
      if (portId.getName().equals("COM1")) ...{
        /**//*打开串口 */
        try ...{
serialPort = (SerialPort) portId.open("ReadComm", 2000);
          }
catch (PortInUseException e) ...{  }
          /**//*设置串口输出流*/
        try ...{
outputStream = serialPort.getOutputStream();
          }
catch (IOException e) ...{}
      } //if end
    } //if end
  } //while end
  /**//*调用线程发送数据*/
  try...{
    readThread = new Thread(this);
    //线程负责每发送一次数据,休眠2秒钟
readThread.start();
}
catch (Exception e) ...{  }
}  //start() end

  /**//*发送数据,休眠2秒钟后重发*/
  public void run() ...{
    /**//*设置串口通讯参数*/
    try ...{
        serialPort.setSerialPortParams(9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        }
catch (UnsupportedCommOperationException e) ...{  }
        /**//*发送数据流(将数组data[]中的数据发送出去)*/
  try ...{
outputStream.write(data);
  }
catch (IOException e) ...{  }
        /**//*发送数据后休眠2秒钟,然后再重发*/
  try ...{ Thread.sleep(2000);
      if (mark)
      ...{return;  //结束run方法,导致线程死亡
      }
      start();
      }
      catch (InterruptedException e) ...{  }
  }  //run() end
}  //类S_Frame end

public class SendComm
...{public static void main(String args[])
...{ S_Frame S_win=new S_Frame();
  S_win.addWindowListener(new WindowAdapter()
    ...{public void windowClosing(WindowEvent e)
      ...{System.exit(0);  }
    });
  S_win.pack();
}
}

/** *//******************************************
* 程序文件名称:ReadComm.java
*  功能:从串行口COM1中接收数据
******************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;

class R_Frame extends Frame implements Runnable,ActionListener,SerialPortEventListener
...{
  /**//*  检测系统中可用的通讯端口类 */
  static CommPortIdentifier    portId;
    /**//*  Enumeration 为枚举型类,在java.util中  */
  static Enumeration            portList;
  InputStream                  inputStream;
    /**//*  声明RS-232串行端口的成员变量  */
  SerialPort    serialPort;   
  Thread        readThread;
  String        str="";
  TextField      out_message=new TextField("上面文本框显示接收到的数据");
  TextArea      in_message=new TextArea();
  Button        btnOpen=new Button("打开串口");

/**//*建立窗体*/
R_Frame()
...{
super("串口接收数据");
  setSize(200,200);
  setVisible(true);
  btnOpen.addActionListener(this);
  add(out_message,"South");
  add(in_message,"Center");
  add(btnOpen,"North");
} //R_Frame() end

/**//*点击按扭所触发的事件:打开串口,并监听串口. */
public void actionPerformed(ActionEvent event)
...{
  /**//*获取系统中所有的通讯端口  */
  portList=CommPortIdentifier.getPortIdentifiers();
  /**//* 用循环结构找出串口 */
  while (portList.hasMoreElements())...{ 
  /**//*强制转换为通讯端口类型*/
    portId=(CommPortIdentifier)portList.nextElement();
    if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL)...{
      if (portId.getName().equals("COM1")) ...{
        try ...{
serialPort = (SerialPort) portId.open("ReadComm", 2000);
      out_message.setText("已打开端口COM1 ,正在接收数据..... ");
      }
  catch (PortInUseException e) ...{ }

    /**//*设置串口监听器*/
    try ...{
serialPort.addEventListener(this);
}
        catch (TooManyListenersException e) ...{ }
        /**//* 侦听到串口有数据,触发串口事件*/
    serialPort.notifyOnDataAvailable(true);
      } //if end
    } //if end
  } //while end
  readThread = new Thread(this);
  readThread.start();//线程负责每接收一次数据休眠20秒钟
} //actionPerformed() end

  /**//*接收数据后休眠20秒钟*/
  public void run() ...{
        try ...{
Thread.sleep(20000);
}
        catch (InterruptedException e) ...{  }
  }  //run() end

      /**//*串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中*/
  public void serialEvent(SerialPortEvent event) ...{
  /**//*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/
      try ...{
          serialPort.setSerialPortParams(9600,
                  SerialPort.DATABITS_8,
                  SerialPort.STOPBITS_1,
                  SerialPort.PARITY_NONE);
}
catch (UnsupportedCommOperationException e) ...{   }
  byte[] readBuffer = new byte[20];
    try ...{
inputStream = serialPort.getInputStream();
}
        catch (IOException e) ...{}
try ...{
  /**//* 从线路上读取数据流 */
        while (inputStream.available() > 0) ...{
              int numBytes = inputStream.read(readBuffer);
            }    //while end
  str=new String(readBuffer);
        /**//*接收到的数据存放到文本区中*/
  in_message.append(str+" ");
  }
catch (IOException e) ...{    }
  } //serialEvent() end
}  //类R_Frame end

public class ReadComm
...{
public static void main(String args[])
  ...{
    /**//*  实例化接收串口数据的窗体类  */
R_Frame R_win=new R_Frame();
/**//*  定义窗体适配器的关闭按钮功能 */
    R_win.addWindowListener(new WindowAdapter()
            ...{public void windowClosing(WindowEvent e)
                ...{System.exit(0); }
      });
  R_win.pack();
}
}

三十五、会计平台能否生成暂存凭证现在客户提出凭证信息可能不全,那会计平台是否支持生成总账暂存凭证?那50的外部数据交换平台能支持暂存凭证的导入吗?

答:目前版本的会计平台不支持暂存凭证,需要修改凭证生成的代码才能实现,可以自己在外部交换平台凭证的校验文件中加入暂存标记

三十六、请问审批流的问题
如何实现审批流,在金额不同时,如小于20000,或大于等于20000,实现不同的审批流。
A1制单后,小于20000时,只需A2审批;大于等于20000时,A2批准后,需提交A3审批;
现在在A1制单后,分两条线,一条线(金额<2000)指向A2+虚节点,另一条(金额>2000)指向A2+A3+虚节点;
请问如何设置临界值2000

答:鼠标双击弟一条线,弹出一个条件对话框,里面可以设置单据上的金额字段的取值范围

三十七、数据库操作
使用数据库操作方法
sql = "select * from 表"
IUAPQueryBS iUAPQueryBS = (IUAPQueryBS)NCLocator.getInstance().lookup(IUAPQueryBS.class.getName());
List list = (List)iUAPQueryBS.executeQuery(sql,new ArrayListProcessor());
返回的数组List里放入的是什么对象
应该怎么取出来使用


答:ArrayProcessor 数组处理器,返回一个对象数组,结果集中只有一行数据,其中结果集中每一列对应数组的一个元素。
  l ArrayListProcessor 数组集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个数组,每个数组对应结果集中的一行数据,其中结果集中每一列对应数组的一个元素。
l  MapProcessor HashMap处理器,返回一个HashMap, 结果集中只有一行数据,其中结果集合中每一列的列名和列值对应HashMap的一个关键字和相应的值。
    MapListProcessorl HashMap集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个HashMap,每个HashMap对应结果集中的一行数据, 其中结果集合中每一列的列名和列值对应HashMap的一个关键字和相应的值。
    BeanProcessorl
值对象处理器,返回一个JavaBean,结果集中只有一行数据,该处理器能自动把结果集中的值按列的名称映射到javaBean中,如结果集中有名称为"name"的字段,那么只要该java对象中有getName()方法就能把结果集合中"name"对应的值映射到对象中。
l  BeanProcessor 值对象集合处理器,返回一个ArrayList集合,集合中的每一个元素是一个javaBean,每个javaBean对应结果集合中一行数据,其中每个JavaBean中的数据映射关系和BeanProcess同理。
l  ColumnProcessor 列值处理器,返回一个Java对象,结果集中只有一行数据,该对象对应与结果集中某一列的值,该处理器通过结果集列的序号或名称来确定列。
  l BeanMappingListProcessor:值对象集合处理器,根据映射信息返回一个ArrayList集合,集合中的每一个元素是一个javaBean,每个javaBean对应结果集合中一行数据,其中每个JavaBean中的数据映射关系和BeanMappingProcess同理
l  BeanMappingProcessor:值对象处理器,根据映射信息返回一个JavaBean,结果集中只有一行数据,该处理器能自动把结果集中的值按列的名称映射到javaBean中,如结果集中有名称为"name"的字段,那么只要该java对象中有getName()方法就能把结果集合中"name"对应的值映射到对象中

三十八、会计平台有批处理的接口吗?
请问会计平台可以批量处理单据吗?
我找了nc.itf.dap.pub.IDapSendMessage里边没有批处理的方法。

答:暂时没有批处理功能,只能循环调用

三十九、模块全部安装 运行时提示找不到组件
具体异常信息
nc.bs.framework.exception.ComponentNotFoundException: Component: nc.itf.dap.priv.IDapProcessor,Detail Message: Can not find component(both in jndi and ioc)
    at nc.bs.framework.server.AbstractContext.lookup(AbstractContext.java:128)
    at nc.bs.framework.server.AbstractContext.getComponentMetaVO(AbstractContext.java:319)
    at nc.bs.framework.server.BusinessAppServer$BusinessServerRemoteMetaContext.lookup(BusinessAppServer.java:880)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at nc.bs.framework.comn.serv.ServiceDispatcher.a(ServiceDispatcher.java:320)
    at nc.bs.framework.comn.serv.ServiceDispatcher.execCall(ServiceDispatcher.java:129)
    at nc.bs.framework.comn.serv.CommonServletDispatcher.doGet(CommonServletDispatcher.java:76)
    at nc.bs.framework.comn.serv.CommonServletDispatcher.doPost(CommonServletDispatcher.java:95)

答:没有生成及部署EJB

四十、都有哪些命令可以输出后台日志请教一下都有哪些命令可以输出后台日志啊
Log
Logger的区别是什么
在程序中经常使用哪些啊
最好给个例子

答:如果日志输出不要求在运行时刻发生变化,用Log,它具有更高的效率,中间件组的纯技术代码使用,其它开发不需使用
?
如果日志输出需要输出到某个发起调用的模块,而不是代码本身所属模块,使用Logger动态日志。如供应链模块的BService调用财务模块的BService,发起端为供应链模块,我们希望在供应链模块能个够跟踪到信息的时候,财务模块的BService采用Logger作为日志API,如果发起方是它自己模块,则输出在自己的模块内,如果未配置模块,则日志在匿名模块内
?
基础算法的程序(供给所有模块使用),统一采用Logger作为API
?
后台业务程序和前后台公共程序、全部业务程序采用Logger。
?
平台类级程序需要进行采用Logger.init/reset设置,放在各自设置的模块中如:(plateform,pa等)

四十一、请问如何在PANEL中启线程显示查询时间现在我所做的查询功能在录入数据过多时,会等待很长时间才会执行完。请问怎么样才可以启动一个线程,显示查询时间。

答:java 线程呀
先定义一个类继承Runable  接口 或者 Thread类
实现run方法
显示时间代码写入run方法,并定时检查数据是否返回
运行的时候
MyThread mt = new MyThread();
mt.start();
为了访问界面数据,可以定义成内部类。
之间的数据同步可以用 synchronized 方法和 synchronized 块

四十二、请教有没有快速的导入EXCEL文件中数据的方法我现在使用的从EXCEL中导入数据的方法如下
  wb = Workbook.getWorkbook(file);
  Sheet sheet = wb.getSheet(0);
  int rowcount = sheet.getRows();
  for (int row = 0; row < rowcount; row++) {
    Vector<String> vor = new Vector<String>();
    vor.add(sheet.getCell(0, row).getContents());
    this.getDefaultTableModel().addRow(vor);
  }


这样在导入的数据过多时花费的时间会比较长,请问有什么别的方法吗?
还有如果将这些数据插入数据库表时,有没有快速插入的方法,即减少插入消耗时间

答:Java读取Excel的两种方式方式介绍

相关标签:


1.
Java读取Excel方式对比
在Java中读写MS Excel文件主要有两种典型的方法
l  Java-To-Com的方式:
(1)  jCom
(2)  Jacob
l  直接Excel文件读写
(3)  jExcel
(4)  POI
方法1中,是利用Java-Com桥的方式来读写Excel文件,需要后台有Com组件的支持,不能脱离Windows平台使用。
方法2是直接使用纯Ref="tag-524-1.html">Java API存取Excel文件,可以直接从磁盘文件或者Java的输入输出流中读写Excel文件。相比之下方法2要更为直接一些,不必依赖于Windows平台以及Com组件。jExcel与POI都是开源的java项目,jExcel是sourceforge的开源项目(http://jexcelapi.sourceforge.net/),POI是Apache的开源项目(Jakarta.apache.org/poi/">http://jakarta.apache.org/poi/)。jExcel现在最近的版本是2.5.9版,于2005年12月22日发布。POI的最近版本是3.0 alpha版。
2.POI功能介绍
POI是Apache下Jakata项目的子项目,其目标是处理OLE2对象。目前比较成熟的包有HSSF,主要用来处理Ms Excel文件。HWPF包,正在完善当中,主要用于处理Ms Word文件。HSLF包,主要用于处理Ms PowerPoint文档。POI组件除了可以供Java使用外,还提供了Ruby接口,可以直接供Ruby使用。
POI的部分代码是来自于OpenOffice,对于处理Excel文档而言,POI是目前最成熟与稳定的Java开源项目

可分析下时间主要耗在哪里,
是sheet.getCell(0, row).getContents())
this.getDefaultTableModel().addRow(vor)
如果是读取慢可考虑其他操作excel方式

四十三、NC审批流开发,求半数通过的解决思路二次开发项目,客户要求在审批流定义中增加半数通过的审批方式,即在一个组(角色)中,如果有半数以上的人审批通过,则不论剩下的人是否审批或者审批意见如何,都通过进入下一审批人

答:[UAP-NC]需要修改后台的 TaskManagerDMO.isTaskComplete(String taskPK) 方法.但要改的话,所有流程都这样了.
更好的方法是把这个"完成策略"定义到审批流的活动上,但这个改动较大.

四十四、getColValue问题
如果需要取出的字段为year该怎么处理,

getColValue(***,year,***,***)

报错:
[AWT-EventQueue-0] ERROR - 公式不正确,发现错误:
公式格式不正确,请检查!

答:A->getColValue(table,B,C,D)
A :待负值的字段,对应BillItem的key
B :需要取出赋给A的数据库对应的字段
C :数据库table中需要关联的字段
D :关联参数字段
最后相当于执行: select B into A from table where C=D

四十五、网银对账单类型是何意义?
网银对账单表styleflag字段 值为 A 或者 B 请问各自代表什么意思?

答:A - 新下载的,有效的
B - 以前下载的,已经无效的


本文系转自互联网,出处不明





收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻