4

Java から RPGIV プログラムを呼び出しています。rpgiv プログラムは出力パラメーターとして複数レコードを返します。

rpgiv から返されたすべての行を返すために、次のことを試しました。

   // Define Output Data Structure 
      AS400DataType[] outputData = 
    {
        new AS400Text(20),              // parentOperationsItemId;
        new AS400Text(10),              // parentOperationsItemType;
        new AS400Text(10),              // parentOperationsItemSubType;
        new AS400Text(20),              // parentKnownbyId;
        new AS400Text(10),              // parentInternalStatus;
        new AS400Text(1),               // parentLeafIndicator;
        new AS400Text(20),              // childOperationsItemId;
        new AS400Text(10),              // childOperationsItemType;
        new AS400Text(10),              // childOperationsItemSubType;
        new AS400Text(20),              // childKnownbyId;
        new AS400Text(10),              // childInternalStatus;
        new AS400Text(1),               // childLeafIndicator;
        new AS400Text(10)               // InternalStatus;
    };

AS400Structure [] outputDataConverter2 = new AS400Structure[3];

    outputDataConverter2[0] = new AS400Structure(outputData);
    outputDataConverter2[1] = new AS400Structure(outputData);
    outputDataConverter2[2] = new AS400Structure(outputData);


    Object[] dataInputInformation = 
    {
        sSqlSelect,
        sFetchDirection,
        sOperationsItemId,
        sparentOperationsItemTypeList,
        sparentOperationsItemSubTpeList,
        sparentInternalStatusList,
        schildOperationsItemType,
        schildOperationsItemSubTpeList,
        schildInternalStatusList,
        sLinkStatus
    };


    Object[] dataInputInformationControl = 
    {
        sPosition,
        new BigDecimal(sRowsFetched)
    };


    // Set up the parameter list
    ProgramParameter[] parameterList = new ProgramParameter[4];
    parameterList[0] = new ProgramParameter(7); //ReturnStatus
    parameterList[1] = new ProgramParameter(inputDataConverter.toBytes(dataInputInformation)); //Input
    parameterList[2] = new ProgramParameter(inputDataControlConverter.toBytes(dataInputInformationControl)); //Control
    parameterList[3] = new ProgramParameter(outputDataConverter2[0].getByteLength()*3); //Output



    try 
    {
        // Set the program name and parameter list.
        program.setProgram(programName, parameterList);
        // Run Function
        if (program.run() != true) 
        {
            // Calling Error
            AS400Message[] messagelist = program.getMessageList();
            for (int i = 0; i < messagelist.length; ++i) 
            {
                output[0].ReturnStatus += messagelist[i] + "\n";
            }
        } 
        else 
        {
            // Set the output
            output[0] = new GetPlannedRoute();
            output[1] = new GetPlannedRoute();
            output[2] = new GetPlannedRoute();



            output[0].SetOutput(parameterList, outputDataConverter2[0]);
            output[1].SetOutput(parameterList, outputDataConverter2[1]);
            output[2].SetOutput(parameterList, outputDataConverter2[2]);
        }
    } 

これは出力クラスにあります

public void SetOutput(ProgramParameter[] parameterList, AS400Structure outputPlannedRouteConverter) 
    {

        ReturnStatus = P6Entity.CallingRPGFunction.ConvertReturnStatus(parameterList[0]);
        Object[] outputData = (Object[]) outputPlannedRouteConverter.toObject(parameterList[3].getOutputData());
        parentOperationsItemId = ((String) outputData[0]).trim();
        parentOperationsItemType = ((String) outputData[1]).trim();
        parentOperationsItemSubType = ((String) outputData[2]).trim();
        parentKnownbyId = ((String) outputData[3]).trim();
        parentInternalStatus = ((String) outputData[4]).trim();
        parentLeafIndicator = ((String) outputData[5]).trim();

        childOperationsItemId = ((String) outputData[6]).trim();
        childOperationsItemType = ((String) outputData[7]).trim();
        childOperationsItemSubType = ((String) outputData[8]).trim();
        childKnownbyId = ((String) outputData[9]).trim();
        childInternalStatus = ((String) outputData[10]).trim();
        childLeafIndicator = ((String) outputData[11]).trim();

        InternalStatus = ((String) outputData[12]).trim();
    }

複数の行または複数のデータ構造を受け取ることができるように parameterList[3] を定義する方法がわかりません。そして、出力 parameterList[3] の特定のインスタンスを取得する方法。

RPGIV コード:

https://www.dropbox.com/s/a29wf1ft0f07sx1/functionCode.txt?dl=0

* FetchedData Occures OCCURS(64) INZ は、Java に返したい出力データ セットです。

4

2 に答える 2

1

データをパラメーターとして渡そうとしないことをお勧めします。

代わりに、データ キューを使用してデータを返します。

Java プログラムにデータ待ち行列を作成させ、その名前をパラメーターとして RPG プログラムに渡します。

その後、RPG プログラムは、QSNDDTAQ API を使用してデータをキューに送信します。

制御が Java プログラムに戻ったら、データ キューからエントリを読み取らせます。

于 2015-05-08T20:02:45.500 に答える