top of page

*&---------------------------------------------------------------------*
*& report zixomo_get_div_payment
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
report zixomo_get_div_payment.
tables: bkpf, zxomodivpayhdr.
constants: c_wsid(4)            value 'IB01',
           c_spam(2)            value '01',
           c_blart(2)           value 'Z4',
           formname_top_of_page type slis_formname value 'TOP_OF_PAGE',
           ws_login(30)         type c value 'App_TW_CMS',
           ws_pass(30)          type c value '',
           ws_appid(30)         type c value 'TWCMS'.

parameters: p_chk1 radiobutton group ga default 'X'.
selection-screen begin of block b1 with frame title text-001.
parameters: p_tok    as checkbox default ' ',
            p_bukrs  type bkpf-bukrs default '1000',
            p_sbudat type bkpf-budat default sy-datum,
            p_ebudat type bkpf-budat default sy-datum,
            p_url    type string lower case,
            p_file   type string lower case,
            p_div    radiobutton group g1 default 'X',
            p_cancel radiobutton group g1.
selection-screen end of block b1.
parameters: p_chk2 radiobutton group ga.
selection-screen begin of block b2 with frame title text-002.
select-options: s_budat for bkpf-budat,
                s_zuonr for zxomodivpayhdr-payout_sequence_id.
parameters: p_div1  radiobutton group g2 default 'X',
            p_canc1 radiobutton group g2.
selection-screen end of block b2.


types: begin of itab_accdoc.
    include structure zgl_accdoc.
types:  end of itab_accdoc.

data: it_div type table of itab_accdoc with header line,
*      itab_rec type table of zxomodivlog with header line,
      wa_log type zxomodivpaylog.

data: fieldcatalog type slis_t_fieldcat_alv with header line,
      gd_tab_group type slis_t_sp_group_alv,
      gd_layout    type slis_layout_alv,
      gd_repid     like sy-repid.

data: begin of it_result occurs 0,
        chkbx       type  icon-id,
        index(4)    type  c,
        bukrs       type  bkpf-bukrs,
        bldat       type  bkpf-bldat,
        budat       type  bkpf-budat,
        wrbtr       type  bseg-wrbtr,
        waers       type  bkpf-waers,
        zuonr       type  bseg-zuonr,
        sgtxt       type  bseg-sgtxt,
        xref1       type  bseg-xref1,
        xref2       type  bseg-xref2,
        xref3       type  bseg-xref3,
        zzpolicy01  type  zgl_accdoc-zzpolicy01,
        doc_no      type  bkpf-belnr,
        debit       type  bseg-hkont,
        credit      type  bseg-hkont,
        seq(8),
        type(1)     type  c,
        message(50) type  c,
      end of it_result.

data: begin of it_canc occurs 0,
        chkbx       type  icon-id,
        index(4)    type  c,
        doc_no      type bkpf-belnr,   " Reversal Document
        bukrs       type bkpf-bukrs,
        gjahr       type bkpf-gjahr,
        zuonr       type  bseg-zuonr,  " Payout sequence ID
        sgtxt       type  bseg-sgtxt,  " Temp to store Original FI doc
        seq(8),
        type(1)     type  c,
        message(50) type  c,
      end of it_canc.

types: begin of identification_data,
         fund_id type string,
       end of identification_data.

types: begin of json_data,
         payer_bank_code               type string,
         payee_bank_code               type string,
         payee_branch_code             type string,
         payee_id                      type string,
         payee_name                    type string,
         payee_bank_account            type string,
         net_dividend_payout_amount    type string,
         net_dividend_payout_ref_curr  type string,
         fund_currency                 type string,
         payment_method                type string,
         payout_date                   type string,
         payout_sequence_id            type string,
         dividend_payout_exchange_date type string,
         fund_currency_exchange_rate   type string,
         fund_currency_ref_exch_rate   type string,
         identification                type identification_data,
       end of json_data.

types: begin of js_res,
         seq                type string,
         policy_number      type string,
         reference_currency type string,
         campaign_code      type string,
         dividend_fund      type table of json_data with non-unique default key,
       end of js_res.

