top of page

*&---------------------------------------------------------------------*
*& report zief_get_payment
*& description: call eflow web service to get
*&              payment info and create fi document
*&              currency mapping table      : zws_curr
*&              a/c code determination table: zef_acc_det
*&              log table                   : zefpayreqlog
*& date:     18 jun 2019
*&---------------------------------------------------------------------*
report zief_get_pay_request.

constants: c_wsid(4)            value 'IB02',
           c_blart(2)           value 'Z3',
           c_xblnr              like bkpf-xblnr value 'EFLOW PAYMENT',
           c_hkont              like bseg-hkont value '564000',
           formname_top_of_page type slis_formname value 'TOP_OF_PAGE',
           ws_login(30)         type c value 'App_TW_CMS'.
data: ws_pass(30)  type c,
      ws_appid(30) type c.

tables: bkpf,zefpayreqlog.", zws_master.

parameters: p_chk1 radiobutton group g1 default 'X'.
selection-screen begin of block b1 with frame title text-001.
* parameters: p_new as checkbox default 'X'.
* parameters: p_chk1  as checkbox default ' ',
parameters: p_tok   as checkbox default ' '.
select-options: s_budat for bkpf-budat no-extension.
parameters: p_bukrs type bkpf-bukrs default '1000',
            p_url   type string lower case,
            p_file  type string lower case.
selection-screen end of block b1.
parameters: p_chk2 radiobutton group g1.
selection-screen begin of block b2 with frame title text-002.
select-options: s_budat1 for bkpf-budat no-extension,
                s_zuonr1 for zefpayreqlog-eflow_request_no.
selection-screen end of block b2.

* selection-screen begin of block b2 with frame title text-002.
* parameters: p_old as checkbox default 'X'.
* select-options: s_budat1 for bkpf-budat no-extension.
* selection-screen end of block b2.

* JSON Data
types: begin of js_party,
         name type string,
         role type string,
       end of js_party.

types: begin of js_bank_account,
         bank_code type string,
       end of js_bank_account.

types: begin of js_origin,
         party        type js_party,
         bank_account type js_bank_account,
       end of js_origin.

types: begin of js_recipient,
         party type js_party,
       end of js_recipient.

types: begin of js_paydet,
         accounting_code   type string,
         currency          type string,
         amount            type string,
         cheque_number     type string,
         payment_origin    type js_origin,
         payment_recipient type js_recipient,
       end of js_paydet.

types: begin of js_paydata,
         eflow_request_no       type string,
         gross_amount           type string,
         bank_charge            type string,
         payment_method         type string,
         payment_status         type string,
         payment_effective_date type string,
       end of js_paydata.

types: begin of js_res,
         payment_data   type js_paydata,
         payment_detail type table of js_paydet with non-unique default key,
       end of js_res.

types: begin of js_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 js_response.

data: wa_js_response type js_response.

* Working ITAB and WA
data: it_js_res type table of js_res,
      wa_js_res type js_res.

data: "it_js_pay type table of js_paydata,
       wa_js_pay   type js_paydata.

data: it_js_paydet type table of js_paydet with non-unique default key,
      wa_js_paydet type js_paydet.

data: "it_js_origin type table of js_origin,
       wa_js_origin   type js_origin.

data: "it_js_recipient type table of js_recipient,
  wa_js_recipient    type js_recipient,
  wa_js_party        type js_party,
  wa_js_bank_account type js_bank_account.

data: it_gl  type table of zgl_accdoc with header line,
      it_gl1 type table of zgl_accdoc with header line,
      it_log type table of zefpayreqlog with header line,
      wa_log type zefpayreqlog.

*data BEGIN OF it_log occurs 0.
*  DATA: sel.
*  INCLUDE STRUCTURE zefpayreqlog.
*DATA END OF it_log.

data BEGIN OF it_log2 occurs 0.
  DATA: sel.
  INCLUDE STRUCTURE zefpayreqlog.
