Skip to content
Skip to content
Menu
SAP ABAP DWIMAN
  • About
SAP ABAP DWIMAN

SAP ABAP – POSTING FBCJ using BAPI

By juananda.satria on October 26, 2023October 26, 2023

ZFIT_UPL_CJ_LOG

https://docs.google.com/spreadsheets/d/1lhd5EwwuNh3L_OkXRRH-AmphiIjkcmmle1rsmLg7Fek/edit?usp=sharing


REPORT zfi_upload_cj MESSAGE-ID zfi.

* -------------------------------------------------------------------- *
*  G L O B A L   V A R I A B L E
* -------------------------------------------------------------------- *
TABLES: zfit_upl_cj_log.

TYPES:
  gty_data TYPE zfist0004,
  gtt_data TYPE TABLE OF zfist0004,
  gty_xlsx TYPE zfist0005,
  gtt_xlsx TYPE TABLE OF zfist0005.

" [START] JDS 08.03.2023 : balance validation
TYPES:
  BEGIN OF gty_balance,
    cajo_number TYPE tcj_balance-cajo_number,
    time_stamp  TYPE tcj_balance-time_stamp,
    closing_sum TYPE tcj_balance-closing_sum,
    currency    TYPE tcj_balance-currency,
  END OF gty_balance,
  gtt_balance TYPE TABLE OF gty_balance.
" [END] JDS 08.03.2023 : balance validation

TYPES:
  BEGIN OF gty_trans,
    comp_code       TYPE tcj_transactions-comp_code,
    transact_number TYPE tcj_transactions-transact_number,
    transact_type   TYPE tcj_transactions-transact_type,
    gl_account      TYPE tcj_transactions-gl_account,
    transact_name   TYPE tcj_trans_names-transact_name,
  END OF gty_trans,
  gtt_trans TYPE TABLE OF gty_trans.

TYPES:
  BEGIN OF gty_cardnum,
    comp_code   TYPE zfit_upl_cj_map-comp_code,
    cajo_number TYPE zfit_upl_cj_map-cajo_number,
    cardnum     TYPE zfit_upl_cj_map-cardnum,
  END OF gty_cardnum,
  gtt_cardnum TYPE TABLE OF gty_cardnum.

" [START] JDS 31.07.2023 : add validation
TYPES: BEGIN OF gty_fmci,
         bukrs TYPE t001-bukrs,
         fipex TYPE fmci-fipex,
       END OF gty_fmci,
       gtt_fmci TYPE TABLE OF gty_fmci.

TYPES: BEGIN OF gty_skb1,
         bukrs TYPE skb1-bukrs,
         saknr TYPE skb1-saknr,
       END OF gty_skb1,
       gtt_skb1 TYPE TABLE OF gty_skb1.
" [END] JDS 31.07.2023 : add validation
DATA:
  gt_fmci      TYPE gtt_fmci, " JDS 31.07.2023 : add cmmt_item validation
  gt_skb1      TYPE gtt_skb1, " JDS 31.07.2023 : add gl validation
  gt_trans     TYPE gtt_trans,
  gt_cardnum   TYPE gtt_cardnum,
  gt_data      TYPE gtt_data,
  go_alv_table TYPE REF TO cl_salv_table,
  gt_log       TYPE TABLE OF zfit_upl_cj_log. " repost

CONSTANTS:
  gc_icon_error   TYPE icon_d VALUE icon_red_light,
  gc_icon_success TYPE icon_d VALUE icon_green_light.

* -------------------------------------------------------------------- *
*  S E L E C T I O N   S C R E E N
* -------------------------------------------------------------------- *
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002.
  PARAMETERS : rb_upl   RADIOBUTTON GROUP rad1 DEFAULT 'X' USER-COMMAND uc1,
               rb_bgj   RADIOBUTTON GROUP rad1,
               rb_repos RADIOBUTTON GROUP rad1, " repost
               rb_log   RADIOBUTTON GROUP rad1.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_file TYPE string LOWER CASE MODIF ID upl. "OBLIGATORY.

  SELECT-OPTIONS: so_bukrs FOR zfit_upl_cj_log-comp_code MODIF ID log,
                  so_cajon FOR zfit_upl_cj_log-cajo_number  MODIF ID log,
                  so_ttype FOR zfit_upl_cj_log-transact_type  MODIF ID log,
                  so_hkont FOR zfit_upl_cj_log-gl_account MODIF ID log,
                  so_budat FOR zfit_upl_cj_log-pstng_date MODIF ID log,
                  so_statu FOR zfit_upl_cj_log-status MODIF ID log,
                  so_erdat FOR zfit_upl_cj_log-erdat MODIF ID log,
                  so_erzet FOR zfit_upl_cj_log-erzet MODIF ID log,
                  so_ernam FOR zfit_upl_cj_log-ernam MODIF ID log.
SELECTION-SCREEN END OF BLOCK b2.

AT SELECTION-SCREEN OUTPUT.
  PERFORM f_sel_out.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  "Popup file open
  PERFORM f_f4_file CHANGING p_file.

* -------------------------------------------------------------------- *
*  C L A S S
* -------------------------------------------------------------------- *
CLASS lcl_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS :
      on_user_command FOR EVENT added_function OF cl_salv_events_table
        IMPORTING e_salv_function,
      on_link_click FOR EVENT link_click OF cl_salv_events_table
        IMPORTING column row.
ENDCLASS.

CLASS lcl_event_handler IMPLEMENTATION.
*
  METHOD on_user_command.
    PERFORM f_handle_user_command USING e_salv_function.

  ENDMETHOD.                    " on_user_command
*
  METHOD on_link_click.
    PERFORM f_handle_hotspot USING column row.
  ENDMETHOD.                    " on_link_click
*
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION

* -------------------------------------------------------------------- *
*  S T A R T   O F    S E L E C T I O N
* -------------------------------------------------------------------- *
START-OF-SELECTION.
  PERFORM f_validation_upload.
  CASE 'X'.
    WHEN rb_bgj.
      PERFORM f_get_file_from_sap_server USING p_file
                                          CHANGING gt_data.
      PERFORM f_get_master_data.
      PERFORM f_build_data.
*      PERFORM f_balance_validation. " JDS 08.03.2023 : add balance validation
      PERFORM f_process_cjdoc.
    WHEN rb_upl.
      PERFORM f_get_upload_data_xlsx USING  p_file
                                     CHANGING gt_data.
      PERFORM f_get_master_data.
      PERFORM f_build_data.
*      PERFORM f_balance_validation. " JDS 08.03.2023 : add balance validation
    WHEN rb_repos. " repost
*      PERFORM f_get_repost_data CHANGING gt_data.
      PERFORM f_get_log_data CHANGING gt_data.
      PERFORM f_get_master_data.
      PERFORM f_build_data.
    WHEN rb_log.
      PERFORM f_get_log_data CHANGING gt_data.
  ENDCASE.


* -------------------------------------------------------------------- *
*  E N D   O F   S E L E C T I O N
* -------------------------------------------------------------------- *
END-OF-SELECTION.
  IF sy-batch NE 'X'.
    PERFORM f_display_alv.
  ENDIF.

* -------------------------------------------------------------------- *
*  S U B R O U T I N E S
* -------------------------------------------------------------------- *