types: begin of json_response,
         status   type string,
         msg_code type string,
         msg_desc type string,
         response type table of js_res with non-unique default key,
       end of json_response.

data: response_wa type json_response,
      temp        type string,
      res_itab    type table of js_res,
      res_wa      type js_res,
      w_status    type json_response-status.
data: wa_iden type identification_data.
data: json_itab type table of json_data,
      json_wa   type json_data,
      cancel_wa type json_data.
"data: it_log type table of zxomodivpaylog with header line.

data: begin of it_skip occurs 0,
        seq   type zseq,
        zuonr like bseg-zuonr,
      end of it_skip.

data begin of it_payhdr2 occurs 0.
data: sel.
include structure zxomodivpayhdr.
data end of it_payhdr2.
data: it_payhdr type zxomodivpayhdr occurs 0 with header line.

data: it_payout type zxomodivpaylog occurs 0 with header line.

data: w_error.
data: w_datum like sy-datum,
      w_uzeit like sy-uzeit.

initialization.
  select single url into p_url from zws_master where wsid = c_wsid.
  w_datum = sy-datum.
  w_uzeit = sy-uzeit.

at selection-screen.
  if p_chk1 = 'X' and p_url is initial and p_file is initial.
    message e001(00) with 'Please enter URL or File Name'.
  endif.

at selection-screen on value-request for p_file.
  perform f4_filename.

start-of-selection.
  if p_chk1 = 'X'.   " Get from XO
    perform get_data.
    if w_error is initial.
      if p_div = 'X'.
        perform process_data.
        perform process_doc.
      else.
        perform process_cancel_data.
        perform process_cancel_doc.
      endif.
    endif.
    perform display_doc.
  endif.

  if p_chk2 = 'X'.    " Reprocess
    perform get_reprocess_data.
    if w_error is initial.
      if p_div1 = 'X'.
        perform process_data.
        perform process_doc.
      else.
        perform process_cancel_data.
        perform process_cancel_doc.
      endif.
    endif.
    perform display_doc.
  endif.

top-of-page.
  write: /1  'Ret code'(003),
            15 'Seq'(004),
            25 'Payout Sequence'(005),
            45 'Document No.'(006),
            60 'Message'(007).
  uline.

form get_data.
  data: lo_http_client type ref to if_http_client,
        lo_rest_client type ref to cl_rest_http_client,
        lv_response    type string,
        token(50)      type c,
        pass_token     type string.
  data: rawdata type truxs_t_text_data with header line.
*  data: wa_jslog type zxomodivjson.
  data: it_tmp_string               type table of string with header line,
        it_tmp_string2              type table of string with header line,
        it_tmp_string3              type table of string with header line,
        wa_tmp_string               type string,
        wa_tmp_string2              type string,
        wa_tmp_string3              type string,

        temp_payment_amount         type string,
        temp_string1                type string,
        temp_actual_dividend_option type string,
        temp_string2                type string,
        temp_string3                type string,
        temp_seq_id                 type string,
        temp_field                  type string,
        temp_value                  type string.

  data: w_line(4096).
  data: begin of outline occurs 0,
          text(255),
        end of outline.
  clear: response_wa,json_itab,json_wa.
  refresh it_div.

  if p_file is not initial.
    call function 'GUI_UPLOAD'
      exporting
        filename                = p_file
        filetype                = 'ASC'
        codepage                = '8300'
        "CODEPAGE  = '8300'
      tables
        data_tab                = rawdata
      exceptions
        file_open_error         = 1
        file_read_error         = 2
        no_batch                = 3
        gui_refuse_filetransfer = 4
        invalid_type            = 5
        no_authority            = 6
        unknown_error           = 7
        others                  = 17.

    loop at rawdata.
      temp = rawdata.
      condense temp.
      concatenate lv_response temp into lv_response.
    endloop.
