Synchronization between Contract and Project

By Edukondalu, IBM India

FUNCTION zyotcpr_contract_sync_project.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(IM_XVBAK1) TYPE  VBAK
*"  TABLES
*"      TBL_XVBAP STRUCTURE  VBAPVB
*"      TBL_CLI_STAT STRUCTURE  ZYOTCPR_CLISTAT
*"----------------------------------------------------------------------
* Author                : Edukondalu atla (013262744)                  *
* Date                  : 10/19/2009
* Program description   : system will synchronize the contract line
*item attributes with the WBS level 2 Billing Element attributes. Most *
* significant is synchronization of system and user status fields.     *
*----------------------------------------------------------------------*
  CONSTANTS: c_error       TYPE char1      VALUE 'E',
             c_e           TYPE char1      VALUE 'E',
             c_i           TYPE char1      VALUE 'I',
             c_x           TYPE char1      VALUE 'X',
             c_relnomp    TYPE  char8      VALUE 'REL NoMP',
             c_rel         TYPE char3      VALUE 'REL',
             c_teco        TYPE char4      VALUE 'TECO',
             c_fnbl        TYPE char4      VALUE 'FNBL',
             c_fnbl_sys_stat TYPE char13      VALUE 'REL NoMP FNBL',
             c_clsd        TYPE char4      VALUE 'CLSD',
* Begin of Modification -005 YDEK919877- Defect 16815
             c_zm          TYPE parvw      VALUE 'ZM',
* End of Modification -005 YDEK919877- Defect 16815
             c_1           TYPE char1      VALUE '1'.
  TYPES:
    BEGIN OF ty_errmessage,
      type    TYPE bapi_mtype,    "Message Type
      message TYPE bapi_msg,      "Message Text
    END OF ty_errmessage,
    BEGIN OF ty_prps1,
      pspnr TYPE ps_posnr,"WBS Element
      vernr TYPE ps_vernr,"Number of the responsible pesson (proj MNGR)
      prart TYPE ps_prart,"Project type
      pbukr TYPE ps_pbukr,"Company code for WBS element
    END OF ty_prps1,
    BEGIN OF ty_prps,
    posid TYPE ps_posid,"Work Breakdown Structure Element (WBS Element)
    objnr TYPE j_objnr,"Object number
    zzpre_contract TYPE zzpre_conract,
    auart TYPE auart,
    END OF ty_prps,
    BEGIN OF ty_jest,
    objnr TYPE objnr,"Object number
    stat TYPE j_status,"status
    END OF ty_jest,
    BEGIN OF ty_sys_stat,
    istat TYPE j_istat,"system Status
    txt04 TYPE j_txt04, " Status text
    END OF ty_sys_stat,
   BEGIN OF ty_user_stat2,
    objnr TYPE objnr,
    stsma TYPE j_stsma,
    estat TYPE j_estat,"user Status
    linep TYPE j_linep,
    txt04 TYPE j_txt04,"Status text
   END OF ty_user_stat2,
    BEGIN OF ty_user_stat,
    stsma TYPE j_stsma,
    estat TYPE j_estat,"user Status
    txt04 TYPE j_txt04,"Status text
   END OF ty_user_stat,
   BEGIN OF ty_user_stat1,
    stsma TYPE j_stsma,
    estat TYPE j_estat,"user Status
    linep TYPE j_linep,"Status text
   END OF ty_user_stat1,
   BEGIN OF ty_project,
    pspid TYPE ps_pspid,"WBS Element
    profl TYPE profidproj," status profile
   END OF ty_project,
   BEGIN OF ty_ztabstat,
   zcont_type TYPE auart, " Doc Type
   zprecontract TYPE zzpre_conract1," pre contract flag
   zcon_header_stat TYPE j_stext,"contract header status
   zcon_sys_stat TYPE j_stext,"Contract line item system status
   zcon_user_stat TYPE asttx,"Contract line item user status
   zwbs_sys_stat TYPE co_sttxt, "WBS system status
   zwbs_user_stat TYPE co_sttxtu,"WBS user status
   END OF ty_ztabstat,
   BEGIN OF ty_wbsstat_in,
     auart TYPE auart,
     zzpre_contract TYPE zzpre_conract," Pre Contract Flag
     zcon_header_stat TYPE j_stext, "contract header status
     objnr TYPE objnr, "Object number
     stat1 TYPE co_sttxt, "Contract line item system status
     stat2 TYPE co_sttxt, "Contract line item user status
   END OF ty_wbsstat_in,
   BEGIN OF ty_conthead,
   objnr TYPE objnr, "Object number
   stat TYPE co_sttxt,"contract header status
   END OF ty_conthead,
   BEGIN OF ty_psphi,
   pspsnr TYPE ps_posnr, "WBS Element
   psphi TYPE ps_psphi, "Current number of the appropriate project
   END OF ty_psphi,
   BEGIN OF ty_pspid,
   pspsnr TYPE ps_posnr, "WBS Element
   pspid TYPE ps_pspid, "Project Definition
   END OF ty_pspid,
   BEGIN OF ty_sys_str,
   sys_stat TYPE j_istat,
   END OF ty_sys_str,
   BEGIN OF ty_user_str,
   user_stat TYPE j_estat,
   END OF ty_user_str,
   BEGIN OF ty_veda,
   vbeln TYPE vbeln_va,
   vposn TYPE posnr_va,
   vbegdat TYPE vbdat_veda,
   venddat  TYPE vndat_veda,
   END OF ty_veda,
   BEGIN OF ty_jsto,
   objnr TYPE j_objnr,
   stsma TYPE j_stsma,
   END OF ty_jsto.
  TYPES : BEGIN OF ty_cli_status,
          objnr TYPE objpo,
          cli_sys_stat  TYPE co_sttxt,
          cli_user_stat TYPE co_sttxt,
          END OF ty_cli_status.
  DATA:  BEGIN OF fnbl OCCURS 0,
         sign(1)    TYPE c,
         option(2)  TYPE c,
         low        TYPE j_stext,
         high       TYPE j_stext,
        END OF fnbl.
  RANGES: r_fnbl FOR zyotcpr_wbsstat-zcon_sys_stat.
  r_fnbl-sign = 'I'.             "include
  r_fnbl-option = 'CP'.          "Pattern
  r_fnbl-low  = '*FNBL*'.             "Low Value
  r_fnbl-high = ''.             "High Value
  APPEND r_fnbl.
  DATA:
      i_jsto TYPE STANDARD TABLE OF ty_jsto,
      wg_jsto TYPE ty_jsto,
      i_veda TYPE STANDARD TABLE OF ty_veda,
      wg_veda TYPE ty_veda,
      i_cli_status1 TYPE STANDARD TABLE OF ty_cli_status,
      wg_cli_sttus1 TYPE ty_cli_status,
      i_sys_stat_tbl TYPE STANDARD TABLE OF ty_sys_str,
      wg_sys_stat_tbl TYPE ty_sys_str,
      i_user_stat_tbl TYPE STANDARD TABLE OF  ty_user_str,
      wg_user_stat_tbl TYPE ty_user_str,
      i_psphi TYPE STANDARD TABLE OF ty_psphi,
      i_pspid TYPE STANDARD TABLE OF ty_pspid,
      wg_pspid TYPE ty_pspid,
      st_project_definition TYPE  bapi_bus2001_chg,
      st_project_definition_upd TYPE  bapi_bus2001_upd,
      st_ext_proj_def TYPE bapi_proj_key-project_defi,
      st_int_proj_def TYPE bapi_proj_key-proj_key_int,
      st_project_definition2 TYPE  bapi_project_definition,
      st_project_definition_upd2 TYPE  bapi_project_definition_up,
      i_return   TYPE STANDARD TABLE OF bapiret2 INITIAL SIZE 0,
      wg_return  TYPE bapiret2 ,
      wg_return1 TYPE  bapiret1,
      i_prps1    TYPE STANDARD TABLE OF ty_prps1,
      wg_prps1   TYPE ty_prps1,
      wg_vbap    TYPE vbapvb,
      g_output   TYPE ps_posid,
      g_temp_wbs_element TYPE ps_posid,
      g_pspnr TYPE ps_psp_pnr,
      st_project_definition1 TYPE bapi_bus2001_new-project_definition,
      i_wbs_element TYPE STANDARD TABLE OF bapi_bus2054_chg
                                                   INITIAL SIZE 0,
      i_wbs_element2 TYPE STANDARD TABLE OF bapi_bus2054_chg
                                                   INITIAL SIZE 0,
      wg_wbs_element TYPE bapi_bus2054_chg,
      i_update_wbs_element TYPE STANDARD TABLE OF bapi_bus2054_upd,
      wg_update_wbs_element TYPE bapi_bus2054_upd,
      i_project_definition TYPE bapi_bus2054_detail-project_definition,
      i_wbs_element1 TYPE STANDARD TABLE OF bapi_wbs_list,
      i_et_wbs_element TYPE STANDARD TABLE OF bapi_bus2054_detail ,
      i_et_wbs_element1 TYPE STANDARD TABLE OF bapi_bus2054_detail ,
      i_et_wbs_element2 TYPE STANDARD TABLE OF bapi_bus2054_detail ,
      wg_et_wbs_element TYPE bapi_bus2054_detail,
      wg_et_wbs_element1 TYPE bapi_bus2054_detail,
      wg_et_wbs_element2 TYPE bapi_bus2054_detail,
      i_prps TYPE STANDARD TABLE OF ty_prps,
      i_prps2 TYPE STANDARD TABLE OF ty_prps,
      i_prps3 TYPE STANDARD TABLE OF ty_prps,
      wg_prps TYPE ty_prps,
      wg_prps2 TYPE ty_prps,
      wg_prps3 TYPE ty_prps,
      i_jest TYPE STANDARD TABLE OF ty_jest,
      i_jest_tmp TYPE STANDARD TABLE OF ty_jest,
      i_jest1 TYPE STANDARD TABLE OF ty_jest,
      i_jest_tmp1 TYPE STANDARD TABLE OF ty_jest,
      wg_jest TYPE ty_jest,
      wg_jest_temp TYPE ty_jest,
      i_wbs_system_status TYPE STANDARD TABLE OF
                                    bapi_wbs_mnt_system_status,