*&---------------------------------------------------------------------*
*& Form f_get_log_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GT_DATA
*&---------------------------------------------------------------------*
FORM f_get_log_data  CHANGING pct_data TYPE gtt_data.

  SELECT *
    FROM zfit_upl_cj_log
    INTO TABLE gt_log
    WHERE comp_code IN so_bukrs
      AND cajo_number IN so_cajon
      AND transact_type IN so_ttype
      AND gl_account IN so_hkont
      AND pstng_date IN so_budat
      AND status IN so_statu
      AND erdat IN so_erdat
      AND erzet IN so_erzet
      AND ernam IN so_ernam.

  IF sy-subrc EQ 0.
    LOOP AT gt_log INTO DATA(ls_log).
      APPEND INITIAL LINE TO pct_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
      MOVE-CORRESPONDING ls_log TO <lfs_data>.
      CASE ls_log-status.
        WHEN 'S'.
          <lfs_data>-icon = gc_icon_success.
        WHEN 'E'.
          <lfs_data>-icon = gc_icon_error.
      ENDCASE.
    ENDLOOP.
  ELSE.
    " No data exists
    MESSAGE ID '/ACCGO/CAS_FLLW_MSG' TYPE 'S' NUMBER 338 DISPLAY LIKE 'E'.
  ENDIF.

  SORT pct_data BY cajo_number pstng_date seq subseq. " JDS 09.03.2023 : repost
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_display_alv .

  CHECK gt_data IS NOT INITIAL.
  IF rb_repos NE 'X' AND rb_log NE 'X'. " JDS 09.03.2023 : repost
    SORT gt_data BY sort_no.
  ENDIF.

  TRY .
      cl_salv_table=>factory(
        IMPORTING
          r_salv_table = go_alv_table
        CHANGING
          t_table      = gt_data ).

      PERFORM f_set_status.
      PERFORM f_set_columns.
      PERFORM f_set_events.

      go_alv_table->display( ).

    CATCH cx_salv_msg.
  ENDTRY.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_set_status
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_set_status .

  DATA: lv_pfstatus TYPE sypfkey.

  IF rb_repos NE 'X'. " JDS 09.03.2023 : repost
    lv_pfstatus = 'STANDARD'.
    LOOP AT gt_data INTO DATA(ls_data) WHERE icon IS NOT INITIAL.
      lv_pfstatus = 'STANDARD2'.
      EXIT.
    ENDLOOP.
  ELSE.
    lv_pfstatus = 'STANDARD_REPOS'.
  ENDIF.

  go_alv_table->set_screen_status(
   EXPORTING
     pfstatus = lv_pfstatus
     report   = sy-repid
     set_functions = go_alv_table->c_functions_all ).
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_set_columns
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_set_columns .
  DATA:
    lo_columns TYPE REF TO cl_salv_columns_table,
    lo_column  TYPE REF TO cl_salv_column_table.

  DEFINE _set_text.
    TRY.
        lo_column ?= lo_columns->get_column( &1 ).
        lo_column->set_short_text( '' ).
        lo_column->set_medium_text( '' ).
        lo_column->set_long_text( &2 ).
      CATCH cx_salv_not_found.
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE _set_hide.
    TRY.
        lo_column ?= lo_columns->get_column( &1 ).
        lo_column->set_visible( value  = if_salv_c_bool_sap=>false ).
      CATCH cx_salv_not_found.
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE _set_technical.
    TRY.
        lo_column ?= lo_columns->get_column( &1 ).
        lo_column->set_technical( ).
      CATCH cx_salv_not_found.
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE _set_icon.
    TRY.
        lo_column ?= lo_columns->get_column( &1 ).
        lo_column->set_icon( ).
      CATCH cx_salv_not_found.
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE _set_checkbox.
    TRY.
        lo_column ?= lo_columns->get_column( &1 ).
        lo_column->set_cell_type( value = if_salv_c_cell_type=>checkbox_hotspot ).
      CATCH cx_salv_not_found.
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE _set_hotspot.
    TRY.
        lo_column ?= lo_columns->get_column( &1 ).
        lo_column->set_cell_type(
            value = if_salv_c_cell_type=>hotspot
        ).
      CATCH cx_salv_not_found.
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE _set_curr_col.
    TRY.
        lo_column ?= lo_columns->get_column( &1 ).
        lo_column->set_currency_column( value = &2 ).
      CATCH cx_salv_not_found.
      CATCH cx_salv_data_error.
    ENDTRY.
  END-OF-DEFINITION.

  DEFINE _set_key.
    TRY.
        lo_column ?= lo_columns->get_column( &1 ).
        lo_column->set_key( ).
      CATCH cx_salv_not_found.
      CATCH cx_salv_data_error.
    ENDTRY.
  END-OF-DEFINITION.

  lo_columns =  go_alv_table->get_columns( ).
  lo_columns->set_optimize( abap_true ).
  lo_columns->set_key_fixation( ).

  _set_icon 'ICON'.
  _set_text 'ICON' 'Icon' ##NO_TEXT.
  _set_text 'ALLOC_NMBR' 'Card Number' ##NO_TEXT.
  _set_technical 'SORT_NO'.
  _set_hotspot 'BELNR'.

  _set_curr_col 'P_PAYMENTS' 'CURRENCY'.

  IF rb_repos NE 'X'. " JDS 09.03.2023 : repost
    _set_technical 'CHECKBOX'.
  ELSE.
    _set_checkbox 'CHECKBOX'.
    _set_key 'CHECKBOX'.
    _set_key 'ICON'.
    _set_key 'COMP_CODE'.
    _set_key 'CAJO_NUMBER'.
    _set_technical 'SEQ'.
    _set_technical 'SUBSEQ'.
  ENDIF.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_set_events
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_set_events .
  DATA:
    lo_events        TYPE REF TO cl_salv_events_table,
    lo_event_handler TYPE REF TO lcl_event_handler.

* Get the event object
  lo_events = go_alv_table->get_event( ).

* Event handler
  CREATE OBJECT lo_event_handler.
  SET HANDLER lo_event_handler->on_user_command FOR lo_events.
  SET HANDLER lo_event_handler->on_link_click FOR lo_events.

ENDFORM.




*&---------------------------------------------------------------------*
*& Form f_validation_upload
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_validation_upload .

  DATA: lv_ext      TYPE c LENGTH 10,
        lv_filename TYPE c LENGTH 255.

  CASE 'X'.
    WHEN rb_bgj OR rb_upl.
      IF p_file IS INITIAL.
        MESSAGE 'Please choose file to upload' TYPE 'S' DISPLAY LIKE 'E' ##NO_TEXT.
        LEAVE LIST-PROCESSING.
      ENDIF.

      lv_filename = p_file.
      CALL FUNCTION 'TRINT_FILE_GET_EXTENSION'
        EXPORTING
          filename  = lv_filename
        IMPORTING
          extension = lv_ext.
      IF lv_ext NE 'XLSX'.
        MESSAGE 'Only XLSX file allowed' TYPE 'S' DISPLAY LIKE 'E' ##NO_TEXT.
        LEAVE LIST-PROCESSING.
      ENDIF.
    WHEN rb_log.
  ENDCASE.

ENDFORM.



*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- P_FILE
*&---------------------------------------------------------------------*
FORM f_f4_file  CHANGING pc_flupld TYPE string.

  DATA: lt_filetable TYPE filetable,
        ls_filetable TYPE file_table,
        lv_subrc     TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      file_filter             = 'Excel Files (*.XLSX)|*.XLSX|' ##NO_TEXT " cl_gui_frontend_services=>filetype_excel "
    CHANGING
      file_table              = lt_filetable
      rc                      = lv_subrc
    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 ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSE.
    READ TABLE lt_filetable INTO ls_filetable INDEX 1.
    pc_flupld = ls_filetable-filename.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form f_get_file_from_sap_server
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_FILE
*&      <-- GT_DATA
*&---------------------------------------------------------------------*
FORM f_get_file_from_sap_server  USING    p_file
                    CHANGING pct_data TYPE gtt_data.

  DATA:
        lv_xstring TYPE xstring.

  "1. Read excel from SAP Path Server (AL11)
  OPEN DATASET p_file FOR INPUT IN BINARY MODE.
  IF sy-subrc EQ 0.

    "2. Convert to XSTRING
    READ DATASET p_file INTO lv_xstring.
    IF sy-subrc NE 0.
      RETURN.
    ENDIF.
  ENDIF.
  CLOSE DATASET p_file.

  PERFORM f_xstring2data USING lv_xstring CHANGING pct_data.
  PERFORM f_validation_data CHANGING pct_data.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_get_upload_data_xlsx
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_FILE
*&      <-- GT_OA
*&---------------------------------------------------------------------*
FORM f_get_upload_data_xlsx  USING    p_file TYPE string
                             CHANGING pct_data TYPE gtt_data.

  PERFORM f_ac_xl_to_sap USING    p_file
                         CHANGING pct_data.

  IF pct_data IS INITIAL.
    "No data to upload
    MESSAGE s611(cpe_ipc) DISPLAY LIKE fiehc_con_msgty_e.
    LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_ac_xl_to_sap
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_FILE
*&      <-- PCT_OA
*&---------------------------------------------------------------------*
FORM f_ac_xl_to_sap  USING    p_file TYPE string
                    CHANGING pct_data TYPE gtt_data.
  DATA:
    lv_filelength    TYPE i,
    lv_headerxstring TYPE xstring,
    lt_records       TYPE solix_tab.

  PERFORM f_xlsx2itab USING p_file CHANGING lv_filelength lv_headerxstring lt_records.
  PERFORM f_itab2xstring USING lv_filelength lt_records CHANGING lv_headerxstring .

  PERFORM f_xstring2data USING lv_headerxstring CHANGING pct_data.
  PERFORM f_validation_data CHANGING pct_data.

