Вызов AS400 RPG из Java
-
21-09-2019 - |
Вопрос
У меня есть очень ограниченные (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 Для деталей.
Если у вас нет подключения, то вы действительно не можете сделать то, что спрашивают. Как вы это проверяете? Есть ли числовые параметры или все они характер?