问题
I am trying to create a Purchase Info Record (ME11) in SAP using the below JCo code:
It executes without fail and throws no error, but i am not able to get the newly created info record in SAP. In ME13 it says info record not found. Can i know what am i missing?
IFunctionTemplate ft1 = mRepository.getFunctionTemplate("ZME_INITIALIZE_INFORECORD");
JCO.Function function1 = ft1.getFunction();
mConnection.execute(function1);
IFunctionTemplate ft = mRepository.getFunctionTemplate("ZME_DIRECT_INPUT_INFORECORD");
JCO.Function function = ft.getFunction();
JCO.ParameterList importparams =function.getImportParameterList();
// Setting HeadData Structure Information
JCO.Structure headStructure = importparams.getStructure("I_EINA");
//headStructure.setValue("105","MANDT");
//headStructure.setValue("5300259768", "INFNR");
headStructure.setValue("MYPART0006", "MATNR");
//headStructure.setValue("MYPART0006", "IDNLF");
headStructure.setValue("100002","LIFNR");
headStructure.setValue("10000","MATKL");
headStructure.setValue("KGS","MEINS");
headStructure.setValue("1","UMREZ");
headStructure.setValue("1","UMREN");
headStructure.setValue("SG","URZLA");
headStructure.setValue("KGS","LMEIN");
//headStructure.setValue("0000005300259768","URZZT");
JCO.Structure headStructure1 = importparams.getStructure("O_EINA");
//headStructure1.setValue("105","MANDT");
//headStructure1.setValue("5300259768", "INFNR");
headStructure1.setValue("MYPART0006", "MATNR");
//headStructure1.setValue("MYPART0006", "IDNLF");
headStructure1.setValue("100002","LIFNR");
headStructure1.setValue("10000","MATKL");
headStructure1.setValue("KGS","MEINS");
headStructure1.setValue("1","UMREZ");
headStructure1.setValue("1","UMREN");
headStructure1.setValue("SG","URZLA");
headStructure1.setValue("KGS","LMEIN");
//headStructure1.setValue("0000005300259768","URZZT");
System.out.println("General Data Set");
JCO.Structure purchaseDataStructure = importparams.getStructure("I_EINE");
//purchaseDataStructure.setValue("105","MANDT");
//purchaseDataStructure.setValue("5300259768", "INFNR");
purchaseDataStructure.setValue("1000","EKORG");
purchaseDataStructure.setValue("1000", "WERKS");
purchaseDataStructure.setValue("003","EKGRP");
purchaseDataStructure.setValue("USD","WAERS");
purchaseDataStructure.setValue("3","APLFZ");
purchaseDataStructure.setValue("1","PEINH");
purchaseDataStructure.setValue("1","BPUMZ");
purchaseDataStructure.setValue("1","BPUMN");
purchaseDataStructure.setValue("1000","EFFPR");
purchaseDataStructure.setValue("0001","BSTAE");
purchaseDataStructure.setValue("100000","NETPR");
purchaseDataStructure.setValue("X","KZABS");
JCO.Structure purchaseDataStructure1 = importparams.getStructure("O_EINE");
//purchaseDataStructure1.setValue("105","MANDT");
//purchaseDataStructure1.setValue("5300259768", "INFNR");
purchaseDataStructure1.setValue("1000","EKORG");
purchaseDataStructure1.setValue("1000", "WERKS");
purchaseDataStructure1.setValue("003","EKGRP");
purchaseDataStructure1.setValue("USD","WAERS");
purchaseDataStructure1.setValue("3","APLFZ");
purchaseDataStructure1.setValue("1","PEINH");
purchaseDataStructure1.setValue("1","BPUMZ");
purchaseDataStructure1.setValue("1","BPUMN");
purchaseDataStructure1.setValue("1000","EFFPR");
purchaseDataStructure1.setValue("0001","BSTAE");
purchaseDataStructure1.setValue("100000","NETPR");
purchaseDataStructure1.setValue("X","KZABS");
mConnection.execute(function);
IFunctionTemplate ft2 = mRepository.getFunctionTemplate("ZME_POST_INFORECORD");
JCO.Function function2 = ft2.getFunction();
JCO.ParameterList importparams2 =function2.getImportParameterList();
importparams2.setValue("MYPART0006", "I_MATNR");
importparams2.setValue("MYPART0006", "O_MATNR");
mConnection.execute(function2);
回答1:
I could be wrong, but i think you're getting a copy of the structure that you fill. could you test this by adding a set of "setValue" just before the execution of the function ie :
importparams.setValue("I_EINA", headStructure);
importparams.setValue("O_EINA", headStructure1);
importparams.setValue("I_EINE", purchaseDataStructure);
importparams.setValue("O_EINE", purchaseDataStructure1);
mConnection.execute(function);
otherwise, a possibility is to add an external break-point into your function (the execution of the java function will trigger a debugging session in ABAP),
- and check what the values are in ABAP, and the execution
- you say the function does not throws any error, but i don't see any error checking in your code. your function should return a struct or table indicating success or errors in the ABAP side (type BAPIRETURN1 for exemple). JCO will trigger an error by itself only if there is an ABAP dump or invalid parameters.
regards
回答2:
In addition to the good answer of @PATRY:
- you might have forgotten a commit work.
- I usually write a small test program in ABAP before I use it from Java. Usually worth the time, though you can trigger the Abap debugger from Java.
- As @PATRY says ignoring return parameters as you do is a bad idea.
来源:https://stackoverflow.com/questions/8534602/creating-purchase-info-record-in-sap