*     /ui2/cl_json=>deserialize( exporting json = lv_response changing data = response_wa  ).
  else.

    if p_div = 'X'.
      concatenate p_url '?operationStartDate=' p_sbudat
                         '&operationEndDate=' p_ebudat
                         '&dataStatus=dividend' into p_url.

    else.
      concatenate p_url '?operationStartDate=' p_sbudat
                       '&operationEndDate=' p_ebudat
                       '&dataStatus=cancel' into p_url.
    endif.
    if not p_file is initial.
      write: / 'Test File: ', p_file.
    else.
      write: / 'URL: ', p_url,
             / 'Run Date: ', p_sbudat, ' to', p_ebudat.
    endif.
    cl_http_client=>create_by_url(
      exporting
        url = p_url
      importing
        client = lo_http_client
      exceptions
        argument_not_found = 1
        plugin_not_active = 2
        internal_error = 3
        others = 4 ).
    if sy-subrc <> 0.
      return.
    endif.

    create object lo_rest_client
      exporting
        io_http_client = lo_http_client.

    lo_http_client->request->set_version( if_http_request=>co_protocol_version_1_0 ).

    if p_tok eq 'X'.
      call function 'Z_BAPI_GET_TOKEN'
        exporting
          login         = ws_login
          password      = ws_pass
          applicationid = ws_appid
        importing
          token         = token.
      "Need to save at somewhere for further use?
    else.
      token = 'SAP'.
    endif.
    if token is not initial.
      pass_token = token.
    else.
      pass_token = 'SAP'.
    endif.
*  * passing the token value in header
    call method lo_http_client->request->set_header_field
      exporting
        name  = 'Token'
        value = pass_token.

*   passing the content-type value in header which is a mandatory field
    call method lo_http_client->request->set_header_field
      exporting
        name  = 'Content-Type'
        value = 'application/json;charset=utf-8'.

    lo_http_client->request->set_method( 'GET' ).
    lo_http_client->request->set_content_type( 'application/json' ).
    lo_http_client->propertytype_logon_popup = if_http_client=>co_disabled.

    lo_http_client->send(
                       exceptions
                       http_communication_failure = 1
                       http_invalid_state = 2 ).

*   Receiving the response
    lo_http_client->receive(
                    exceptions
                    http_communication_failure = 1
                    http_invalid_state = 2
                    http_processing_failed = 3 ).
    if sy-subrc eq 0.
      it_result-type = 'E'.
      it_result-message = 'Web Service Connection Failed'.
      append it_result.
      w_error = 'X'.
    endif.
  endif.
  "Rename the field name which is over 30 char

  check w_error is initial.
  lv_response = lo_http_client->response->get_cdata( ).
  replace all occurrences of 'net_dividend_payout_amount_reference_currency'
  in lv_response with 'net_dividend_payout_ref_curr'.

  replace all occurrences of 'fund_currency_to_nt_exchange_rate'
     in lv_response with 'fund_currency_exchange_rate'.

  replace all occurrences of 'fund_currency_to_reference_currency_exchange_rate'
     in lv_response with 'fund_currency_ref_exch_rate'.

  /ui2/cl_json=>deserialize( exporting json = lv_response changing data = response_wa  ).
  w_line = lv_response.
  w_status = response_wa-status.
  if w_status = '200' .
    move response_wa-response to res_itab.
    loop at res_itab into res_wa.
      move res_wa-dividend_fund to json_itab.
      sort json_itab by payout_sequence_id.
      loop at json_itab into json_wa.
        select single payout_sequence_id into temp from zxomodivpayhdr
        where payout_sequence_id = json_wa-payout_sequence_id
          and payout_date = json_wa-payout_date
          and status = '02'.   " ALready Processed
        check sy-subrc ne 0.
        on change of json_wa-payout_sequence_id.
          it_payout-sequence = 0.
          it_payhdr-payout_sequence_id = json_wa-payout_sequence_id.
          it_payhdr-payout_date = json_wa-payout_date.
          it_payhdr-policy_number = res_wa-policy_number.
          it_payhdr-reference_currency = res_wa-reference_currency.
          it_payhdr-campaign_code = res_wa-campaign_code.
          it_payhdr-status = '01'.   " Created
          it_payhdr-updatedate = w_datum.
          it_payhdr-updatetime = w_uzeit.
          if p_div = 'X'.
            it_payhdr-datastatus = 'DIVIDEND'.
          else.
            it_payhdr-datastatus = 'CANCEL'.
          endif.
          append it_payhdr.
        endon.
        it_payout-sequence = it_payout-sequence + 1.
        if p_div = 'X'.
          it_payout-datastatus = 'DIVIDEND'.
        else.
          it_payout-datastatus = 'CANCEL'.
        endif.
        move-corresponding json_wa to it_payout.
        append it_payout.
      endloop.
    endloop.
    modify zxomodivpayhdr from table it_payhdr.
    modify zxomodivpaylog from table it_payout.
  else.
    it_result-type  = 'E'.
    it_result-message = response_wa-msg_code.
    append it_result.
    w_error = 'X'.
  endif.

