-1

如果我登录 SAP R/3 并执行事务代码MM60,那么它将显示材料列表的一些 UI 屏幕并询问材料编号。如果我指定材料编号并执行,那么它将显示输出,即材料列表。

如果我是 SAP R/3 用户,故事到此结束。

但是,如果我想使用 java 程序执行上述相同的步骤并在 java 本身中获取结果而不是转到 SAP R/3 怎么办?我想这样做基本上是因为我想将该输出数据用于 BI 工具。

假设我使用 JCO3 与 R/3 连接。

编辑 根据链接中的信息,我尝试执行以下代码之类的操作,但它没有在后台安排任何作业,也没有下载任何假脱机文件等。我已手动将文档发送到假脱机并尝试在代码。这是为了MM60.

    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);
4

2 回答 2

2

您不能通过 JCo 执行 SAP 事务。您可以做的是运行启用远程功能的功能模块。因此,您需要编写自己的功能模块,提供您需要的功能,或者找到一个 SAP 功能模块,它可以满足您的需求(或足够接近以供使用)。

于 2017-12-15T11:01:30.463 回答
1

您的代码存在以下问题:

  • 只有当您通过 BAPI_XMI_LOGON 和 BAPI_XMI_LOGOFF 声明其用途时,才能使用 XBP BAPI。传递参数interface = 'XBP', version = '3.0', extcompany = 'any name you want'
  • 您使用在 SAP 端使用给定物料编号定义的程序变体启动程序RMMVRZ00(对应于直接位于事务代码后面的程序) ,但您的目标可能是传递不同的物料编号,因此您应该首先更改程序变体中的物料编号通过.MM60KRUGMANNBAPI_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(成功完成)。
  • 您对程序生成的线轴编号进行硬编码。要检索 spool 编号,您可以调用BAPI_XBP_JOB_SPOOLLIST_READwhich 返回作业的所有 spool 数据。
  • 此外,我不确定您是否可以调用功能模块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 直到状态为AF
    • 请注意,如果 SAP 队列中有许多作业在等待,则可能需要一些时间
  • BAPI_XBP_JOB_SPOOLLIST_READ
  • 最终 RSPO_DOWNLOAD_SPOOLJOB 如果有效
  • BAPI_XMI_LOGOFF
  • 最终 BAPI_TRANSACTION_COMMIT 因为 XMI 写入了 XMI 日志。
于 2019-09-29T10:55:40.750 回答