Wednesday, 16 October 2024

SAP ABAP - Upload G/L Account (FS00) Custom Program


Custom Structure for program



Screen Element List


Screen FLow Logic


Gui Status



Download template Here
 
TYPES:
  BEGIN OF ty_excel,
    bukrs      TYPE bukrs,
    saknr      TYPE saknr,
    glacc_type TYPE char1,
    ktoks      TYPE ska1-ktoks,
    txt20      TYPE txt20,
    txt50      TYPE txt50,
    waers      TYPE waers,
    kdfsl      TYPE skb1-kdfsl,
    bewgp      TYPE skb1-bewgp,
    mwskz      TYPE skb1-mwskz,
    xmwno      TYPE skb1-xmwno,
    mitkz      TYPE skb1-mitkz,
    altkt      TYPE skb1-altkt,
    infky      TYPE skb1-infky,
    togru      TYPE skb1-togru,
    zuawa      TYPE skb1-zuawa,
    fstag      TYPE skb1-fstag,
    xintb      TYPE skb1-xintb,
    xnkon      TYPE skb1-xnkon,
    xmitk      TYPE skb1-xmitk,
    fdlev      TYPE skb1-fdlev,
    xgkon      TYPE skb1-xgkon,
    hbkid      TYPE skb1-hbkid,
    hktid      TYPE skb1-hktid,
  END OF ty_excel,
  BEGIN OF ty_data,
    icons      LIKE icon-id,
    snote      TYPE char255,
    ccell      TYPE lvc_t_scol,
    cstyl      TYPE lvc_t_styl,
    cline      TYPE char4,
    bukrs      TYPE bukrs,
    saknr      TYPE saknr,
    glacc_type TYPE char1,
    ktoks      TYPE ska1-ktoks,
    txt20      TYPE txt20,
    txt50      TYPE txt50,
    waers      TYPE waers,
    kdfsl      TYPE skb1-kdfsl,
    bewgp      TYPE skb1-bewgp,
    mwskz      TYPE skb1-mwskz,
    xmwno      TYPE skb1-xmwno,
    mitkz      TYPE skb1-mitkz,
    altkt      TYPE skb1-altkt,
    infky      TYPE skb1-infky,
    togru      TYPE skb1-togru,
    zuawa      TYPE skb1-zuawa,
    fstag      TYPE skb1-fstag,
    xintb      TYPE skb1-xintb,
    xnkon      TYPE skb1-xnkon,
    xmitk      TYPE skb1-xmitk,
    fdlev      TYPE skb1-fdlev,
    xgkon      TYPE skb1-xgkon,
    hbkid      TYPE skb1-hbkid,
    hktid      TYPE skb1-hktid,
  END OF ty_data,
  BEGIN OF zstab,
    field TYPE char10,
  END OF zstab.
DATA:
  lt_excel TYPE TABLE OF ty_excel,
  ls_excel TYPE ty_excel,
  lt_data  TYPE TABLE OF ty_data,
  ls_data  TYPE ty_data,
  stab     TYPE TABLE OF zstab,
  itab     TYPE TABLE OF  alsmex_tabline WITH HEADER LINE.
DATA:
  ob_container TYPE REF TO cl_gui_custom_container,
  ob_grid      TYPE REF TO cl_gui_alv_grid,
  lt_fieldcat  TYPE lvc_t_fcat,
  ls_fieldcat  LIKE LINE OF lt_fieldcat,
  is_lyout     TYPE lvc_s_layo,
  lt_message   TYPE TABLE OF bdcmsgcoll,
  ls_message   LIKE LINE OF lt_message,
  ld_mode      TYPE c VALUE 'N'.
DATA:
   zz_pid TYPE char80.
DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE.
*       messages of call transaction
DATA:   messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
*       error session opened (' ' or 'X')
DATA:   e_group_opened.
*       message texts
TABLES: t100.
"Selection Screen
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
  PARAMETERS:
*    p_bukrs  TYPE bukrs OBLIGATORY,
    filename TYPE localfile MEMORY ID zfile,
    p_line   TYPE i DEFAULT 3,
    p_total  TYPE i.
SELECTION-SCREEN END OF SCREEN 101 .
AT SELECTION-SCREEN ON VALUE-REQUEST FOR filename.
*  MESSAGE 'Tes' TYPE 'I' DISPLAY LIKE 'S'.
  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      static    = 'X'
      mask      = '*.xls'
    CHANGING
      file_name = filename.
AT SELECTION-SCREEN OUTPUT.
  GET PARAMETER ID 'ZFILE' FIELD zz_pid.
  LOOP AT SCREEN.
    IF lt_data IS NOT INITIAL AND
    ( screen-name CS 'P_LINE' OR screen-name CS 'P_BUKRS' OR screen-name CS 'FILENAME').
      screen-input = 0.
    ELSE.
      screen-input = 1.
    ENDIF.
    IF screen-name CS 'P_TOTAL'.
      screen-input = 0.
    ENDIF.
    MODIFY SCREEN.
  ENDLOOP.