*Begin of Modification-003 -YDEK916677 - SCR1
     i_wbs_system_status_single TYPE STANDARD TABLE OF
                                    bapi_wbs_mnt_system_status,
*End of Modification-003 -YDEK916677 - SCR1
      wg_wbs_system_status TYPE bapi_wbs_mnt_system_status,
      i_wbs_user_status TYPE STANDARD TABLE OF bapi_wbs_mnt_user_status,
      wg_wbs_user_status TYPE bapi_wbs_mnt_user_status,
      i_result TYPE STANDARD TABLE OF bapi_status_result,
      i_sys_stat TYPE STANDARD TABLE OF ty_sys_stat,
      wg_sys_stat TYPE ty_sys_stat,
      i_user_stat TYPE STANDARD TABLE OF ty_user_stat,
      wg_user_stat TYPE ty_user_stat,
      i_user_stat1 TYPE STANDARD TABLE OF ty_user_stat1,
      wg_user_stat1 TYPE ty_user_stat1,
      i_user_stat2 TYPE STANDARD TABLE OF ty_user_stat2,
      i_user_stat3 TYPE STANDARD TABLE OF ty_user_stat2,
      wg_user_stat2 TYPE ty_user_stat2,
      g_profl TYPE ps_stspr,
      g_hvlv TYPE zzhvlv,
      gd_set TYPE char1,
*    g_gbstk TYPE gbstk,
      i_ztabstat TYPE STANDARD TABLE OF ty_ztabstat,
      wg_ztabstat TYPE ty_ztabstat,
      i_wbsstat_in TYPE STANDARD TABLE OF ty_wbsstat_in,
      wg_wbsstat_in TYPE ty_wbsstat_in,
      lv_index TYPE sy-tabix,
      i_prps4 LIKE i_prps3,
      i_prps5 LIKE i_prps3,
      i_prps6 LIKE i_prps3,
      g_line TYPE sy-tabix,
      wg_wbsstat_tmp LIKE LINE OF i_wbsstat_in,
      i_wbsstat_tmp LIKE i_wbsstat_in,
      i_conthead TYPE STANDARD TABLE OF ty_conthead,
      wg_conthead         TYPE  ty_conthead,
      g_conthead          TYPE j_status ,
      g_conthead_txt      TYPE j_txt04,
      wl_index            TYPE sy-tabix,
      g_line_sysstat      TYPE co_sttxt,
      g_line_sysstat_tmp  TYPE co_sttxt,
      g_line_userstat     TYPE co_sttxt,
      g_line_userstat_tmp TYPE co_sttxt,
      l_no   TYPE i,
      v_len  TYPE i,
      v_len1 TYPE i,
      lv_len TYPE i,
      v_len2 TYPE i.
* WORK AREAS
  DATA:  wg_project_definition         TYPE bapi_project_definition_up,
         wg_bapi_method_project        TYPE bapi_method_project,
         wg_bapi_element_table_update  TYPE bapi_wbs_element_update,
         wg_bapi_element_table         TYPE bapi_wbs_element,
         wg_proj_def                   TYPE bapi_project_definition,
         wg_bapi_project_definition_ex TYPE bapi_project_definition_ex,
         wg_type                       TYPE bapireturn1, "Return Parameter
         wg_classvarvalues             TYPE bapi1003_char_val_r,
         wg_wbs_element_table          TYPE bapi_wbs_element_exp,
         wg_type1                      TYPE bapiret2,
         wg_e_wbs_element              TYPE bapi_wbs_elements.
**&---------------------------------------------------------------------
*
*** INTERNAL TABLE
  DATA:  i_bapi_method_project TYPE TABLE OF bapi_method_project,
         i_bapi_element_table_update   TYPE TABLE OF
                                       bapi_wbs_element_update,
         i_bapi_element_table  TYPE STANDARD TABLE OF
                                      bapi_wbs_element,
         i_classvarvalues  TYPE STANDARD TABLE OF bapi1003_char_val_r,
         i_wbs_element_table           TYPE STANDARD TABLE OF
                                   bapi_wbs_element_exp,
         i_e_wbs_element  TYPE STANDARD TABLE OF bapi_wbs_elements.
** CONSTANTS
  CONSTANTS: c_val       TYPE string VALUE '000001',
             c_one        TYPE c      VALUE '1',
             c_update       TYPE string VALUE 'UPDATE',
             c_save         TYPE string VALUE 'SAVE',
             c_wbs_element  TYPE string VALUE 'WBS-ELEMENT'  ,
             c_project      TYPE string VALUE 'ProjectDefinition',
             c_offering     TYPE atwrt  VALUE 'OCI',
             c_classt       TYPE  bapi_class_key-classtype VALUE '001' .
*Begin of Modification-003 -YDEK916677 - SCR1
  DATA: i_wbs_sys_stat TYPE STANDARD TABLE OF bapi_wbs_system_status,
        wg_wbs_sys_stat TYPE bapi_wbs_system_status.
  DATA: i_ztabstat_fnbl TYPE STANDARD TABLE OF ty_ztabstat.
  DATA: i_wbs_elements TYPE STANDARD TABLE OF bapi_wbs_elements,
        wg_wbs_elements TYPE bapi_wbs_elements.
  CLEAR: wg_wbs_elements.
*End of Modification-003 -YDEK916677 - SCR1
  DATA: l_char(40) TYPE c.
  DATA: wg_cli_status TYPE zyotcpr_clistat,
        i_status1 TYPE STANDARD TABLE OF zyotcpr_clistat.
  DATA : l_pernr TYPE  pernr_d,
         l_pernr_header TYPE  pernr_d.
* End of Modification @002 - Rev track 2732 : YDEK912939 Defect # 12026
*---------------------------------------------------------------*
* Begin of  Processing
*---------------------------------------------------------------*
*  IF sy-uname EQ '0132627441'."OR
***    sy-uname  EQ '00904C744' OR
***    sy-uname  EQ '00828G744' or
*    sy-uname  eq '617633744'.
*    added by Debaraj Sahoo to get the line item details entered in
*    the Contract screen
  DATA: i_xveda TYPE TABLE OF vedavb,
        wl_xveda TYPE vedavb.
*Begin of Modification-003 -YDEK916677 - SCR1
  DATA: i_xvbpa TYPE TABLE OF vbpavb,
       wl_xvbpa TYPE vbpavb.
  FIELD-SYMBOLS: <ls_03> TYPE ANY,
               <ls_04> TYPE ANY.
  ASSIGN '(SAPMV45A)XVBPA[]' TO <ls_03>.
  ASSIGN (<ls_03>) TO <ls_04>.
