Как запустить транзакции SAP R /3 через JCO3? или выполнять отчеты через JCO?

Предположим, у меня есть tcode со мной, давайте рассмотрим, mm60 или va03. Если я пойду в sap r/3 и выполню первый tcode, он покажет некоторый экран интерфейса пользователя для Списка материалов и попросит номер материала. Если я укажу номер материала и выполню, он покажет мне вывод, т.е. список материалов.

На этом история заканчивается, если я пользователь sap r/3. Но что, если я захочу сделать те же самые шаги, описанные выше, используя программу Java, и получить результат в самой Java вместо того, чтобы идти в sap r/3? Я хочу сделать это в основном потому, что я хочу использовать эти данные o/p для инструмента BI. Предположим, я использую JCO3 для соединения с r / 3.

РЕДАКТИРОВАТЬ На основе информации в ссылке я попытался сделать что-то вроде приведенных ниже кодов, но он не планирует какую-либо работу в фоновом режиме и не загружает какой-либо файл спула или т. Д. Я вручную отправил документ в спул и попытался дать его идентификатор в код.. это для мм60.

    JCoContext.begin(destination);
function = mRepository.getFunction("BAPI_XBP_JOB_OPEN");
JCoParameterList input = function.getImportParameterList();
    input.setValue("JOBNAME", "jb1");
    input.setValue("EXTERNAL_USER_NAME", "sap*");
    function.execute(destination);
    JCoFunction function2 = mRepository.getFunction("BAPI_XBP_JOB_ADD_ABAP_STEP");
    function2.getImportParameterList().setValue("JOBNAME", "jb1");
    function2.getImportParameterList().setValue("EXTERNAL_USER_NAME", "sap*");
    function2.getImportParameterList().setValue("ABAP_PROGRAM_NAME", "RMMVRZ00");
    function2.getImportParameterList().setValue("ABAP_VARIANT_NAME", "KRUGMANN");
    function2.getImportParameterList().setValue("SAP_USER_NAME", "sap*");
    function2.getImportParameterList().setValue("LANGUAGE", destination.getLanguage());
    function2.execute(destination);

    function3.getImportParameterList().setValue("JOBNAME", "jb1");
    function3.getImportParameterList().setValue("EXTERNAL_USER_NAME", "sap*");
    function3.getImportParameterList().setValue("EXT_PROGRAM_NAME", "RMMVRZ00");
    function3.getImportParameterList().setValue("SAP_USER_NAME", "sap*");
    function3.execute(destination);

    JCoFunction function4 = mRepository.getFunction("BAPI_XBP_JOB_CLOSE");
    function4.getImportParameterList().setValue("JOBNAME", "jb1");
    function4.getImportParameterList().setValue("EXTERNAL_USER_NAME", "sap*");
    function4.execute(destination);

    JCoFunction function5 = mRepository.getFunction("BAPI_XBP_JOB_START_ASAP");
    function5.getImportParameterList().setValue("JOBNAME", "jb1");
    function5.getImportParameterList().setValue("EXTERNAL_USER_NAME", "sap*");
    function5.execute(destination);

    JCoFunction function6 = mRepository.getFunction("RSPO_DOWNLOAD_SPOOLJOB");
    function6.getImportParameterList().setValue("ID", "31801");
    function6.getImportParameterList().setValue("FNAME", "abc");

    function6.execute(destination);

1 ответ

Вы не можете выполнить транзакцию SAP через JCo. Что вы можете сделать, так это запустить удаленно включенные функциональные модули. Поэтому вам нужно либо написать собственный функциональный модуль, предоставляющий именно ту функциональность, которая вам требуется, либо найти функциональный модуль SAP, который делает то, что вам нужно (или достаточно близко, чтобы быть полезным).

В вашем коде есть следующие проблемы:

  • XBP BAPI можно использовать только в том случае, если вы объявляете об их использовании через BAPI_XMI_LOGON и BAPI_XMI_LOGOFF. Передайте параметрыinterface = 'XBP', version = '3.0', extcompany = 'any name you want'.
  • Вы запускаете программу RMMVRZ00 (что соответствует программе непосредственно за кодом транзакции MM60) с вариантом программы KRUGMANN который определяется на стороне SAP с заданным номером материала, но ваша цель, вероятно, состоит в том, чтобы передать другой номер материала, поэтому вы должны сначала изменить номер материала в варианте программы с помощью BAPI_XBP_VARIANT_CHANGE.
  • После звонка BAPI_XBP_JOB_OPEN, вы должны прочитать возвращаемое значение JOBCOUNT параметр и передать его всем последующим BAPI_XBP_JOB_* звонки вместе с JOBNAME (Я имею в виду, что две вакансии могут называться одинаково, JOBCOUNT используется для уникальной идентификации работы).
  • После звонка BAPI_XBP_JOB_START_ASAP, вам следует дождаться завершения задания, неоднократно вызывая BAPI_XBP_JOB_STATUS_GET пока статус работы не станет A (прервано) или F (завершено успешно).
  • Вы жестко кодируете номер катушки, сгенерированный программой. Чтобы узнать номер спула, вы можете позвонитьBAPI_XBP_JOB_SPOOLLIST_READ который возвращает все данные спула задания.
  • Более того, я не уверен, можно ли вызывать функциональный модуль RSPO_DOWNLOAD_SPOOLJOBчтобы загрузить данные спула в файл на вашем компьютере Java. Если это не сработает, вы можете использовать данные спула, возвращенныеBAPI_XBP_JOB_SPOOLLIST_READ и делай что хочешь.

Короче считаю, что последовательность должна быть:

  • BAPI_XMI_LOGON
  • BAPI_XBP_VARIANT_CHANGE
  • BAPI_XBP_JOB_OPEN
  • BAPI_XBP_JOB_ADD_ABAP_STEP
  • BAPI_XBP_JOB_CLOSE
  • BAPI_XBP_JOB_START_ASAP
  • Повторный вызов BAPI_XBP_JOB_STATUS_GET, пока статус не станет A или F
    • Обратите внимание, что это может занять некоторое время, если в очереди SAP находится много заданий.
  • BAPI_XBP_JOB_SPOOLLIST_READ
  • В конце концов RSPO_DOWNLOAD_SPOOLJOB, если он работает
  • BAPI_XMI_LOGOFF
  • В конце концов, BAPI_TRANSACTION_COMMIT, потому что XMI записывает журнал XMI.
Другие вопросы по тегам