START-OF-SELECTION.
  CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  REFRESH stab.
  IF lt_data IS INITIAL.
    APPEND 'POST' TO stab.
    APPEND 'CLRD'  TO stab.
  ELSE.
    APPEND 'READ' TO stab.
  ENDIF.
  SET PF-STATUS 'PF100' EXCLUDING stab.
  SET TITLEBAR  'TL100' WITH 'Upload G/L Account Master'.
  PERFORM initial_screen.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE sy-ucomm.
    WHEN 'BACK' OR 'EXIT' OR 'CNCL'.
      LEAVE PROGRAM.
    WHEN 'READ'.
      CLEAR p_total.
      PERFORM read_excel USING filename '1' p_line '70' '65536'.
      DESCRIBE TABLE lt_data LINES p_total.
    WHEN 'CLRD'.
      REFRESH : lt_data, lt_excel.
    WHEN 'POST'.
      PERFORM create_gl.
  ENDCASE.
ENDMODULE.
FORM initial_screen.
  IF ob_container IS INITIAL.
    CREATE OBJECT ob_container
      EXPORTING
        container_name = 'CONTAINER'.
    CREATE OBJECT ob_grid
      EXPORTING
        i_parent = ob_container.
  ENDIF.
  PERFORM set_fieldcat.
  PERFORM set_lyout.
  PERFORM alv_displ_out.
  CALL METHOD ob_grid->refresh_table_display.
ENDFORM.
FORM set_fieldcat.
  REFRESH lt_fieldcat.
  PERFORM :
      append_fieldcat USING 'ICONS'    'Status'      'CHAR' '' '' '5'  '' 'X' 'LT_DATA' '1',
      append_fieldcat USING 'SNOTE'    'Message'     'CHAR' '' '' '40' '' 'X' 'LT_DATA' '1'.
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = 'YSFC001'
    CHANGING
      ct_fieldcat      = lt_fieldcat.
ENDFORM.
FORM append_fieldcat USING p_fname p_fdesc p_dtype p_qfield p_cfield p_olen p_sum p_key p_tabname p_act.
  DATA irows TYPE i.
  CLEAR irows.
  DESCRIBE TABLE lt_fieldcat LINES irows.
  irows = irows + 1.
  CLEAR ls_fieldcat.
  IF p_fname = 'ICONS'.
    ls_fieldcat-icon = 'X'.
    ls_fieldcat-just = 'C'.
  ENDIF.
  ls_fieldcat-col_pos    = irows.
  ls_fieldcat-key        = p_key.
  ls_fieldcat-fieldname  = p_fname.
  ls_fieldcat-scrtext_l  = p_fdesc.
  ls_fieldcat-scrtext_m  = p_fdesc.
  ls_fieldcat-scrtext_s  = p_fdesc.
  ls_fieldcat-datatype   = p_dtype.
  ls_fieldcat-qfieldname = p_qfield.
  ls_fieldcat-cfieldname = p_cfield.
  ls_fieldcat-outputlen  = p_olen.
  ls_fieldcat-do_sum     = p_sum.
  ls_fieldcat-tabname    = p_tabname.
  APPEND ls_fieldcat TO lt_fieldcat.
ENDFORM.
FORM set_lyout .
  CLEAR is_lyout.
  is_lyout-zebra        = 'X'.
  is_lyout-cwidth_opt   = 'X'.
  is_lyout-box_fname    = 'ZBOX'.
*  is_lyout-no_rowins    = 'X'.
  is_lyout-stylefname   = 'CSTYL'.
  is_lyout-info_fname   = 'CLINE'.
  is_lyout-ctab_fname   = 'CCELL'.
ENDFORM.
FORM alv_displ_out.
  CALL METHOD ob_grid->set_table_for_first_display
    EXPORTING
*     is_variant                    = is_varnt      "DISVARIANT
      i_save                        = 'A'           "CHAR1 - X:Global - U:User - A:All - Space:No
      i_default                     = 'X'           "CHAR1 - X:Allowed - Space:not
      is_layout                     = is_lyout      "LVC_S_LAYO
*     is_print                      = is_print      "LVC_S_PRNT
*     it_toolbar_excluding          = it_excld      "UI_FUNCTIONS
    CHANGING
      it_outtab                     = lt_data
      it_fieldcatalog               = lt_fieldcat      "LVC_T_FCAT
*     it_sort                       = it_sort       "LVC_T_SORT
    EXCEPTIONS
      invalid_parameter_combination = 1
      program_error                 = 2
      too_many_lines                = 3
      OTHERS                        = 4.
ENDFORM.
FORM read_excel USING p_file p_bcol p_brow p_ecol p_erow.
*  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = p_bcol
      i_begin_row             = p_brow
      i_end_col               = p_ecol
      i_end_row               = p_erow
    TABLES
      intern                  = itab[]
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  DATA lv_index TYPE i.
  FIELD-SYMBOLS <fs>.
  LOOP AT itab.
    MOVE itab-col TO lv_index.
    ASSIGN COMPONENT lv_index OF STRUCTURE ls_excel TO <fs>.
    MOVE itab-value TO <fs>.
    AT END OF row.
      CLEAR ls_data.