* Begin of Modification 004 YDEK919397 for defect 16277
  IF sy-subrc EQ 0.
    i_xvbpa[] = <ls_04>.
  ENDIF.
* End of Modification 004 YDEK919397 for defect 16277
*End of Modification-003 -YDEK916677 - SCR1
  FIELD-SYMBOLS: <ls_01> TYPE ANY,
                 <ls_02> TYPE ANY.
  ASSIGN '(SAPLV45W)xveda[]' TO <ls_01>.
  ASSIGN (<ls_01>) TO <ls_02>.
* Begin of Modification 004 YDEK919397 for defect 16277
  IF sy-subrc EQ 0.
    i_xveda[] = <ls_02>.
  ENDIF.
* End of Modification 004 YDEK919397 for defect 16277
*    end of addition by Debaraj Sahoo
*Begin of modification YDEK919257 defect no 16277
  COMMIT WORK.
* End of modification YDEK919257 defect no 16277
  i_status1[] = tbl_cli_stat[].
  DELETE ADJACENT DUPLICATES FROM i_status1 COMPARING ALL FIELDS.
  LOOP AT i_status1 INTO wg_cli_status.
    CONDENSE wg_cli_status-zcli_sys_stat.
    CONDENSE wg_cli_status-zcli_user_stat.
    MODIFY i_status1 FROM wg_cli_status.
  ENDLOOP.
*IF SY-UNAME EQ '00000'.
* Slect the flag which differentiates High Volume Low Value Contract
* if the g_hvlv indicator has some vlaue it belongs to HVLV Contract
  SELECT SINGLE zzhvlv FROM  vbak
                       INTO g_hvlv
                       WHERE vbeln = im_xvbak1-vbeln.
******** added ******************
  TYPES: BEGIN OF ty_vbpa,
          vbeln TYPE vbeln,
          posnr TYPE posnr,
          parvw TYPE parvw,
          pernr TYPE pernr_d,
         END OF ty_vbpa.
  DATA: i_wbs_get_stat TYPE STANDARD TABLE OF bapi_wbs_elements,
              wg_wbs_get_stat TYPE bapi_wbs_elements.
  DATA: i_vbpa TYPE STANDARD TABLE OF ty_vbpa,
        wg_vbpa TYPE ty_vbpa.
  IF NOT tbl_xvbap[] IS INITIAL.
    SELECT vbeln posnr
           parvw pernr
    FROM vbpa INTO TABLE i_vbpa
    FOR ALL ENTRIES IN tbl_xvbap
    WHERE vbeln EQ tbl_xvbap-vbeln
*      AND   posnr EQ tbl_xvbap-posnr
    AND   parvw EQ 'ZM'.
    IF i_vbpa IS NOT INITIAL.
      SORT i_vbpa BY vbeln posnr.
    ENDIF.
  ENDIF.
  IF NOT tbl_xvbap[] IS INITIAL.
    SELECT objnr stsma
    FROM jsto INTO TABLE i_jsto
    FOR ALL ENTRIES IN tbl_xvbap
    WHERE objnr EQ tbl_xvbap-objnr.
    IF i_jsto IS NOT INITIAL.
      SORT i_jsto BY objnr.
    ENDIF.
  ENDIF.
******** added********
  SORT tbl_xvbap BY ps_psp_pnr.
*  * Get the Current number of the appropriate project from PRPS Table
*  Based on the WBS Element present in Contract
*  IF sy-uname = '00904C744' .".OR  sy-uname =  '013262744'.
  SELECT objnr stat
          FROM jest
          INTO TABLE i_conthead
          WHERE objnr = im_xvbak1-objnr.
* Filter the Contract header status by filtering the statuses which
* starts with I.
  READ TABLE i_conthead INTO wg_conthead WITH KEY stat+0(1) = c_i  .
  IF sy-subrc = 0.
    g_conthead = wg_conthead-stat.
  ENDIF.
* get the Contract Header status from tj02t
  SELECT SINGLE  txt04 FROM tj02t
                       INTO g_conthead_txt
                       WHERE istat = g_conthead
                       AND   spras = sy-langu.
* get the Current number of the appropriate project from PRPS by
* providing the WBS Element
  DELETE tbl_xvbap WHERE abgru NE '  '
                         OR objnr EQ '                      '.
  IF NOT tbl_xvbap[]  IS INITIAL.
    SELECT pspnr psphi FROM prps
                       INTO TABLE i_psphi
                       FOR ALL ENTRIES IN tbl_xvbap
                       WHERE pspnr = tbl_xvbap-ps_psp_pnr.
  ENDIF.
  IF NOT i_psphi[]  IS INITIAL.
    SORT i_psphi BY psphi.
    DELETE ADJACENT DUPLICATES FROM i_psphi COMPARING psphi.
* Get the Project from PROJ Table Based on
*                          the Current number of the Project
    SELECT  pspnr pspid  FROM proj
                         INTO TABLE i_pspid
                         FOR ALL ENTRIES IN i_psphi
                         WHERE pspnr = i_psphi-psphi.
  ENDIF.
  DESCRIBE TABLE i_psphi LINES l_no.
  IF l_no EQ 0.
    EXIT.
  ELSEIF l_no GT 1.
    MESSAGE i010(zyotc).
    EXIT.
*     IF the Project does not Exist Then Skip all the Further
*Processing
  ELSE.
* Get the Status Profile for Project definition from PROJ Table
    READ TABLE i_pspid INTO wg_pspid INDEX c_1.
*    READ TABLE tbl_xvbap into wg_xvbap.
    SELECT SINGLE stspr
                 FROM proj
                 INTO g_profl WHERE pspnr = wg_pspid-pspid.
*      IF NOT tbl_xvbap IS INITIAL.
    SELECT vbeln vposn  vbegdat venddat FROM veda INTO TABLE i_veda
      FOR ALL ENTRIES IN tbl_xvbap WHERE vbeln = tbl_xvbap-vbeln.
*           AND VPOSN = tbl_xvbap-POSNR.
*        ENDIF.
    READ TABLE i_veda INTO wg_veda INDEX c_1.
    i_project_definition = wg_pspid-pspid.
    st_project_definition1 = wg_pspid-pspid.
* use the BAPI BAPI_BUS2054_GETDATA to get detailed
*                                       information about WBS elements.
    CALL FUNCTION 'BAPI_BUS2054_GETDATA'
      EXPORTING
        i_project_definition = i_project_definition
        i_language           = 'EN'
      TABLES
        it_wbs_element       = i_wbs_element1
        et_wbs_element       = i_et_wbs_element.
    CLEAR wg_vbap.
    LOOP AT i_et_wbs_element INTO wg_et_wbs_element.
      IF wg_et_wbs_element-wbs_up IS INITIAL.
        APPEND wg_et_wbs_element TO i_et_wbs_element1.
      ENDIF.
      READ TABLE i_et_wbs_element1 INTO wg_et_wbs_element1 WITH KEY
                           wbs_element = wg_et_wbs_element-wbs_up.
      IF sy-subrc = 0.
        APPEND wg_et_wbs_element TO i_et_wbs_element2.
      ENDIF.
      CLEAR: wg_et_wbs_element,wg_et_wbs_element1.
    ENDLOOP.
***********First Section of the Enhancement for Project data Update*****
*    CLEAR ALL THE WORK AREAS,INTERNAL TABLES
    CLEAR :  wg_proj_def,wg_project_definition,wg_type,
             wg_wbs_element_table, i_wbs_element_table[],
             i_bapi_method_project[],
             i_bapi_element_table_update[],
             i_bapi_element_table[].
    READ TABLE i_xveda INTO wl_xveda INDEX c_1.
    READ TABLE i_vbpa INTO wg_vbpa
                             WITH KEY vbeln = wg_vbap-vbeln.
    wg_proj_def-project_definition = st_project_definition1.
    wg_proj_def-start   = wl_xveda-vbegdat.
    wg_proj_def-finish  = wl_xveda-venddat.
    wg_project_definition-project_definition = c_x.
    wg_project_definition-start = c_x.
    wg_project_definition-finish = c_x.
    wg_bapi_method_project-refnumber      = c_val.
    wg_bapi_method_project-objecttype     = c_project.
    wg_bapi_method_project-method         = c_update.
    wg_bapi_method_project-objectkey      = c_one.
    APPEND wg_bapi_method_project TO i_bapi_method_project.
    CLEAR wg_bapi_method_project.
    wg_bapi_method_project-method         = c_save.
    APPEND wg_bapi_method_project TO   i_bapi_method_project.
    CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'
      EXPORTING
        i_project_definition       = wg_proj_def
        i_project_definition_upd   = wg_project_definition
      IMPORTING
        return                     = wg_return1
      TABLES
        i_method_project           = i_bapi_method_project
        i_wbs_element_table_update = i_bapi_element_table_update
        i_wbs_element_table        = i_bapi_element_table.
    IF wg_return1-type EQ c_error .
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      CLEAR i_return.
*    EXIT.
    ELSE.