endform.

form get_reprocess_data.
  if p_div1 = 'X'.
    select * into corresponding fields of table it_payhdr2
       from zxomodivpayhdr
      where payout_sequence_id in s_zuonr
        and payout_date in s_budat
        and datastatus = 'DIVIDEND'
        and ( status = '01' or status = '99' ).

*    "show header list to select.
*    DO 10 TIMES.
*      it_payhdr-payout_sequence_id = 'a'.
*      APPEND it_payhdr.
*    ENDDO.
    if lines( it_payhdr2 ) ne 0.
      perform display_alv_list.
*      perform display_alv_list1.
    endif.

    loop at it_payhdr.
      move-corresponding it_payhdr to res_wa.
      append res_wa to res_itab.
      select * appending corresponding fields of table it_payout
        from zxomodivpaylog
        where payout_sequence_id = it_payhdr-payout_sequence_id
          and payout_date = it_payhdr-payout_date.
    endloop.

    loop at it_payout.
      move-corresponding it_payout to json_wa.
      wa_iden-fund_id = it_payout-fund_id.
      json_wa-identification = wa_iden.
      append json_wa to json_itab.
    endloop.
  else.
    select * into corresponding fields of table it_payhdr
       from zxomodivpayhdr
      where payout_sequence_id in s_zuonr
        and payout_date in s_budat
        and datastatus = 'CANCEL'
           and ( status = '01' or status = '99' ).

    if lines( it_payhdr ) ne 0.
      perform display_alv_list.
    endif.

    loop at it_payhdr.
      move-corresponding it_payhdr to res_wa.
      append res_wa to res_itab.
      select * appending corresponding fields of table it_payout
       from zxomodivpaylog
       where payout_sequence_id = it_payhdr-payout_sequence_id
         and payout_date = it_payhdr-payout_date.
    endloop.

    loop at it_payout.
      move-corresponding it_payout to json_wa.
      wa_iden-fund_id = it_payout-fund_id.
      json_wa-identification = wa_iden.
      append json_wa to json_itab.
    endloop.
  endif.

endform.

form process_data.
  data: gv_item   type i,
        dr_acc    type bseg-hkont,
        cr_acc    type bseg-hkont,
        hktid     type t012a-hktid,
        hbkid     type t012a-hbkid,
        wa_it_div type itab_accdoc.
  data: tran_itab type table of zbk_acc_det with header line.

  data: temp        type string,
        local_waers type bkpf-waers,
        temp2       type string.
  data: year(4)  type c,
        month(2) type c,
        day(2)   type c.

  if w_error = ''.
    if p_chk1 = 'X'.
      res_itab = response_wa-response.  " Move JSON Response to ITAB
    endif.
    loop at res_itab into res_wa.

      if p_chk1 = 'X'.
        json_itab = res_wa-dividend_fund.
      endif.
      loop at json_itab into json_wa.
        add 1 to gv_item.
        clear: it_div, w_error.
* check if already process or not
        select single payout_sequence_id into temp from zxomodivpayhdr
        where payout_sequence_id = json_wa-payout_sequence_id
          and payout_date = json_wa-payout_date
          and datastatus = 'DIVIDEND'
          and status = '02'.
        if sy-subrc eq 0. " Already Processed
          it_skip-seq   = res_wa-seq.
          it_skip-zuonr = json_wa-payout_sequence_id.
          append it_skip.
          exit.   " Skip
        endif.