*      ls_data-icons = '@08@'.
      MOVE-CORRESPONDING ls_excel TO ls_data.
      SELECT SINGLE saknr FROM skb1
        INTO @DATA(ls_check)
        WHERE saknr = @ls_data-saknr AND bukrs = @ls_data-bukrs.
      IF ls_check IS NOT INITIAL.
        ls_data-icons = '@0A@'.
        ls_data-snote = |G/L Account { ls_data-saknr } already exists in company code { ls_data-bukrs }|.
      ELSE.
        ls_data-icons = '@08@'.
      ENDIF.
      CLEAR ls_check.
      APPEND ls_data TO lt_data.
      CLEAR ls_excel.
    ENDAT.
  ENDLOOP.
ENDFORM.
FORM create_gl.
  CLEAR ls_data.
  LOOP AT lt_data INTO ls_data WHERE icons = '@08@'.
    REFRESH bdcdata[].
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=ACC_CRE'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_KEY-SAKNR'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_KEY-SAKNR'
                                  ls_data-saknr.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_KEY-BUKRS'
                                  ls_data-bukrs.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=GLACC_TYPE'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
                                  'GLACCOUNT_SCREEN_COA-GLACCOUNT_TYPE'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-GLACCOUNT_TYPE'
                                  ls_data-glacc_type.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=2102_GROUP'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_COA-KTOKS'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-GLACCOUNT_TYPE'
                            ls_data-glacc_type.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-KTOKS'
          ls_data-ktoks.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=ENTER'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-GLACCOUNT_TYPE'
                                  ls_data-glacc_type.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-KTOKS'
          ls_data-ktoks.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_COA-TXT50_ML'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-TXT20_ML'
          ls_data-txt20.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-TXT50_ML'
          ls_data-txt50.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=TAB02'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_COA-GLACCOUNT_TYPE'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-GLACCOUNT_TYPE'
          ls_data-glacc_type.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-KTOKS'
          ls_data-ktoks.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-TXT20_ML'
          ls_data-txt20.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_COA-TXT50_ML'
          ls_data-txt50.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=TAB03'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_CCODE-MITKZ'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_CCODE-WAERS'
          ls_data-waers.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_CCODE-ZUAWA'
                              '001'.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=ENTER'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_CCODE-FSTAG'
          ls_data-fstag.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_CCODE-XGKON'
          ls_data-xgkon.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_CCODE-ZINRT'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_CCODE-ZINRT'
          ''.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=TAB04'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_CCODE-FSTAG'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_CCODE-FSTAG'
          ls_data-fstag.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_CCODE-XGKON'
          ls_data-xgkon.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=TAB05'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_COA-LANGU_KW(01)'.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=TAB06'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_KEY-SAKNR'.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=SAVE'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'EENO_DYNP-ZEILE(01)'.
    PERFORM bdc_dynpro      USING 'SAPLGL_ACCOUNT_MASTER_MAINTAIN' '2001'.
    PERFORM bdc_field       USING 'BDC_OKCODE'
          '=BACK'.
    PERFORM bdc_field       USING 'BDC_CURSOR'
          'GLACCOUNT_SCREEN_KEY-SAKNR'.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_KEY-SAKNR'
          ls_data-saknr.
    PERFORM bdc_field       USING 'GLACCOUNT_SCREEN_KEY-BUKRS'
          ls_data-bukrs.
    REFRESH lt_message.
    CALL TRANSACTION 'FS00' USING bdcdata[]
          MODE ld_mode
          UPDATE 'S'
          MESSAGES INTO lt_message.
    READ TABLE lt_message ASSIGNING FIELD-SYMBOL(<fs_mssg>)
      WITH KEY msgtyp = 'E'.
    IF sy-subrc = 0.
      ls_data-snote = |{ <fs_mssg>-msgv1 } { <fs_mssg>-msgv2 } { <fs_mssg>-msgv3 } { <fs_mssg>-msgv4 }|.
      ls_data-icons = '@F1@'.
    ELSE.
      ls_data-snote = |G/L Account { ls_data-saknr } Created!|.
      ls_data-icons = '@5Y@'.
    ENDIF.
    MODIFY lt_Data FROM ls_data
      TRANSPORTING icons snote
        WHERE bukrs = ls_data-bukrs AND saknr = ls_data-saknr.
    CLEAR ls_data.
  ENDLOOP.
ENDFORM.
FORM bdc_dynpro USING program dynpro.
  CLEAR bdcdata.
  bdcdata-program  = program.
  bdcdata-dynpro   = dynpro.
  bdcdata-dynbegin = 'X'.
  APPEND bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
*        Insert field                                                  *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
  CLEAR bdcdata.
  bdcdata-fnam = fnam.
  bdcdata-fval = fval.
  APPEND bdcdata.
