cancel
Showing results for 
Search instead for 
Did you mean: 

FM/BAPI/CLASS to call BPC program UJD_TEST_PACKAGE from a custom program

Former Member
0 Kudos

Hi All,

We have a requirement to automate the calling of BPC program UJD_TEST_PACKAGE.

I have developed a custom program which fetches selection criteria like region, environment, answer prompt etc dynamically as per the scenario. Above fetched data has to be passed to BPC program UJD_TEST_PACKAGE and automate BPC load.

I have tried SUBMIT program but it does not work.

Please suggest if there is any standard FM/BAPI/CLASS to call BPC program UJD_TEST_PACKAGE from custom program.

Accepted Solutions (0)

Answers (8)

Answers (8)

former_member186338
Active Contributor
0 Kudos

"But then pop-ups will appear." - what do you mean?

Please provide screenshots...

former_member186338
Active Contributor
0 Kudos

Sorry, but you will schedule the chain that will include running of your Z-program! And it will be scheduled in background!

I don't understand your issue... I don't understand what you are doing....

Former Member
0 Kudos

Hi Vadim,

You've got it correct, I will include package triggering code in my Z program and the Z program will be included in process chain and the process chain will be scheduled.

But I need the instance number and status, so I will keep IF_SYNC as YES. But then pop-ups will appear. And pop-ups don't work in scheduled program.

Former Member
0 Kudos

And my requirement is -> We are automating BPC package triggering. And the BPC package triggering class code will be placed in a process chain.

former_member186338
Active Contributor
0 Kudos

Sorry, but use if-sync = yes, then you will get status!

former_member186338
Active Contributor
0 Kudos

P.S. What do you mean by pop-ups?

Former Member
0 Kudos

But If I set IF_SYNC = yes, then I wont be able to schedule my Z program in backgroung...right ?
Because pop-ups are not allowed in background.

I am still wondering how do I achieve my requirement of scheduling in background.

former_member186338
Active Contributor
0 Kudos

P.S. Please read my blog: https://blogs.sap.com/2018/11/23/how-to-run-dm-package-with-current-month-selection-in-bpc-nw/

With a sample of ZUJD_TEST_PACKAGE to select current month.

former_member186338
Active Contributor
0 Kudos

Sample of ZUJD_TEST_PACKAGE without user interface and all values fixed in code:

REPORT  ZUJD_TEST_PACKAGE.

