Showing posts with label SAP. Show all posts
Showing posts with label SAP. Show all posts

Monday, 22 September 2025

Belajar ABAP Part 1: Pengenalan ABAP untuk Pemula

Belajar ABAP Part 1: Pengenalan ABAP untuk Pemula

Belajar ABAP Part 1: Pengenalan ABAP untuk Pemula

Selamat datang di seri Belajar ABAP dari Basic sampai Advance. Pada bagian pertama ini, kita akan membahas pengenalan dasar ABAP, sejarah singkat, dan menulis program pertama di SAP menggunakan ABAP.

Apa itu ABAP?

ABAP (Advanced Business Application Programming) adalah bahasa pemrograman yang digunakan untuk mengembangkan aplikasi pada sistem SAP. ABAP mendukung pemrograman prosedural maupun object-oriented, sehingga fleksibel digunakan untuk berbagai kebutuhan bisnis.

Sejarah Singkat ABAP

ABAP pertama kali dikembangkan oleh SAP pada tahun 1980-an untuk mendukung pembuatan laporan dan program aplikasi bisnis. Hingga saat ini, ABAP masih menjadi salah satu pilar utama dalam SAP ERP maupun SAP S/4HANA.

Kenapa Belajar ABAP?

  • Digunakan secara luas di perusahaan besar yang menggunakan SAP.
  • Mudah dipelajari bagi pemula yang sudah familiar dengan bahasa pemrograman dasar.
  • Banyak peluang karir di bidang SAP Development.
  • Mendukung integrasi dengan teknologi modern (CDS View, OData, HANA, dsb).

Tools yang Dibutuhkan

Untuk mulai belajar ABAP, ada dua tools utama yang biasanya digunakan:

  1. SAP GUI: digunakan untuk akses langsung ke sistem SAP.
  2. Eclipse dengan ABAP Development Tools (ADT): IDE modern untuk coding ABAP.

Program Pertama: Hello World

Sebagai latihan pertama, mari kita buat program sederhana di ABAP:


REPORT zhello_world.

WRITE: 'Hello, ABAP World!'.

Program di atas akan menampilkan teks sederhana Hello, ABAP World! ke layar SAP. Mudah kan? 😊

Kesimpulan

Pada artikel pertama ini, kita sudah mengenal dasar apa itu ABAP, sejarah singkatnya, alasan kenapa belajar ABAP penting, tools yang dibutuhkan, dan membuat program pertama. Di seri berikutnya, kita akan membahas lebih detail tentang dasar-dasar pemrograman ABAP seperti variabel, tipe data, dan perintah dasar.

👉 Lanjut ke: Belajar ABAP Part 2: Dasar-Dasar Pemrograman ABAP

SAP ABAP CDS View - Batch Characteristic Value

SAP ABAP CDS View - Batch Characteristic Value

SAP ABAP CDS View: Batch Characteristic Value

In modern SAP development, Core Data Services (CDS View) play a vital role in building reusable and optimized data models. This article demonstrates how to create a CDS View to retrieve Batch Characteristic Values from SAP standard tables.

Objective

The purpose of this CDS View is to extract batch characteristic data from standard SAP tables such as INOB, AUSP, CABN, and related tables. The result can be leveraged for reporting, analytics, or Fiori applications.

CDS View Script


@AbapCatalog.sqlViewName: 'ZV_BATCHCHAR'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS View Batch Characteristic Value'
define view ZCDS_BATCH_CHARACTERISTIC as select from inob as a 
inner join ausp as b on a.cuobj = b.objek 
left outer join cabnt as c on c.atinn = b.atinn
left outer join cabn  as f on f.atinn = b.atinn
left outer join cawnt as d on b.atinn = d.atinn and b.atzhl = right(d.atzhl, 3) {
    b.objek as auspObjek,
    a.objek as obj,
    a.obtab,
    b.klart,
    cast(substring(a.objek, 1, 40) as char40 ) as Material,
    cast(substring(a.objek, 41, 50) as char10 ) as Batch,
    b.atinn,
    f.atnam,
    c.atbez,
    b.atzhl,
    b.atwrt,
    d.atwtb,
    b.atflv,
    b.date_from,
    b.dec_value_from
} where a.obtab = 'MCH1' and a.klart = '023' and c.spras = 'E'
    

Sample Output

Below is an example of the result set when running this CDS View in SAP HANA:

Material Batch Characteristic Description Value (Technical) Value (Text) Valid From
MAT-1001 BATCH001 COLOR Batch Color RED Red 2025-01-01
MAT-1001 BATCH001 EXP_DATE Expiration Date 20251231 31-Dec-2025 2025-01-01
MAT-1002 BATCH005 PURITY Purity Level 99.8 99.8 % 2025-02-15

Consuming CDS View in ABAP

To consume the CDS View in an ABAP program, you can use a simple SELECT statement referencing the CDS View entity name:


REPORT ztest_batchchar.

TYPES: BEGIN OF ty_batchchar,
         material     TYPE char40,
         batch        TYPE char10,
         atnam        TYPE char30,
         atbez        TYPE char60,
         atwrt        TYPE char30,
         atwtb        TYPE char60,
         date_from    TYPE dats,
       END OF ty_batchchar.

DATA lt_batchchar TYPE TABLE OF ty_batchchar.
DATA ls_batchchar TYPE ty_batchchar.

SELECT material,
       batch,
       atnam,
       atbez,
       atwrt,
       atwtb,
       date_from
  FROM zcds_batch_characteristic
  INTO TABLE @lt_batchchar
  UP TO 20 ROWS.

LOOP AT lt_batchchar INTO ls_batchchar.
  WRITE: / ls_batchchar-material,
           ls_batchchar-batch,
           ls_batchchar-atnam,
           ls_batchchar-atwrt.
ENDLOOP.
    

Field Explanation

  • Material → extracted from the object key (first 40 characters).
  • Batch → extracted from the object key (characters 41–50).
  • atnam → technical name of the characteristic.
  • atbez → description of the characteristic.
  • atwrt / atwtb → technical and descriptive values of the characteristic.
  • date_from → start of validity period.

Key Benefits

- Simplifies batch characteristic reporting without complex queries.
- Enables seamless integration with SAP Fiori apps and HANA analytics.
- Provides a reusable data model for multiple business scenarios.

Conclusion

This CDS View provides a clean and efficient way to retrieve batch and characteristic information in SAP ABAP. With this approach, reporting and analytics become much easier and faster to implement.

Feel free to adapt this CDS View and ABAP snippet for your own SAP implementation!

SAP Issue Unapproved Requisition could be converted to Purchase Order

Purchase Requisitions that have not been released/approved can be continued to become Purchase Order. If they have not been released/approved, they cannot be made into Purchase Order. 



If you found this Issue in your SAP S4 System try to implement this SAP Note
https://me.sap.com/notes/3300350/E

Friday, 19 September 2025

Showing Field Invoice Receipt Date in SAP MIR7/MIRO Transaction

Invoice Receipt Date in SAP MIR7 Transaction



First step Maintain Table IDFIVATV_DEF using SM30 and Edit

Add new entries if your company code not maintained yet in this table.

Next step double click on company code and tick Receipt Date Active 



Last step is Save and Open MIR7 Transaction



Tuesday, 16 September 2025

Custom Agent Determination in SAP Flexible Workflow for Supplier Invoice Approval

Custom Agent Determination in SAP Flexible Workflow for Supplier Invoice Approval

Custom Agent Determination in SAP Flexible Workflow for Supplier Invoice Approval

In SAP MM, supplier invoice approval is often handled using the Flexible Workflow. However, standard configuration may not fully cover complex approval requirements. In such cases, Custom Agent Determination can be implemented using BAdI MRM_WORKFLOW_AGENTS.

This blog explains how to implement a custom approval workflow for supplier invoices (MIR7), including creating custom tables, CDS views, Fiori custom logic, and defining workflow conditions.

1. Create Custom Tables

Two custom tables are required:

a. Table for Mapping User Approval

Table: ZMMT007 (Supplier Invoice Approval Agent Assignment)

  • FUNCTION – Function key
  • FUNDESC – Function description
  • APP_LVL – Approval level
  • BUS_USR – Business user

b. Table for Mapping Condition Approval

Table: ZMMT008 (Invoice Release Strategy)

  • ZREL_GROUP – Release group
  • ZREL_STRAT – Release strategy
  • ZFUNCTION – Function
  • ZSIGN – Comparison sign
  • ZCURR – Currency
  • ZAMOUNT – Amount threshold

2. Create Custom CDS Views

CDS views are required for retrieving approval mapping data. Example definitions:

@AbapCatalog.sqlViewName: 'ZIWFINVOICE'
define view ZI_SUPP_INV_WF as select from zmmt007 {
  key function as Function,
  fundesc as FuncDesc,
  app_lvl as AppLvl,
  bus_usr as BusUser
}
      