DATA END OF it_log2.

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

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,
        seq(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,
        xref1        type  bseg-xref1,
        doc_no       type  bkpf-belnr,
        debit        type  bseg-hkont,
        credit       type  bseg-hkont,
        type         type  c,
        message(100) type  c,
      end of it_result.

data: w_line(4096).
data: begin of outline occurs 0,
        text(255),
      end of outline.
data: w_lastdate type datum.
data: w_error.
data: w_datum like sy-datum,
      w_uzeit like sy-uzeit.

initialization.
  select single url lastdate into ( p_url, w_lastdate ) from zws_master where wsid = c_wsid.
  if w_lastdate is initial or w_lastdate >= sy-datum.
    s_budat-low = s_budat-high = sy-datum.
  else.
    s_budat-low = w_lastdate.
    s_budat-high = sy-datum.
  endif.
  s_budat-sign = 'I'.
  s_budat-option = 'BT'.
  append s_budat.
  w_datum = sy-datum.
  w_uzeit = sy-uzeit.

at selection-screen.

  if p_url is initial and p_file is initial AND p_chk1 EQ 'X'.
    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.
*  case 'X'.
*    when p_new.
  if p_chk1 = 'X'.
    perform get_data.
  elseif p_chk2 = 'X'.
    perform get_log.
  endif.

  if w_error is initial.
    perform process_data.
    perform process_doc.
    perform display_doc.
  endif.
*    when p_old.

*  endcase.

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,
        temp    type string.
  data:  lv_json  type string.
  clear: wa_js_response,
         wa_js_pay,
         wa_js_origin,
         it_js_paydet,
         wa_js_paydet.
  refresh it_gl.

  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 = wa_js_response  ).
  else.
    concatenate p_url '?paymentStartDate=' s_budat-low
                      '&paymentEndDate='   s_budat-high into p_url.
*    write: / 'Calling EFlow Web Service.'.

    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'.
      select single password appid
        into ( ws_pass, ws_appid )
        from zws_token where login = ws_login.
      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.
    else.
      case sy-subrc.
        when 1.
          write: / 'Error: ', 'http_communiation_failure'.
        when 2.
          write: / 'Error: ', 'http_invalid_state'.
        when 3.
          write: / 'Error: ', 'http_processing_failed'.
      endcase.
    endif.
    lv_response = lo_http_client->response->get_cdata( ).
  endif.
  /ui2/cl_json=>deserialize( exporting json = lv_response changing data = wa_js_response  ).

  if not p_file is initial.
    write: / 'Test File: ', p_file.
  else.
    write: / 'URL: ', p_url.
  endif.
  if wa_js_response-status = '200' .
    it_js_res = wa_js_response-response.
    write : / 'Status: 200(OK).'.
    w_line = lv_response.

    loop at it_js_res into wa_js_res.
      wa_js_pay = wa_js_res-payment_data.
      select single eflow_request_no into temp from zefpayreqlog
      where eflow_request_no = wa_js_pay-eflow_request_no
        and payment_effective_date = wa_js_pay-payment_effective_date
        and status = '02'.   " ALready Processed
      check sy-subrc ne 0.

      move-corresponding wa_js_pay to it_log.
      it_log-bukrs = p_bukrs.
      it_log-datum = sy-datum.
      it_log-uzeit = sy-uzeit.
      it_log-status = '01'.
      it_js_paydet = wa_js_res-payment_detail.

      it_log-payment_detail = /ui2/cl_json=>serialize( it_js_paydet ).
      append it_log.
    endloop.
    modify zefpayreqlog from table it_log.
    move wa_js_response-response to it_js_res.
  elseif wa_js_response-status = '0'.
    w_error = 'X'.
    write : / 'Status: ', wa_js_response-status, '(No Record)'.
  else.
    w_error = 'X'.
    write : / 'Status: ', wa_js_response-status, '(Error).'.
    write : / 'Message Code: ', wa_js_response-msg_code.
    write : / 'Message Desc: ', wa_js_response-msg_desc.
  endif.

endform.

form get_log.
  data: paydet_json    type string.
  select *
    from zefpayreqlog
    appending corresponding fields of table it_log2
   where eflow_request_no in s_zuonr1
     and payment_effective_date in s_budat1
     and ( status = '01' or status = '99' ).
