2010-01-20 77 views
0

我對AS400和RPG的知識非常有限(0)。但是我們有迫切的要求,我們需要從java類調用RPG程序。所以我發現我們可以通過JTOpen來實現它。但我堅持宣佈ProgramParameter列表。我對RPG程序從Java調用AS400 RPG

程序名稱如下信息:ZM30000R 參數: 科7,0(數字)
賬戶類型2(01檢查,02儲蓄)
賬戶號碼20(字符)
錯誤代碼7(字符) DR/CR指示符1(字符D,C)

但是無法確定什麼是輸入和輸出。如何聲明ProgramParameter。我做了如下。我無法測試,因爲我沒有連接到這些系統。

// Create AS400 Text objects for the different lengths 
      // of parameters you are sending in. 
      AS400Text branchTxt = new AS400Text(7); 
      AS400Text accntTypeTxt = new AS400Text(2); 
      AS400Text accntNumberTxt = new AS400Text(20); 
      AS400Text errorCodeTxt = new AS400Text(7); 
      AS400Text DCIndicatorTxt = new AS400Text(1);    

      // declare and instantiate your parameter list. 
      ProgramParameter[] parmList = new ProgramParameter[5]; 

      // assign values to your parameters using the AS400Text class to convert to bytes 
      // the second parameter is an integer which sets the length of your parameter output 
      parmList[0] = new ProgramParameter(branchTxt.toBytes(branch),7); 
      parmList[1] = new ProgramParameter(accntTypeTxt.toBytes(accntTypeTxt),2);  
      parmList[2] = new ProgramParameter(accntNumberTxt.toBytes(accntNumberTxt),20);  
      parmList[3] = new ProgramParameter(errorCodeTxt.toBytes(""),7);  
      parmList[4] = new ProgramParameter(DCIndicatorTxt.toBytes(indicator),5); 

任何幫助將非常有用。

感謝和問候,

SRINIVAS

+1

我給你提了一些關於如何在另一個問題中測試一個java調用rpg程序的提示。 – robertnl 2010-01-20 20:56:31

+1

哦,看!這很緊急!放下一切並回答它!或者,不要諷刺,每個在這裏提出問題的人都希望得到答案。你*不會通過試圖在社區中點燃火焰而獲得更好的迴應。你應該鏈接到你關於同一主題的上一個問題(http://stackoverflow.com/questions/2103928/as400-rpg-simulator),並解釋這個問題是如何與它相關的。 – dmckee 2010-01-20 20:58:57

+1

事實上,dmckee,你是對的。這個問題可能會好得多。對as400一無所知也沒有幫助。 這僅僅是我經歷了java和rpg之間的接口有多困難和困惑,我可以回答這兩個問題。希望它能幫助Phani解決真正的問題。解決這個問題可能需要另一個步驟(或問題;-) – robertnl 2010-01-20 21:22:00

回答

4

好吧,我有一個線索,只是在參數的描述。分行,賬戶類型和賬號都是IN。您需要這些信息進行金融預訂或交易。錯誤代碼顯然是OUT。根據我對財務系統的經驗,API返回預訂金額的方式是合理的。通常人們會使用這個符號,但在金融系統中,(D)ebit或(C)redit是更好的方法。

API很可能是金融系統的API。如果這是真的,那麼我錯過了數額。你確定你有完整的描述嗎?

請注意,第一個參數是數字。你不走運。 iSeries和RPG對於數字的類型不是很寬容。可以選擇Bit,Zoned,Packed,Decimal,Integer,Float等。如果RPG真的是RPG而不是ILE RPG,那麼你可以把它放到Zoned,Packed和Byte。

我假設您可以訪問iSeries。然後您可以觀看程序調用,調試信息和轉儲信息。如果你必須做「反覆試驗」,這將對你有所幫助。如果你沒有進入,道路將非常艱難。如果程序調用不成功,您將在您的java類中收到錯誤。但是如果沒有iSeries的信息,你很難確定真正的錯誤。因此,訪問真的是必需的。

0

如果你沒有連接,那麼你真的不能做什麼問。你如何測試它?有數字參數還是全部是字符?

3

您的示例大多處於正確的軌道上。但是你的分支參數是數字。所以,你應該用AS400ZonedDecimal代替AS400Text的:

AS400ZonedDecimal branchNbr = new AS400ZonedDecimal(7,0) 

的RPG程序可以期待包裝,而不是劃。沒什麼大不了的,只需要使用AS400PackedDecimal。

在構造ProgramParameter對象時,構造函數的要求根據它們是否是程序的輸入或輸出參數而有所不同。對於輸入參數,只需傳遞toBytes()結果即可。沒有必要包括長度。對於僅輸出參數,只需傳遞長度即可。

我同意羅伯特的答案,有一些缺少的信息,但他對錯誤代碼的輸出的假設似乎有效。但是,我猜想,DCIndicator參數是自您的示例傳遞值後輸入的。對於錯誤代碼參數,在程序調用之後,您需要提取值並對其進行處理。鑑於你已經有了,這裏是程序調用的工作方式。請注意,我指定了「MyLibrary」的庫名稱。這是例如目的。你必須確定你的程序的對象是在圖書館。

ProgramCall pgm = new ProgramCall(as400, QSYSObjectPathName.toPath("MyLibrary","ZM30000R","PGM"), parmList); 
if (pgm.run() == true) { 
    String sErrorCode = (String) errorCodeTxt.toObject(parmList[3].getOutputData()); 

    //Do something with your output data. 
} 
else { 
    AS400Message[] messageList = pgm.getMessageList(); 
    for (int i=0; i<messageList.length; i++) { 
     String sMessageID = messageList[i].getID(); 
     String sMessageText = messageList[i].getText(); 

     //Do something with the error messages 
    } 
} 

別的東西要考慮的是庫列表。 RPG程序是否期望某些庫位於庫列表中?如果是這樣,您應該在調用程序之前發出CommandCalls以將庫添加到庫列表中。

+1

感謝Tracy的建議,AS400PackedDecimal聲明已經解決了這個問題。 – Srinivas 2010-01-25 17:06:20