*  This method executes a COMMIT WORK command.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = c_x.
      CLEAR i_return.
    ENDIF.
*******LEVEL1 WBS Element Data Update*************************
* *    CLEAR ALL THE WORK AREAS,INTERNAL TABLES
    CLEAR :  wg_proj_def,wg_project_definition,wg_type,
             wg_wbs_element_table, i_wbs_element_table[],
             i_bapi_method_project[],
             i_bapi_element_table_update[],
             i_bapi_element_table[].
    READ TABLE i_xveda INTO wl_xveda INDEX c_1.
    READ TABLE i_vbpa INTO wg_vbpa
                             WITH KEY vbeln = wg_vbap-vbeln.
    wg_proj_def-project_definition = st_project_definition1.
    wg_proj_def-start   = wl_xveda-vbegdat.
    wg_proj_def-finish  = wl_xveda-venddat.
    wg_project_definition-project_definition = c_x.
    wg_project_definition-start = c_x.
    wg_project_definition-finish = c_x.
    wg_bapi_method_project-refnumber      = c_val.
    wg_bapi_method_project-objecttype     = c_wbs_element.
    wg_bapi_method_project-method         = c_update.
    wg_bapi_method_project-objectkey      = c_one.
    APPEND wg_bapi_method_project TO i_bapi_method_project.
    CLEAR wg_bapi_method_project.
    wg_bapi_method_project-method         = c_save.
    APPEND wg_bapi_method_project TO   i_bapi_method_project.
    READ TABLE i_et_wbs_element1 INTO wg_et_wbs_element1 INDEX c_1.
    IF sy-subrc EQ 0.
      wg_bapi_element_table_update-wbs_basic_start_date = c_x.
      wg_bapi_element_table_update-wbs_basic_finish_date = c_x.
      wg_bapi_element_table_update-proj_type = c_x.
      APPEND wg_bapi_element_table_update TO
                            i_bapi_element_table_update.
      wg_bapi_element_table-wbs_element =
                                  wg_et_wbs_element1-wbs_element.
      wg_bapi_element_table-wbs_basic_start_date = wl_xveda-vbegdat.
      wg_bapi_element_table-wbs_basic_finish_date =
                                             wl_xveda-venddat.
      IF g_hvlv = 'X'.
        wg_bapi_element_table-proj_type  = 'ZH'.
      ELSE.
        wg_bapi_element_table-proj_type  = 'ZC'.
      ENDIF.
      APPEND wg_bapi_element_table TO i_bapi_element_table.
    ENDIF.
    CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'
      EXPORTING
        i_project_definition       = wg_proj_def
        i_project_definition_upd   = wg_project_definition
      IMPORTING
        return                     = wg_return1
      TABLES
        i_method_project           = i_bapi_method_project
        i_wbs_element_table_update = i_bapi_element_table_update
        i_wbs_element_table        = i_bapi_element_table.
    IF wg_return1-type EQ c_error .
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      CLEAR i_return.
*    EXIT.
    ELSE.
*  This method executes a COMMIT WORK command.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = c_x.
      CLEAR i_return.
    ENDIF.
******Second part of the Enhancement for updating WBS Element data*****
    LOOP AT tbl_xvbap INTO wg_vbap.
*    CLEAR ALL THE WORK AREAS,INTERNAL TABLES
      CLEAR :  wg_proj_def,wg_project_definition,wg_type,
               wg_wbs_element_table, i_wbs_element_table[],
               i_bapi_method_project[],
               i_bapi_element_table_update[],
               i_bapi_element_table[] ,
               wg_return1." 
      READ TABLE i_xveda INTO wl_xveda WITH KEY vbeln = wg_vbap-vbeln
                                              vposn = wg_vbap-posnr.
* Begin of Modification @005 YDEK919877- Defect 16815
*  If line item level data is not present take the header data
      IF sy-subrc NE 0.
        READ TABLE i_xveda INTO wl_xveda INDEX c_1.
      ENDIF.
*      READ TABLE i_xvbpa INTO wl_xvbpa WITH KEY vbeln = wg_vbap-vbeln
*                                                posnr = wg_vbap-posnr.
* If line item level data is not present then consider the header data
      READ TABLE i_xvbpa INTO wl_xvbpa WITH KEY vbeln = wg_vbap-vbeln
                                                posnr = wg_vbap-posnr
                                                parvw = c_zm.
      IF sy-subrc NE 0.
        READ TABLE i_xvbpa INTO wl_xvbpa WITH KEY vbeln = wg_vbap-vbeln
                                                  parvw = c_zm.
        IF sy-subrc EQ 0.
*          do nothing
        ENDIF.
      ENDIF.
* End of Modification @005 YDEK919877- Defect 16815
* Begin of Modification @002 - Rev track 2732 : YDEK912939 Defect # 12026
*      READ TABLE i_vbpa INTO wg_vbpa
*                               WITH KEY vbeln = wg_vbap-vbeln
*                               posnr = '000000'.
*      l_pernr_header = wg_vbpa-pernr.
*
*      READ TABLE i_vbpa INTO wg_vbpa
*                               WITH KEY vbeln = wg_vbap-vbeln
*                               posnr = wg_vbap-posnr.
*      IF  l_pernr_header = wg_vbpa-pernr.
*        wg_vbpa-pernr = l_pernr_header.
*      ENDIF.
*      IF sy-subrc eq 0.
      CLEAR l_pernr.
*   To check if there is an entry maintained in TCJ04.
      SELECT SINGLE vernr INTO l_pernr
        FROM tcj04 WHERE vernr EQ wl_xvbpa-pernr.
      IF  l_pernr IS INITIAL.
        CALL FUNCTION 'ZYOTCPR_EMPLOYEE_RESPONSIBLE' DESTINATION ' '
          EXPORTING
            im_pernr = wl_xvbpa-pernr.
      ENDIF.
*      ENDIF.
** End of Modification @002 - Rev track 2732 : YDEK912939 Defect # 12026
      wg_proj_def-project_definition = st_project_definition1.
      wg_proj_def-start   = wl_xveda-vbegdat.
      wg_proj_def-finish  = wl_xveda-venddat.
      wg_project_definition-project_definition = c_x.
      wg_project_definition-start = c_x.
      wg_project_definition-finish = c_x.
      wg_bapi_method_project-refnumber      = c_val.
      wg_bapi_method_project-objecttype     = c_wbs_element.
      wg_bapi_method_project-method         = c_update.
      wg_bapi_method_project-objectkey      = c_one.
      APPEND wg_bapi_method_project TO i_bapi_method_project.
      CLEAR wg_bapi_method_project.
      wg_bapi_method_project-method         = c_save.
      APPEND wg_bapi_method_project TO   i_bapi_method_project.