@AbapCatalog.sqlViewName: 'ZIWFINVOICEREL'
define view ZI_SUPP_INV_REL_MAP as select from zmmt008 {
  key zrel_group,
  key zrel_strat,
  zfunction,
  zsign,
  zcurr,
  zamount
}
      

Make sure to release CDS Views for usage in custom logic by setting the API State to Use System-Internally (Contract C1).

3. Implement Custom Logic in Fiori

Navigate to Custom Logic app in Fiori and create a new implementation:

  • Business Context: Procurement: Flexible Workflow
  • BAdI: Determination of Workflow Agents for Supplier Invoice
  • Implementation ID: BADI MRM_WORKFLOW_AGENTS

Sample ABAP snippet for custom agent selection:

DATA: lt_wf TYPE TABLE OF ZI_SUPP_INV_WF,
      lt_wf_rel TYPE TABLE OF zi_supp_inv_rel_map,
      ls_wf_relx TYPE zi_supp_inv_rel_map.

SELECT * FROM I_SupplierInvoiceAPI01
  WHERE SupplierInvoice = @supplierinvoice
    AND FiscalYear = @FiscalYear
  INTO TABLE @DATA(lt_SupplierInv).

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

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

ENDIF.
      

In the Filter tab, set the filter: workflowscenario = WS00800303.

4. Define Flexible Workflow Conditions

In the Fiori app Manage Workflows for Supplier Invoices, configure the workflows according to business rules. For example:

a. Invoice With PO

  • Company code = JSB
  • Invoice is based on PO
  • Steps: Level-1 and Level-2 Agent Determination via BAdI

b. Invoice Without PO < 10 Million

  • Company code = JSB
  • Amount < 10,000,000 IDR
  • Steps: Level-1, Level-2, Level-3 Agent Determination

c. Invoice Without PO ≥ 10 Million

  • Company code = JSB
  • Amount ≥ 10,000,000 IDR
  • Steps: Level-1 to Level-4 Agent Determination

Conclusion

By combining custom tables, CDS views, and Fiori custom logic, businesses can implement robust and flexible approval workflows for supplier invoices in SAP. This approach ensures compliance, supports complex approval hierarchies, and automates the agent determination process.

👉 If you’re also interested in other SAP MM workflow enhancements, check out our related article on SAP Invoice Splitting.

How to Set Default Values in SAP Business Partner (BP)

How to Set Default Values in SAP Business Partner (BP)

How to Set Default Values in SAP Business Partner (BP)

In SAP Business Partner (BP) transactions, setting default values can help streamline data entry and ensure consistency across the system. For example, you may want to predefine a default language or tolerance group at the company level. SAP provides a standard way to handle this through the BUSDEFAULT structure and enhancement options.

This guide explains how to set default BP values using customer exits and the function module BUP_BUPA_FIELDVALUES_SET.

Understanding the BUSDEFAULT Structure

SAP provides a structure called BUSDEFAULT, which contains fields that can be configured with default values. You can explore it using transaction SE11.

Some of the key fields available in BUSDEFAULT include:

  • LANGU – Business partner language
  • COUNTRY – Country/Region key
  • POST_CODE1 – City postal code
  • MC_CITY1 – City name
  • TELNR – Telephone number
  • BPKIND – Business Partner Type
  • BU_SORT1 / BU_SORT2 – Search Terms

For a detailed reference, SAP Note 2992030 provides more insights into this feature.

Implementation Steps

Follow these steps to configure default values for SAP BP:

  1. Create a custom function module in the customer namespace.
  2. Within the function module, call BUP_BUPA_FIELDVALUES_SET to populate default values.
  3. Save and activate the function module.
  4. Run transaction BUS7.
  5. Open event ISDAT/ISSTA.
  6. Create a new entry to register your function module for application BUP.
  7. Save and ensure the Call indicator is set to X.

Sample ABAP Code


DATA i_busdefault TYPE busdefault.

CLEAR i_busdefault.
i_busdefault-langu = sy-langu.

CALL FUNCTION 'BUP_BUPA_FIELDVALUES_SET'
  EXPORTING
    i_busdefault = i_busdefault.
      

This example sets the default language (LANGU) based on the system language (sy-langu).

Registering the Function Module

In transaction BUS7, add a new entry to link the function module with the event:

  • Event: ISDAT (Read Data)
  • Function Module: Your custom module (e.g., Z_BUP_BUPA_DEFAULTS)
  • Call: Set to X

