1. 程式人生 > >用友NC二次開發問題彙總【轉】

用友NC二次開發問題彙總【轉】

一、供應鏈採購訂單問題
在採購訂單參照請購單時,若選擇了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 - 以前下載的,已經無效的

本文系轉自網際網路,出處不明