ENDFORM.

Wednesday, 25 September 2024

SAP ABAP - PDF Viewer From Application Server Directory

 


AL11



REPORT ysap_pdf_viewer.
DATA : lt_data TYPE TABLE OF x255.
DATA : wa_line TYPE x255.
DATA: lo_docking_container TYPE REF TO cl_gui_docking_container.
DATA: lo_html    TYPE REF TO cl_gui_html_viewer.
DATA: lv_url TYPE char255.
DATA: ok_code(20).
DATA filename TYPE string.
PARAMETERS fname TYPE localfile.
** Selection screen value request
AT SELECTION-SCREEN ON VALUE-REQUEST FOR fname.
  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      static    = 'X'
    CHANGING
      file_name = fname.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

START-OF-SELECTION.

  filename = '/usr/sap/attachment/'. "AL11 Directory
  filename = |{ filename }{ fname }|.
* Read PDF File
  PERFORM read_file.
* Display to screen
  PERFORM display_pdf.
*&---------------------------------------------------------------------*
*&      Form  read_file
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM read_file.
  fname = filename.
  OPEN DATASET fname FOR INPUT IN BINARY MODE.
  IF sy-subrc = 0.
    DO.
      READ DATASET fname INTO wa_line.
      IF sy-subrc = 0.
        APPEND wa_line TO lt_data.
      ELSE.
        APPEND wa_line TO lt_data.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.
ENDFORM.                    "read_file

*&---------------------------------------------------------------------*
*&      Form  display_pdf
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM display_pdf.
  IF NOT lt_data IS INITIAL.
    CALL SCREEN 100.
  ELSE.
    WRITE :/ 'No data to display'.
  ENDIF.
ENDFORM.                    "display_pdf
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'MAIN'.
  CLEAR ok_code.
  IF NOT ( lo_docking_container IS INITIAL ).
    CALL METHOD lo_docking_container->free
      EXCEPTIONS
        cntl_error        = 1
        cntl_system_error = 2
        OTHERS            = 3.
  ENDIF.
  IF NOT ( lo_html IS INITIAL ).
    CALL METHOD lo_html->free
      EXCEPTIONS
        cntl_error        = 1
        cntl_system_error = 2
        OTHERS            = 3.
  ENDIF.
  CREATE OBJECT lo_docking_container
    EXPORTING
      repid     = sy-repid
      dynnr     = sy-dynnr
      extension = 5000.
  CREATE OBJECT lo_html
    EXPORTING
      parent = lo_docking_container.
*
* Load the HTML
  lo_html->load_data(
  EXPORTING
    type         = 'application'
    subtype      = 'pdf'
  IMPORTING
    assigned_url         = lv_url
  CHANGING
    data_table           = lt_data
  EXCEPTIONS
    dp_invalid_parameter = 1
    dp_error_general     = 2
    cntl_error           = 3
    OTHERS               = 4 ).
* Show it
  lo_html->show_url( url = lv_url  in_place = 'X' ).
ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE sy-ucomm.
    WHEN 'BACK' OR 'EXIT' OR 'CANC'.
      IF NOT ( lo_docking_container IS INITIAL ).
        CALL METHOD lo_docking_container->free
          EXCEPTIONS
            cntl_error        = 1
            cntl_system_error = 2
            OTHERS            = 3.
      ENDIF.
      IF NOT ( lo_html IS INITIAL ).
        CALL METHOD lo_html->free
          EXCEPTIONS
            cntl_error        = 1
            cntl_system_error = 2
            OTHERS            = 3.
      ENDIF.
      leave TO SCREEN 0.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT



Monday, 23 September 2024

SAP ABAP - Upload File to OneDrive Folder

 


REPORT yupload_file.
** Data Declarations
DATA: gv_filename    TYPE string,
      lt_data_tab    TYPE TABLE OF x255,
      lv_bin_size    TYPE i,
      lv_file        TYPE string,
      e_filenamefull TYPE string,
      e_filename     TYPE string,
      e_extension    TYPE string.

DATA:
  lv_e_pathname TYPE rstxtlg, "
  lv_i_filepath TYPE rsfilenm, "
  lv_e_filename TYPE rsawbnobjnm. "

** Parameters
PARAMETERS : gv_name TYPE localfile.
** Selection screen value request
AT SELECTION-SCREEN ON VALUE-REQUEST FOR gv_name.
  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      static    = 'X'
    CHANGING
      file_name = gv_name.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
START-OF-SELECTION.
  PERFORM upload_attachment.
FORM upload_attachment.
  CLEAR : lv_i_filepath.
  gv_filename   = gv_name.
  lv_i_filepath = gv_name.