ENDFORM.



*&---------------------------------------------------------------------*
*& Form f_xlsx2itab
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_FILE
*&      <-- LV_FILELENGTH
*&      <-- LV_HEADERXSTRING
*&      <-- LT_RECORDS
*&---------------------------------------------------------------------*
FORM f_xlsx2itab  USING    p_file TYPE string
                  CHANGING pc_filelength TYPE i
                           pc_headerxstring TYPE xstring
                           pct_records TYPE solix_tab.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = p_file
      filetype                = 'BIN'
    IMPORTING
      filelength              = pc_filelength
      header                  = pc_headerxstring
    TABLES
      data_tab                = pct_records
    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
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    LEAVE LIST-PROCESSING.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_itab2xstring
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_FILELENGTH
*&      <-- LV_HEADERXSTRING
*&      <-- LT_RECORDS
*&---------------------------------------------------------------------*
FORM f_itab2xstring  USING    p_filelength TYPE i
                              pt_records TYPE solix_tab
                     CHANGING pc_headerxstring TYPE xstring.

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = p_filelength
    IMPORTING
      buffer       = pc_headerxstring
    TABLES
      binary_tab   = pt_records
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno DISPLAY LIKE 'E'
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    LEAVE LIST-PROCESSING.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_xstring2data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- PCT_DATA
*&---------------------------------------------------------------------*
FORM f_xstring2data USING    p_headerxstring TYPE xstring
*                    CHANGING pct_data_p TYPE gtt_data
*                             pct_data_r TYPE gtt_data.
                    CHANGING pct_data TYPE gtt_data.
  DATA:
    lv_filename_str TYPE string,
    lo_excel_ref    TYPE REF TO cl_fdt_xl_spreadsheet,
    lt_worksheets   TYPE STANDARD TABLE OF string,
    lv_err_msg      TYPE string,
    lv_idx          TYPE sy-index,
    lo_exc          TYPE REF TO cx_fdt_excel_core,
    lo_data_raw     TYPE REF TO data,
    ls_data         TYPE gty_data,
    ls_xlsx         TYPE gty_xlsx,
    lv_sort         TYPE i,
    lv_char10       TYPE char10,
    ls_item         TYPE zfist0006,
    lv_worksheet_i  TYPE i. " JDS 08.03.2023 : GL multi purpose (pay/rec)

  FIELD-SYMBOLS:
    <lft_data_raw> TYPE STANDARD TABLE.

  TRY .
      CREATE OBJECT lo_excel_ref
        EXPORTING
          document_name = lv_filename_str
          xdocument     = p_headerxstring.

      IF lo_excel_ref IS NOT INITIAL.
        lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
          IMPORTING
            worksheet_names = lt_worksheets
        ).
      ENDIF.

      DATA:
        lr_descr TYPE REF TO cl_abap_structdescr,
        ls_comp  TYPE abap_compdescr.
      DATA: lv_lines TYPE i.
      lr_descr ?= cl_abap_typedescr=>describe_by_data( ls_xlsx ).
      DESCRIBE TABLE lr_descr->components LINES lv_lines.

      IF lt_worksheets IS NOT INITIAL.
        LOOP AT lt_worksheets INTO DATA(lv_worksheet).
          " [START] JDS 08.03.2023 : GL multi purpose (pay/rec)
          lv_worksheet_i = sy-tabix.
          IF lv_worksheet_i > 2.
            EXIT.
          ENDIF.
          " [END] JDS 08.03.2023 : GL multi purpose (pay/rec)
          lv_idx = 2. " first data row
          lo_data_raw = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet( lv_worksheet ).
          ASSIGN lo_data_raw->* TO <lft_data_raw>.
          IF sy-subrc EQ 0.
            LOOP AT <lft_data_raw> ASSIGNING FIELD-SYMBOL(<lfs_data_raw>) FROM lv_idx.
              lv_sort = lv_sort + 1.
              APPEND INITIAL LINE TO pct_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
              CLEAR: ls_xlsx.
              DO.
                ASSIGN COMPONENT sy-index OF STRUCTURE <lfs_data_raw> TO FIELD-SYMBOL(<lfs_raw>).
                IF sy-subrc NE 0 OR sy-index > lv_lines.
                  EXIT.
                ELSE.
                  ASSIGN COMPONENT sy-index OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(<lfs_dest>).
                  CASE sy-index.
                    WHEN 9 OR 10 OR 11. " ALPHA = IN CHAR10 (HKONT, KOSTL, PRCTR)
                      lv_char10 = |{ <lfs_raw> ALPHA = IN }|.
                      <lfs_dest> = lv_char10.
                    WHEN 3 OR 4. " date
                      PERFORM f_convert_date USING <lfs_raw> CHANGING <lfs_dest>.
                    WHEN 8. " Currency
                      ASSIGN COMPONENT 5 OF STRUCTURE ls_xlsx TO FIELD-SYMBOL(<lfs_waers>).
                      PERFORM f_convert_curr_in USING <lfs_raw> <lfs_waers> CHANGING <lfs_dest>.
*                      PERFORM f_convert_curr_in USING <lfs_raw> 'IDR' CHANGING <lfs_dest>.
                    WHEN 12. " commitment item / fipos
                      PERFORM f_convert_fipos_in USING <lfs_raw> CHANGING <lfs_dest>.
                    WHEN OTHERS.
                      <lfs_dest> = <lfs_raw>.
                  ENDCASE.
                ENDIF.
              ENDDO.
              MOVE-CORRESPONDING ls_xlsx TO ls_item.
              IF ls_xlsx-comp_code IS INITIAL.
                <lfs_data> = ls_data.
                MOVE-CORRESPONDING ls_item TO <lfs_data>.
              ELSE.
                MOVE-CORRESPONDING ls_xlsx TO <lfs_data>.
                ls_data = <lfs_data>.
              ENDIF.
              <lfs_data>-sort_no = lv_sort.
              " [START] JDS 08.03.2023 : GL multi purpose (pay/rec)
              CASE lv_worksheet_i.
                WHEN 1.
                  <lfs_data>-transact_type = 'C'. " receipt
                WHEN 2.
                  <lfs_data>-transact_type = 'E'. " payment
              ENDCASE.
              " [END] JDS 08.03.2023 : GL multi purpose (pay/rec)
            ENDLOOP.
          ENDIF.
        ENDLOOP.

      ENDIF.


    CATCH cx_fdt_excel_core INTO lo_exc.
      lv_err_msg = lo_exc->get_text( ).
      MESSAGE lv_err_msg TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
  ENDTRY.

*  SORT pct_data BY int_no ebelp tier_from.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_convert_curr_in
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <LFS_RAW>
*&      --> <LFS_WAERS>
*&      <-- <LFS_DEST>
*&---------------------------------------------------------------------*
FORM f_convert_curr_in  USING    p_in
                                 p_waers
                        CHANGING pc_out.
  IF p_waers EQ 'IDR'.
    pc_out = p_in / 100.
  ELSE.
    pc_out = p_in.
  ENDIF.
ENDFORM.