DATA: LF_EXISTS               TYPE UJ_FLG,
      LF_DEBUG                TYPE UJ_FLG,
      LF_SCHEDULE             TYPE UJ_FLG,
      L_ERRORMSG              TYPE UJ_STRING,
      L_RESULT                TYPE UJ_STRING,
      L_STATUS_STR            TYPE UJ_STRING,
      L_LOG_CONTENT           TYPE UJ_STRING,
      L_LOG_FILE              TYPE UJF_DOC-DOCNAME,
      L_INSTANCE_ID           TYPE RSPC_LOGID,
      L_LOG_XCONTENT          TYPE UJF_DOC-DOC_CONTENT,

      LS_PACKAGE_STATUS       TYPE UJD_STATUS,
      LS_USER                 TYPE UJ0_S_USER,
      LS_SCHEDULE_INFO        TYPE UJD_S_SCHEDULE_INFO,
      LS_SCHEDULE_INFO2       TYPE UJD_S_SCHEDULE_INFO2,
      LTH_ANSWER_PROMPT       TYPE UJD_TH_VALUE,
      LS_ANSWER_PROMPT        LIKE LINE OF LTH_ANSWER_PROMPT,
      LT_MESSAGE              TYPE UJ0_T_MESSAGE,

      LO_FILE_MGR             TYPE REF TO CL_UJF_FILE_SERVICE_MGR,
      LO_CONTEXT              TYPE REF TO IF_UJ_CONTEXT,
      LO_PACKAGE              TYPE REF TO CL_UJD_PACKAGE,
      L_OX                    TYPE REF TO CX_ROOT,

      LF_RAISE_MSG            TYPE UJ_FLG VALUE ABAP_FALSE,
      LT_LOG                  TYPE STRING_TABLE,
      L_LOG                   TYPE STRING,

      LF_IF_SYNC              TYPE UJ_BOOL,
      L_USER                  TYPE UJ_USER_ID,
      L_PACKAGE               TYPE UJ_PACKAGE_ID,
      L_APPSET                TYPE UJ_APPSET_ID,
      L_APPL                  TYPE UJ_APPL_ID,
      L_TEAM                  TYPE UJ_TEAM_ID,
      L_GROUP                 TYPE UJ_PACK_GRP_ID,
      L_SCHEDULE              TYPE STRING,
      LF_IF_MSG               TYPE UJ_BOOL.

  LF_IF_SYNC = UJ00_CS_BOOL-YES.
  L_USER = 'SUPPORT_EXT'.
  L_PACKAGE = 'Clear'.
  L_APPSET = 'SHELLTEST'.
  L_APPL = 'Planning'.
  L_TEAM = ''.
  L_GROUP = 'Data Management'.
  L_SCHEDULE = '<SCHEDULING><IMMEDIATE>Y</IMMEDIATE><STATE>0</STATE><PERIOD>N</PERIOD></SCHEDULING>'.             
  LF_IF_MSG = UJ00_CS_BOOL-NO.

  LS_ANSWER_PROMPT-FIELDNAME = '%SELECTION%'.
  LS_ANSWER_PROMPT-VALUE = '/SHELLTEST/Planning/PRIVATEPUBLICATIONS/SUPPORT_EXT/TempFiles/FROM.TMP@@@SAVE@@@@@@EXPAND@@@|DIMENSION:ACCOUNT|PL110|DIMENSION:AUDITTRAIL|Input|' &&
    'DIMENSION:CATEGORY|Budget|DIMENSION:ENTITY|DE|DIMENSION:INTERCO|ThirdParty|DIMENSION:PRODUCT|ProductA|DIMENSION:RPTCURRENCY|LC|DIMENSION:TIME|2007.01'.
  INSERT LS_ANSWER_PROMPT INTO TABLE LTH_ANSWER_PROMPT.
  LS_ANSWER_PROMPT-FIELDNAME = '%SELECTION_KEYDATE%'.
  LS_ANSWER_PROMPT-VALUE = ''.
  INSERT LS_ANSWER_PROMPT INTO TABLE LTH_ANSWER_PROMPT.
  LS_ANSWER_PROMPT-FIELDNAME = '%ENABLETASK%'.
  LS_ANSWER_PROMPT-VALUE = '1'.
  INSERT LS_ANSWER_PROMPT INTO TABLE LTH_ANSWER_PROMPT.
  LS_ANSWER_PROMPT-FIELDNAME = '%CHECKLCK%'.
  LS_ANSWER_PROMPT-VALUE = '1'.
  INSERT LS_ANSWER_PROMPT INTO TABLE LTH_ANSWER_PROMPT.

  LS_USER-USER_ID = L_USER.

  CALL METHOD CL_UJ_CONTEXT=>SET_CUR_CONTEXT
    EXPORTING
      I_APPSET_ID = L_APPSET
      IS_USER     = LS_USER
      I_APPL_ID   = L_APPL.

  IF LF_IF_SYNC = UJ00_CS_BOOL-YES.
    LF_DEBUG = ABAP_TRUE.
  ELSE.
    LF_DEBUG = ABAP_FALSE.
  ENDIF.

  TRY.

      CL_UJD_SCHEDULE_PARSE=>PARSE_7X_FORMAT( EXPORTING I_SCHEDULE_STR = L_SCHEDULE
                                              IMPORTING ES_SCHEDULE_INFO = LS_SCHEDULE_INFO
                                                        ES_SCHEDULE_INFO_NEW = LS_SCHEDULE_INFO2 ).
      IF LS_SCHEDULE_INFO-IFIMMEDIATE = UJ00_CS_BOOL-YES.
        LF_SCHEDULE = ABAP_FALSE.
      ELSE.
        LF_SCHEDULE = ABAP_TRUE.
        LS_SCHEDULE_INFO2-MODULE_ID = UJD0_CS_MODULE_ID-PACKAGE.
      ENDIF.

      CREATE OBJECT LO_PACKAGE.

      CALL METHOD LO_PACKAGE->RUN_PACKAGE
        EXPORTING
          I_APPSET_ID       = L_APPSET
          I_APPL_ID         = L_APPL
          I_TEAM_ID         = L_TEAM
          I_GROUP_ID        = L_GROUP
          I_PACKAGE_ID      = L_PACKAGE
          ITH_ANSWER_PROMPT = LTH_ANSWER_PROMPT
          IS_SCHEDULE_INFO  = LS_SCHEDULE_INFO2
          IF_SCHEDULE       = LF_SCHEDULE
          IF_DEBUG          = LF_DEBUG.

    cl_uja_actvty_mgr=>record_logon_activity(
      exporting
        i_appset_id = L_APPSET
        i_activity  = cl_uja_actvty_mgr=>gc_act_report_ujd_test_package ).

    CATCH CX_ROOT INTO L_OX.                             "#EC CATCH_ALL
      CALL FUNCTION 'UJ0_CONV_EX2MSG'
        EXPORTING
          IO_EXCEPTION     = L_OX
        IMPORTING
          ET_MESSAGE_LINES = LT_MESSAGE.

      CALL FUNCTION 'UJ0_CONV_MSG2STR'
        EXPORTING
          IT_MSG = LT_MESSAGE
        IMPORTING
          E_STR  = L_ERRORMSG.

      CALL FUNCTION 'DB_ROLLBACK'.
      RETURN.
  ENDTRY.
  CALL FUNCTION 'DB_COMMIT'.

  IF L_ERRORMSG IS NOT INITIAL.
    WRITE:/ L_ERRORMSG.
  ELSE.
    WRITE:/ L_RESULT.
  ENDIF.

  TRY.
      CL_UJD_PACKAGE_CONTEXT=>GET_INSTANCE_ID(
       IMPORTING E_INSTANCE_ID = L_INSTANCE_ID ).

      CL_UJD_PACKAGE_STATUS_DAO=>GET_PACKAGE_STATUS(
        EXPORTING I_LOG_ID = L_INSTANCE_ID
        IMPORTING ES_PACKAGE_STATUS = LS_PACKAGE_STATUS ).

      CASE LS_PACKAGE_STATUS-STATUS.
        WHEN UJD0_CS_PACKAGE_STATUS-EXCUTE OR
        UJD0_CS_PACKAGE_STATUS-SUCCEED.
          L_STATUS_STR = 'Success'.                         "#EC NOTEXT
        WHEN UJD0_CS_PACKAGE_STATUS-WARNING.
          L_STATUS_STR = 'Warning'.                         "#EC NOTEXT
        WHEN UJD0_CS_PACKAGE_STATUS-FAILED.
          L_STATUS_STR = 'Error'.                           "#EC NOTEXT
          LF_RAISE_MSG = ABAP_TRUE.
        WHEN OTHERS.
          L_STATUS_STR = 'Cancel'.                          "#EC NOTEXT
          LF_RAISE_MSG = ABAP_TRUE.
      ENDCASE.

      CONCATENATE 'Package status =>' L_STATUS_STR INTO L_STATUS_STR.
                                                            "#EC NOTEXT
      WRITE:/ L_STATUS_STR.

      L_LOG_FILE = LS_PACKAGE_STATUS-LOG_FILE.
      IF L_LOG_FILE IS INITIAL.
        RETURN.
      ENDIF.

      LO_CONTEXT = CL_UJ_CONTEXT=>GET_CUR_CONTEXT( ).

      CONCATENATE UJ00_C_WEB_ROOT LO_CONTEXT->D_APPSET_ID
      UJD0_CS_FILE_PATH_SLASH LO_CONTEXT->D_APPL_ID
      UJD0_CS_FILE_PATH_SLASH UJ00_C_PRIV_PUBLICATION
      UJD0_CS_FILE_PATH_SLASH LO_CONTEXT->DS_USER-USER_ID
      UJD0_CS_FILE_PATH_SLASH UJ00_C_TEMPFILES
      UJD0_CS_FILE_PATH_SLASH L_LOG_FILE INTO L_LOG_FILE.

      LO_FILE_MGR = CL_UJF_FILE_SERVICE_MGR=>FACTORY(
        IS_USER = LO_CONTEXT->DS_USER
        I_APPSET = LO_CONTEXT->D_APPSET_ID ).

      TRY.
          LO_FILE_MGR->CHECK_DOCUMENT_EXIST(
            EXPORTING I_DOCNAME = L_LOG_FILE
            IMPORTING E_RESULT = LF_EXISTS ).
        CATCH CX_UJF_FILE_SERVICE_ERROR.
          RETURN.
      ENDTRY.

      IF LF_EXISTS = ABAP_TRUE.
        LO_FILE_MGR->GET_DOCUMENT(
          EXPORTING I_DOCNAME = L_LOG_FILE
            I_RETZIP = ABAP_FALSE
          IMPORTING E_DOCUMENT_CONTENT = L_LOG_XCONTENT ).

        L_LOG_CONTENT = CL_UJ_UTL_CONV=>XSTRING_TO_STRING( I_XSTR = L_LOG_XCONTENT ).

        "WRITE:/ L_LOG_CONTENT.
        REPLACE ALL OCCURRENCES OF '<' IN L_LOG_CONTENT WITH '<'.
        REPLACE ALL OCCURRENCES OF '>' IN L_LOG_CONTENT WITH '>'.
        SPLIT L_LOG_CONTENT AT CL_ABAP_CHAR_UTILITIES=>CR_LF INTO TABLE LT_LOG.
        LOOP AT LT_LOG INTO L_LOG.
          WRITE:/ L_LOG.
        ENDLOOP.
      ENDIF.

    CATCH CX_ROOT.                                       "#EC CATCH_ALL
      LF_RAISE_MSG = ABAP_TRUE.
  ENDTRY.
  IF LF_IF_SYNC = UJ00_CS_BOOL-YES AND LF_IF_MSG = UJ00_CS_BOOL-YES AND LF_RAISE_MSG = ABAP_TRUE.
    MESSAGE A001(00) ##MG_MISSING
     WITH 'Package Failed'. "#EC NOTEXT
  ENDIF.