*    DATA: temp(10) TYPE n.
*    DO 10 TIMES.
*      temp = temp + 1.
*      it_log-EFLOW_REQUEST_NO = temp.
*      APPEND it_log.
*    ENDDO.

  if lines( it_log2 ) eq 0.
    w_error = 'X'.
    write: / 'No Record Found.'.
  else.
    perform display_alv_list.

    loop at it_log.
      move-corresponding it_log to wa_js_pay.
      wa_js_res-payment_data = wa_js_pay.
      paydet_json = it_log-payment_detail.
      /ui2/cl_json=>deserialize( exporting json = paydet_json changing data = it_js_paydet ).
      wa_js_res-payment_detail = it_js_paydet.
      append wa_js_res to it_js_res.
    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_line1 type zgl_accdoc,
        wa_line2 type zgl_accdoc,
        wa_line3 type zgl_accdoc,
        wa_line4 type zgl_accdoc,
        w_zuonr  like bseg-zuonr.
  data: it_tran type table of zbk_acc_det with header line.

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

  if w_error = ''.

    loop at it_js_res into wa_js_res.   " Process each record
      clear: w_error, wa_line1.
      wa_js_pay = wa_js_res-payment_data.
      w_zuonr = wa_js_pay-eflow_request_no.
      select single eflow_request_no
        into temp
        from zefpayreqlog
      where eflow_request_no = w_zuonr
        and status = '02'.
      if sy-subrc eq 0. " Already Processed
        it_skip-zuonr = temp.
        append it_skip.
        continue.   " Skip
      endif.
* write record to log
*      write: / 'Record no.:  ', sy-tabix.
* process payment data

*      write: /5 'Payment Data: ',
*               wa_js_pay-eflow_request_no, wa_js_pay-gross_amount,
*               wa_js_pay-bank_charge, wa_js_pay-payment_method,
*               wa_js_pay-payment_status, wa_js_pay-payment_effective_date.
* process payment detail
      refresh it_js_paydet.
      it_js_paydet = wa_js_res-payment_detail.
*      loop at it_js_paydet into wa_js_paydet.
*        write: /5 'Payment Detail: ',
*            wa_js_paydet-accounting_code, wa_js_paydet-currency,
*            wa_js_paydet-amount, wa_js_paydet-cheque_number,
*            wa_js_paydet-payment_origin-party-name,
*            wa_js_paydet-payment_origin-party-role,
*            wa_js_paydet-payment_origin-bank_account-bank_code,
*            wa_js_paydet-payment_recipient-party-name,
*            wa_js_paydet-payment_recipient-party-role.
*      endloop.

      add 1 to gv_item.
      wa_line1-index = gv_item.
      wa_line1-zuonr = wa_js_pay-eflow_request_no.

* Header
      wa_line1-blart = c_blart.  " EFlow Document Type
      wa_line1-xblnr = c_xblnr.
      wa_line1-bukrs = p_bukrs. " Company Code
      wa_line1-bldat = sy-datum.
      wa_line1-budat = wa_js_pay-payment_effective_date.

      clear: wa_js_paydet, wa_js_recipient, wa_js_party.
      read table it_js_paydet index 1 into wa_js_paydet.  " 1st Entry
      wa_js_recipient = wa_js_paydet-payment_recipient.
      wa_js_party = wa_js_recipient-party.
      wa_line1-bktxt = wa_js_party-role.

      select single sap_curr into wa_line1-waers from zws_curr
         where ef_curr = wa_js_paydet-currency.   " Currency
      if wa_line1-waers is initial.
        if wa_js_paydet-currency = 'NT$'.
          wa_line1-waers = 'TWD'.
        else.
*          write: /5 'Currency not found in ZWS_CURR: ', wa_js_paydet-currency.
          concatenate 'No matching currency in ZWS_CURR: ' wa_js_paydet-currency
          into wa_line1-message separated by space.
          wa_line1-type = 'E'.
          w_error = 'X'.
        endif.
      endif.