* header record
        it_div-index = gv_item.
        it_div-bldat = p_sbudat.
        it_div-budat = json_wa-payout_date.
        it_div-blart = c_blart.    " Doc Type
        it_div-bukrs = p_bukrs. " Company Code

        select single sap_curr into it_div-waers from zws_curr
            where xo_curr = res_wa-reference_currency.   " Currency
        if it_div-waers is initial.
          concatenate it_div-message 'No matching currency in ZWS_CURR: ' res_wa-reference_currency
          into it_div-message separated by space.
          it_div-type = 'E'.
          w_error = 'X'.
        elseif it_div-waers <> 'TWD'.
          it_div-kursf = json_wa-fund_currency_exchange_rate.
          it_div-wwert_d = json_wa-dividend_payout_exchange_date.
        endif.
        it_div-bktxt = it_div-waers && json_wa-net_dividend_payout_amount.
        select single debit credit zxoty
           from zxo_acc_det
           into ( dr_acc , cr_acc, it_div-xblnr )
          where bankcode = json_wa-payee_bank_code
            and currency = it_div-waers
            and bukrs = p_bukrs.
        if sy-subrc ne 0.
          concatenate it_div-message 'No matching A/C in ZXO_ACCT_DET:'
           json_wa-payee_bank_code ':' res_wa-reference_currency
          into it_div-message.
          it_div-type = 'E'.
          w_error = 'X'.
        else.
          perform conversion_exit changing dr_acc.
          perform conversion_exit changing cr_acc.
          it_div-hkont = dr_acc.
        endif.

*   Debit Line
        it_div-bschl      = '40'.  " Debit
        it_div-wrbtr      = json_wa-net_dividend_payout_ref_curr.
        it_div-dmbtr      = 0."let it cal in post function
        it_div-zuonr      = json_wa-payout_sequence_id.
        it_div-xref1      = json_wa-payee_id.
        it_div-xref2      = json_wa-payee_name.
        wa_iden          = json_wa-identification.
        it_div-xref3      = wa_iden-fund_id.
        it_div-sgtxt      = wa_iden-fund_id.
        it_div-zzpolicy01 = res_wa-policy_number.
        it_div-zfieldname = 'ZZPOLICY01;ZZCAMPCD1'.
        it_div-zfieldval = res_wa-policy_number && ';' &&  res_wa-campaign_code.

*   Credit Line
        move it_div to wa_it_div.
        wa_it_div-bschl = '50'.
        wa_it_div-hkont = cr_acc.
        wa_it_div-sgtxt = json_wa-payee_bank_code && json_wa-payee_branch_code
                         && json_wa-payee_bank_account.
        wa_it_div-valut = it_div-budat.
        if wa_it_div-hkont is initial.
          concatenate it_div-message 'No matching A/C in ZXO_ACCT_DET:'
           json_wa-payee_bank_code ':' res_wa-reference_currency
          into it_div-message.
          w_error = 'X'.
          it_div-type = 'E'.
        endif.

* Move to RESULT_ITAB
        clear it_result.
        move-corresponding it_div to it_result.
        it_result-seq     = res_wa-seq.
        it_result-debit   = it_div-hkont.
        it_result-credit  = wa_it_div-hkont.
        it_result-message = it_div-message.
        append it_result.

* Move to it_div if need to Post
        if it_div-type <> 'E'.
          append it_div.             " Append Debit Line
          append wa_it_div to it_div. " Append Credit Line
        else.
          update zxomodivpayhdr set status = '99'
                                 message = it_div-message
                 where payout_sequence_id = json_wa-payout_sequence_id
                   and payout_date = json_wa-payout_date.
        endif.
      endloop.
    endloop.
  endif.
endform.