*    Conversion of Internal to External WBS Element Number
      CALL FUNCTION 'CONVERSION_EXIT_ABPSP_OUTPUT'
        EXPORTING
          input  = wg_vbap-ps_psp_pnr
        IMPORTING
          output = g_output.
      CLEAR : wg_et_wbs_element1.
      READ TABLE i_et_wbs_element2 INTO wg_et_wbs_element1 WITH KEY
                          wbs_element = g_output.
      IF sy-subrc EQ 0.
        wg_bapi_element_table_update-wbs_basic_start_date = c_x.
        wg_bapi_element_table_update-wbs_basic_finish_date = c_x.
        wg_bapi_element_table_update-responsible_no  = c_x.
        wg_bapi_element_table_update-proj_type = c_x.
        APPEND wg_bapi_element_table_update TO
                                 i_bapi_element_table_update.
        wg_bapi_element_table-wbs_element = g_output.
        wg_bapi_element_table-wbs_basic_start_date = wl_xveda-vbegdat.
        wg_bapi_element_table-wbs_basic_finish_date =
                                                    wl_xveda-venddat.
        wg_bapi_element_table-responsible_no = wl_xvbpa-pernr.
        IF g_hvlv = 'X'.
          wg_bapi_element_table-proj_type  = 'ZH'.
        ELSE.
          wg_bapi_element_table-proj_type  = 'ZC'.
        ENDIF.
        APPEND wg_bapi_element_table TO i_bapi_element_table.
      ENDIF.
      CALL FUNCTION 'BAPI_PROJECT_MAINTAIN'
        EXPORTING
          i_project_definition       = wg_proj_def
          i_project_definition_upd   = wg_project_definition
        IMPORTING
          return                     = wg_return1
        TABLES
          i_method_project           = i_bapi_method_project
          i_wbs_element_table_update = i_bapi_element_table_update
          i_wbs_element_table        = i_bapi_element_table.
      IF wg_return1-type EQ c_error .
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        CLEAR i_return.
*    EXIT.
      ELSE.
*  This method executes a COMMIT WORK command.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = c_x.
        CLEAR i_return.
      ENDIF.
      READ TABLE i_et_wbs_element2 INTO wg_et_wbs_element1
                WITH KEY wbs_element = g_output.
      IF sy-subrc = 0.
        wg_prps-objnr = wg_vbap-objnr.
        wg_prps-posid = g_output.
        wg_prps-zzpre_contract = wg_vbap-zzpre_contract.
        wg_prps-auart = im_xvbak1-auart.
        APPEND wg_prps TO i_prps.
        wg_wbs_get_stat-wbs_element = g_output.
        APPEND wg_wbs_get_stat TO i_wbs_get_stat.
      ENDIF.
      CLEAR wg_vbap.
    ENDLOOP.
    APPEND LINES OF i_wbs_element2 TO i_wbs_element.
    SORT i_wbs_element BY wbs_element.
    DELETE ADJACENT DUPLICATES FROM i_wbs_element COMPARING
                                            wbs_element.
    CLEAR: g_temp_wbs_element,wg_et_wbs_element,wg_prps-objnr.
    CLEAR wg_update_wbs_element.
*   get all the statuses of all the line items of Level2 WBS Elements
    SELECT objnr stat FROM jest INTO TABLE i_jest
         FOR ALL ENTRIES IN i_prps WHERE objnr = i_prps-objnr
                                   AND inact EQ ' '.
    IF sy-subrc EQ 0.
      i_jest_tmp[] = i_jest[].
      SORT i_jest_tmp BY stat.
* delete system statuses from i_jest_tmp so that it contains only user
* statuses System statuses starts with the Letetr 'I'.
      DELETE i_jest_tmp WHERE stat+0(1) = c_i.
* delete user statuses from i_jest so that it contains only system
* statuses user statuses starts with the Letetr 'E' .
      DELETE i_jest WHERE stat+0(1) = c_e .
    ENDIF.
* After this i_jest_tmp contains user status and i_jest
*                                  contains system status
    IF NOT i_jest[] IS INITIAL.
* get the system statuses text from the table tj02t for all the
* statuses in the internal table i_jest
      SELECT istat txt04 FROM tj02t INTO TABLE i_sys_stat
                       FOR ALL ENTRIES IN i_jest
                       WHERE istat = i_jest-stat
                       AND   spras = sy-langu.
      IF sy-subrc EQ 0.
        SORT i_jest BY objnr.
      ENDIF.
    ENDIF.
* get the system statuses text from the table tj30t for all the
* statuses in the internal table i_jest_tmp
    IF NOT i_jest_tmp[] IS INITIAL.
      SELECT stsma estat txt04 FROM tj30t INTO TABLE i_user_stat
                        FOR ALL ENTRIES IN i_jest_tmp
                        WHERE estat = i_jest_tmp-stat
                        AND   spras = sy-langu.
      SELECT stsma estat linep FROM tj30 INTO TABLE i_user_stat1
                         FOR ALL ENTRIES IN i_jest_tmp
                       WHERE estat = i_jest_tmp-stat.
      IF sy-subrc EQ 0.
        SORT i_jest_tmp BY objnr.
      ENDIF.
    ENDIF.
    LOOP AT i_jest_tmp INTO wg_jest_temp.
      READ TABLE i_jsto INTO wg_jsto WITH KEY objnr =
                                             wg_jest_temp-objnr.
      IF sy-subrc = 0.
        READ TABLE i_user_stat  INTO wg_user_stat
                             WITH KEY estat = wg_jest_temp-stat
                                     stsma = wg_jsto-stsma.
        IF sy-subrc = 0.
          READ TABLE i_user_stat1  INTO wg_user_stat1
                                 WITH KEY estat = wg_user_stat-estat
                                          stsma = wg_jsto-stsma.
          IF sy-subrc = 0.
            wg_user_stat2-objnr = wg_jest_temp-objnr.
            wg_user_stat2-stsma = wg_user_stat-stsma.
            wg_user_stat2-estat = wg_user_stat-estat.
            wg_user_stat2-linep = wg_user_stat1-linep.
            wg_user_stat2-txt04 = wg_user_stat-txt04.
            APPEND wg_user_stat2 TO i_user_stat2.
*        endif.
          ENDIF.
        ENDIF.
      ELSE.
        READ TABLE i_user_stat  INTO wg_user_stat
                      WITH KEY estat = wg_jest_temp-stat
                              stsma = wg_jsto-stsma.
        IF sy-subrc = 0.
          READ TABLE i_user_stat1  INTO wg_user_stat1
                                 WITH KEY estat = wg_user_stat-estat
                                          stsma = wg_jsto-stsma.
          IF sy-subrc = 0.
            wg_user_stat2-objnr = wg_jest_temp-objnr.
            wg_user_stat2-stsma = wg_user_stat-stsma.
            wg_user_stat2-estat = wg_user_stat-estat.
            wg_user_stat2-linep = wg_user_stat1-linep.
            wg_user_stat2-txt04 = wg_user_stat-txt04.
            APPEND wg_user_stat2 TO i_user_stat2.
*        endif.
          ENDIF.
        ENDIF.
      ENDIF.
      CLEAR: wg_user_stat2.
    ENDLOOP.
* zyotcpr_wbsstat
    SORT i_prps BY objnr.
    LOOP AT i_prps INTO wg_prps.
      wg_wbsstat_in-auart = wg_prps-auart.
      wg_wbsstat_in-zzpre_contract = wg_prps-zzpre_contract.
      wg_wbsstat_in-objnr = wg_prps-objnr.
      CLEAR : wg_jest.
      i_jest1 = i_jest.
      DELETE i_jest1 WHERE objnr NE wg_prps-objnr.
      DESCRIBE TABLE i_jest1 LINES l_no.
      READ TABLE i_jest1 INTO wg_jest
                        WITH KEY objnr = wg_prps-objnr BINARY SEARCH.
      lv_index = sy-tabix.
      DO l_no TIMES.
        READ TABLE i_jest1 INDEX lv_index  INTO wg_jest .
        IF wg_prps-objnr = wg_jest-objnr .
*        IF sy-subrc = 0 AND ( wg_prps-objnr = wg_jest-objnr ).
          READ TABLE i_sys_stat INTO wg_sys_stat
                       WITH KEY istat = wg_jest-stat BINARY SEARCH.
          IF sy-subrc EQ 0.
            IF lv_index = 1.
              g_line_sysstat = wg_sys_stat-txt04.
            ELSE.
              g_line_sysstat_tmp = wg_sys_stat-txt04.
              CONCATENATE g_line_sysstat g_line_sysstat_tmp   INTO
                                 g_line_sysstat SEPARATED BY space.
            ENDIF.
          ENDIF.
          CLEAR : wg_jest,wg_sys_stat.
        ENDIF.
        lv_index = lv_index + 1.
      ENDDO.
      CLEAR: lv_index,wg_jest,l_no.
*      IMPORT  i_cli_status1 FROM MEMORY ID 'ZCLI_STAT'.
      wg_wbsstat_in-stat1 = g_line_sysstat.
