Monday, 15 September 2025

ABAP Dump Open Screen Painter

If this error come when you try to open ABAP Screen Painter, you can follow this tips. 



1. Go To Transaction Code SM59 


Double click EU_SCRP_WIN32 and open Logon & Security Tab


Maintain Callback Positive List

RS_SCRP_GF_PROCESS_640

RFC_GET_FUNCTION_INTERFACE

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RBUILDINFO

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RDDICFIELDS

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RDOCU

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RELEMTABLE

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RHELPGETTEXT

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RICONS

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RKEYS

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RKEYTEXTS

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RMESSAGES

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RPROPTABLE

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RPROP_DELETE

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RSHLP

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RSTATUS_40

RS_SCRP_GF_PROCESS_640

RS_SCRP_GF_RTEXTS


Save and Try Again...!!!




Tuesday, 26 August 2025

SAP ABAP - CALL BP TCODE From ABAP

REPORT ycall_bp.

PARAMETERS: p_bpnum TYPE but000-partner.
DATA: lo_request TYPE REF TO cl_bupa_navigation_request,
      lo_options TYPE REF TO cl_bupa_dialog_joel_options.
* Create request and options objects
CREATE OBJECT lo_request.
CREATE OBJECT lo_options.
* Set Business Partner number (example)
lo_request->set_partner_number( p_bpnum ). " your BP number
* Set activity (e.g., '03' for display)
lo_request->set_bupa_activity( '03' ).
* Optional: Set a specific sub-header tab (e.g., 'CVIC01' for Commercial View)
lo_request->set_bupa_sub_header_id( 'CVIC01' ).
* Optional: Hide the locator (search) area
lo_options->set_locator_visible( space ).
* Call the BP transaction with navigation
CALL METHOD cl_bupa_dialog_joel=>start_with_navigation
  EXPORTING
    iv_request              = lo_request
    iv_options              = lo_options
    iv_in_new_internal_mode = abap_true  " Open in a new internal mode
  EXCEPTIONS
    already_started         = 1
    not_allowed             = 2
    OTHERS                  = 3.







Wednesday, 18 June 2025

SAP ABAP - Read Table With Index New Syntax


 
*&---------------------------------------------------------------------*
*& Report YABAP_LEAR01
*&---------------------------------------------------------------------*
*& Title      : Read Table With Index New Syntax
*&---------------------------------------------------------------------*
REPORT yabap_lear01.
DATA: ls_mara TYPE mara.
START-OF-SELECTION.
  SELECT * FROM mara
    INTO TABLE @DATA(lt_mara)
      UP TO 10 ROWS.
  WRITE :/ '.'.
  "Old Method
  CLEAR ls_mara.
  READ TABLE lt_mara INDEX 5 INTO ls_mara.
  IF sy-subrc = 0.
    WRITE :/ 'Old Method Result :', ls_mara-matnr.
  else.
    WRITE :/ 'Data not found!'.
  ENDIF.
  WRITE :/ '.'.
  WRITE :/ '============================================'.
  WRITE :/ '.'.
  "New Method
  CLEAR ls_mara.
  TRY.
      ls_mara = lt_mara[ 6 ].
      WRITE :/ 'New Method Result :', ls_mara-matnr.
    CATCH cx_sy_itab_line_not_found.
      WRITE :/ 'Data not found!'.
  ENDTRY.

Wednesday, 21 May 2025

SAP ABAP - Extract Number From String

REPORT yextract_number.

DATA number(10) VALUE '0123456789'.
DATA string_val TYPE char100.

WRITE :/ 'First Option ========================'.
string_val = '  SHIPMENT 335'.
WRITE :/ 'Before', string_val.
REPLACE ALL OCCURENCES OF REGEX '[^\d]' IN string_val WITH space.

CONDENSE string_val NO-GAPS.
WRITE :/ 'After', string_val.
WRITE :/ 'First Option ========================'.

WRITE :/ '##########################################'.

DATA : lv_string TYPE string.
DATA : lv_num TYPE string.
lv_string = 'A1313.33BBC'.
lv_num = lv_string.

WRITE :/ 'Second Option ========================'.
WRITE :/ 'Before', lv_string.
REPLACE ALL OCCURRENCES OF REGEX '([[:alpha:]])' IN lv_num WITH ''.
WRITE :/ 'After', lv_num.
WRITE :/ 'Second Option ========================'.




Friday, 16 May 2025

SAP Transaction Code S_ALR_87013645 Language Screen is Germany

 


1. Open Transaction Code GR53 and fill Report Group 1KMA


2. Run Generate


Try open S_ALR_87013645 again and here the result






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 











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...