* Line 1: Credit Entry
      wa_line1-bschl = '50'.
      wa_line1-wrbtr = wa_js_pay-gross_amount.

      wa_line1-valut = wa_js_pay-payment_effective_date.
      wa_line1-xref1 = wa_js_pay-payment_method.

      wa_js_origin = wa_js_paydet-payment_origin.
      wa_js_party = wa_js_origin-party.
      wa_line1-xref2 = wa_js_party-name.

      wa_js_bank_account = wa_js_origin-bank_account.
      select single clearing from zef_acc_det into
        wa_line1-hkont where bankcode = wa_js_bank_account-bank_code
                         and payment_method = wa_js_pay-payment_method.
      if wa_line1-hkont is initial.
*        write: /5 'A/C not found: ', wa_js_bank_account-bank_code, wa_js_pay-payment_method.
        concatenate 'No matching A/C in ZEFLOW_ACCT_DET:'
        wa_js_bank_account-bank_code
        wa_js_pay-payment_method
        into wa_line1-message separated by space.
        wa_line1-type = 'E'.
        w_error = 'X'.
      else.
        append wa_line1 to it_gl.
      endif.

*   Line Item 2: For Bank Charge, only if bank charge > 0
      clear wa_line2.
      if wa_js_pay-bank_charge > 0.
        move-corresponding wa_line1 to wa_line2.
        wa_line2-bschl = '40'.
        wa_line2-hkont = c_hkont.
        wa_line2-wrbtr = wa_js_pay-bank_charge.
        clear wa_line2-valut.
        append wa_line2 to it_gl.
      endif.

*   Line Item3 to ItemN: Debit Entry
      net_total = 0.
      loop at it_js_paydet into wa_js_paydet.
        net_total = net_total + wa_js_paydet-amount.
      endloop.

      loop at it_js_paydet into wa_js_paydet.
        clear wa_line3.
        move-corresponding wa_line1 to wa_line3.
        wa_line3-bschl = '40'.
        wa_line3-hkont = wa_js_paydet-accounting_code.
        wa_line3-wrbtr = ( wa_js_pay-gross_amount - wa_js_pay-bank_charge )
                         * ( wa_js_paydet-amount / net_total ).
        wa_line3-sgtxt = wa_js_paydet-currency && wa_js_paydet-amount.
        append wa_line3 to it_gl.
      endloop.


* write all records to log
*      move-corresponding wa_line1 to wa_log.
*      wa_log-seq = wa_line1-index.
*      append wa_log to it_log.
* write correct records to it_gl
      if w_error is initial.  " Only create FI Document if no error
        append lines of it_gl to it_gl1.
        clear: it_gl[].
      else.
        update zefpayreqlog set status = '99'
                                message = wa_line1-message
                     where eflow_request_no = wa_line1-zuonr
                  and payment_effective_date = wa_line1-budat.
      endif.
* write records to it_result
      move-corresponding wa_line1 to it_result.
      it_result-debit = wa_line1-hkont .
      it_result-seq   = wa_line1-index.
      append it_result.
*      endif.
    endloop.
  endif.
endform.

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

  if it_gl1[] is not initial.
    skip.
*    write: / 'Create FI Document....'.
    call function 'Z_BAPI_POST_DOC'
      exporting
        park_flag   = ''
        print_flag  = 'X'
        alv         = 'X'
        test_run    = ''
      tables
        acc_doc     = it_gl1
      exceptions
        check_fail  = 1
        create_fail = 2.

    bapi_result = sy-subrc. "Read table in below loop for it_result may replace sy-subrc.
    clear curr_index.
    loop at it_gl1.
      if curr_index <> it_gl1-index. "skip duplicate line.for D / C balance record in it_gl.
        curr_index = it_gl1-index.
        read table it_result with key seq = it_gl1-index.
        it_result-doc_no  = it_gl1-doc_no.
        it_result-type    = it_gl1-type.
        it_result-message = it_gl1-message.
        modify it_result index sy-tabix.
      endif.
    endloop.
    clear curr_index.

    update zws_master set lastdate = s_budat-high where wsid = c_wsid.
  else.
    bapi_result = -1.
  endif.

  "LOG
  loop at it_gl1."result tab and record tab is create in same time. tabix<->record will be match.
