Как отправить / проверить статус IDOC, отправленного в SAP ECC через ALE Audit?

Я работаю над приложением Java, которое получает промежуточные документы (IDocs) из ECC и передает iDocs в ECC.

Наше приложение работает как мост между ECC и другими системами, оно получает IDoc от ECC, которые хранятся на диске нашим приложением, затем фоновый процесс отвечает за проверку расположения файловой системы, где файлы с IDoc сохраняются и позже отправляются в другие места назначения через HTTP-запросы. Приложение также взаимодействует с этими другими системами для получения информации, которая также сохраняется в файлах, а затем в фоновом процессе для их чтения и создания IDoc для отправки в ECC.

Когда приложение получает IDoc из ECC, оно отправляет IDoc подтверждения в ECC, что-то подобное необходимо сделать при отправке в ECC, то есть, когда приложение Java отправляет ему IDoc, мы хотим, чтобы ECC отправлял подтверждение ALE в наш приложению, если IDoc были отправлены правильно, поэтому наше приложение знает, что отправленный пакет можно безопасно переместить в нашу папку истории, и в случае, если подтверждение указывает на наличие проблемы, следует предпринять еще одну попытку отправить IDoc.

Как мы можем настроить ECC для отправки подтверждения нашему Java-приложению?

Код, который мы используем для отправки из Java в ECC, следующий:

try {
     destination= JCoDestinationManager.getDestination(PROGID);
     iDocRepository = JCoIDoc.getIDocRepository(destination);
     tid = destination.createTID();
     iDocFactory = JCoIDoc.getIDocFactory();
 } catch (JCoException e) {
     e.printStackTrace();
 }
 List<Invoic02> invoic02s = new ArrayList<>();

 EDI_DC40 edi_dc40 = IdocUtil.generateIdocControlRecordObject(IdocUtil.invoiceIdocType, IdocUtil.invoiceMsgType);

 for(InvoiceIdoc invoicIdoc : invoices){
     Invoic02 invoic02 = new Invoic02();
     invoicIdoc.setBEGIN("1");
     invoicIdoc.setEDI_DC40(edi_dc40);
     invoic02.getInvoiceIdoc().add(invoicIdoc);
 }

 String invoicesIdocString = XmlParser.objectToXmlString(invoices, Invoic02.class);

 try {
     IDocXMLProcessor processor= iDocFactory.getIDocXMLProcessor();
     IDocDocumentList iDocList=processor.parse(iDocRepository, invoicesIdocString.toString());
     JCoIDoc.send(iDocList, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid);
 } catch (JCoException e) {
     e.printStackTrace();
 } catch (IDocParseException e) {
     e.printStackTrace();
 }

Для прослушивания входящих IDOC мы используем частную библиотеку, но она также использует библиотеку JCO IDOC.

Можно ли использовать библиотеку JCO IDOC для проверки статуса отправленного IDOC? Или есть способ настроить ECC для отправки подтверждений каждого полученного IDOC?


person Uriel Arvizu    schedule 21.10.2016    source источник


Ответы (3)


Если вы используете стандартные методы ввода IDOC (http и функция), это возвращает номер сохранения IDOC. Так что вам не нужно ждать еще одного IDOC. Просто проверяю номер сохранения IDOC в ответ.

person mkysoft    schedule 23.10.2016
comment
IDOC отправляются из ECC через ALE, из приложения Java мы используем библиотеку JCO IDOC, проверьте код в моем обновленном вопросе - person Uriel Arvizu; 25.10.2016
comment
мы хотим, чтобы ECC отправлял подтверждение ALE нашему приложению или знал, способна ли библиотека JCO IDOC проверять состояние IDOC, отправленных в ECC. - person Uriel Arvizu; 25.10.2016
comment
Вы можете проверить, что ваш IDOC успешно сохранен с помощью ECC, с помощью команды destination.confirmTID (tid). Я понимаю, что вам нужно, чтобы IDOC успешно обработали или нет. Существует множество причин для отказа вашего IDOC во время обработки. Я думаю, вам нужно вызвать функцию RFC GET_STATUS_FROM_IDOCNR с помощью библиотеки SAP java или веб-службы. - person mkysoft; 29.10.2016
comment
confirmTID, кажется, выдает только исключение, если операция подтверждения завершается неудачно, но если idoc получен успешно, но его статус является ошибкой, этот метод не уведомит меня о таком статусе - person Uriel Arvizu; 01.11.2016

Я полагаю, что проверка TID - единственный способ на стороне Java убедиться, что ваш IDoc был успешно получен. SAP передовой практики не дает нам ни одного пути:

tid = destination.createTID ();
...
JCoIDoc.send (iDocList, IDocFactory.IDOC_VERSION_DEFAULT, destination, tid);
destination.confirmTID (tid);
return true;

Эта строка выбрасывает ошибки, если что-то было не так на стороне ERP.

person Suncatcher    schedule 01.11.2016
comment
Из того, что я прочитал в спецификации метода confirmTID, возникает исключение, если при выполнении подтверждения произошел сбой, если статус idoc является ошибкой, исключение не будет выбрано, если я не ошибаюсь - person Uriel Arvizu; 01.11.2016
comment
Да, ты прав. Он может проверить, только если он был получен. Ошибочный статус обработки IDoc (поле STATUS в EDIDC) технически не означает, что что-то пошло не так с доставкой IDoc. Это говорит нам о том, что во входящем FM IDoc произошла логическая ошибка. - person Suncatcher; 01.11.2016
comment
И это то, о чем мой вопрос, я хочу каким-то образом узнать о статусе любых IDoc, которые приложение отправляет в ERP, кажется, создание пользовательского RFC - один из способов, но мы хотим избежать этого, вместо того, чтобы передавать в конфигурации ERP для отправки подтверждения о статусе полученного IDoc. - person Uriel Arvizu; 02.11.2016

Как я вижу в вашем комментарии под ответом Suncatcher, вы хотите запросить статус IDoc после того, как он был обработан на стороне ECC.

Во-первых, вы используете транзакционный RFC, поэтому обработка на стороне ECC является асинхронной, поэтому вам придется ждать неопределенное время, пока IDoc не будет обработан SAP.

Следовательно, у вас есть две возможности:

  • Либо ваше приложение регулярно запрашивает статус IDoc на стороне ECC.
  • Or you schedule the program RBDSTATE at ECC side, as a background job triggered at regular intervals, which sends confirmations for processed IDocs, and you develop an additional java application which listens to these confirmations. I suggest that you choose the RFC protocol to send the confirmations.
    • RBDSTATE scans the processed IDocs and sends a confirmation IDoc of type ALEAUD01 to the sender system, which contains the numbers of the IDoc processed, their processing status (success, error), messages, business objects created or changed...
    • Вам необходимо настроить партнерские профили, порт, данные подключения (коды транзакций WE20, WE21, BD97, SM59)
    • Вам необходимо разработать новое Java-приложение, которое работает как RFC-сервер, который прослушивает все поступающие сообщения и обрабатывает входящие ALEAUD01 IDoc.
    • Дополнительную информацию можно получить в Библиотека SAP по аудиту ALE.
    • Что касается разработки серверного приложения RFC на java, вы можете получить дополнительную информацию в Библиотека SAP, посвященная программированию сервера SAP JCO.
person Sandra Rossi    schedule 29.09.2019