** upload the file data from desktop/localfile
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename   = gv_filename
      filetype   = 'BIN'
    IMPORTING
      filelength = lv_bin_size
    TABLES
      data_tab   = lt_data_tab.

  CALL FUNCTION 'RSDS_SPLIT_PATH_TO_FILENAME'  "split file path in file name and path
    EXPORTING
      i_filepath = lv_i_filepath
    IMPORTING
      e_pathname = lv_e_pathname
      e_filename = lv_e_filename
    . " RSDS_SPLIT_PATH_TO_FILENAME
  CLEAR lv_file.
  DATA(dstpatch) = 'XX:OneDrivePath\'.
  lv_file = |{ dstpatch }{ lv_e_filename }|.

  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
      filename                = lv_file
      filetype                = 'BIN'
    TABLES
      data_tab                = lt_data_tab
    EXCEPTIONS
      file_write_error        = 1
      no_batch                = 2
      gui_refuse_filetransfer = 3
      invalid_type            = 4
      no_authority            = 5
      unknown_error           = 6
      header_not_allowed      = 7
      separator_not_allowed   = 8
      filesize_not_allowed    = 9
      header_too_long         = 10
      dp_error_create         = 11
      dp_error_send           = 12
      dp_error_write          = 13
      unknown_dp_error        = 14
      access_denied           = 15
      dp_out_of_memory        = 16
      disk_full               = 17
      dp_timeout              = 18
      file_not_found          = 19
      dataprovider_exception  = 20
      control_flush_error     = 21
      OTHERS                  = 22.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
  IF sy-subrc = 0.
    WRITE: / 'Successfully uploaded to One Drive'.
  ENDIF.
ENDFORM.







Thursday, 5 September 2024

SAP ABAP - Multiple Header ALV List


REPORT ZALV_LIST_MULTIHEADER NO STANDARD PAGE HEADING.
TYPE-POOLS: slis.
DATA :t_fieldcat TYPE slis_t_fieldcat_alv,
      w_fieldcat TYPE slis_fieldcat_alv,
      layout     TYPE slis_layout_alv,
      t_sort     TYPE slis_t_sortinfo_alv,
      t_event    TYPE slis_t_event WITH HEADER LINE,
      d_repid    LIKE sy-repid,
      d_layout   TYPE slis_layout_alv,
      key        TYPE slis_keyinfo_alv.
TYPES : BEGIN OF ty_data,
          store(50),
          price      TYPE dmbtr,
          quantity   TYPE p,
          total      TYPE dmbtr, "(10) TYPE p DECIMALS 2,
          price2     TYPE dmbtr,
          quantity2  TYPE p,
          total2     TYPE dmbtr, "(10) TYPE p DECIMALS 2,
          curr       TYPE waers,
        END OF ty_data.
DATA : t_data TYPE ty_data OCCURS 0 WITH HEADER LINE.

START-OF-SELECTION.
  PERFORM f_process_data.
  PERFORM f_write_data.
*&---------------------------------------------------------------------*
*&      Form  F_PROCESS_DATA
*&---------------------------------------------------------------------*
FORM f_process_data .
*fill data t_data
  t_data-store = 'Ayam Kampung'.
  t_data-quantity = 30.
  t_data-price = 50000.
  t_data-total = t_data-quantity * t_data-price.
  t_data-quantity2 = 525.
  t_data-price2    = 55000.
  t_data-total2    = t_data-quantity2 * t_data-price2.
  t_data-curr = 'IDR'.
  APPEND t_data.
  t_data-store = 'Ayam Boiler'.
  t_data-quantity = 10.
  t_data-price = 50000.
  t_data-total = t_data-quantity * t_data-price.
  t_data-quantity2 = 55.
  t_data-price2    = 55000.
  t_data-total2    = t_data-quantity2 * t_data-price2.
  t_data-curr = 'IDR'.
  APPEND t_data.
ENDFORM.                    " F_PROCESS_DATA
*&---------------------------------------------------------------------*
*&      Form  F_WRITE_DATA
*&---------------------------------------------------------------------*
FORM f_write_data .
  PERFORM field_catalog.
  PERFORM build_layout.
  PERFORM build_event.
  d_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
    EXPORTING
      i_callback_program = d_repid
      is_layout          = d_layout
      i_bypassing_buffer = 'X'
      it_fieldcat        = t_fieldcat
      i_default          = 'X'
      i_save             = 'A'
      it_events          = t_event[]
      it_sort            = t_sort
    TABLES
      t_outtab           = t_data[]
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
ENDFORM.                    " F_WRITE_DATA
*&---------------------------------------------------------------------*
*&      Form  FIELD_CATALOG
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM field_catalog .
  PERFORM f_fieldcats USING :
        'STORE'  'STORE'       '50' ''  ''     ''  ''  '',
        'QUANTITY' 'QUANTITY'  '15' ''  ''     ''  ''  '',
        'PRICE'  'PRICE'       '15' ''  'CURR'     ''  ''  '',
        'TOTAL'  'TOTAL'       '20' '' 'CURR'     ''  ''  '',
        'QUANTITY2' 'QUANTITY2'  '15' ''  ''     ''  ''  '',
        'PRICE2'  'PRICE2'       '15' ''  'CURR'     ''  ''  '',
        'TOTAL2'  'TOTAL2'       '20' '' 'CURR'     ''  ''  ''.
