Вопрос

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

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

Но нет подсказка о том, что такое интуитивный и вывод. Как объявить программы. Я сделал, как показано ниже. Я также не могу проверить, потому что у меня нет связи с этими системами.

// 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);

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

Спасибо и с уважением,

Шринивас

Это было полезно?

Решение

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

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

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

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

Другие советы

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

FWIW: Гораздо проще называть IBM, я принимаю программы и сервисные программы, используя PCML, а не ProgramCall.

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

Видеть http://javadoc.midrange.com/jtopen/com/ibm/as400/data/programcalldocument.html Для деталей.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top