*        i_jest_tmp1 = i_jest_tmp.
      i_user_stat3 = i_user_stat2.
      READ TABLE i_jsto INTO wg_jsto WITH KEY objnr = wg_prps-objnr.
      DELETE i_user_stat3 WHERE objnr NE wg_prps-objnr
                               OR stsma NE wg_jsto-stsma.
      SORT i_user_stat3 BY linep.
      DESCRIBE TABLE i_user_stat3 LINES l_no.
      READ TABLE i_user_stat3 INTO wg_user_stat2
                      WITH KEY objnr = wg_prps-objnr BINARY SEARCH.
      lv_index = sy-tabix.
      DO l_no TIMES.
        READ TABLE i_user_stat3 INDEX lv_index INTO wg_user_stat2.
        IF  wg_prps-objnr = wg_user_stat2-objnr .
          IF sy-subrc EQ 0.
            IF lv_index = 1.
              g_line_userstat = wg_user_stat2-txt04.
            ELSE.
              g_line_userstat_tmp = wg_user_stat2-txt04.
              CONCATENATE g_line_userstat g_line_userstat_tmp  INTO
                            g_line_userstat SEPARATED BY space.
            ENDIF.
          ENDIF.
          CLEAR : wg_jest,wg_user_stat2.
        ENDIF.
        lv_index = lv_index + 1.
      ENDDO.
      CLEAR: lv_index,l_no.
      wg_wbsstat_in-stat2 = g_line_userstat.
      wg_wbsstat_in-zcon_header_stat = g_conthead_txt.
      READ TABLE i_status1 INTO wg_cli_status WITH KEY objnr =
                                  wg_wbsstat_in-objnr.
      IF sy-subrc EQ 0.
        wg_wbsstat_in-objnr = wg_cli_status-objnr.
        wg_wbsstat_in-stat1 = wg_cli_status-zcli_sys_stat.
        wg_wbsstat_in-stat2 = wg_cli_status-zcli_user_stat.
      ENDIF.
      APPEND wg_wbsstat_in TO i_wbsstat_in.
    ENDLOOP.
    IF NOT i_wbsstat_in[] IS INITIAL.
      SORT i_wbsstat_in BY objnr.
      DELETE ADJACENT DUPLICATES FROM i_wbsstat_in COMPARING objnr.
      SELECT zcont_type
             zprecontract
             zcon_header_stat
             zcon_sys_stat
             zcon_user_stat
             zwbs_sys_stat
             zwbs_user_stat INTO TABLE i_ztabstat
             FROM zyotcpr_wbsstat
             FOR ALL ENTRIES IN i_wbsstat_in
             WHERE
              zcont_type = i_wbsstat_in-auart
             AND   zprecontract = i_wbsstat_in-zzpre_contract
             AND  zcon_header_stat = g_conthead_txt
             AND   zcon_sys_stat    = i_wbsstat_in-stat1
             AND   zcon_user_stat   = i_wbsstat_in-stat2.
      SELECT   zcont_type
               zprecontract
               zcon_header_stat
               zcon_sys_stat
               zcon_user_stat
               zwbs_sys_stat
               zwbs_user_stat INTO TABLE i_ztabstat_fnbl
               FROM zyotcpr_wbsstat
               FOR ALL ENTRIES IN i_wbsstat_in
               WHERE zcont_type = i_wbsstat_in-auart
               AND   zprecontract = i_wbsstat_in-zzpre_contract
               AND    zcon_header_stat = g_conthead_txt
               AND   zcon_sys_stat    IN r_fnbl
               AND   zcon_user_stat   = i_wbsstat_in-stat2.
      IF sy-subrc EQ 0.
        SORT i_wbsstat_in BY objnr.
      ENDIF.
    ENDIF.
    SORT i_prps BY posid.
* this loop is to seperate the line items assigend to only one WBS
* elemet into internal table i_prps2 and line items assigned with one
* WBS Element into an internal table i_prps3
    LOOP AT i_prps INTO wg_prps." i_prps has WBS Elements of LEVEL2
      CLEAR gd_set.
      AT NEW posid.
        gd_set = c_x.
        APPEND wg_prps TO i_prps3.
      ENDAT.
      AT END OF posid.
        IF gd_set = c_x.
          APPEND wg_prps TO i_prps2.
          DELETE i_prps3  WHERE posid = wg_prps-posid .
        ENDIF.
      ENDAT.
      IF gd_set NE c_x.
        APPEND wg_prps TO i_prps3.
      ENDIF.
    ENDLOOP.
*  this is to replace the stars(*****) that somes becuase of usage of
*  AT NEW and AT END commands
    LOOP AT i_prps INTO wg_prps.
      READ TABLE i_prps2 INTO wg_prps2
                                    WITH KEY posid = wg_prps-posid.
*    idx = sy-tabix.
      IF sy-subrc = 0.
        wg_prps2-objnr = wg_prps-objnr.
        MODIFY  i_prps2 INDEX sy-tabix  FROM wg_prps2 TRANSPORTING
                                                            objnr.
        IF sy-subrc = 0.
        ENDIF.
      ENDIF.
      READ TABLE i_prps3 INTO wg_prps3 WITH KEY posid =
    wg_prps-posid.
      IF sy-subrc = 0.
        wg_prps3-objnr = wg_prps-objnr.
        MODIFY i_prps3 INDEX sy-tabix FROM wg_prps3 TRANSPORTING
    objnr.
        IF sy-subrc = 0.
        ENDIF.
      ENDIF.
    ENDLOOP.
    SORT : i_prps2  BY posid,
           i_wbsstat_in BY objnr.
*******************Getting the statuses for WBS Elements***************
    DATA: i_wbs_got_stat TYPE STANDARD TABLE OF bapi_wbs_user_status,
          wg_wbs_got_stat TYPE bapi_wbs_user_status,
          i_wbs_got_stat1 TYPE STANDARD TABLE OF
bapi_wbs_mnt_user_status,
           i_wbs_got_stat2 TYPE STANDARD TABLE OF
bapi_wbs_mnt_user_status,
          wg_wbs_got_stat1 TYPE bapi_wbs_mnt_user_status .
    CALL FUNCTION 'BAPI_BUS2054_GET_STATUS'
     IMPORTING
       return                = wg_return1
      TABLES
        i_wbs_elements        = i_wbs_get_stat
*     E_SYSTEM_STATUS       =
        e_user_status         = i_wbs_got_stat
*     E_RESULT              =
              .
    CLEAR i_return.
    DELETE i_wbs_got_stat WHERE
                    user_status = '0001' OR
                    user_status = '1004' OR
                    user_status = '1005' OR
                    user_status = '1006'.
    LOOP AT i_wbs_got_stat INTO wg_wbs_got_stat.
      wg_wbs_got_stat1-wbs_element = wg_wbs_got_stat-wbs_element.
      wg_wbs_got_stat1-undo_user_status = wg_wbs_got_stat-user_status.
      APPEND wg_wbs_got_stat1 TO i_wbs_got_stat1.
    ENDLOOP.

    LOOP AT i_wbs_got_stat1 INTO wg_wbs_got_stat1.
      REFRESH: i_wbs_got_stat2[].
      APPEND wg_wbs_got_stat1 TO i_wbs_got_stat2.

      CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
      CLEAR i_return.
      CALL FUNCTION 'BAPI_BUS2054_SET_STATUS'
       IMPORTING
         return                    = wg_return1
       TABLES
*           I_WBS_SYSTEM_STATUS       =
         i_wbs_user_status         = i_wbs_got_stat2
         e_result                  = i_result
                .
      IF wg_return1-type EQ c_error .
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        CLEAR i_return.
        EXIT.
      ELSE.
**    Precommit for PS BAPIs
        CALL FUNCTION 'BAPI_PS_PRECOMMIT'
          TABLES
            et_return = i_return.
        READ TABLE i_return INTO wg_return WITH KEY type = c_error..
        IF sy-subrc EQ 0.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        ENDIF.
*  This method executes a COMMIT WORK command.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = c_x.
        CLEAR i_return.
      ENDIF.
    ENDLOOP.
*******************Getting the statuses for WBS Elements***************
    i_prps4[] = i_prps[].
    SORT i_prps4 BY posid.