ENDFORM.                    " FIELD_CATALOG
*&---------------------------------------------------------------------*
*&      Form  F_FIELDCATS
*&---------------------------------------------------------------------*
FORM f_fieldcats USING fu_fname
      fu_text
      fu_len
      fu_sum
      fu_curr
      fu_spot
      fu_out
      fu_sign.
  DATA : lt_fieldcat TYPE slis_fieldcat_alv.
  lt_fieldcat-fieldname      = fu_fname.  "field name
  lt_fieldcat-seltext_l      = lt_fieldcat-seltext_m =  "text
  lt_fieldcat-seltext_s      = fu_text.
  lt_fieldcat-reptext_ddic   = fu_text.
  lt_fieldcat-outputlen      = fu_len.  "text length
  lt_fieldcat-do_sum         = fu_sum.  "summing
  lt_fieldcat-cfieldname     = fu_curr. "currency
  lt_fieldcat-hotspot        = fu_spot.
  lt_fieldcat-no_out         = fu_out.
  lt_fieldcat-no_sign        = fu_sign.
  APPEND lt_fieldcat TO t_fieldcat.
  CLEAR: lt_fieldcat.
ENDFORM.                    " F_FIELDCATS
*&---------------------------------------------------------------------*
*&      Form  BUILD_LAYOUT
*&---------------------------------------------------------------------*
FORM build_layout .
  d_layout-colwidth_optimize = ''.
  d_layout-zebra = 'X'.
  d_layout-no_colhead         = 'X'. "space.
ENDFORM.                    " BUILD_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  BUILD_EVENT
*&---------------------------------------------------------------------*
FORM build_event .
  t_event-form = 'TOP_PAGE'.
  t_event-name = 'TOP_OF_PAGE'.
  APPEND t_event.
ENDFORM.                    " BUILD_EVENT
*&---------------------------------------------------------------------*
*&      Form  top_of_page
*&---------------------------------------------------------------------*
FORM top_page.
  ULINE (295) .
  FORMAT COLOR 1 .
  WRITE: / sy-vline, (48) '' CENTERED,
  sy-vline, (50) 'Current Period' CENTERED,
  sy-vline, (50) 'Ytd Period' CENTERED,
  sy-vline.
*  ULINE (295) .
  WRITE: / sy-vline, (48) ' ' CENTERED,
  sy-vline, (13) 'Quantity' CENTERED,
  sy-vline, (13) 'per Unit' CENTERED,
  sy-vline, (18) 'Total' CENTERED,
  sy-vline, (13) 'Quantity' CENTERED,
  sy-vline, (13) 'per Unit' CENTERED,
  sy-vline, (18) 'Total' CENTERED,
  sy-vline.
*  ULINE (295) .
  FORMAT COLOR OFF.
ENDFORM.                    "top_of_page

Wednesday, 4 September 2024

SAP ABAP - Display Message in Popup Table




*&---------------------------------------------------------------------*
*& Report YBULK_MESSAGE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ybulk_message.
TYPES: BEGIN OF ty_message,
         msgid  LIKE sy-msgid,
         msgty  LIKE sy-msgty,
         msgno  LIKE sy-msgno,
         msgv1  LIKE sy-msgv1,
         msgv2  LIKE sy-msgv2,
         msgv3  LIKE sy-msgv3,
         msgv4  LIKE sy-msgv4,
         lineno LIKE mesg-zeile,
       END OF ty_message.
DATA:
  lt_message TYPE TABLE OF ty_message.
START-OF-SELECTION.
  PERFORM display_message.
FORM display_message.
  REFRESH lt_message.
  lt_message = VALUE #(
       ( msgid = 'FB'
         msgty = 'E'
         msgno = '000'
         msgv1 = 'Material XXX01'
         msgv2 = 'Not'
         msgv3 = 'Found'
         msgv4 = ''
         lineno = '1'
       )      "Line 1
      ( msgid = 'FB'
        msgty = 'E'
        msgno = '000'
        msgv1 = 'Plant L001'
        msgv2 = 'Not'
        msgv3 = 'Found'
        msgv4 = ''
        lineno = '2'
       )      "Line 2
  ).
  CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
    TABLES
      i_message_tab = lt_message.
ENDFORM.




Friday, 30 August 2024

