Вызов AS400 RPG с Java - PullRequest
       23

Вызов AS400 RPG с Java

0 голосов
/ 20 января 2010

У меня очень ограниченные (0) знания по AS400 и RPG. Но у нас есть срочное требование, когда нам нужно вызывать RPG-программу из Java-класса. Поэтому я обнаружил, что мы можем достичь этого с помощью JTOpen. Но я застрял при объявлении списка ProgramParameter. У меня есть следующая информация о программе RPG

Название программы: ZM30000R Параметры: Отвод 7,0 (Числовой)
Тип счета 2 (01-чек, 02 сбережения)
Номер счета 20 (символ)
Код ошибки 7 (символ) Индикатор DR / CR 1 (символ D, C)

Но без понятия о том, что такое intput и output. Как объявить 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);

Любая помощь будет очень полезна.

Спасибо и всего наилучшего,

Шринивас

Ответы [ 4 ]

4 голосов
/ 21 января 2010

Ну, у меня есть подсказка только по описанию параметров. Филиал, тип счета и номер счета IN. Вам нужна эта информация для финансового бронирования или транзакции. Код ошибки, видимо, OUT. По моему опыту работы с финансовыми системами, вполне нормально, что API возвращает способ зачисления суммы. Обычно можно использовать знак, но в финансовых системах лучше использовать (D) ebit или (C) redit.

API, скорее всего, API финансовой системы. Если это правда, то мне не хватает суммы. Вы уверены, что у вас есть полное описание?

Обратите внимание, что первый параметр является числовым. Тебе не повезло. ISeries и RPG не очень-то прощают тип чисел. Можно выбрать бит, зонирование, упаковку, десятичное число, целое число, число с плавающей запятой и т. Д. Если RPG действительно RPG вместо ILE RPG, то вы можете свести это к Zoned, Packed и Byte.

Я полагаю, у вас есть доступ к iSeries. Затем вы можете наблюдать за вызовом программы, отладочной информацией и дампом. Это поможет вам, если вам придется делать «проб и ошибок». Если у вас нет доступа, дорога будет очень трудной. Вы получите сообщение об ошибке в своем классе Java, если вызов программы не был успешным. Но будет трудно определить настоящую ошибку без информации от iSeries. Поэтому доступ действительно необходим.

3 голосов
/ 22 января 2010

Ваш образец в основном на правильном пути. Но ваш параметр ветки числовой. Поэтому вы должны использовать 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 голос
/ 03 июня 2010

FWIW: намного проще вызывать программы и программы-службы IBM i, используя PCML, а не ProgramCall.

Компиляторы даже сгенерируют документ PCML для вас.

Подробнее см. http://javadoc.midrange.com/jtopen/com/ibm/as400/data/ProgramCallDocument.html.

0 голосов
/ 21 января 2010

Если у вас нет связи, то вы действительно не можете делать то, что просят. Как вы это тестируете? Есть числовые параметры или все они символьные?

...