Вызов AS400 RPG с Java
У меня очень ограниченные (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 ответа
Ну, у меня есть подсказка только по описанию параметров. Филиал, тип счета и номер счета IN. Вам нужна эта информация для финансового бронирования или транзакции. Код ошибки, видимо, OUT. По моему опыту работы с финансовыми системами, вполне нормально, что API возвращает способ зачисления суммы. Обычно можно использовать знак, но в финансовых системах (D)ebit или (C)redit - лучший способ.
API, скорее всего, API финансовой системы. Если это правда, то мне не хватает суммы. Вы уверены, что у вас есть полное описание?
Обратите внимание, что первый параметр является числовым. Тебе не повезло. ISeries и RPG не очень прощают тип чисел. Можно выбрать бит, зонирование, упаковку, десятичное число, целое число, число с плавающей запятой и т. Д. Если RPG действительно RPG вместо ILE RPG, то вы можете свести это к Zoned, Packed и Byte.
Я предполагаю, что у вас есть доступ к 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 i, используя PCML, а не ProgramCall
,
Компиляторы даже сгенерируют документ PCML для вас.
См. http://javadoc.midrange.com/jtopen/com/ibm/as400/data/ProgramCallDocument.html для получения подробной информации.
Если у вас нет подключения, то вы действительно не можете делать то, что просят. Как вы это тестируете? Есть числовые параметры или все они символьные?