Working fine:

Former Member
0 Kudos

Hi,

Thanks for your input. I copied the code from UJD_TEST_PACKAGE to my Z program and I faced same issue of blank instance.

After test running I found the root cause. I am passing IF_SYNC as UJ00_CS_BOOL-NO. That is why instance is not generated and program was unable to get me status.

I t is working fine if I pass IF_SYNC as UJ00_CS_BOOL-YES, but then generates pop-ups.

My requirement is to keep my Z custom program as a part of process chain step. This process chain will be scheduled in background and in background pop-ups do not work.

If I suppress the pop-ups using IF_SYNC as UJ00_CS_BOOL-YES, the package is triggered but I am unable to get unique 25 digit process chain ID and the status. I want to take action accordingly after the package fails or success.

Thanks,

Rujuta

former_member186338
Active Contributor
0 Kudos

I am not sure that you are passing all parameters correctly!

In my test case based on Z copy of UJD_TEST_PACKAGE I replaced parameters with fixed values in code. Everything is working fine.

Actually in the code you are using small number of methods:

CALL METHOD CL_UJ_CONTEXT=>SET_CUR_CONTEXT

CL_UJD_SCHEDULE_PARSE=>PARSE_7X_FORMAT

CREATE OBJECT LO_PACKAGE.

CALL METHOD LO_PACKAGE->RUN_PACKAGE