*&---------------------------------------------------------------------*
*& Form f_convert_date
*&---------------------------------------------------------------------*
*& external to internal date
*&---------------------------------------------------------------------*
*&      --> <LFS_VALUE>
*&      <-- YYYYMMDD
*&---------------------------------------------------------------------*
FORM f_convert_date  USING p_date_string TYPE string CHANGING pc_date TYPE datum .

  DATA: lv_convert_date(10) TYPE c.

  CHECK p_date_string IS NOT INITIAL.

  lv_convert_date = p_date_string .

  "date format YYYY/MM/DD
  FIND REGEX '^\d{4}[/|-]\d{1,2}[/|-]\d{1,2}$' IN lv_convert_date.
  IF sy-subrc = 0.
    CALL FUNCTION '/SAPDMC/LSM_DATE_CONVERT'
      EXPORTING
        date_in             = lv_convert_date
        date_format_in      = 'DYMD'
        to_output_format    = ' '
        to_internal_format  = 'X'
      IMPORTING
        date_out            = lv_convert_date
      EXCEPTIONS
        illegal_date        = 1
        illegal_date_format = 2
        no_user_date_format = 3
        OTHERS              = 4.
  ELSE.

    " date format DD/MM/YYYY or DD-MM-YYYY or DD.MM.YYYY

    FIND REGEX '^\d{1,2}[/|-|.]\d{1,2}[/|-|.]\d{4}$' IN lv_convert_date.
    IF sy-subrc = 0.
      CALL FUNCTION '/SAPDMC/LSM_DATE_CONVERT'
        EXPORTING
          date_in             = lv_convert_date
          date_format_in      = 'DDMY'
          to_output_format    = ' '
          to_internal_format  = 'X'
        IMPORTING
          date_out            = lv_convert_date
        EXCEPTIONS
          illegal_date        = 1
          illegal_date_format = 2
          no_user_date_format = 3
          OTHERS              = 4.

    ENDIF.
  ENDIF.

  IF sy-subrc = 0.
    pc_date = lv_convert_date .
  ELSE.
    CLEAR pc_date.
  ENDIF.

ENDFORM.



*&---------------------------------------------------------------------*
*& Form f_validation_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- GT_DATA
*&---------------------------------------------------------------------*
FORM f_validation_data  CHANGING pct_data TYPE gtt_data.

*  DATA:
*    lv_ematn   TYPE gty_data-ematn,
*    lv_intno   TYPE gty_data-int_no,
*    lt_log     TYPE gtt_log,
*    lv_icon    TYPE icon_d,
*    lv_remarks TYPE gty_data-remarks.

*  PERFORM f_get_log  USING pct_data CHANGING lt_log .
*  SORT lt_log BY int_no.

*  LOOP AT pct_data INTO DATA(ls_grp_h) WHERE icon IS INITIAL GROUP BY ls_grp_h-int_no.
*    READ TABLE lt_log INTO DATA(ls_log) WITH KEY int_no = ls_grp_h-int_no BINARY SEARCH.
*    IF sy-subrc NE 0.
*      CLEAR: ls_log.
*    ENDIF.
*    LOOP AT GROUP ls_grp_h INTO DATA(ls_grp_i) GROUP BY ls_grp_i-ebelp.
*      LOOP AT GROUP ls_grp_i ASSIGNING FIELD-SYMBOL(<lfs_data>).
*      ENDLOOP.
*    ENDLOOP.
*
*  ENDLOOP.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_sel_out
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_sel_out .  DATA: lv_upl TYPE char1,
lv_log TYPE char1.

CASE 'X'.
  WHEN rb_log OR rb_repos.
    lv_upl = 0.
    lv_log = 1.
  WHEN rb_upl OR rb_bgj.
    lv_upl = 1.
    lv_log = 0.
  WHEN OTHERS.
ENDCASE.

LOOP AT SCREEN.
  CASE screen-name.
    WHEN 'P_FILE'.
      screen-required = 2.
      MODIFY SCREEN.
  ENDCASE.

  CASE screen-group1.
    WHEN 'UPL'.
      screen-active = lv_upl.
      MODIFY SCREEN.
    WHEN 'LOG'.
      screen-active = lv_log.
      MODIFY SCREEN.
    WHEN OTHERS.
  ENDCASE.
ENDLOOP.
ENDFORM.



*&---------------------------------------------------------------------*
*& Form f_handle_user_command
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_SALV_FUNCTION
*&---------------------------------------------------------------------*
FORM f_handle_user_command  USING p_ucomm TYPE salv_de_function.

  DATA: lv_answer TYPE char4,
        lv_subrc  LIKE sy-subrc.

  CASE p_ucomm.
    WHEN '&POST'. " Posting
      IF rb_repos EQ 'X'. " repost
        PERFORM f_validation_repos CHANGING lv_subrc.
        IF lv_subrc IS INITIAL.
          PERFORM f_process_cjdoc_repost.
          PERFORM f_refresh_table USING go_alv_table.
        ENDIF.
      ELSE.
        PERFORM f_validation_post CHANGING lv_subrc.
        IF lv_subrc IS INITIAL.
          PERFORM f_process_cjdoc.
          PERFORM f_grey_button.
          PERFORM f_refresh_table USING go_alv_table.
        ENDIF.
      ENDIF.
    WHEN '&ZALL'. " select all
      PERFORM f_select_all USING 'X'.
      PERFORM f_refresh_table USING go_alv_table.
    WHEN '&ZSAL'. " deselect all
      PERFORM f_select_all USING ''.
      PERFORM f_refresh_table USING go_alv_table.
    WHEN '&DEL'. " deselect all
      PERFORM f_validation_delete CHANGING lv_subrc.
      IF lv_subrc IS INITIAL.
        PERFORM f_popup_confirm CHANGING lv_answer.
        IF lv_answer EQ '1'.
          PERFORM f_delete_data.
          PERFORM f_refresh_table USING go_alv_table.
        ENDIF.
      ENDIF.
  ENDCASE.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_refresh_table
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> GO_ALV_TABLE
*&---------------------------------------------------------------------*
FORM f_refresh_table  USING    po_alv_table TYPE REF TO cl_salv_table.
  DATA:
    lo_columns TYPE REF TO cl_salv_columns_table,
    ls_stable  TYPE lvc_s_stbl.

  ls_stable-col = 'X'.
  ls_stable-row = 'X'.

  lo_columns =  po_alv_table->get_columns( ).
  lo_columns->set_optimize( abap_true ).
  po_alv_table->refresh(
    EXPORTING
      s_stable     = ls_stable
*      refresh_mode = if_salv_c_refresh=>soft
  ).
ENDFORM.





*&---------------------------------------------------------------------*
*& Form f_handle_hotspot
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> COLUMN
*&      --> ROW
*&---------------------------------------------------------------------*
FORM f_handle_hotspot  USING    p_column TYPE salv_de_column
                                p_row TYPE salv_de_row.

  CASE p_column.
    WHEN 'BELNR'.
      PERFORM f_click_belnr USING p_row.
    WHEN 'CHECKBOX'.
      PERFORM f_click_checkbox USING p_row.
      PERFORM f_refresh_table USING go_alv_table.
  ENDCASE.
ENDFORM.



*&---------------------------------------------------------------------*
*& Form f_click_belnr
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> RS_SELFIELD_TABINDEX
*&---------------------------------------------------------------------*
FORM f_click_belnr  USING    p_index.
  READ TABLE gt_data INTO DATA(ls_data) INDEX p_index.
  IF sy-subrc EQ 0.
    CHECK ls_data-belnr IS NOT INITIAL.
    IF ls_data-belnr CO '0123456789'.
      PERFORM f_call_fb03 USING ls_data-comp_code ls_data-belnr ls_data-pstng_date(4).
    ENDIF.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_call_fb03
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> LS_DATA_BUKRS
*&      --> LS_DATA_BELNR
*&      --> LS_DATA_BUDAT(4)
*&---------------------------------------------------------------------*
FORM f_call_fb03  USING    p_bukrs
                           p_belnr
                           p_gjahr.

  SET PARAMETER ID 'BLN' FIELD p_belnr.
  SET PARAMETER ID 'BUK' FIELD p_bukrs.
  SET PARAMETER ID 'GJR' FIELD p_gjahr.
  CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.

ENDFORM.



*&---------------------------------------------------------------------*
*& Form f_post_cjdoc
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_post_cjdoc USING    p_cjdocno TYPE bapi_cj_key-posting_number
                  CHANGING pcs_data  TYPE gty_data.