This ensures the default values are applied automatically whenever BP data is processed.

Conclusion

By leveraging the BUSDEFAULT structure and BUP_BUPA_FIELDVALUES_SET function module, you can automate the process of setting default values in SAP Business Partner (BP). This not only saves time but also improves data consistency and reduces manual errors.

For complex requirements, you can extend this approach by customizing additional fields within the BUSDEFAULT structure and linking them to events in BUS7.

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

Tuesday, 7 November 2023

SAP ABAP - Retrieve Data From Standard Program MB52 Report to Custom Report

 *&---------------------------------------------------------------------*

*& Report YMB52
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ymb52.
TABLES maramarcmardmchb.

DATABEGIN OF gt_mb52 OCCURS 0,
        matnr    LIKE mara-matnr,
        werks    LIKE t001w-werks,
        lgort    LIKE mard-lgort,
        sobkz    LIKE mkol-sobkz,
        ssnum    LIKE bickey-ssnum,
        pspnr    LIKE mspr-pspnr,
        vbeln    LIKE mska-vbeln,
        posnr    LIKE mska-posnr,
        lifnr    LIKE mkol-lifnr,
        kunnr    LIKE msku-kunnr,
        kzbws    LIKE mssa-kzbws,
        charg    LIKE mchb-charg,
        maktx    LIKE marav-maktx,
        bwkey    LIKE mbew-bwkey,
        mtart    LIKE marav-mtart,
        matkl    LIKE marav-matkl,
        meins    LIKE marav-meins,
        bwtty    LIKE marc-bwtty,
        xchar    LIKE marc-xchar,
        lgobe    LIKE t001l-lgobe,
        bwtar    LIKE mcha-bwtar,
        waers    LIKE t001-waers,
        name1    LIKE t001w-name1,
        labst    LIKE mard-labst,
        wlabs    LIKE mbew-salk3,
        sgt_scat LIKE  mchb-sgt_scat.

DATAowner  LIKE msis-owner,
      lifnr2 LIKE mslb-lifnr.

DATAEND OF gt_mb52,
gs_mb52 LIKE LINE OF gt_mb52.

DATABEGIN OF gs_data.
        INCLUDE STRUCTURE gs_mb52.
DATA:
      END OF gs_data,
      gt_data LIKE TABLE OF gs_data.

CONSTANTS:
  c_x   TYPE c     VALUE 'X'.

DATA :
   go_data  TYPE REF TO data.

FIELD-SYMBOLS:
       <gt_data> TYPE ANY TABLE.

SELECTION-SCREEN  BEGIN OF BLOCK b1 WITH   FRAME TITLE TEXT-001.
  SELECT-OPTIONS s_matnr FOR mara-matnr,
  s_werks FOR marc-werks,
  s_lgort FOR mard-lgort,
  s_charg FOR mchb-charg.
SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.
  PERFORM get_data.

FORM get_data.
  cl_salv_bs_runtime_info=>set(
  EXPORTING
    display        abap_false
    metadata       abap_false
    data           abap_true ).


  SUBMIT rm07mlbs
    WITH matnr IN s_matnr
    WITH werks IN s_werks
    WITH lgort IN s_lgort
    WITH charg IN s_charg
    WITH negativ  abap_false
    WITH pa_sond  abap_true
    WITH xmchb    abap_true
    WITH nozero   c_x
    WITH novalues abap_false
    WITH pa_hsq   abap_false
    WITH pa_flt   c_x
    WITH p_vari   abap_false
    AND RETURN.

  "Get data from MB52
  TRY.
      cl_salv_bs_runtime_info=>get_data_ref(
      IMPORTING r_data go_data ).
      ASSIGN go_data->TO <gt_data>.

      "Keep mb52 data into internal table
      IF <gt_data> IS ASSIGNED.
        LOOP AT <gt_data> ASSIGNING FIELD-SYMBOL(<fs_data1>).
          MOVE-CORRESPONDING <fs_data1> TO gs_data.
          APPEND gs_data TO gt_data.
        ENDLOOP.
      ENDIF.

    CATCH cx_salv_bs_sc_runtime_info ##NO_HANDLER.
      MESSAGE 'Unable to retrieve alv data' TYPE 'e'.
  ENDTRY.

  cl_salv_bs_runtime_info=>clear_all).

  cl_demo_output=>display_datagt_data ).
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...