cl_uja_actvty_mgr=>record_logon_activity

CL_UJD_PACKAGE_CONTEXT=>GET_INSTANCE_ID

CL_UJD_PACKAGE_STATUS_DAO=>GET_PACKAGE_STATUS

LO_CONTEXT = CL_UJ_CONTEXT=>GET_CUR_CONTEXT

LO_FILE_MGR = CL_UJF_FILE_SERVICE_MGR=>FACTORY

LO_FILE_MGR->CHECK_DOCUMENT_EXIST

LO_FILE_MGR->GET_DOCUMENT

former_member186338
Active Contributor
0 Kudos

Sorry, but it's a strange idea to call UJD_TEST_PACKAGE from your code!

Look on UJD_TEST_PACKAGE code itself. It's very simple 🙂 And you don't need to prepare parameters in the form of UJD_TEST_PACKAGE input.

Create a Z copy of UJD_TEST_PACKAGE

Remove user interface and generate answer prompt with your custom abap code.

Don't increase unnesessary complexity!

former_member186338
Active Contributor
0 Kudos

P.S. The format of LTH_ANSWER_PROMPT that you have to fill is very simple:

%SELECTION% has the following format:

/SHELLTEST/Planning/PRIVATEPUBLICATIONS/SUPPORT_EXT/TempFiles/FROM.TMP@@@SAVE@@@@@@EXPAND@@@|DIMENSION:ACCOUNT|PL110|DIMENSION:AUDITTRAIL|Input|DIMENSION:CATEGORY|Budget|DIMENSION:ENTITY|DE|DIMENSION:INTERCO|ThirdParty|DIMENSION:PRODUCT|ProductA|DIMENSION:RPTCURRENCY|LC|DIMENSION:TIME|2007.01