*FORM f_post_cjdoc  USING    ps_ujs    TYPE zsdt0018
*                            ps_map    TYPE gty_map
*                            p_cjdocno TYPE bapi_cj_key-posting_number
*                            p_total   TYPE wrbtr
*                   CHANGING pcs_result TYPE gty_result.

  DATA: lt_itcj         TYPE TABLE OF iscj_postings WITH HEADER LINE,
        lt_itcjcpd      TYPE TABLE OF tcj_cpd WITH HEADER LINE,
        lt_itcjtax      TYPE TABLE OF tcj_wtax_items WITH HEADER LINE,
        lt_itcjpos      TYPE TABLE OF iscj_postings WITH HEADER LINE,

        lv_cajo_num     TYPE tcj_c_journals-cajo_number,
        lv_begbal       TYPE cjamount,
        lv_totrep       TYPE cjamount,
        lv_totpay       TYPE cjamount,
        lv_totcek       TYPE cjamount,
        lv_runbal       TYPE cjamount,
        lv_casbal       TYPE cjamount,
        lv_num_rec      TYPE i,
        lv_num_pay      TYPE i,
        lv_num_cek      TYPE i,
        lv_error_number TYPE cjbelnr,
        lv_budat        TYPE budat,
        lv_typ          TYPE cjtranstyp.
  DATA: lv_awkey TYPE bkpf-awkey.

  lt_itcj-cajo_number     = pcs_data-cajo_number.
  lt_itcj-comp_code       = pcs_data-comp_code.
  lt_itcj-fisc_year       = pcs_data-pstng_date(4).
  lt_itcj-posting_number  = p_cjdocno.
  lt_itcj-h_net_amount    = pcs_data-p_payments.
  lt_itcj-h_net_payment_wt  = pcs_data-p_payments.
  lt_itcj-h_total_amount  = pcs_data-p_payments.
  lt_itcj-document_date   = pcs_data-doc_date.
  lt_itcj-document_number = pcs_data-ref_doc_no.
  lt_itcj-posting_date    = pcs_data-pstng_date.
  lt_itcj-document_status = 'S'.
  lt_itcj-transact_name   = pcs_data-transact_name.
  lt_itcj-kostl           = pcs_data-costcenter.
  lt_itcj-prctr           = pcs_data-profit_ctr.
  lt_itcj-gl_account      = pcs_data-gl_account.
  lt_itcj-fipos           = pcs_data-cmmt_item.
  lt_itcj-position_text   = pcs_data-position_text.


  CASE pcs_data-transact_type.
    WHEN 'C'.
      lv_typ = 'R'.
      lt_itcj-h_receipts      = pcs_data-p_payments.
      lt_itcj-alloc_nmbr      = pcs_data-alloc_nmbr.
    WHEN 'E' OR 'B'. " edited by JDS 06.02.2023 : trans type 'B'
*      lv_typ = pcs_data-transact_type.
      lv_typ = 'E'.
      " [start] remarked by JDS 31.07.2023
*      IF pcs_data-currency NE 'IDR'.
*        lt_itcj-h_payments      = pcs_data-p_payments / 100.
*      ELSE.
*        lt_itcj-h_payments      = pcs_data-p_payments.
*      ENDIF.
      " [end] remarked by JDS 31.07.2023
      lt_itcj-h_payments      = pcs_data-p_payments. " remarked by JDS 31.07.2023
  ENDCASE.

  APPEND lt_itcj.

  CALL FUNCTION 'FCJ_POST_ALL'
    EXPORTING
      i_comp_code         = pcs_data-comp_code
      i_cajo_number       = pcs_data-cajo_number
      i_currency          = pcs_data-currency
      i_typ               = lv_typ
      i_display_period_lo = pcs_data-pstng_date
      i_display_period_hi = pcs_data-pstng_date
    IMPORTING
      e_error_number      = lv_error_number
    TABLES
      itcj_postings       = lt_itcj[]
      itcj_wtax_items     = lt_itcjtax[]
      itcj_split_postings = lt_itcjpos[]
      itcj_cpd            = lt_itcjcpd[]
    CHANGING
      p_beg_balance       = lv_begbal
      p_total_receipts    = lv_totrep
      p_total_payments    = lv_totpay
      p_total_checks      = lv_totcek
      p_run_balance       = lv_runbal
      p_run_cash_balance  = lv_casbal
      p_numb_of_rec       = lv_num_rec
      p_numb_of_paym      = lv_num_pay
      p_numb_of_checks    = lv_num_cek.

  IF lv_error_number IS INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    pcs_data-icon = gc_icon_success.

    CONCATENATE p_cjdocno pcs_data-cajo_number pcs_data-comp_code INTO lv_awkey.
    SELECT SINGLE belnr
      FROM bkpf
      INTO pcs_data-belnr
      WHERE bukrs = pcs_data-comp_code
        AND gjahr = pcs_data-pstng_date(4)
        AND awtyp = 'CAJO'
        AND awkey = lv_awkey.

  ELSE.
    pcs_data-icon = gc_icon_error.
  ENDIF.

ENDFORM.


FORM f_create_cjdoc
*FORM f_create_cjdoc  USING    ps_ujs TYPE zsdt0018
*                              ps_map TYPE gty_map
*                              p_total TYPE wrbtr
                     CHANGING pc_cjdocno TYPE bapi_cj_key-posting_number
                       pcs_data    TYPE gty_data.
*                              pcs_result TYPE gty_result.


  DATA: ls_header TYPE bapi_cj_header,
        lt_item   TYPE TABLE OF bapi_cj_items WITH HEADER LINE,
        lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE.

  " header
  ls_header-doc_date      = pcs_data-doc_date.
  ls_header-pstng_date    = pcs_data-pstng_date.
  ls_header-comp_code     = pcs_data-comp_code.
  ls_header-cajo_number   = pcs_data-cajo_number.
  ls_header-currency      = pcs_data-currency.
  ls_header-currency_iso  = pcs_data-currency.
  ls_header-ref_doc_no    = pcs_data-ref_doc_no.
*  ls_header-text1         = pcs_data-text1.
*  ls_header-text2         = pcs_data-text2.

  " item
  lt_item-position_number = 900.
  lt_item-transact_number = pcs_data-transact_number.

  CASE pcs_data-transact_type.
    WHEN 'C'.
      IF pcs_data-currency NE 'IDR'.
        lt_item-p_receipts      = pcs_data-p_payments.
      ELSE.
        lt_item-p_receipts      = pcs_data-p_payments * 100.
      ENDIF.
      ls_header-alloc_nmbr    = pcs_data-alloc_nmbr.
    WHEN OTHERS.
      IF pcs_data-currency NE 'IDR'.
        lt_item-p_payments      = pcs_data-p_payments.
      ELSE.
        lt_item-p_payments      = pcs_data-p_payments * 100.
      ENDIF.
  ENDCASE.
  lt_item-gl_account      = pcs_data-gl_account.
  lt_item-costcenter      = pcs_data-costcenter.
  lt_item-profit_ctr      = pcs_data-profit_ctr.
  lt_item-cmmt_item       = pcs_data-cmmt_item.
  lt_item-position_text   = pcs_data-position_text.
  APPEND lt_item.

  CALL FUNCTION 'BAPI_CASHJOURNALDOC_CREATE'
    EXPORTING
      header              = ls_header
    IMPORTING
      cash_journal_doc_no = pc_cjdocno
    TABLES
      items               = lt_item[]
      return              = lt_return[].

  IF pc_cjdocno IS NOT INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.

    pcs_data-icon = gc_icon_success.
    pcs_data-cjbelnr = pc_cjdocno.

  ELSE.
    " E  FCJ 023 Document could not be saved; correct the errors listed
    DELETE lt_return WHERE id = 'FCJ' AND number = '023'.
    LOOP AT lt_return INTO DATA(ls_ret) WHERE type = 'E'.
      IF pcs_data-remarks IS INITIAL.
        pcs_data-remarks = ls_ret-message.
      ELSE.
        pcs_data-remarks = pcs_data-remarks && ` ; ` && ls_ret-message.
      ENDIF.
    ENDLOOP.
    pcs_data-icon = gc_icon_error.

  ENDIF.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_process_cjdoc
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_process_cjdoc .
  DATA: lv_cjdocno    TYPE bapi_cj_key-posting_number,
        lv_cannot_run TYPE flag.