SAP ABAP - Purchase Order Change Condition Value BADI ME_PROCESS_PO_CUST

  METHOD if_ex_me_process_po_cust~process_item.
    FIELD-SYMBOLS: <ekko> TYPE ekko.
    DATA: f_mepoitem TYPE mepoitem.
    DATA: lt_mepoitem TYPE TABLE OF mepoitem.
    DATA: fo_header TYPE REF TO if_purchase_order_mm.
    DATA: f_checkheader TYPE mepoheader.
    DATA: f_checkheader_curr TYPE mepoheader.
    DATA: f_ekkotxt TYPE string.
    TYPES : ty_komv TYPE TABLE OF komv.
    DATA:
      lo_services_mm TYPE REF TO if_services_mm,
      gt_komv        TYPE ty_komv,
      gt_komv_old    TYPE ty_komv,
      zkposn         TYPE prcd_elements-kposn,
      lv_amount      TYPE komv-kbetr,
      lv_count       TYPE i.
    FIELD-SYMBOLS:
      <fs_acctv> TYPE tact-actvt,
      <fs_tkomv> TYPE ty_komv.
    DATA: BEGIN OF fs_condcheck,
            set   TYPE c,
            ebelp TYPE ekpo-ebelp,
          END OF fs_condcheck.
    DATA: ft_condcheck LIKE STANDARD TABLE OF fs_condcheck.
    CHECK im_item IS NOT INITIAL.
    f_mepoitem = im_item->get_data( ).
    f_ekkotxt = '(SAPLMEPO)EKKO'.
    ASSIGN (f_ekkotxt) TO <ekko>.
    IF sy-subrc EQ 0.
      IF <ekko>-bsart = 'ZDOP'.
        IMPORT gt_komv_old = gt_komv_old
          FROM MEMORY ID 'ZPOCOND'.
        IMPORT lt_mepoitem = lt_mepoitem
               FROM MEMORY ID 'ZPOITM'.
        ASSIGN ('(SAPLMEPO)TKOMV[]') TO <fs_tkomv>.
        IF <fs_tkomv> IS ASSIGNED.
          gt_komv = <fs_tkomv>.
        ENDIF.
        IF f_mepoitem-konnr IS NOT INITIAL.
          SELECT SINGLE zzroute, zzdistance, netpr
            FROM ekpo
          INTO @DATA(ls_contract)
                WHERE ebeln = @f_mepoitem-konnr AND
                ebelp = @f_mepoitem-ktpnr.
          IF f_mepoitem-zzroute IS INITIAL.
            f_mepoitem-zzroute    = ls_contract-zzroute.
          ENDIF.
          IF f_mepoitem-zzdistance IS INITIAL.
            f_mepoitem-zzdistance = ls_contract-zzdistance.
          ENDIF.
        ENDIF.
        IF f_mepoitem-anzpu IS INITIAL.
          f_mepoitem-anzpu = f_mepoitem-zzdistance.
        ELSE.
          f_mepoitem-zzdistance = f_mepoitem-anzpu.
        ENDIF.
        CALL METHOD im_item->set_data
          EXPORTING
            im_data = f_mepoitem.
        DATA lv_valid TYPE mmpur_bool.
        CLEAR lv_valid.
        lv_valid = im_item->is_valid( ).
        SELECT SINGLE * FROM tvarvc
          INTO @DATA(ls_matkl)
            WHERE name = 'ZMATKL_DIST_PRICE' AND
                  low  = @f_mepoitem-matkl.
        IF ls_matkl IS NOT INITIAL AND lv_valid = 'X'.
          CLEAR zkposn.
          zkposn = f_mepoitem-ebelp.
          CLEAR lv_amount.
          DATA: ft_conditionsx TYPE mmpur_tkomv.
          im_item->get_conditions( IMPORTING ex_conditions = ft_conditionsx[] ).
          LOOP AT ft_conditionsx ASSIGNING FIELD-SYMBOL(<fs_check_cond>)
            WHERE kschl = 'ZPBD'.
            READ TABLE gt_komv_old ASSIGNING FIELD-SYMBOL(<fs_cond_old>)
              WITH KEY kposn = zkposn kschl = 'ZPBD'.
            IF sy-subrc = 0.
              IF <fs_check_cond>-kbetr = <fs_cond_old>-kbetr.
                READ TABLE lt_mepoitem ASSIGNING FIELD-SYMBOL(<fs_old_po_item>)
                  WITH KEY ebelp = f_mepoitem-ebelp.
                IF sy-subrc = 0.
                  IF f_mepoitem-anzpu <> <fs_old_po_item>-anzpu.
                    lv_amount = ls_contract-netpr * f_mepoitem-zzdistance.
                    CLEAR fs_condcheck.
                    fs_condcheck-ebelp = f_mepoitem-ebelp.
                  ELSE.
                    CLEAR fs_condcheck.
                    fs_condcheck-set   = 'X'.
                    fs_condcheck-ebelp = f_mepoitem-ebelp.
                  ENDIF.
                ELSE.
                  CLEAR fs_condcheck.
                  fs_condcheck-set   = 'X'.
                  fs_condcheck-ebelp = f_mepoitem-ebelp.
                ENDIF.
              ELSE.
                lv_amount = f_mepoitem-netpr * f_mepoitem-zzdistance.
                CLEAR fs_condcheck.
                fs_condcheck-ebelp = f_mepoitem-ebelp.
              ENDIF.
            ELSE.
              IF sy-tcode = 'ME21N'.
                lv_amount = f_mepoitem-netpr * f_mepoitem-zzdistance.
                CLEAR fs_condcheck.
                fs_condcheck-ebelp = f_mepoitem-ebelp.
              ELSE.
                SELECT SINGLE * FROM ekpo
                  INTO @DATA(ls_ekpo)
                    WHERE ebeln = @f_mepoitem-ebeln AND ebelp = @f_mepoitem-ebelp.
                IF ls_ekpo-anzpu <> f_mepoitem-anzpu.
                  lv_amount = ls_contract-netpr * f_mepoitem-zzdistance.
                  CLEAR fs_condcheck.
                  fs_condcheck-ebelp = f_mepoitem-ebelp.
                ELSE.
                  CLEAR fs_condcheck.
                  fs_condcheck-set   = 'X'.
                  fs_condcheck-ebelp = f_mepoitem-ebelp.
                ENDIF.
                SELECT * FROM ekpo INTO CORRESPONDING FIELDS OF TABLE lt_mepoitem
                   WHERE ebeln = f_mepoitem-ebeln AND ebelp = f_mepoitem-ebelp.
              ENDIF.
            ENDIF.
          ENDLOOP.
          CLEAR ls_contract.
          IF fs_condcheck-set IS INITIAL.
            DATA: ft_conditions TYPE mmpur_tkomv.
            DATA: f_cond_changed TYPE c.
            FIELD-SYMBOLS: <komv> TYPE komv.
            CLEAR f_cond_changed.
            "get condition for item
            im_item->get_conditions( IMPORTING ex_conditions = ft_conditions[] ).
            "our manipulation of conditions (do your coding here)
            LOOP AT ft_conditions ASSIGNING <komv>
              WHERE kschl = 'ZPBD'.
              CLEAR <komv>-kbetr.
              <komv>-kbetr = lv_amount.
              <komv>-kmprs = 'X'.
              f_cond_changed = 'X'.
            ENDLOOP.
            "check if we changed something
            IF f_cond_changed IS NOT INITIAL.