form process_doc.
  data: curr_index(4)  type c,
        bapi_result(4) type c.

  if it_div[] is not initial.
    call function 'Z_BAPI_POST_DOC'
      exporting
        park_flag   = ''
        print_flag  = 'X'
        alv         = 'X'
        test_run    = ''
      tables
        acc_doc     = it_div
      exceptions
        check_fail  = 1
        create_fail = 2.

    bapi_result = sy-subrc."Read table in below loop for it_result may replace sy-subrc.
  else.
    bapi_result = -1.
  endif.

  clear curr_index.
  loop at it_div.
    if curr_index <> it_div-index."skip duplicate line.for D / C balance record in it_div.
      curr_index = it_div-index.
      " Update Posting Result to it_result
      read table it_result with key index = it_div-index.
      it_result-doc_no  = it_div-doc_no.
      it_result-type    = it_div-type.
      it_result-message = it_div-message.
      modify it_result index sy-tabix.
    endif.
  endloop.

  clear curr_index.

  "LOG
  loop at it_div."result tab and record tab is create in same time. tabix<->record will be match.

    loop at it_payhdr where payout_sequence_id = it_div-zuonr.
      if it_div-type = ''.
        it_payhdr-status = '02'.
      elseif it_div-type = 'E'.
        it_payhdr-status = '99'.
        it_payhdr-message = it_div-message.
      endif.
      modify it_payhdr.
    endloop.
    modify zxomodivpayhdr from table it_payhdr.

  endloop.


endform.

form process_cancel_data.
  data: year(4)  type c,
        month(2) type c,
        day(2)   type c.
  if w_error = ''.
    if p_chk1 = 'X'.
      res_itab = response_wa-response.
    endif.
    loop at res_itab into res_wa.
      if p_chk1 = 'X'.
        json_itab = res_wa-dividend_fund.
      endif.
      loop at json_itab into cancel_wa.
        select single payout_sequence_id into temp
        from zxomodivpayhdr
          where payout_sequence_id = cancel_wa-payout_sequence_id
            and payout_date = cancel_wa-payout_sequence_id
            and datastatus = 'CANCEL'
            and status = '02'.
        if sy-subrc eq 0. " Already Processed
          it_skip-seq = res_wa-seq.
          it_skip-zuonr = cancel_wa-payout_sequence_id.
          append it_skip.
          continue.   " Skip
        endif.
        select single bkpf~bukrs bkpf~belnr as doc_no bkpf~gjahr
              bseg~zuonr
          into corresponding fields of it_canc
          from bseg
         inner join bkpf on bkpf~bukrs = bseg~bukrs
                        and bkpf~belnr = bseg~belnr
                        and bkpf~gjahr = bseg~gjahr
                        and bkpf~stblg = ''
         where bseg~zuonr = cancel_wa-payout_sequence_id.
        if sy-subrc ne 0.
          it_canc-type = 'E'.
          concatenate cancel_wa-payout_sequence_id ': Document not found'
          into it_canc-message.
          update zxomodivpayhdr set status = '99'
                                  message = it_canc-message
                  where payout_sequence_id = cancel_wa-payout_sequence_id
                    and payout_date = cancel_wa-payout_date.
        endif.
        it_canc-seq   = res_wa-seq.
        it_canc-zuonr = cancel_wa-payout_sequence_id.

        append it_canc.
      endloop.
    endloop.
  endif.
endform.

form process_cancel_doc.
  data: re_budat    type bkpf-budat,
        temp_month  type i,
        temp_str(2) type c.
  data: gv_item  type i.
  data: w_reversal type bapiacrev.
  data: obj_key type bapiacrev-obj_key.
  data: it_return type table of bapiret2,
        wa_return type bapiret2.

  loop at it_canc where type <> 'E'.
    add 1 to gv_item.
    it_canc-index = gv_item.
    w_reversal-obj_type = 'BKPFF'.
    w_reversal-reason_rev = 'CP'.
    concatenate it_canc-doc_no
                it_canc-bukrs
                it_canc-gjahr into w_reversal-obj_key_r.
    call function 'BAPI_ACC_DOCUMENT_REV_POST'
      exporting
        reversal = w_reversal
        bus_act  = 'RFBU'
      importing
        obj_key  = obj_key
      tables
        return   = it_return.
    loop at it_return into wa_return where type = 'E'. " Error
      it_canc-type = 'E'.
      it_canc-message = wa_return-message.
    endloop.
    if sy-subrc ne 0.
      call function 'BAPI_TRANSACTION_COMMIT'.
      it_canc-sgtxt = obj_key.
      modify it_canc.
    endif.
    modify it_canc.
  endloop.
  "LOG
  loop at it_canc."result tab and record tab is create in same time. tabix<->record will be match.

    loop at it_payhdr where payout_sequence_id = it_canc-zuonr.
      if it_canc-type = ''.
        it_payhdr-status = '02'.
      elseif it_canc-type = 'E'.
        it_payhdr-status = '99'.
        it_payhdr-message = it_canc-message.
      endif.
      modify it_payhdr.
    endloop.
    modify zxomodivpayhdr from table it_payhdr.
  endloop.