*  LOOP AT gt_data INTO DATA(ls_data) WHERE icon IS NOT INITIAL.
*    lv_cannot_run = 'X'.
*    EXIT.
*  ENDLOOP.
*
*  IF lv_cannot_run EQ 'X'.
*    " Cannot run posting cash journal
*    MESSAGE s003(zfi) DISPLAY LIKE 'E'.
*    EXIT.
*  ENDIF.

  SORT gt_data BY transact_type.

  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>) WHERE icon IS INITIAL.
    PERFORM f_create_cjdoc CHANGING lv_cjdocno <lfs_data>.
    IF lv_cjdocno IS NOT INITIAL.
      PERFORM f_post_cjdoc USING lv_cjdocno <lfs_data>.
    ENDIF.
  ENDLOOP.

  SORT gt_data BY sort_no.

  PERFORM f_update_log.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_process_cjdoc_repost
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_process_cjdoc_repost .
  DATA: lv_cjdocno    TYPE bapi_cj_key-posting_number,
        lv_cannot_run TYPE flag.

  SORT gt_data BY transact_type.

  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>) WHERE checkbox EQ 'X'.
    CLEAR: <lfs_data>-remarks.
    PERFORM f_create_cjdoc CHANGING lv_cjdocno <lfs_data>.
    IF lv_cjdocno IS NOT INITIAL.
      PERFORM f_post_cjdoc USING lv_cjdocno <lfs_data>.
    ENDIF.
  ENDLOOP.

  SORT gt_data BY cajo_number pstng_date seq subseq.

  PERFORM f_update_log_repost.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_grey_button
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_grey_button .

  DATA: lv_pfstatus TYPE sypfkey.

  lv_pfstatus = 'STANDARD2'.

  go_alv_table->set_screen_status(
   EXPORTING
     pfstatus = lv_pfstatus
     report   = sy-repid
     set_functions = go_alv_table->c_functions_all ).
ENDFORM.




*&---------------------------------------------------------------------*
*& Form f_get_master_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_get_master_data .
  DATA(lt_data) = gt_data.
  SORT lt_data BY comp_code gl_account.
  DELETE ADJACENT DUPLICATES FROM lt_data COMPARING comp_code gl_account.

  SELECT a~comp_code a~transact_number a~transact_type a~gl_account b~transact_name
    FROM tcj_transactions AS a
    INNER JOIN tcj_trans_names AS b ON a~comp_code = b~comp_code AND a~transact_number = b~transact_number
    INTO TABLE gt_trans
    FOR ALL ENTRIES IN lt_data
    WHERE a~comp_code = lt_data-comp_code
      AND a~gl_account = lt_data-gl_account
      AND b~langu = 'E'.



  lt_data = gt_data.
  SORT lt_data BY comp_code cajo_number.
  DELETE ADJACENT DUPLICATES FROM lt_data COMPARING comp_code cajo_number.

  SELECT comp_code cajo_number cardnum
    FROM zfit_upl_cj_map
    INTO TABLE gt_cardnum
    FOR ALL ENTRIES IN lt_data
    WHERE comp_code = lt_data-comp_code
      AND cajo_number = lt_data-cajo_number.


  " [START] JDS 31.07.2023 : add validation
  DATA: lt_fmci_tmp TYPE gtt_fmci.

  lt_data = gt_data.
  SORT lt_data BY comp_code cmmt_item.
  DELETE ADJACENT DUPLICATES FROM lt_data COMPARING comp_code cmmt_item.

  LOOP AT lt_data INTO DATA(ls_data).
    APPEND INITIAL LINE TO lt_fmci_tmp ASSIGNING FIELD-SYMBOL(<lfs_fmci>).
    <lfs_fmci>-bukrs = ls_data-comp_code.
    <lfs_fmci>-fipex = ls_data-cmmt_item.
  ENDLOOP.

  SELECT b~bukrs a~fipex
    FROM fmci AS a
    INNER JOIN t001 AS b ON a~fikrs = b~fikrs
    INTO TABLE gt_fmci
    FOR ALL ENTRIES IN lt_fmci_tmp
    WHERE b~bukrs = lt_fmci_tmp-bukrs
      AND a~fipex = lt_fmci_tmp-fipex.

  lt_data = gt_data.
  SORT lt_data BY comp_code gl_account.
  DELETE ADJACENT DUPLICATES FROM lt_data COMPARING comp_code gl_account.

  SELECT bukrs saknr
    FROM skb1
    INTO TABLE gt_skb1
    FOR ALL ENTRIES IN lt_data
    WHERE bukrs = lt_data-comp_code
      AND saknr = lt_data-gl_account.
  " [END] JDS 31.07.2023 : add validation

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_update_log
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_update_log .
  DATA: lt_log    TYPE TABLE OF zfit_upl_cj_log,
        lv_subseq TYPE zfit_upl_cj_log-subseq.

  SELECT SINGLE MAX( seq )
    FROM zfit_upl_cj_log
    INTO @DATA(lv_seq).

  lv_seq = lv_seq + 1.

  LOOP AT gt_data INTO DATA(ls_data).
    lv_subseq = lv_subseq + 1.
    APPEND INITIAL LINE TO lt_log ASSIGNING FIELD-SYMBOL(<lfs_log>).
    <lfs_log>-comp_code = ls_data-comp_code.
    <lfs_log>-cajo_number = ls_data-cajo_number.
    <lfs_log>-transact_type = ls_data-transact_type.
    <lfs_log>-gl_account = ls_data-gl_account.
    <lfs_log>-seq = lv_seq.
    <lfs_log>-subseq = lv_subseq.
    <lfs_log>-doc_date = ls_data-doc_date.
    <lfs_log>-pstng_date = ls_data-pstng_date.
    <lfs_log>-currency = ls_data-currency.
    <lfs_log>-alloc_nmbr = ls_data-alloc_nmbr.
    <lfs_log>-ref_doc_no = ls_data-ref_doc_no.
    <lfs_log>-position_text = ls_data-position_text.
*    <lfs_log>-text1 = ls_data-text1.
*    <lfs_log>-text2 = ls_data-text2.
    <lfs_log>-p_payments = ls_data-p_payments.
    <lfs_log>-costcenter = ls_data-costcenter.
    <lfs_log>-profit_ctr = ls_data-profit_ctr.
    <lfs_log>-cmmt_item = ls_data-cmmt_item.
    <lfs_log>-cjbelnr = ls_data-cjbelnr.
    <lfs_log>-remarks = ls_data-remarks.

    CASE ls_data-icon.
      WHEN gc_icon_success.
        <lfs_log>-status = 'S'.
      WHEN gc_icon_error.
        <lfs_log>-status = 'E'.
      WHEN OTHERS.
    ENDCASE.

    <lfs_log>-erdat = sy-datum.
    <lfs_log>-erzet = sy-uzeit.
    <lfs_log>-ernam = sy-uname.
  ENDLOOP.

  MODIFY zfit_upl_cj_log FROM TABLE lt_log.
ENDFORM.



*&---------------------------------------------------------------------*
*& Form f_update_log_repost
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_update_log_repost .
  DATA: lt_log    TYPE TABLE OF zfit_upl_cj_log,
        lv_subseq TYPE zfit_upl_cj_log-subseq.

  SORT gt_log BY comp_code cajo_number transact_type gl_account seq subseq.

  LOOP AT gt_data INTO DATA(ls_data) WHERE checkbox = 'X'.
    READ TABLE gt_log INTO DATA(ls_log) WITH KEY comp_code = ls_data-comp_code
                                                 cajo_number = ls_data-cajo_number
                                                 transact_type = ls_data-transact_type
                                                 gl_account = ls_data-gl_account
                                                 seq = ls_data-seq
                                                 subseq = ls_data-subseq BINARY SEARCH.
    IF sy-subrc EQ 0.
      CASE ls_data-icon.
        WHEN gc_icon_error.
          ls_log-status = 'E'.
        WHEN gc_icon_success.
          ls_log-status = 'S'.
      ENDCASE.
      ls_log-cjbelnr = ls_data-cjbelnr.
      ls_log-remarks = ls_data-remarks.
      " timestamps
      ls_log-erdat = sy-datum.
      ls_log-erzet = sy-uzeit.
      ls_log-ernam = sy-uname.
      APPEND ls_log TO lt_log.
    ENDIF.
  ENDLOOP.

  MODIFY zfit_upl_cj_log FROM TABLE lt_log.