*
              im_item->set_conditions( EXPORTING im_conditions = ft_conditions[] ).
              fs_condcheck-set = 'X'.
              READ TABLE lt_mepoitem
                   WITH KEY ebeln = f_mepoitem-ebeln ebelp = f_mepoitem-ebelp TRANSPORTING NO FIELDS.
              IF sy-subrc <> 0.
                APPEND f_mepoitem TO lt_mepoitem.
              ELSE.
                MODIFY lt_mepoitem FROM f_mepoitem
                  TRANSPORTING anzpu
                    WHERE ebelp = f_mepoitem-ebelp.
              ENDIF.
              LOOP AT ft_conditions ASSIGNING FIELD-SYMBOL(<fs_ins_cond>).
                READ TABLE gt_komv_old WITH KEY
                    kschl = <fs_ins_cond>-kschl
                    kposn = <fs_ins_cond>-kposn TRANSPORTING NO FIELDS.
                IF sy-subrc = 0.
                  DELETE gt_komv_old WHERE
                    kschl = <fs_ins_cond>-kschl AND
                    kposn = <fs_ins_cond>-kposn.
                ENDIF.
                APPEND <fs_ins_cond> TO gt_komv_old.
              ENDLOOP.
              EXPORT gt_komv_old = gt_komv_old
                TO MEMORY ID 'ZPOCOND'.
              EXPORT lt_mepoitem = lt_mepoitem
                TO MEMORY ID 'ZPOITM'.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDMETHOD. 

Thursday, 1 August 2024

SAP ABAP - Call Transaction Code KSS2 From Custom Program




DATA:
  lt_mara TYPE TABLE OF mara,
  ls_mara TYPE mara.
DATA : xmarked TYPE char1.
PARAMETERS:
  p_bukrs TYPE bukrs.


PARAMETERS:
  p_rb1 RADIOBUTTON GROUP rb DEFAULT 'X',
  p_rb2 RADIOBUTTON GROUP rb,
  p_rb3 RADIOBUTTON GROUP rb,
  p_rb4 RADIOBUTTON GROUP rb.
START-OF-SELECTION.
  CASE abap_true.
    WHEN p_rb1. xmarked = 'I'.
    WHEN p_rb2. xmarked = 'S'.
    WHEN p_rb3. xmarked = 'V'.
    WHEN p_rb4. xmarked = 'A'.
  ENDCASE.
  SET PARAMETER ID 'CAC' FIELD '1000'.
  SET PARAMETER ID 'VPE' FIELD '001'.
  SET PARAMETER ID 'GJR' FIELD sy-datum(4).
  SET PARAMETER ID 'K70' FIELD xmarked. "I = Cost Center, S = Cost Center Group, V = Variant, A = All Cost Center
  CALL TRANSACTION 'KSS2'.




ABAP CDS View Part 10 : Authorization & DCL untuk ABAP CDS

Authorization & DCL di ABAP CDS | Panduan Lengkap (PFCG, @AccessControl, DCL) Authorization & DCL untuk ABAP CDS — Pandua...