Как запустить транзакции 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.