* this is for processing HVLV contracts
    IF g_hvlv EQ c_x.
      LOOP AT i_prps4 INTO wg_prps.
        READ TABLE i_wbsstat_in INTO wg_wbsstat_in WITH KEY objnr = wg_prps-objnr.
        IF sy-subrc EQ 0.
          IF  wg_wbsstat_in-stat1 CS c_fnbl.
            wg_wbs_system_status-wbs_element = wg_prps-posid.
            wg_wbs_system_status-set_system_status = c_fnbl .
            APPEND wg_wbs_system_status TO i_wbs_system_status.
          ELSE.
            CLEAR :wg_wbsstat_in.
            READ TABLE i_wbsstat_in INTO wg_wbsstat_in
                        WITH KEY objnr = wg_prps-objnr BINARY SEARCH.
            IF sy-subrc EQ 0.
              CLEAR :wg_ztabstat.
              READ TABLE i_ztabstat INTO wg_ztabstat
              WITH KEY  zcont_type       = wg_wbsstat_in-auart
                        zprecontract     = wg_wbsstat_in-zzpre_contract
                        zcon_header_stat = wg_wbsstat_in-zcon_header_stat
                        zcon_sys_stat   = wg_wbsstat_in-stat1
                        zcon_user_stat  = wg_wbsstat_in-stat2 BINARY SEARCH.
              IF sy-subrc EQ 0.
                IF wg_ztabstat-zcon_sys_stat = c_relnomp .
                  wg_wbs_system_status-wbs_element = wg_prps-posid.
                  wg_wbs_system_status-set_system_status = c_rel .
                ENDIF.
                APPEND wg_wbs_system_status TO i_wbs_system_status.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDLOOP.
*Begin of Modification-003 -YDEK916677 - SCR1
      IF NOT i_wbs_system_status IS INITIAL.
        READ TABLE i_wbs_system_status INTO wg_wbs_system_status INDEX 1.
        IF sy-subrc EQ 0.
          wg_wbs_elements = wg_wbs_system_status-wbs_element.
          APPEND wg_wbs_elements TO i_wbs_elements.
          CALL FUNCTION 'BAPI_BUS2054_GET_STATUS'
            IMPORTING
              return          = wg_return1
            TABLES
              i_wbs_elements  = i_wbs_elements
              e_system_status = i_wbs_sys_stat.
          IF sy-subrc EQ 0.
            CLEAR:wg_wbs_sys_stat.
            READ TABLE i_wbs_sys_stat INTO wg_wbs_sys_stat INDEX 1.
          ENDIF.
          IF wg_wbs_system_status-set_system_status EQ c_fnbl.
            IF NOT wg_wbs_sys_stat-system_status IS INITIAL.
              IF wg_wbs_sys_stat-system_status NE c_fnbl.
                PERFORM f_status_change_for_fnbl USING wg_wbs_system_status-wbs_element.
              ENDIF.
            ENDIF.
          ELSE.
            CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
            CLEAR i_return.
            CALL FUNCTION 'BAPI_BUS2054_SET_STATUS'
             IMPORTING
               return              = wg_return1
             TABLES
               i_wbs_system_status = i_wbs_system_status
*            i_wbs_user_status   = i_wbs_user_status_single
               e_result            = i_result.
            IF wg_return1-type EQ c_error .
              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
              CLEAR i_return.
              EXIT.
            ELSE.
**    Precommit for PS BAPIs
              CALL FUNCTION 'BAPI_PS_PRECOMMIT'
                TABLES
                  et_return = i_return.
              READ TABLE i_return INTO wg_return WITH KEY type = c_error..
              IF sy-subrc EQ 0.
                CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
              ENDIF.
*  This method executes a COMMIT WORK command.
              CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                EXPORTING
                  wait = c_x.
              CLEAR i_return.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
*End of Modification-003 -YDEK916677 - SCR1
    ELSE.
*  This is for processing single item assigned to single WBS Element
      IF i_prps2 IS NOT INITIAL.
        DELETE ADJACENT DUPLICATES FROM i_prps4 COMPARING posid.
        LOOP AT i_prps4 INTO wg_prps.
          READ TABLE i_prps2 INTO wg_prps2
                        WITH KEY posid = wg_prps-posid BINARY SEARCH.
          IF sy-subrc EQ 0.
            CLEAR :wg_wbsstat_in.
            READ TABLE i_wbsstat_in INTO wg_wbsstat_in
                         WITH KEY objnr = wg_prps2-objnr BINARY   SEARCH.
            IF sy-subrc EQ 0. "   If the i_wbsstat_in contains FNBL then FNBL case executeted
              IF wg_wbsstat_in-stat1 CS c_fnbl.
*Begin of Modification-003 -YDEK916677 - SCR1
                CLEAR :wg_ztabstat.
                READ TABLE i_ztabstat_fnbl INTO wg_ztabstat
                         WITH KEY  zcon_sys_stat = c_fnbl_sys_stat  
                                  zcon_user_stat = wg_wbsstat_in-stat2.
                IF sy-subrc EQ 0.
                  wg_wbs_system_status-wbs_element = wg_prps2-posid.
                  wg_wbs_system_status-set_system_status = "'LKD'.
                                            wg_ztabstat-zwbs_sys_stat.
                  wg_wbs_user_status-wbs_element = wg_prps2-posid.
                  wg_wbs_user_status-set_user_status =  wg_ztabstat-zwbs_user_stat.
                  APPEND wg_wbs_user_status TO i_wbs_user_status.
                  APPEND wg_wbs_system_status TO i_wbs_system_status.
                ENDIF.
*End of Modification-003 -YDEK916677 - SCR1
              ELSE.
                CLEAR :wg_ztabstat.
                READ TABLE i_ztabstat INTO wg_ztabstat
                         WITH KEY  zcon_sys_stat = wg_wbsstat_in-stat1
                                  zcon_user_stat = wg_wbsstat_in-stat2.
                IF sy-subrc EQ 0.
                  wg_wbs_system_status-wbs_element = wg_prps2-posid.
                  wg_wbs_system_status-set_system_status = "'LKD'.
                                            wg_ztabstat-zwbs_sys_stat.
                  wg_wbs_user_status-wbs_element = wg_prps2-posid.
                  wg_wbs_user_status-set_user_status =      "'0002'.
                                           wg_ztabstat-zwbs_user_stat.
                  l_char = wg_ztabstat-zwbs_user_stat.
                  DO 10 TIMES.
                    SPLIT l_char AT space
                        INTO wg_wbs_user_status-set_user_status l_char.
                    APPEND wg_wbs_user_status TO i_wbs_user_status.
                    IF l_char IS INITIAL.
                      EXIT.
                    ENDIF.
                  ENDDO.
                  CLEAR l_char.
                  APPEND wg_wbs_system_status TO i_wbs_system_status.
*              APPEND wg_wbs_user_status TO i_wbs_user_status.
                ENDIF.
              ENDIF.
***********************************************************
            ENDIF.
          ENDIF.
        ENDLOOP.
      ENDIF.
*********Processing of Case3 Single WBS assigned to Multiple CLI********************
      IF i_prps3 IS NOT INITIAL.
        i_prps5[] =  i_prps3[].
        i_prps6[] =  i_prps3[].
        DELETE ADJACENT DUPLICATES FROM i_prps5 COMPARING posid.
        CLEAR wg_prps.
        LOOP AT  i_prps5 INTO wg_prps.
          DELETE i_prps6 WHERE posid NE wg_prps-posid.
          DESCRIBE TABLE i_prps6 LINES g_line.
          DO g_line TIMES.
            READ TABLE i_prps6 INTO wg_prps INDEX sy-tabix.
            IF sy-subrc = 0.
              READ TABLE i_wbsstat_in INTO wg_wbsstat_in
                                 WITH KEY objnr = wg_prps-objnr.
              IF sy-subrc = 0.
                CLEAR : wg_wbsstat_tmp.
                wg_wbsstat_tmp-objnr = wg_prps-objnr.
                wg_wbsstat_tmp-stat1 = wg_wbsstat_in-stat1.
                wg_wbsstat_tmp-stat2 = wg_wbsstat_in-stat2.
                APPEND wg_wbsstat_tmp TO i_wbsstat_tmp.
              ENDIF.
            ENDIF.
          ENDDO.
          SORT i_wbsstat_tmp BY stat1.
          DELETE ADJACENT DUPLICATES FROM i_wbsstat_tmp COMPARING stat1.
          DESCRIBE TABLE i_wbsstat_tmp LINES g_line.
          IF g_line EQ 1.
            READ TABLE i_wbsstat_tmp INTO wg_wbsstat_tmp
                          WITH KEY stat1 = c_relnomp BINARY SEARCH.
            IF sy-subrc EQ 0.
              READ TABLE i_ztabstat INTO wg_ztabstat WITH KEY
                          zcon_header_stat = g_conthead_txt
                          zcon_sys_stat    = wg_wbsstat_tmp-stat1
                          zcon_user_stat   = wg_wbsstat_tmp-stat2.
              IF sy-subrc EQ 0.
                wg_wbs_system_status-wbs_element = wg_prps-posid.
                wg_wbs_system_status-set_system_status = c_rel.
                wg_wbs_user_status-wbs_element = wg_prps-posid.
                wg_wbs_user_status-set_user_status =
                                       wg_ztabstat-zwbs_user_stat.
                l_char = wg_ztabstat-zwbs_user_stat.
                DO 10 TIMES.
                  SPLIT l_char AT space
                      INTO wg_wbs_user_status-set_user_status l_char.
                  APPEND wg_wbs_user_status TO i_wbs_user_status.
                  IF l_char IS INITIAL.
                    EXIT.
                  ENDIF.
                ENDDO.
                APPEND wg_wbs_system_status TO i_wbs_system_status.
