{"id":182,"date":"2023-12-28T03:46:01","date_gmt":"2023-12-28T03:46:01","guid":{"rendered":"https:\/\/sapabap.dwimansolution.com\/?p=182"},"modified":"2023-12-28T04:01:07","modified_gmt":"2023-12-28T04:01:07","slug":"sap-abap-bapi-on-ps-module-1-create-network-and-activity","status":"publish","type":"post","link":"https:\/\/sapabap.dwimansolution.com\/index.php\/2023\/12\/28\/sap-abap-bapi-on-ps-module-1-create-network-and-activity\/","title":{"rendered":"SAP ABAP &#8211; BAPI on PS Module #1 &#8211; Create Network and Activity"},"content":{"rendered":"\n<p>class references : <a href=\"https:\/\/github.com\/juanandasatria\/ZCL_UPLOAD_EXCEL.git\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/juanandasatria\/ZCL_UPLOAD_EXCEL.git<\/a> <\/p>\n\n\n\n<p>In a standard way, we can create a network and activity using code <strong>CJ20N <\/strong>under project and WBS. But now we have a request to create a program to <strong>mass-create the network activity using BAPI<\/strong>.<\/p>\n\n\n\n<p>BAPI on PS has unique behavior to make it work properly. They must run with this sequence:<\/p>\n\n\n\n<ol>\n<li>BAPI_PS_INITIALIZATION<\/li>\n\n\n\n<li>BAPI_BUS**** (this is the main BAPI that does the Create\/Change on your program) <\/li>\n\n\n\n<li>BAPI_PS_PRECOMMIT<\/li>\n\n\n\n<li>BAPI_TRANSACTION_COMMIT<\/li>\n<\/ol>\n\n\n\n<p>Based on the sequence, we can use the BAPI just for testing purposes. We have to know that one of the functions of BAPI_PS_PRECOMMIT is to <strong>generate the document number<\/strong>, while BAPI_BUS**** is doing all the <strong>checks and preparing<\/strong> <strong>the document<\/strong>. And finally, BAPI_TRANSACTION_COMMIT will publish the document.<\/p>\n\n\n\n<p>If we want to run in <strong>test mode<\/strong> without generating the document number then it should be run the BAPI_PS_INITIALIZATION then BAPI_BUS**** only. <\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>BAPI that we can use: <\/p>\n\n\n\n<ol>\n<li>Create Network : BAPI_BUS2002_CREATE<\/li>\n\n\n\n<li>Create Activity : BAPI_BUS2002_ACT_CREATE_MULTI<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<p>Here is the example of the code that running BAPI create Network:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>* ==================================================================== *\n* Description..: Upload Network Activity                               *\n* ==================================================================== *\nREPORT z_upl_network_activity.\n\n* -------------------------------------------------------------------- *\n*  G L O B A L   V A R I A B L E\n* -------------------------------------------------------------------- *\nDEFINE _set_text.\n  TRY.\n      lo_col = lo_cols-&gt;get_column( &amp;1 ).\n      lo_col-&gt;set_short_text( CONV scrtext_s( &amp;2 ) ).\n      lo_col-&gt;set_medium_text( CONV scrtext_m( &amp;2 ) ).\n      lo_col-&gt;set_long_text( CONV scrtext_l( &amp;2 )  ).\n    CATCH cx_salv_not_found.\n  ENDTRY.\nEND-OF-DEFINITION.\n\nTABLES: sscrfields.\nCLASS: lcl_main DEFINITION DEFERRED.\nTYPES: BEGIN OF ty_xlsx_raw,\n         \" NETWORK\n         project_definition     TYPE char100,\n         wbs_element            TYPE char100,\n         network                TYPE char100,\n         network_type           TYPE char100,\n         short_text             TYPE char100,\n         plant                  TYPE char10,\n         profit_ctr             TYPE char100,\n         mrp_controller         TYPE char100,\n         profile                TYPE char100,\n         bus_area               TYPE char100,\n\n         \" ACTIVITY\n         control_key            TYPE char100,\n         activity               TYPE char100,\n         description            TYPE char100,\n         duration_normal        TYPE dummy,\n         duration_normal_unit   TYPE char100,\n         work                   TYPE dummy,\n         work_unit              TYPE dummy,\n         work_center            TYPE dummy,\n         matl_group             TYPE char100,\n         purch_org              TYPE char100,\n         pur_group              TYPE char100,\n         requisitioner          TYPE char100,\n         recipient              TYPE char100,\n         tracking_number        TYPE dummy,\n         currency               TYPE char100,\n         operation_qty          TYPE char100,\n         operation_measure_unit TYPE char100,\n         price                  TYPE char100,\n         price_unit             TYPE char100,\n         cost_elem              TYPE char100,\n         start_date             TYPE char10,\n         finish_date            TYPE char10,\n       END OF ty_xlsx_raw,\n       tt_xlsx_raw TYPE TABLE OF ty_xlsx_raw.\n\n\n\" must have same fieldname with ty_xlsx_raw\n\" fields sort order is not necessary\nTYPES: BEGIN OF ty_xlsx,\n\n         \" NETWORK\n         project_definition     TYPE bapi_bus2002_new-project_definition,\n         wbs_element            TYPE bapi_bus2002_new-wbs_element,\n         network                TYPE bapi_bus2002_new-network,\n         network_type           TYPE bapi_bus2002_new-network_type,\n         short_text             TYPE bapi_bus2002_new-short_text,\n         plant                  TYPE bapi_bus2002_new-plant,\n         profit_ctr             TYPE bapi_bus2002_new-profit_ctr,\n         mrp_controller         TYPE bapi_bus2002_new-mrp_controller,\n         profile                TYPE bapi_bus2002_new-profile,\n         bus_area               TYPE bapi_bus2002_new-bus_area,\n\n         \" ACTIVITY\n         control_key            TYPE bapi_bus2002_act_new-control_key,\n         activity               TYPE bapi_bus2002_act_new-activity,\n         description            TYPE bapi_bus2002_act_new-description,\n         duration_normal        TYPE bapi_bus2002_act_new-duration_normal, \" dummy\n         duration_normal_unit   TYPE bapi_bus2002_act_new-duration_normal_unit,\n         work                   TYPE bapi_bus2002_act_new-work_activity, \" dummy,\n         work_unit              TYPE bapi_bus2002_act_new-un_work, \" dummy,\n         work_center            TYPE bapi_bus2002_act_new-work_cntr, \" dummy,\n         matl_group             TYPE bapi_bus2002_act_new-matl_group,\n         purch_org              TYPE bapi_bus2002_act_new-purch_org,\n         pur_group              TYPE bapi_bus2002_act_new-pur_group,\n         requisitioner          TYPE bapi_bus2002_act_new-preq_name,\n         recipient              TYPE bapi_bus2002_act_new-gr_rcpt,\n         tracking_number        TYPE bapi_bus2002_act_new-trackingno, \"dummy,\n         currency               TYPE bapi_bus2002_act_new-currency,\n         operation_qty          TYPE bapi_bus2002_act_new-operation_qty,\n         operation_measure_unit TYPE bapi_bus2002_act_new-operation_measure_unit,\n         price                  TYPE bapi_bus2002_act_new-price,\n         price_unit             TYPE bapi_bus2002_act_new-price_unit,\n         cost_elem              TYPE bapi_bus2002_act_new-cost_elem,\n         start_date             TYPE bapi_bus2002_act_new-early_start_date,\n         finish_date            TYPE bapi_bus2002_act_new-early_finish_date,\n       END OF ty_xlsx,\n       tt_xlsx TYPE TABLE OF ty_xlsx.\n\nTYPES: BEGIN OF ty_data,\n         icon    TYPE icon_d.\n         INCLUDE TYPE ty_xlsx.\nTYPES:   aufnr   TYPE afko-aufnr,\n         message TYPE char255,\n       END OF ty_data,\n       tt_data TYPE TABLE OF ty_data.\n\nDATA: t_xlsx_raw TYPE tt_xlsx_raw,\n      t_data     TYPE tt_data,\n      gv_error   TYPE boolean.\n\nDATA: o_main TYPE REF TO lcl_main.\n\nCONSTANTS:\n  c_start_time   TYPE syst-uzeit VALUE '000000',\n  c_finish_time  TYPE syst-uzeit VALUE '000000',\n\n  c_icon_error   TYPE icon_d VALUE icon_led_red,\n  c_icon_success TYPE icon_d VALUE icon_led_green.\n\n* -------------------------------------------------------------------- *\n*  S E L E C T I O N   S C R E E N\n* -------------------------------------------------------------------- *\nSELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.\n  PARAMETERS: p_file TYPE file_table-filename LOWER CASE.\n  PARAMETERS: p_test AS CHECKBOX USER-COMMAND test.\nSELECTION-SCREEN END OF BLOCK b1.\nSELECTION-SCREEN FUNCTION KEY 1.\n\nAT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.\n  p_file = zclzca_upload_excel=&gt;f4_filename( ).\n\nAT SELECTION-SCREEN.\n  IF sscrfields-ucomm = 'FC01'.\n    PERFORM f_download.\n  ENDIF .\n\n* -------------------------------------------------------------------- *\n*  C L A S S\n* -------------------------------------------------------------------- *\nCLASS lcl_main DEFINITION INHERITING FROM zclzca_upload_excel.\n  PUBLIC SECTION.\n    METHODS:\n      get_data,\n      show_data,\n      create_ps\n        IMPORTING\n          i_test TYPE boolean,\n      convert_data.\n\n  PRIVATE SECTION.\n    DATA: mv_is_external TYPE nriv-externind,\n          mo_alv         TYPE REF TO cl_salv_table.\n\n    METHODS:\n      alv_set_columns,\n      get_interval_external,\n      create_network\n        IMPORTING\n          i_test  TYPE boolean\n          is_data TYPE ty_data\n        EXPORTING\n          e_aufnr TYPE aufnr\n          e_msg   TYPE string\n          e_error TYPE boolean,\n      create_activities\n        IMPORTING\n          i_aufnr TYPE aufnr\n          i_test  TYPE boolean\n          it_data TYPE tt_data\n        EXPORTING\n          e_msg   TYPE string\n          e_error TYPE boolean.\nENDCLASS.\n\nCLASS lcl_main IMPLEMENTATION.\n  METHOD get_data.\n    convert_xlsx_to_itab( EXPORTING i_file = p_file i_initial_row = 2 CHANGING ct_data = t_xlsx_raw ).\n    convert_data( ).\n  ENDMETHOD. \" get_data\n\n  METHOD convert_data.\n    DATA: ls_xlsx TYPE ty_xlsx_raw.\n\n    DATA(lo_struct) = CAST cl_abap_structdescr( cl_abap_tabledescr=&gt;describe_by_data( ls_xlsx ) ).\n    DATA(lt_comps) = lo_struct-&gt;components.\n\n    LOOP AT t_xlsx_raw INTO ls_xlsx.\n      APPEND INITIAL LINE TO t_data ASSIGNING FIELD-SYMBOL(&lt;lfs_data&gt;).\n      DO.\n        DATA(lv_index) = sy-index.\n        ASSIGN COMPONENT lv_index OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(&lt;lfs_source&gt;).\n        IF sy-subrc NE 0.\n          EXIT.\n        ELSE.\n          READ TABLE lt_comps INTO DATA(ls_comp) INDEX lv_index.\n          IF sy-subrc EQ 0.\n            ASSIGN COMPONENT ls_comp-name OF STRUCTURE &lt;lfs_data&gt; TO FIELD-SYMBOL(&lt;lfs_target&gt;).\n            IF sy-subrc EQ 0.\n              CASE ls_comp-name.\n                WHEN 'WORK_UNIT' OR 'DURATION_NORMAL_UNIT'.\n                  &lt;lfs_target&gt; = convert_in_unit( &lt;lfs_source&gt; ).\n                WHEN 'NETWORK'.\n                  &lt;lfs_target&gt; = |{ &lt;lfs_source&gt; ALPHA = IN }|.\n                WHEN 'PRICE'.\n                  ASSIGN COMPONENT 'CURRENCY' OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(&lt;lfs_cuky&gt;).\n                  IF &lt;lfs_cuky&gt; EQ 'IDR'.\n                    &lt;lfs_target&gt; = &lt;lfs_source&gt; \/ 100.\n                  ELSE.\n                    &lt;lfs_target&gt; = &lt;lfs_source&gt;.\n                  ENDIF.\n                WHEN 'START_DATE' OR 'FINISH_DATE'.\n                  &lt;lfs_target&gt; = convert_in_date( &lt;lfs_source&gt; ).\n                WHEN OTHERS.\n                  &lt;lfs_target&gt; = &lt;lfs_source&gt;.\n              ENDCASE.\n\n            ENDIF.\n          ENDIF.\n        ENDIF.\n      ENDDO.\n    ENDLOOP.\n  ENDMETHOD. \" convert_data\n\n\n  METHOD create_network.\n    DATA: lt_bapiret2 TYPE TABLE OF bapiret2,\n          ls_network  TYPE bapi_bus2002_new,\n          lv_msg      TYPE string,\n          lv_dummy    TYPE char100.\n\n    IF is_data-network IS NOT INITIAL.\n      SELECT SINGLE aufnr\n        FROM afko\n        INTO @DATA(lv_aufnr)\n        WHERE aufnr = @is_data-network.\n      IF sy-subrc EQ 0.\n        CONCATENATE 'Order' lv_aufnr 'is already been created' INTO lv_msg SEPARATED BY space.\n        WRITE:\/ lv_msg.\n        MESSAGE s003(zca) DISPLAY LIKE 'E' WITH lv_aufnr. \" Order &amp; is already been created\n        EXIT.\n      ENDIF.\n    ENDIF.\n\n    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.\n\n\n    IF mv_is_external EQ 'X'.\n      ls_network-network = is_data-network.\n    ELSE.\n      ls_network-network = ''.\n    ENDIF.\n    ls_network-network_type = is_data-network_type.\n    ls_network-profile = is_data-profile.\n    ls_network-plant = is_data-plant.\n    ls_network-mrp_controller = is_data-mrp_controller.\n    ls_network-short_text = is_data-short_text.\n    ls_network-start_date = is_data-start_date.\n    ls_network-finish_date = is_data-finish_date.\n    ls_network-sched_type = '1'.\n    ls_network-not_auto_schedule = 'X'.\n    ls_network-not_mrp_applicable = 'X'.\n    ls_network-project_definition = is_data-project_definition.\n    ls_network-wbs_element = is_data-wbs_element.\n    ls_network-bus_area = is_data-bus_area.\n    ls_network-objectclass = 'IV'.\n    ls_network-currency = is_data-currency.\n\n\n    CALL FUNCTION 'BAPI_BUS2002_CREATE'\n      EXPORTING\n        i_network = ls_network\n      TABLES\n        et_return = lt_bapiret2.\n\n    LOOP AT lt_bapiret2 INTO DATA(ls_bapiret2).\n      lv_msg = build_message_bapiret2( ls_bapiret2 ).\n      WRITE:\/ ls_bapiret2-type, lv_msg.\n      IF ls_bapiret2-type EQ 'E'.\n        IF e_msg IS NOT INITIAL.\n          CONCATENATE e_msg lv_msg INTO e_msg SEPARATED BY ';'.\n        ELSE.\n          e_msg = lv_msg.\n        ENDIF.\n      ENDIF.\n    ENDLOOP.\n\n    IF line_exists( lt_bapiret2&#91; type = 'E' ] ).\n      e_error = 'X'.\n      EXIT.\n    ENDIF.\n\n    IF i_test NE 'X'.\n      CALL FUNCTION 'BAPI_PS_PRECOMMIT' TABLES et_return = lt_bapiret2.\n\n\n      READ TABLE lt_bapiret2 INTO ls_bapiret2 WITH KEY type = 'S' id = 'CNIF_PI' number = '052'.\n      IF sy-subrc EQ 0.\n        SPLIT ls_bapiret2-message_v2 AT space INTO e_aufnr lv_dummy.\n        e_aufnr = |{ e_aufnr ALPHA = IN }|.\n      ENDIF.\n\n      LOOP AT lt_bapiret2 INTO ls_bapiret2.\n        lv_msg = build_message_bapiret2( ls_bapiret2 ).\n        WRITE:\/ ls_bapiret2-type, lv_msg.\n        IF ls_bapiret2-type EQ 'E'.\n          IF e_msg IS NOT INITIAL.\n            CONCATENATE e_msg lv_msg INTO e_msg SEPARATED BY ';'.\n          ELSE.\n            e_msg = lv_msg.\n          ENDIF.\n        ENDIF.\n      ENDLOOP.\n\n      IF line_exists( lt_bapiret2&#91; type = 'E' ] ).\n        e_error = 'X'.\n        EXIT.\n      ENDIF.\n\n      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'.\n    ELSE.\n      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.\n    ENDIF.\n  ENDMETHOD. \" create_network\n\n\n  METHOD create_activities.\n    DATA: lt_bapiret2 TYPE TABLE OF bapiret2,\n          lt_activity TYPE TABLE OF bapi_bus2002_act_new,\n          lv_msg      TYPE string,\n          lv_aufnr    TYPE aufnr,\n          lv_vornr    TYPE afvc-vornr.\n\n    IF i_test EQ 'X'.\n      lv_vornr = '8000'.\n    ELSE.\n      SELECT SINGLE MAX( vornr )\n        FROM afvc AS a\n        INNER JOIN afko AS b ON b~aufpl = a~aufpl\n        INTO lv_vornr\n        WHERE b~aufnr = i_aufnr.\n    ENDIF.\n\n    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.\n\n    LOOP AT it_data INTO DATA(ls_data).\n      APPEND INITIAL LINE TO lt_activity ASSIGNING FIELD-SYMBOL(&lt;lfs_act&gt;).\n\n      \" if there is already activity created inside the network, then continue numbering (+10)\n      \" if not then start with 10\n      lv_vornr = lv_vornr + 10.\n      &lt;lfs_act&gt;-activity = |{ lv_vornr ALPHA = IN }|.\n\n      &lt;lfs_act&gt;-control_key = ls_data-control_key.\n      &lt;lfs_act&gt;-plant = ls_data-plant.\n      &lt;lfs_act&gt;-description = ls_data-description.\n      &lt;lfs_act&gt;-wbs_element = ls_data-wbs_element. \" converted value\n      &lt;lfs_act&gt;-purch_org = ls_data-purch_org.\n      &lt;lfs_act&gt;-pur_group = ls_data-pur_group.\n      &lt;lfs_act&gt;-matl_group = ls_data-matl_group.\n      &lt;lfs_act&gt;-price = ls_data-price.\n      &lt;lfs_act&gt;-price_unit = ls_data-price_unit.\n      &lt;lfs_act&gt;-currency = ls_data-currency.\n      &lt;lfs_act&gt;-cost_elem = ls_data-cost_elem.\n      &lt;lfs_act&gt;-operation_qty = ls_data-operation_qty.\n      &lt;lfs_act&gt;-operation_measure_unit = ls_data-operation_measure_unit.\n      &lt;lfs_act&gt;-constraint_start_date = ls_data-start_date.\n      &lt;lfs_act&gt;-constraint_finish_date = ls_data-finish_date.\n      &lt;lfs_act&gt;-bus_area = ls_data-bus_area.\n      &lt;lfs_act&gt;-preq_name = ls_data-requisitioner.\n      &lt;lfs_act&gt;-gr_rcpt = ls_data-recipient.\n    ENDLOOP.\n\n    IF i_test EQ 'X'.\n      DATA(lv_pronr) = convert_in_project( ls_data-project_definition ).\n      DATA(lv_pspel) = convert_in_wbs( ls_data-wbs_element ).\n      SELECT SINGLE a~aufnr\n        FROM aufk AS a\n        INNER JOIN afko AS b ON a~aufnr = b~aufnr\n        INTO lv_aufnr\n        WHERE a~auart = ls_data-network_type\n          AND a~pspel = lv_pspel\n          AND b~pronr = lv_pronr.\n    ELSE.\n      lv_aufnr = i_aufnr.\n    ENDIF.\n\n    CALL FUNCTION 'BAPI_BUS2002_ACT_CREATE_MULTI'\n      EXPORTING\n        i_number    = lv_aufnr\n      TABLES\n        it_activity = lt_activity\n        et_return   = lt_bapiret2.\n\n    LOOP AT lt_bapiret2 INTO DATA(ls_bapiret2).\n      lv_msg = build_message_bapiret2( ls_bapiret2 ).\n      WRITE:\/ ls_bapiret2-type, lv_msg.\n      IF ls_bapiret2-type EQ 'E'.\n        IF e_msg IS NOT INITIAL.\n          CONCATENATE e_msg lv_msg INTO e_msg SEPARATED BY ';'.\n        ELSE.\n          e_msg = lv_msg.\n        ENDIF.\n      ENDIF.\n    ENDLOOP.\n\n    IF line_exists( lt_bapiret2&#91; type = 'E' ] ).\n      e_error = 'X'.\n      EXIT.\n    ENDIF.\n\n    IF i_test NE 'X'.\n      CALL FUNCTION 'BAPI_PS_PRECOMMIT' TABLES et_return = lt_bapiret2.\n\n      LOOP AT lt_bapiret2 INTO ls_bapiret2.\n        lv_msg = build_message_bapiret2( ls_bapiret2 ).\n        WRITE:\/ ls_bapiret2-type, lv_msg.\n        IF ls_bapiret2-type EQ 'E'.\n          IF e_msg IS NOT INITIAL.\n            CONCATENATE e_msg lv_msg INTO e_msg SEPARATED BY ';'.\n          ELSE.\n            e_msg = lv_msg.\n          ENDIF.\n        ENDIF.\n      ENDLOOP.\n\n      IF line_exists( lt_bapiret2&#91; type = 'E' ] ).\n        e_error = 'X'.\n        EXIT.\n      ENDIF.\n\n      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'.\n    ELSE.\n      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.\n\n    ENDIF.\n\n  ENDMETHOD. \" create_activities\n\n\n  METHOD get_interval_external.\n    SELECT SINGLE externind\n      FROM nriv\n      INTO mv_is_external\n      WHERE object = 'AUFTRAG'\n        AND nrrangenr = '15'.\n\n  ENDMETHOD. \" get_interval_external\n\n  METHOD create_ps.\n    DATA: lt_data_act TYPE tt_data,\n          lv_aufnr    TYPE aufnr,\n          lv_msg      TYPE string,\n          lv_error    TYPE boolean.\n\n\n    SORT t_data BY network.\n\n    get_interval_external( ).\n\n    LOOP AT t_data ASSIGNING FIELD-SYMBOL(&lt;lfs_data_net&gt;) GROUP BY &lt;lfs_data_net&gt;-network.\n      CLEAR: lv_error.\n\n      lv_msg = `Processing : ` &amp;&amp; &lt;lfs_data_net&gt;-network.\n      WRITE: \/ lv_msg.\n\n      \" Create Network\n      CLEAR: lv_aufnr, lv_msg.\n      create_network( EXPORTING i_test = i_test is_data = &lt;lfs_data_net&gt; IMPORTING e_aufnr = lv_aufnr e_msg = lv_msg e_error = lv_error ).\n      LOOP AT GROUP &lt;lfs_data_net&gt; ASSIGNING FIELD-SYMBOL(&lt;lfs_data_act&gt;).\n        IF lv_error EQ 'X'.\n          &lt;lfs_data_act&gt;-icon = c_icon_error.\n          &lt;lfs_data_act&gt;-message = lv_msg.\n        ELSE.\n          &lt;lfs_data_act&gt;-aufnr = lv_aufnr.\n        ENDIF.\n      ENDLOOP.\n      CHECK lv_error EQ ''.\n\n      \" Create Activities\n      CLEAR: lt_data_act, lv_msg.\n      LOOP AT GROUP &lt;lfs_data_net&gt; ASSIGNING &lt;lfs_data_act&gt;.\n        APPEND &lt;lfs_data_act&gt; TO lt_data_act.\n      ENDLOOP.\n      create_activities( EXPORTING i_aufnr = lv_aufnr i_test = i_test it_data = lt_data_act IMPORTING e_msg = lv_msg e_error = lv_error ).\n      LOOP AT GROUP &lt;lfs_data_net&gt; ASSIGNING &lt;lfs_data_act&gt;.\n        IF lv_error EQ 'X'.\n          &lt;lfs_data_act&gt;-icon = c_icon_error.\n          &lt;lfs_data_act&gt;-message = lv_msg.\n        ELSE.\n          &lt;lfs_data_act&gt;-aufnr = lv_aufnr.\n          &lt;lfs_data_act&gt;-icon = c_icon_success.\n        ENDIF.\n      ENDLOOP.\n\n      WRITE:\/ sy-uline.\n    ENDLOOP.\n    WRITE:\/ sy-uline.\n\n    IF line_exists( t_data&#91; icon = c_icon_error ] ).\n      gv_error = 'X'.\n    ENDIF.\n\n    IF gv_error NE 'X'.\n      IF p_test EQ 'X'.\n        WRITE:\/ 'File is ready to run'.\n        MESSAGE s004(zca). \" File is ready to run\n      ELSE.\n        WRITE:\/ 'Process has been completed'.\n        MESSAGE s002(zca). \" Process has been completed\n      ENDIF.\n    ELSE.\n      WRITE:\/ 'Error occurred'.\n      MESSAGE s005(zca) DISPLAY LIKE 'E'. \" Error occurred\n    ENDIF.\n\n\n  ENDMETHOD. \" create_ps\n\n\n  METHOD alv_set_columns.\n    DATA: lo_col TYPE REF TO cl_salv_column.\n\n    DATA(lo_cols) = mo_alv-&gt;get_columns( ).\n    lo_cols-&gt;set_optimize( ).\n\n    _set_text 'ICON' 'Icon'.\n    _set_text 'MESSAGE' 'Message'.\n\n  ENDMETHOD. \" alv_set_columns\n\n  METHOD show_data.\n    TRY.\n        CALL METHOD cl_salv_table=&gt;factory\n          IMPORTING\n            r_salv_table = mo_alv\n          CHANGING\n            t_table      = t_data.\n      CATCH cx_salv_msg.\n    ENDTRY.\n\n    DATA(lo_functions) = mo_alv-&gt;get_functions( ).\n    lo_functions-&gt;set_all( abap_true ).\n\n    alv_set_columns( ).\n\n    mo_alv-&gt;display( ).\n  ENDMETHOD. \" show_data\n\nENDCLASS.\n\n\n* -------------------------------------------------------------------- *\n*  I N I T I A L I Z A T I O N\n* -------------------------------------------------------------------- *\nINITIALIZATION.\n  CREATE OBJECT o_main.\n  sscrfields-functxt_01 = 'Download Template'.\n\n\n* -------------------------------------------------------------------- *\n*  S T A R T   O F    S E L E C T I O N\n* -------------------------------------------------------------------- *\nSTART-OF-SELECTION.\n  PERFORM f_main.\n\n* -------------------------------------------------------------------- *\n*  E N D   O F   S E L E C T I O N\n* -------------------------------------------------------------------- *\nEND-OF-SELECTION.\n  PERFORM f_end.\n\n* -------------------------------------------------------------------- *\n*  S U B R O U T I N E S\n* -------------------------------------------------------------------- *\n*&amp;---------------------------------------------------------------------*\n*&amp; Form f_MAIN\n*&amp;---------------------------------------------------------------------*\n*&amp; text\n*&amp;---------------------------------------------------------------------*\n*&amp; --&gt;  p1        text\n*&amp; &lt;--  p2        text\n*&amp;---------------------------------------------------------------------*\nFORM f_main .\n  o_main-&gt;get_data( ).\nENDFORM.\n\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form f_download\n*&amp;---------------------------------------------------------------------*\n*&amp; text\n*&amp;---------------------------------------------------------------------*\n*&amp; --&gt;  p1        text\n*&amp; &lt;--  p2        text\n*&amp;---------------------------------------------------------------------*\nFORM f_download .\n  \" File should saved in tcode : OAOR\n  o_main-&gt;download_template( i_description = 'UPLOAD_NETWORK_ACTIVITY' ).\nENDFORM.\n\n\n*&amp;---------------------------------------------------------------------*\n*&amp; Form f_end\n*&amp;---------------------------------------------------------------------*\n*&amp; text\n*&amp;---------------------------------------------------------------------*\n*&amp; --&gt;  p1        text\n*&amp; &lt;--  p2        text\n*&amp;---------------------------------------------------------------------*\nFORM f_end .\n  o_main-&gt;create_ps( i_test = p_test ).\n  o_main-&gt;show_data( ).\n  MESSAGE s002(zca). \" Process has been completed\nENDFORM.<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>class references : https:\/\/github.com\/juanandasatria\/ZCL_UPLOAD_EXCEL.git In a standard way, we can create a network and activity using code CJ20N under project and WBS. But now we have a request to create a program to mass-create the network activity using BAPI. BAPI on PS has unique behavior to make it work properly. They must run with this&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/182"}],"collection":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/comments?post=182"}],"version-history":[{"count":2,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/182\/revisions"}],"predecessor-version":[{"id":185,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/posts\/182\/revisions\/185"}],"wp:attachment":[{"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/media?parent=182"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/categories?post=182"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sapabap.dwimansolution.com\/index.php\/wp-json\/wp\/v2\/tags?post=182"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}