Easy to create!

Former Member
0 Kudos

Let me try that ! I am running out of options 😞

However, is there any drawback to call standard program UJD_TEST_PACKAGE from my custom program using SUBMIT abap command?
As in are there any issues in automating the BPC package execution ?

Are there any other SAP recommended ways to automate UJD_TEST_PACKAGE like keeping the program in a process chain and passing a variant?

former_member186338
Active Contributor
0 Kudos

Sorry, but simply add code from UJD_TEST_PACKAGE to your custom program 🙂 Not a lot of code...

Former Member
0 Kudos

Hi Vadim Kalinin,

After posting the question I managed to call UJD_TEST_PACKAGE program from my custom code using 'SUBMIT' command.

I am dynamically fetching parameters and passing them in the SUBMIT program.

However when I checked by debugging, the method LO_PACKAGE->RUN_PACKAGE is executing properly in UJD_TEST_PACKAGE without any exception getting caught. But in the next step where instance is getting imported using "CL_UJD_PACKAGE_CONTEXT=>GET_INSTANCE_ID( IMPORTING E_INSTANCE_ID = L_INSTANCE_ID )." method, L_INSTANCE_ID is getting imported as blank.

Hence, the next step where package status is getting fetched using class method "

CL_UJD_PACKAGE_STATUS_DAO=>GET_PACKAGE_STATUS( EXPORTING I_LOG_ID = L_INSTANCE_ID IMPORTING ES_PACKAGE_STATUS = LS_PACKAGE_STATUS ).", exception is getting caught. Because blank instance is fetched in previous step.

I compared all parameters of standard program and my custom program by debugging. Everything is same.

Am I missing something?

I have attached debug mode screenshot.