ENDFORM.



*&---------------------------------------------------------------------*
*& Form f_build_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_build_data .

  SORT gt_trans BY comp_code gl_account transact_type.
  SORT gt_cardnum BY comp_code cajo_number.
  SORT gt_fmci BY bukrs fipex. " JDS 31.07.2023 : add validation
  SORT gt_skb1 BY bukrs saknr. " JDS 31.07.2023 : add validation

  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
    READ TABLE gt_trans INTO DATA(ls_trans) WITH KEY comp_code = <lfs_data>-comp_code
                                                     gl_account = <lfs_data>-gl_account
                                                     transact_type = <lfs_data>-transact_type BINARY SEARCH.
    IF sy-subrc EQ 0.
      <lfs_data>-transact_type = ls_trans-transact_type.
      <lfs_data>-transact_number = ls_trans-transact_number.
      <lfs_data>-transact_name = ls_trans-transact_name.
    ELSE.
      READ TABLE gt_trans INTO ls_trans WITH KEY comp_code = <lfs_data>-comp_code
                                                       gl_account = <lfs_data>-gl_account
                                                       transact_type = 'B' BINARY SEARCH.
      IF sy-subrc EQ 0.
        <lfs_data>-transact_type = ls_trans-transact_type.
        <lfs_data>-transact_number = ls_trans-transact_number.
        <lfs_data>-transact_name = ls_trans-transact_name.
      ELSE.
        <lfs_data>-icon = gc_icon_error.
        <lfs_data>-remarks = TEXT-e02. " invalid GL Account
      ENDIF.
    ENDIF.

    READ TABLE gt_cardnum INTO DATA(ls_cardnum) WITH KEY comp_code = <lfs_data>-comp_code cajo_number = <lfs_data>-cajo_number BINARY SEARCH.
    IF sy-subrc EQ 0.
      <lfs_data>-alloc_nmbr = ls_cardnum-cardnum.
    ENDIF.

    " [START] JDS 31.07.2023 : add validation
    IF <lfs_data>-cmmt_item IS NOT INITIAL.
      READ TABLE gt_fmci INTO DATA(ls_fmci) WITH KEY bukrs = <lfs_data>-comp_code fipex = <lfs_data>-cmmt_item BINARY SEARCH.
      IF sy-subrc NE 0.
        <lfs_data>-icon = gc_icon_error.
        <lfs_data>-remarks = TEXT-e03. " invalid Commitment Item
      ENDIF.
    ENDIF.

    READ TABLE gt_skb1 INTO DATA(ls_skb1) WITH KEY bukrs = <lfs_data>-comp_code saknr = <lfs_data>-gl_account BINARY SEARCH.
    IF sy-subrc NE 0.
      <lfs_data>-icon = gc_icon_error.
      <lfs_data>-remarks = TEXT-e04. " invalid GL Account
    ENDIF.
    " [END] JDS 31.07.2023 : add validation
  ENDLOOP.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_convert_fipos_in
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> <LFS_RAW>
*&      <-- <LFS_DEST>
*&---------------------------------------------------------------------*
FORM f_convert_fipos_in  USING    p_in
                      CHANGING pc_out.
  CALL FUNCTION 'CONVERSION_EXIT_FMCIS_INPUT'
    EXPORTING
      input  = p_in
    IMPORTING
      output = pc_out.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_balance_validation
*&---------------------------------------------------------------------*
*& " JDS 08.03.2023 : add balance validation
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_balance_validation .
**  DATA: lt_balance TYPE gtt_balance.
**
**  " get balance
**  PERFORM f_get_balance CHANGING lt_balance.
**
**  " calculate remaining cash on hand
**  DATA(lt_data) = gt_data.
**  SORT lt_data BY cajo_number .
**
**  LOOP AT lt_data INTO DATA(ls_data).
**    " at new
**    AT NEW cajo_number.
**      READ TABLE lt_balance ASSIGNING FIELD-SYMBOL(<lfs_bal>) WITH KEY cajo_number = ls_data-cajo_number BINARY SEARCH.
**      IF sy-subrc NE 0.
**        " error handling
**        APPEND INITIAL LINE TO lt_balance ASSIGNING <lfs_bal>.
**        <lfs_bal>-cajo_number = ls_data-cajo_number.
**      ENDIF.
**    ENDAT.
**
**    " sequence
**    CASE ls_data-transact_type.
**      WHEN 'C'. " receipt
**        <lfs_bal>-closing_sum += ls_data-p_payments.
**      WHEN OTHERS. " payment
**        <lfs_bal>-closing_sum -= ls_data-p_payments.
**    ENDCASE.
**
**    " at end
**    AT END OF cajo_number.
**    ENDAT.
**
**  ENDLOOP.

**  " validating..
**  SORT gt_data BY cajo_number.
**  LOOP AT lt_balance INTO DATA(ls_bal).
**    IF ls_bal-closing_sum < 0.
**      IF sy-batch EQ 'X'.
**        PERFORM f_write_error USING ls_bal.
**      ENDIF.
**      READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>) WITH KEY cajo_number = ls_bal-cajo_number BINARY SEARCH.
**      IF sy-subrc EQ 0.
**        LOOP AT gt_data ASSIGNING <lfs_data> FROM sy-tabix.
**          IF <lfs_data>-cajo_number NE ls_bal-cajo_number.
**            EXIT.
**          ENDIF.
**          <lfs_data>-icon = gc_icon_error.
**          <lfs_data>-remarks = TEXT-e01.
**        ENDLOOP.
**      ENDIF.
**    ENDIF.
**  ENDLOOP.


******"     REFERENCE(I_AMOUNT) TYPE  CJAMOUNT
******"     REFERENCE(I_DOCUMENT_STATUS) TYPE  CJDOCSTAT
******"     REFERENCE(I_TYP) TYPE  CJTRANSTYP OPTIONAL
******"     REFERENCE(I_COMP_CODE) LIKE  TCJ_C_JOURNALS-COMP_CODE
******"     REFERENCE(I_CAJO_NUMBER) LIKE  TCJ_C_JOURNALS-CAJO_NUMBER
******"     REFERENCE(I_CHECK_STACK) LIKE  ISCJ_POSTINGS-CHECK_STACK
******"     REFERENCE(I_PROCESS_STATUS) TYPE  CJDOCSTAT
******"     REFERENCE(I_POSTING_DATE) LIKE  SY-DATUM
******"     REFERENCE(I_MEANS_OF_PAYMENT) TYPE  CJMOFPAYM OPTIONAL
******"     REFERENCE(I_XBAPI) TYPE  BOOLEAN OPTIONAL
*****  DATA:
*****    lv_amount          TYPE cjamount,
*****    lv_document_status TYPE cjdocstat,
*****    lv_comp_code       TYPE tcj_c_journals-comp_code,
*****    lv_cajo_number     TYPE tcj_c_journals-cajo_number,
*****    lv_check_stack     TYPE iscj_postings-check_stack,
*****    lv_process_status  TYPE cjdocstat,
*****    lv_datum           LIKE sy-datum.
*****
*****  DATA(lt_data) = gt_data.
*****  SORT lt_data BY cajo_number .
*****
*****  CALL FUNCTION 'FCJ_CHECK_DOC_AMOUNT'
*****    EXPORTING
*****      i_amount          = lv_amount
*****      i_document_status = lv_document_status
******     I_TYP             =
*****      i_comp_code       = lv_comp_code
*****      i_cajo_number     = lv_cajo_number
*****      i_check_stack     = lv_check_stack
*****      i_process_status  = lv_process_status
*****      i_posting_date    = lv_datum
******     I_MEANS_OF_PAYMENT       =
******     I_XBAPI           =
*****    EXCEPTIONS
*****      error_message     = 1
*****      warning_message   = 2
*****      OTHERS            = 3.
*****  IF sy-subrc <> 0.
****** Implement suitable error handling here
*****  ENDIF.


ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_get_balance
*&---------------------------------------------------------------------*
*& " JDS 08.03.2023 : add balance validation
*&---------------------------------------------------------------------*
*&      <-- LT_BALANCE
*&---------------------------------------------------------------------*
FORM f_get_balance  CHANGING pct_balance TYPE gtt_balance.
  DATA: lt_bal_tmp TYPE gtt_balance.

  DATA(lt_data) = gt_data.
  SORT lt_data BY cajo_number pstng_date DESCENDING.
  DELETE ADJACENT DUPLICATES FROM lt_data COMPARING cajo_number.

  LOOP AT lt_data INTO DATA(ls_data).
    APPEND INITIAL LINE TO lt_bal_tmp ASSIGNING FIELD-SYMBOL(<lfs_bal>).
    <lfs_bal>-cajo_number = ls_data-cajo_number.
    <lfs_bal>-time_stamp = ls_data-pstng_date && '235959'.
  ENDLOOP.

  SELECT cajo_number time_stamp closing_sum currency
    FROM tcj_balance
    INTO TABLE pct_balance
    FOR ALL ENTRIES IN lt_bal_tmp
    WHERE cajo_number = lt_bal_tmp-cajo_number
      AND rec_type = ''
      AND time_stamp <= lt_bal_tmp-time_stamp.

  SORT pct_balance BY cajo_number time_stamp DESCENDING.
  DELETE ADJACENT DUPLICATES FROM pct_balance COMPARING cajo_number.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_write_error