*        put wbs stats = REL and respective user status
              ENDIF.
*Begin of Modification-003 -YDEK916677 - SCR1
            ELSE.
              CLEAR :wg_ztabstat.
              READ TABLE i_ztabstat_fnbl INTO wg_ztabstat
                       WITH KEY  zcon_sys_stat = c_fnbl_sys_stat
                                zcon_user_stat = wg_wbsstat_in-stat2.
              IF sy-subrc EQ 0.
                wg_wbs_system_status-wbs_element = wg_prps-posid.
                wg_wbs_system_status-set_system_status = c_fnbl.
                wg_wbs_user_status-wbs_element = wg_prps-posid.
                wg_wbs_user_status-set_user_status =  wg_ztabstat-zwbs_user_stat.
                APPEND wg_wbs_system_status TO i_wbs_system_status.
                APPEND wg_wbs_user_status TO i_wbs_user_status.
              ENDIF.
            ENDIF.
*End of Modification-003 -YDEK916677 - SCR1
          ENDIF.
*        ENDIF.
          i_prps6[] =  i_prps3[].
        ENDLOOP.
      ENDIF.
      IF NOT i_wbs_system_status  IS INITIAL.
*-------Part3 of the Enhancement for Updating status update*********
*
***  You can use BAPI_BUS2054_SET_STATUS in a list of WBS elements
***  to revoke a system status and a user status respectively,
***  as well as to set a system status and a user status respectively.
*
*        PERFORM f_update_wbs_status ON COMMIT.
        CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
        CLEAR i_return.
*Begin of Modification-003 -YDEK916677 - SCR1
        DATA: flg_not_fnbl TYPE char1.
        CLEAR: wg_wbs_elements,
               flg_not_fnbl.
        REFRESH: i_wbs_elements,
                 i_wbs_sys_stat.
*End of Modification-003 -YDEK916677 - SCR1
        LOOP AT i_wbs_user_status INTO wg_wbs_user_status.
*Begin of Modification-003 -YDEK916677 - SCR1
          READ TABLE i_wbs_system_status INTO wg_wbs_system_status
                                    WITH KEY wbs_element = wg_wbs_user_status-wbs_element.
          IF sy-subrc = 0.
            CLEAR: i_wbs_system_status_single.
            APPEND wg_wbs_system_status TO i_wbs_system_status_single.
            wg_wbs_elements = wg_wbs_user_status-wbs_element.
            APPEND wg_wbs_elements TO i_wbs_elements.
            CALL FUNCTION 'BAPI_BUS2054_GET_STATUS'
              IMPORTING
                return          = wg_return1
              TABLES
                i_wbs_elements  = i_wbs_elements
                e_system_status = i_wbs_sys_stat.
            IF sy-subrc = 0.
              READ TABLE i_wbs_sys_stat INTO wg_wbs_sys_stat INDEX 1.
              IF sy-subrc EQ 0.
                IF wg_wbs_sys_stat-system_status NE c_fnbl.
                  flg_not_fnbl = c_x.
                ENDIF.
              ENDIF.
            ENDIF.
            IF  wg_wbs_system_status-set_system_status EQ c_fnbl.
              IF flg_not_fnbl EQ c_x.
                PERFORM f_status_change_for_fnbl USING wg_wbs_system_status-wbs_element.
                REFRESH: i_wbs_user_status_single[].
                APPEND wg_wbs_user_status TO i_wbs_user_status_single.
                CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
                CLEAR i_return.
                CALL FUNCTION 'BAPI_BUS2054_SET_STATUS'
                  IMPORTING
                    return              = wg_return1
                  TABLES
*              i_wbs_system_status = i_wbs_system_status
                    i_wbs_user_status   = i_wbs_user_status_single
                    e_result            = i_result.
                "i_wbs_user_status
                IF wg_return1-type EQ c_error .
                  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
                  CLEAR i_return.
                  EXIT.
                ELSE.
**    Precommit for PS BAPIs
                  CALL FUNCTION 'BAPI_PS_PRECOMMIT'
                    TABLES
                      et_return = i_return.
                  READ TABLE i_return INTO wg_return WITH KEY type = c_error..
                  IF sy-subrc EQ 0.
                    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
                  ENDIF.
*  This method executes a COMMIT WORK command.
                  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                    EXPORTING
                      wait = c_x.
                  CLEAR i_return.
                ENDIF.
              ENDIF.
            ELSE.
              REFRESH: i_wbs_user_status_single[].
              APPEND wg_wbs_user_status TO i_wbs_user_status_single.
              CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
              CLEAR i_return.
              CALL FUNCTION 'BAPI_BUS2054_SET_STATUS'
                IMPORTING
                  return              = wg_return1
                TABLES
                  i_wbs_system_status = i_wbs_system_status_single
                  i_wbs_user_status   = i_wbs_user_status_single
                  e_result            = i_result.
              "i_wbs_user_status
              IF wg_return1-type EQ c_error .
                CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
                CLEAR i_return.
                EXIT.
              ELSE.
**    Precommit for PS BAPIs
                CALL FUNCTION 'BAPI_PS_PRECOMMIT'
                  TABLES
                    et_return = i_return.
                READ TABLE i_return INTO wg_return WITH KEY type = c_error..
                IF sy-subrc EQ 0.
                  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
                ENDIF.
*  This method executes a COMMIT WORK command.
                CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                  EXPORTING
                    wait = c_x.
                CLEAR i_return.
              ENDIF.
            ENDIF.
          ENDIF.
*          REFRESH: i_wbs_user_status_single[].
*          APPEND wg_wbs_user_status TO i_wbs_user_status_single.
*
*          CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
*          CLEAR i_return.
*
*          CALL FUNCTION 'BAPI_BUS2054_SET_STATUS'
*            IMPORTING
*              return              = wg_return1
*            TABLES
*              i_wbs_system_status = i_wbs_system_status
*              i_wbs_user_status   = i_wbs_user_status_single
*              e_result            = i_result.
*          "i_wbs_user_status
*
*          IF wg_return1-type EQ c_error .
*            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*            CLEAR i_return.
*            EXIT.
*          ELSE.
***    Precommit for PS BAPIs
*            CALL FUNCTION 'BAPI_PS_PRECOMMIT'
*              TABLES
*                et_return = i_return.
*            READ TABLE i_return INTO wg_return WITH KEY type = c_error..
*            IF sy-subrc EQ 0.
*              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*            ENDIF.
**  This method executes a COMMIT WORK command.
*            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
*              EXPORTING
*                wait = c_x.
*            CLEAR i_return.
*          ENDIF.
*End of Modification-003 -YDEK916677 - SCR1
        ENDLOOP.
      ENDIF.
    ENDIF.
  ENDIF.
ENDFUNCTION.

 Please send us your feedback/suggestions at webmaster@SAPFunctional.COM 

HomeContribute About Us Privacy Terms Of Use • Disclaimer • SafeCompanies: Advertise on SAPFunctional.COM | Post JobContact Us  

Graphic Design by Round the Bend Wizards

footer image footer image