如何通过JCO3运行sap r / 3交易?或通过JCO执行报告?

时间:2017-12-15 06:44:41

标签: sap saprfc sap-r3 sapjco3

假设我有一个tcode,我可以考虑mm60或va03。如果我去sap r / 3并执行第一个tcode,那么它将显示Material列表的一些UI屏幕并询问材料编号。如果我指定材料编号并执行,那么它将显示输出,即材料清单。

如果我是sap r / 3用户,故事结束。 但是,如果我想使用java程序执行相同的上述步骤并在java本身中获取结果而不是使用sap r / 3呢?我想这样做基本上是因为我想将这个o / p数据用于BI工具.. 假设我使用JCO3与r / 3连接。

修改 基于link中的信息,我尝试执行类似下面的代码,但它不会在后台安排任何作业,也不会下载任何假脱机文件等。 我已手动将文档发送到假脱机并尝试在代码中提供其ID。这适用于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);

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您的代码存在以下问题:

  • XBP BAPI仅在您通过BAPI_XMI_LOGON和BAPI_XMI_LOGOFF声明其用法时才能使用。传递参数interface = 'XBP', version = '3.0', extcompany = 'any name you want'
  • 您使用程序变式RMMVRZ00启动程序MM60(与交易代码KRUGMANN后面的程序相对应),程序变式BAPI_XBP_VARIANT_CHANGE在SAP端定义了给定的物料编号,但是您的目标可能是传递变化的物料编号,因此您首先应通过BAPI_XBP_JOB_OPEN更改程序变体中的物料编号。
  • 调用JOBCOUNT之后,您应该读取BAPI_XBP_JOB_*参数的返回值,并将其与JOBNAME一起传递给所有后续的BAPI_XBP_JOB_START_ASAP调用(我是说,两个作业的名称可以相同,JOBCOUNT可以唯一地标识该作业。
  • 调用BAPI_XBP_JOB_STATUS_GET之后,您应等待作业完成,方法是反复调用A直到作业状态为F(已终止)或BAPI_XBP_JOB_SPOOLLIST_READ(已完成)。成功)。
  • 您可以对程序生成的后台打印编号进行硬编码。要检索后台打印编号,您可以调用RSPO_DOWNLOAD_SPOOLJOB,该代码返回作业的所有后台打印数据。
  • 此外,我不确定您是否可以调用功能模块BAPI_XBP_JOB_SPOOLLIST_READ来将假脱机数据下载到Java计算机上的文件中。如果不起作用,则可以使用A返回的假脱机数据,并做任何您想做的事情。

简而言之,我认为顺序应为:

  • 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,直到状态为Fimport org.apache.spark.functions.col val df: DataFrame = Seq( ("toyota",Array(("year", 2000), ("price", 100000))), ("toyota",Array(("year", 2001))) ).toDF("car", "details") +------+-------------------------------+ |car |details | +------+-------------------------------+ |toyota|[[year, 2000], [price, 100000]]| |toyota|[[year, 2001]] | +------+-------------------------------+ val newdf = df .withColumn("year", when(col("details")(0)("_1") === lit("year"), col("details")(0)("_2")).otherwise(col("details")(1)("_2"))) .withColumn("price", when(col("details")(0)("_1") === lit("price"), col("details")(0)("_2")).otherwise(col("details")(1)("_2"))) .drop("details") newdf.show() +------+----+------+ | car|year| price| +------+----+------+ |toyota|2000|100000| |toyota|2001| null| +------+----+------+
    • 请注意,如果SAP队列中有许多作业正在等待,则可能要花一些时间
  • BAPI_XBP_JOB_SPOOLLIST_READ
  • 如果可行,最终RSPO_DOWNLOAD_SPOOLJOB
  • BAPI_XMI_LOGOFF
  • 最终是BAPI_TRANSACTION_COMMIT,因为XMI编写了XMI日志。