*    on change of it_canc-index.
    loop at it_log where eflow_request_no = it_gl1-zuonr.
      if it_gl1-type = ''.
        it_log-status = '02'.
      elseif it_gl1-type = 'E'.
        it_log-status = '99'.
        it_log-message = it_gl1-message.
      endif.
      modify it_log.
    endloop.
    modify zefpayreqlog from table it_log.
  endloop.
endform.

form display_doc .
*  if w_error is initial.
  data: w_text(10).
  data: w_skip    type i, w_success type i, w_error type i.
  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.

  skip.
* write: / 'Detail Log:'.
  loop at it_skip.
    write: / 'Skipped' under text-003,
             it_skip-zuonr under text-005.
  endloop.

  loop at it_result where type = 'E'.
    write: / 'Error' under text-003,
              it_result-zuonr   under text-005,
              40 it_result-budat,
              it_result-doc_no under text-006,
              it_result-message under text-007.
  endloop.

  loop at it_result where type <> 'E'.
    write: / 'Success' under text-003,
                  it_result-zuonr   under text-005,
                  40 it_result-budat,
                  it_result-doc_no under text-006,
                  it_result-message under text-007.
  endloop.
  skip.
  write: / 'Record count: ',
             /5 'Skipped: ', w_skip,
             /5 'Posted:  ', w_success,
             /5 'Error    ', w_error.


*  endif.
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 = 'CSV|*.csv|TXT|*.txt|Excel File|*.xls;*.xlsx|All Types|*.*'.

  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_alv_list.
  gd_repid = sy-repid.
  PERFORM build_fieldcatalog.
  PERFORM build_layout.
  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_log2
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
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   = 'EFLOW_REQUEST_NO'.
  fieldcatalog-seltext_m   = 'EFlow Request No'.
  fieldcatalog-col_pos     = 0.
  fieldcatalog-outputlen   = 10.
  fieldcatalog-emphasize   = 'X'.
  fieldcatalog-key         = 'X'.
*  fieldcatalog-do_sum      = 'X'.
*  fieldcatalog-no_zero     = 'X'.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'PAYMENT_EFFECTIVE_DATE'.
  fieldcatalog-seltext_m   = 'Payment Effective Date'.
  fieldcatalog-col_pos     = 1.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'GROSS_AMOUNT'.
  fieldcatalog-seltext_m   = 'Gross Amount'.
  fieldcatalog-col_pos     = 2.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'BANK_CHARGE'.
  fieldcatalog-seltext_m   = 'Bank Charge'.
  fieldcatalog-col_pos     = 3.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'PAYMENT_METHOD'.
  fieldcatalog-seltext_m   = 'Payment Method'.
  fieldcatalog-col_pos     = 4.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'PAYMENT_STATUS'.
  fieldcatalog-seltext_m   = 'Payment Status'.
  fieldcatalog-col_pos     = 5.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'DATUM'.
  fieldcatalog-seltext_m   = 'Update Date'.
  fieldcatalog-col_pos     = 6.
  APPEND fieldcatalog TO fieldcatalog.
  CLEAR  fieldcatalog.

  fieldcatalog-fieldname   = 'UZEIT'.
  fieldcatalog-seltext_m   = 'Update Time'.
  fieldcatalog-col_pos     = 7.
  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_log2.
        IF it_log2-sel EQ 'X'.
            MOVE-CORRESPONDING it_log2 TO it_log.
            APPEND it_log.
*       Process records that have been selected
        ENDIF.
      ENDLOOP.
      "rs_selfield-refresh = 'X'.
      rs_selfield-exit = 'X'.
      SET PF-STATUS space.

      LEAVE SCREEN.
*      SUPPRESS DIALOG.
*      LEAVE TO LIST-PROCESSING.
  ENDCASE.
ENDFORM.                    "user_command

top-of-page.

  write: /1  'Status'(003),
           15 'Payout Sequence'(005),
           40 'Effective Date'(008),
           58 'Document No.'(006),
           73 'Message'(007).
  uline.

bottom of page