Wednesday, 30 April 2025

SAP ABAP - Smartforms as Email Attachment



 
*&---------------------------------------------------------------------*
*& Report YMAIL01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ymail01.
DATA:
  lv_subject            TYPE so_obj_des,
  lv_attachment_subject TYPE  sood-objdes,
  ls_mailto             TYPE zsmail_to,
  lt_mailto             TYPE TABLE OF zsmail_to,
  lt_otf                TYPE TABLE OF itcoo,
  lt_mail_content       TYPE soli_tab,
  ls_mail_content       TYPE soli.
DATA:
  document_output_info TYPE  ssfcrespd,
  job_output_info      TYPE  ssfcrescl,
  job_output_options   TYPE  ssfcresop,
  ssfctrlop            TYPE  ssfctrlop,
  ssfcompop            TYPE  ssfcompop.
START-OF-SELECTION.
  PERFORM send_email.
FORM send_email.
  lv_attachment_subject = lv_subject = 'Email Test Attachment'.
  ls_mailto-email_address  = 'email@gmail.com'.
  ls_mailto-recipient_type = 'TO'.
  APPEND ls_mailto TO lt_mailto.
*  control_parameters-getotf = 'X'.
  ssfctrlop-no_dialog  = abap_true.
  ssfctrlop-preview    = abap_false.
  ssfctrlop-getotf     = 'X'.
  ssfcompop-tddest     = 'LOCL'.
  ssfcompop-tdimmed    = 'X'.
  ssfcompop-tddelete   = 'X'.
  CLEAR job_output_info.
  CALL FUNCTION '/1BCDWB/SF00000147'
    EXPORTING
      control_parameters = ssfctrlop
      output_options     = ssfcompop
      user_settings      = 'X'
    IMPORTING
*     DOCUMENT_OUTPUT_INFO       =
      job_output_info    = job_output_info
*     JOB_OUTPUT_OPTIONS =
    EXCEPTIONS
      formatting_error   = 1
      internal_error     = 2
      send_error         = 3
      user_canceled      = 4
      OTHERS             = 5.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
  lt_otf = job_output_info-otfdata[].
  CLEAR ls_mail_content.
  ls_mail_content = 'Testing Email Attachment'.
  APPEND ls_mail_content TO lt_mail_content.
  CALL FUNCTION 'ZFM_SEND_EMAIL'
    EXPORTING
      i_mail_subject       = lv_subject
      i_attachment_subject = lv_attachment_subject
      lt_mail_content      = lt_mail_content
*     I_MAIL_SUBJECT2      =
*   IMPORTING
*     E_STATUS             =
*     E_SENT_TO_ALL        =
    TABLES
      lt_otf               = lt_otf
      lt_mailto            = lt_mailto
*     LT_EXCEL             =
    .
ENDFORM.


Monday, 17 February 2025

SAP ABAP - Custom Agent Determination Supplier Invoice Flexible Workflow Approval

Approval Supplier Invoice document (MIR7) using flexible workflow with custom agent determination.

Using custom agent determination for supplier invoice approval with flexible workflow in SAP involves several steps. Below is a step-by-step guide to help you set this up:

Step 1: Understand the Requirement

  • In my case, custom agent determination need to maintain with custom table. Below the custom table needs:


  • After create both of tables, need to create custom CDS view which will be used in custom logic apps code

  • First CDS View ZInvoiceWf 
    @AbapCatalog.sqlViewName: 'ZIWFINVOICE'
    @AbapCatalog.compiler.compareFilter: true
    @AbapCatalog.preserveKey: true
    @AccessControl.authorizationCheck: #CHECK
    @ClientHandling.algorithm: #SESSION_VARIABLE
    @EndUserText.label: 'Supplier Invoice Workflow'
    @VDM.viewType: #COMPOSITE
    @VDM.lifecycle.contract.type: #SAP_INTERNAL_API

    @ObjectModel.usageType.sizeCategory: #M
    @ObjectModel.usageType.serviceQuality: #A
    @ObjectModel.usageType.dataClass: #MASTER
    @ObjectModel.supportedCapabilities:
      [  #CDS_MODELING_DATA_SOURCE,
         #CDS_MODELING_ASSOCIATION_TARGET,
         #SQL_DATA_SOURCE                  ]
    define view ZI_SUPP_INV_WF 
      as select from zmmt007 as ZInvoiceWf 
    {
        key ZInvoiceWf.function as Function,
        key ZInvoiceWf.fundesc as FuncDesc,
        key ZInvoiceWf.app_lvl as AppLvl,
        ZInvoiceWf.bus_usr as BusUser    
    }

    Second CDS View ZI_SUPP_INV_REL_MAP
    @AbapCatalog.sqlViewName: 'ZIWFINVOICEREL'
    @AbapCatalog.compiler.compareFilter: true
    @AbapCatalog.preserveKey: true
    @AccessControl.authorizationCheck: #NOT_REQUIRED
    @EndUserText.label: 'Release Invoice Mapping'
    @VDM.viewType: #COMPOSITE
    @VDM.lifecycle.contract.type: #SAP_INTERNAL_API

    @ObjectModel.usageType.sizeCategory: #M
    @ObjectModel.usageType.serviceQuality: #A
    @ObjectModel.usageType.dataClass: #MASTER
    @ObjectModel.supportedCapabilities:
      [  #CDS_MODELING_DATA_SOURCE,
         #CDS_MODELING_ASSOCIATION_TARGET,
         #SQL_DATA_SOURCE                  ]
    define view ZI_SUPP_INV_REL_MAP as select from zmmt008 as ZInvoiceRel 
    {
        key ZInvoiceRel.zrel_group,
        key ZInvoiceRel.zrel_strat,
        key ZInvoiceRel.zfunction,
        key ZInvoiceRel.zsign,
        key ZInvoiceRel.zcurr,
        zamount

    @AbapCatalog.sqlViewName: 'ZVRBCO'
    @AbapCatalog.compiler.compareFilter: true
    @AbapCatalog.preserveKey: true
    @AccessControl.authorizationCheck: #NOT_REQUIRED
    @EndUserText.label: 'Invoice Account Assignment'
    define view ZI_INV_RBCO as select from rbco {
        key belnr,
        key gjahr,
        key buzei,
        key cobl_nr,
        wrbtr,
        sgtxt,
        txjcd,
        kostl
    }

    after create all CDS view need to publish all cds view to whitelisted object, to publish cds view


    Step 2: Create a Custom BADI Implementation

Create BADI implementation from sap fiori Custom Logic Apps:

Create new custom logic


After create, will show the custom logic page, in custom logic page go to Filter tab and add new filter workflowscenario = WS00800303 


add this code to custom logic code
    DATA:
      ls_badi_approver     TYPE if_mrm_workflow_agents=>bd_mmpur_s_badi_approver,
      lt_badi_approver     TYPE if_mrm_workflow_agents=>bd_mmpur_t_badi_approver,
      ls_previous_approver TYPE if_mrm_workflow_agents=>bd_mmpur_s_previous_approver,
      ls_new_approver      TYPE if_mrm_workflow_agents=>bd_mmpur_s_badi_approver,
      lv_count             TYPE i.

    DATA:
     lt_wf type table of ZI_SUPP_INV_WF,
     lt_wf_rel TYPE TABLE OF zi_supp_inv_rel_map,
     lt_wf_rel2 TYPE TABLE OF zi_supp_inv_rel_map,
     ls_wf_relx TYPE  zi_supp_inv_rel_map,
     ls_wf_rel2 TYPE  zi_supp_inv_rel_map,

     lv_app_level TYPE I.


    lv_app_level = stepinfo-current_step.

    SELECT *
        from I_SupplierInvoiceAPI01 WITH PRIVILEGED ACCESS
        where SupplierInvoice = @supplierinvoice and
              FiscalYear = @FiscalYear
        INTO TABLE @DATA(lt_SupplierInv).

    SELECT *
        from ZI_INV_RBCO WITH PRIVILEGED ACCESS
        where belnr = @supplierinvoice and
              gjahr = @FiscalYear
        INTO TABLE @DATA(lt_supplier_inv_assignment).

    READ TABLE lt_SupplierInv INTO DATA(ls_invoice) INDEX 1.
    READ TABLE lt_supplier_inv_assignment INTO DATA(ls_assignement) INDEX 1.

    IF ls_invoice-companycode = '0001' AND
       ls_invoice-ACCOUNTINGDOCUMENTTYPE = 'RE' AND
       ls_invoice-INVOICEGROSSAMOUNT >= 1.

        SELECT * FROM zi_supp_inv_rel_map WITH PRIVILEGED ACCESS
            WHERE zrel_group = 'WPO-GEN-WF' AND
                  zrel_strat = 'ALL'
        INTO TABLE @lt_wf_rel.

    ELSEIF ls_invoice-companycode = '0001' AND
           ls_invoice-ACCOUNTINGDOCUMENTTYPE <> 'RE'.
*           AND
*           ls_invoice-INVOICEGROSSAMOUNT <= 100000.

        SELECT * FROM zi_supp_inv_rel_map WITH PRIVILEGED ACCESS
            WHERE zcurr = @ls_invoice-documentcurrency AND
                  zrel_strat = @ls_assignement-kostl
        INTO TABLE @lt_wf_rel2.

        LOOP AT lt_wf_rel2 ASSIGNING FIELD-SYMBOL(<fs_wf_rel>).
            IF ls_invoice-INVOICEGROSSAMOUNT > <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'GT'.
                ls_wf_relx = <fs_wf_rel>.
                EXIT.
            ELSEIF ls_invoice-INVOICEGROSSAMOUNT >= <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'GE'.
                ls_wf_relx = <fs_wf_rel>.
                EXIT.
            ELSEIF ls_invoice-INVOICEGROSSAMOUNT < <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'LT'.
                ls_wf_relx = <fs_wf_rel>.
                EXIT.
            ELSEIF ls_invoice-INVOICEGROSSAMOUNT <= <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'LE'.
                ls_wf_relx = <fs_wf_rel>.
                EXIT.
            ELSEIF ls_invoice-INVOICEGROSSAMOUNT = <fs_wf_rel>-zamount AND <fs_wf_rel>-zsign = 'EQ'.
                ls_wf_relx = <fs_wf_rel>.
                EXIT.
            ENDIF.
        ENDLOOP.

        SELECT * FROM zi_supp_inv_rel_map WITH PRIVILEGED ACCESS
        WHERE zrel_group = @ls_wf_relx-zrel_group AND
              zrel_strat = @ls_assignement-kostl
        INTO TABLE @lt_wf_rel.

    ENDIF.

    IF lt_wf_rel is not initial.
        select * FROM ZI_SUPP_INV_WF WITH PRIVILEGED ACCESS
            FOR ALL ENTRIES IN @lt_wf_rel
            WHERE function = @lt_wf_rel-zfunction
                AND APPLVL   = @lv_app_level
                into TABLE @lt_wf.

        sort lt_wf by AppLvl.
    ENDIF.

    clear lv_count.
    loop at lt_wf into data(ls_wf).
        clear ls_badi_approver.
        ls_badi_approver-businessuser = ls_wf-BusUser.
        ls_badi_approver-approvallevel = ls_wf-AppLvl.
        APPEND ls_badi_approver TO lt_badi_approver.
        clear ls_wf.
        lv_count = lv_count + 1.
    endloop.

*stepinfo-total_steps = lv_count.

**  determine the next approval level and appropriate approvers
    READ TABLE lt_badi_approver INTO ls_badi_approver INDEX 1.
    LOOP AT lt_badi_approver INTO ls_new_approver.
*                WHERE approvallevel = ls_badi_approver-approvallevel.
      APPEND ls_new_approver-businessuser TO approverlist.
    ENDLOOP.

**  remove the previous approvers from the list of BAdI approvers
    LOOP AT previousapproverlist INTO ls_previous_approver.
      READ TABLE lt_badi_approver INTO ls_badi_approver
                              WITH KEY businessuser = ls_previous_approver-businessuser.
      CHECK sy-subrc = 0.
      DELETE lt_badi_approver WHERE approvallevel = ls_badi_approver-approvallevel.
    ENDLOOP.

    


Save the code and publish the custom logic code.





Define Flexible workflow for supplier invoice 











Thursday, 31 October 2024

SAP ABAP - Remove Special Character With Regex

REPORT yregex.

DATA mystring1 TYPE string.
DATA mystring2 TYPE string.

mystring1 = 'mystringa)aksak*1<>!@#$%^&*()~'.
mystring2 = 'mystringa)aksak*1<>!@#$%^&*()~'.

REPLACE ALL OCCURRENCES OF REGEX '[^0-9a-zA-Z]+' IN mystring2 WITH space.

WRITE:/ mystring1.
WRITE:/ mystring2.



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.

Belajar SAP ABAP RAP

  Belajar SAP ABAP RAP: Pengenalan dan Konsep Dasar Restful ABAP Programming Model Kalau kamu seorang ABAPer yang mulai terjun ke dunia SAP...