*&---------------------------------------------------------------------*
*& " JDS 08.03.2023 : add balance validation
*&---------------------------------------------------------------------*
*&      --> LS_BAL_CAJO_NUMBER
*&      --> LS_BAL_CLOSING_SUM
*&---------------------------------------------------------------------*
FORM f_write_error  USING   ps_bal TYPE gty_balance.

  DATA: lv_text_amt TYPE char30.

  WRITE ps_bal-closing_sum TO lv_text_amt CURRENCY ps_bal-currency.
  WRITE:/ `[ERROR] Insufficient balance: `, ps_bal-cajo_number, ` ` , lv_text_amt.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_get_repost_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_get_repost_data CHANGING pct_data TYPE gtt_data.
  DATA: lt_log TYPE TABLE OF zfit_upl_cj_log.

  SELECT *
    FROM zfit_upl_cj_log
    INTO TABLE lt_log
    WHERE comp_code IN so_bukrs
      AND cajo_number IN so_cajon
      AND transact_type IN so_ttype
      AND gl_account IN so_hkont
      AND pstng_date IN so_budat
      AND status EQ 'E'
      AND erdat IN so_erdat
      AND erzet IN so_erzet
      AND ernam IN so_ernam.

  IF sy-subrc EQ 0.
    LOOP AT lt_log INTO DATA(ls_log).
      APPEND INITIAL LINE TO pct_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
      MOVE-CORRESPONDING ls_log TO <lfs_data>.
      CASE ls_log-status.
        WHEN 'S'.
          <lfs_data>-icon = gc_icon_success.
        WHEN 'E'.
          <lfs_data>-icon = gc_icon_error.
      ENDCASE.
    ENDLOOP.
  ELSE.
    " No data exists
    MESSAGE ID '/ACCGO/CAS_FLLW_MSG' TYPE 'S' NUMBER 338 DISPLAY LIKE 'E'.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_click_checkbox
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_ROW
*&---------------------------------------------------------------------*
FORM f_click_checkbox  USING    p_index.

  READ TABLE gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>) INDEX p_index.
  IF sy-subrc EQ 0.
    CASE <lfs_data>-checkbox.
      WHEN ''.
        <lfs_data>-checkbox = 'X'.
      WHEN 'X'.
        <lfs_data>-checkbox = ''.
    ENDCASE.
  ENDIF.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_select_all
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&---------------------------------------------------------------------*
FORM f_select_all  USING  p_x.
  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<lfs_data>).
    <lfs_data>-checkbox = p_x.
  ENDLOOP.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_popup_confirm
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_ANSWER
*&---------------------------------------------------------------------*
FORM f_popup_confirm  CHANGING pc_answer.
  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
*     TITLEBAR              = ' '
*     DIAGNOSE_OBJECT       = ' '
      text_question         = 'Are you sure?'
      text_button_1         = TEXT-b01
      icon_button_1         = 'ICON_OKAY'
      text_button_2         = TEXT-b02
      icon_button_2         = 'ICON_CANCEL'
*     DEFAULT_BUTTON        = '1'
      display_cancel_button = ''
*     USERDEFINED_F1_HELP   = ' '
*     START_COLUMN          = 25
*     START_ROW             = 6
*     POPUP_TYPE            =
*     IV_QUICKINFO_BUTTON_1 = ' '
*     IV_QUICKINFO_BUTTON_2 = ' '
    IMPORTING
      answer                = pc_answer
* TABLES
*     PARAMETER             =
    EXCEPTIONS
      text_not_found        = 1
      OTHERS                = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_delete_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_delete_data .

  DATA: lt_log LIKE gt_log.

  SORT gt_log BY comp_code cajo_number transact_type gl_account seq subseq.

  LOOP AT gt_data INTO DATA(ls_data) WHERE checkbox = 'X'.
    READ TABLE gt_log INTO DATA(ls_log) WITH KEY comp_code = ls_data-comp_code
                                                 cajo_number = ls_data-cajo_number
                                                 transact_type = ls_data-transact_type
                                                 gl_account = ls_data-gl_account
                                                 seq = ls_data-seq
                                                 subseq = ls_data-subseq BINARY SEARCH.
    IF sy-subrc EQ 0.
      APPEND ls_log TO lt_log.
    ENDIF.
  ENDLOOP.

  DELETE zfit_upl_cj_log FROM TABLE lt_log.
  DELETE gt_data WHERE checkbox = 'X'.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_validation_delete
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_SUBRC
*&---------------------------------------------------------------------*
FORM f_validation_delete  CHANGING pc_subrc LIKE sy-subrc.
  READ TABLE gt_data WITH KEY checkbox = 'X' icon = gc_icon_success TRANSPORTING NO FIELDS.
  IF sy-subrc EQ 0.
    pc_subrc = 4.
    " Cannot delete successed data
    MESSAGE s002(zfi002) DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  READ TABLE gt_data WITH KEY checkbox = 'X' TRANSPORTING NO FIELDS.
  IF sy-subrc NE 0.
    pc_subrc = 4.
    " Please select data
    MESSAGE s003(zfi002) DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_validation_repos
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_SUBRC
*&---------------------------------------------------------------------*
FORM f_validation_repos  CHANGING pc_subrc.
  READ TABLE gt_data WITH KEY checkbox = 'X' icon = gc_icon_success TRANSPORTING NO FIELDS.
  IF sy-subrc EQ 0.
    pc_subrc = 4.
    " Cannot post successed data
    MESSAGE s001(zfi002) DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

  READ TABLE gt_data WITH KEY checkbox = 'X' TRANSPORTING NO FIELDS.
  IF sy-subrc NE 0.
    pc_subrc = 4.
    " Please select data
    MESSAGE s003(zfi002) DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form f_validation_post
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- LV_SUBRC
*&---------------------------------------------------------------------*
FORM f_validation_post  CHANGING pc_subrc.
  LOOP AT gt_data INTO DATA(ls_data) WHERE icon IS NOT INITIAL.
    " Cannot run posting cash journal
    pc_subrc = 4.
    MESSAGE s003(zfi) DISPLAY LIKE 'E'.
    EXIT.
  ENDLOOP.
  CHECK pc_subrc IS NOT INITIAL.
ENDFORM.

Post navigation

Simple Send Email with Excel Attachment
SAP ABAP – String Encode & Decode BASE64

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recent Posts

  • SAP ABAP – Generate Fiori URL
  • SAP ABAP – Workflow Agents CDS
  • SAP ABAP – Workflow Level with Table Function
  • SAP ABAP – Download ALV to Excel with Total and Subtotal
  • SAP ABAP – BDC Template

Recent Comments

  1. SAP ABAP – Simple Interface FTP Inbound (SAP Consume File From FTP) – SAP ABAP DWIMAN on SAP ABAP – String Encode & Decode BASE64
  2. Upload file – SAP ABAP DWIMAN on F4 Search Help File

Archives

  • May 2025
  • August 2024
  • June 2024
  • May 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • May 2023
  • April 2023

Categories

  • Uncategorized
©2026 SAP ABAP DWIMAN | WordPress Theme by SuperbThemes.com