endform.

form conversion_exit changing k_varbl.
  call function 'CONVERSION_EXIT_ALPHA_INPUT'
    exporting
      input  = k_varbl
    importing
      output = k_varbl.
endform.                    "CONVERSION_EXITs

form f4_filename.
  data: l_desktop   type string,
        l_i_files   type filetable,
        l_wa_files  type file_table,
        l_rcode     type int4,
        l_file_type type string.

  l_file_type = 'TXT|*.txt'.

  call method cl_gui_frontend_services=>file_open_dialog
    exporting
      window_title            = 'Select file'
      default_extension       = l_file_type
      file_filter             = l_file_type
    changing
      file_table              = l_i_files
      rc                      = l_rcode
    exceptions
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      others                  = 5.
  if sy-subrc <> 0.
    message e000(00) with 'Error while opening file'.
  endif.
  check l_i_files is not initial.
  read table l_i_files index 1 into l_wa_files.
  if sy-subrc = 0.
    p_file = l_wa_files-filename.
  else.
    message e000(00) with 'Error while opening file'.
  endif.
endform.

form display_doc.
  data: w_text(10).
  data: w_skip    type i, w_success type i, w_error type i.

* Count no. of records
  clear: w_skip, w_success, w_error.
  describe table it_skip lines w_skip.
  loop at it_result.
    if it_result-type = 'E'.
      w_error = w_error + 1.
    else.
      w_success = w_success + 1.
    endif.
  endloop.
  loop at it_canc.
    if it_canc-type = 'E'.
      w_error = w_error + 1.
    else.
      w_success = w_success + 1.
    endif.
  endloop.
  write: / 'Record count: ',
        /5 'Skipped: ', w_skip,
        /5 'Posted:  ', w_success,
        /5 'Error    ', w_error.
  skip.

  loop at it_skip.
    write: / 'Skipped' under text-003,
              it_skip-seq under text-004,
              it_skip-zuonr under text-005.
  endloop.

  case 'X'.
    when p_div.
      loop at it_result.
        at first.
          write: / 'Status: ', w_status.
        endat.
        write: /  it_result-type under text-003,
                  it_result-seq   under text-004,
                  it_result-zuonr under text-005,
                  it_result-doc_no under text-006,
                  it_result-message under text-007.
      endloop.
      skip.

    when p_cancel.

      loop at it_canc.
        at first.
          write: / 'Status: ', w_status.
        endat.
        write: /  it_canc-type    under text-003,
                  it_canc-seq     under text-004,
                  it_canc-zuonr   under text-005,
                  it_canc-doc_no  under text-006,
                  it_canc-message under text-007.
      endloop.
      skip.
  endcase.
endform.

form display_alv_list.
  gd_repid = sy-repid.
  perform build_fieldcatalog.
  perform build_layout.
*  call function 'REUSE_ALV_GRID_DISPLAY'
  call function 'REUSE_ALV_LIST_DISPLAY'
    exporting
      i_callback_program       = gd_repid
      i_callback_user_command  = 'USER_COMMAND'
      i_callback_pf_status_set = 'SET_PF_STATUS'   "see FORM
      is_layout                = gd_layout
      it_fieldcat              = fieldcatalog[]
      i_save                   = 'X'
    tables
      t_outtab                 = it_payhdr2
    exceptions
      program_error            = 1
      others                   = 2.
  if sy-subrc <> 0.

  endif.
