假设我有一个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);
答案 0 :(得分:2)
您无法通过JCo执行SAP交易。您可以做的是运行启用远程的功能模块。因此,您需要编写自己的功能模块,提供您所需的功能,或者找到一个SAP功能模块,它可以满足您的需要(或者足够接近有用)。
答案 1 :(得分:1)
您的代码存在以下问题:
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
返回的假脱机数据,并做任何您想做的事情。简而言之,我认为顺序应为:
F
或import 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|
+------+----+------+