endform.                    " DISPLAY_ALV_REPORT

*form display_alv_list1.
*  set pf-status 'ZGUI_STATUS'.
*  loop at it_payhdr.
*    write: / it_payhdr-sel as checkbox,
*             it_payhdr-payout_sequence_id,
*             it_payhdr-payout_date,
*             it_payhdr-policy_number,
*             it_payhdr-reference_currency,
*             it_payhdr-campaign_code,
*             it_payhdr-updatedate,
*             it_payhdr-updatetime.
*    hide:    it_payhdr-sel,
*             it_payhdr-payout_sequence_id,
*             it_payhdr-payout_date,
*             it_payhdr-policy_number,
*             it_payhdr-reference_currency,
*             it_payhdr-campaign_code,
*             it_payhdr-updatedate,
*             it_payhdr-updatetime.
*  endloop.
*endform.                    " DISPLAY_ALV_REPORT

form set_pf_status using rt_extab type slis_t_extab.
  set pf-status 'ZGUI_STATUS'.
  "Copy of 'STANDARD' pf_status from fgroup SALV
endform.

form build_fieldcatalog.
  fieldcatalog-fieldname   = 'PAYOUT_SEQUENCE_ID'.
  fieldcatalog-seltext_m   = 'Payout Sequence ID'.
  fieldcatalog-col_pos     = 0.
  fieldcatalog-outputlen   = 10.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
  append fieldcatalog to fieldcatalog.
  clear  fieldcatalog.

  fieldcatalog-fieldname   = 'PAYOUT_DATE'.
  fieldcatalog-seltext_m   = 'Payout Date'.
  fieldcatalog-col_pos     = 1.
  append fieldcatalog to fieldcatalog.
  clear  fieldcatalog.

  fieldcatalog-fieldname   = 'POLICY_NUMBER'.
  fieldcatalog-seltext_m   = 'Policy Number'.
  fieldcatalog-col_pos     = 2.
  append fieldcatalog to fieldcatalog.
  clear  fieldcatalog.

  fieldcatalog-fieldname   = 'REFERENCE_CURRENCY'.
  fieldcatalog-seltext_m   = 'Reference Currency'.
  fieldcatalog-col_pos     = 3.
  append fieldcatalog to fieldcatalog.
  clear  fieldcatalog.

  fieldcatalog-fieldname   = 'CAMPAIGN_CODE'.
  fieldcatalog-seltext_m   = 'Campaign Code'.
  fieldcatalog-col_pos     = 4.
  append fieldcatalog to fieldcatalog.
  clear  fieldcatalog.

  fieldcatalog-fieldname   = 'UPDATEDATE'.
  fieldcatalog-seltext_m   = 'Update Date'.
  fieldcatalog-col_pos     = 5.
  append fieldcatalog to fieldcatalog.
  clear  fieldcatalog.

  fieldcatalog-fieldname   = 'UPDATETIME'.
  fieldcatalog-seltext_m   = 'Update Time'.
  fieldcatalog-col_pos     = 6.
  append fieldcatalog to fieldcatalog.
  clear  fieldcatalog.
endform.                    " BUILD_FIELDCATALOG

form build_layout.
  gd_layout-box_fieldname     = 'SEL'.
  "set field name to store row selection
  gd_layout-edit              = 'X'. "makes whole ALV table editable
  gd_layout-zebra             = 'X'.
endform.                    " BUILD_LAYOUT

form user_command using r_ucomm like sy-ucomm
                   rs_selfield type slis_selfield.

* Check function code
  case r_ucomm.
    when 'EXEC'.  "user presses SAVE
      loop at it_payhdr2.
        if it_payhdr2-sel NE 'X'.
          "Process selected line. Remove the not selected line.
*          delete it_payhdr2.
          MOVE-CORRESPONDING it_payhdr2 TO it_payhdr.
          APPEND it_payhdr.
*       Process records that have been selected
        endif.
      endloop.
      rs_selfield-refresh = 'X'.
      set pf-status space.
*      LEAVE TO LIST-PROCESSING.
      LEAVE SCREEN.
  endcase.
ENDFORM.

bottom of page