Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

RFC โหลดข้อมูลตาราง และดูรายการ BAPI ใน SAP

ค้นหา BAPI ทั้งหมดในระบบ SAP

ไม่มี BAPI เดียวที่คืนรายการ BAPI ทั้งหมด แต่สามารถใช้ Function Module RFC_FUNCTION_SEARCH ค้นหา Function Modules ที่ขึ้นต้นด้วย BAPI*

วิธีที่ 1: ใช้ BAPI_MONITOR_GETLIST

CALL FUNCTION 'BAPI_MONITOR_GETLIST'
  EXPORTING
    OBJECTTYPE        = p_objtype
    SHOW_RELEASE      = p_rel
    BAPIS_POTENTIAL   = p_poten
    BAPIS_NEW         = p_new_bapi
    BAPIS_OLD         = p_old_bapi
    RELEASED_BAPI     = p_rel_bapi
    RELEASED_FUNC     = p_released_func
  IMPORTING
    RETURN            = d_ret
  TABLES
    COMPONENTS2SELECT = int_cs
    SYSTEMS2SELECT    = int_sss
    BAPILIST          = int_bapilist

พารามิเตอร์สำคัญ:

  • OBJECTTYPE - ประเภทออบเจกต์ (เช่น 'BUS1001' สำหรับ Material)
  • BAPILIST - ตารางคืนค่ารายการ BAPI พร้อมรายละเอียด

วิธีที่ 2: RFC_FUNCTION_SEARCH (Generic Search)

DATA: lt_funcs TYPE TABLE OF rfcfunc.

CALL FUNCTION 'RFC_FUNCTION_SEARCH'
  EXPORTING
    funcname = 'BAPI*'
  TABLES
    funcs    = lt_funcs.

LOOP AT lt_funcs INTO DATA(ls_func).
  WRITE: / ls_func-funcname, ls_func-functxt.
ENDLOOP.

อ่านข้อมูลตารางผ่าน RFC_READ_TABLE

RFC_READ_TABLE เป็น Function Module มาตรฐานสำหรับอ่านข้อมูลตาราง SAP ผ่าน RFC (Remote Function Call)

โครงสร้างพารามิเตอร์

CALL FUNCTION 'RFC_READ_TABLE'
  EXPORTING
    QUERY_TABLE     = 'DD02L'     " ชื่อตาราง
    DELIMITER       = '|'         " ตัวคั่นฟิลด์
    ROWCOUNT        = 100         " จำนวนแถวสูงสุด
    ROWSKIPS        = 0           " ข้ามกี่แถว
  TABLES
    OPTIONS         = lt_options  " WHERE conditions
    FIELDS          = lt_fields   " ฟิลด์ที่ต้องการ
    DATA            = lt_data     " ข้อมูลที่คืน (RAW)
  EXCEPTIONS
    TABLE_NOT_AVAILABLE = 1
    TABLE_WITHOUT_DATA  = 2
    OTHERS              = 3.

ตัวอย่าง: ดึงรายการตารางทั้งหมดจาก DD02L

DATA: lt_fields  TYPE TABLE OF rfc_db_fld,
      lt_options TYPE TABLE OF rfc_db_opt,
      lt_data    TYPE TABLE OF rfc_db_data.

" เลือกฟิลด์ที่ต้องการ
lt_fields = VALUE #(
  ( FIELDNAME = 'TABNAME' )  " ชื่อตาราง
  ( FIELDNAME = 'DDTEXT' )   " คำอธิบาย
).

" เงื่อนไข: ตารางที่ไม่ใช่ Cluster/Pool
APPEND VALUE #( TEXT = "TABCLASS = 'TRANSP'" ) TO lt_options.

CALL FUNCTION 'RFC_READ_TABLE'
  EXPORTING
    QUERY_TABLE = 'DD02L'
    DELIMITER   = '|'
    ROWCOUNT    = 500
  TABLES
    FIELDS      = lt_fields
    OPTIONS     = lt_options
    DATA        = lt_data.

" Parse ข้อมูล RAW
LOOP AT lt_data INTO DATA(ls_data).
  " แยกฟิลด์ด้วย delimiter
  SPLIT ls_data-wa AT '|' INTO DATA(tabname) DATA(ddtext).
  WRITE: / tabname, ddtext.
ENDLOOP.

ตารางสำคัญสำหรับ Metadata

ตาราง คำอธิบาย
DD02L ตารางทั้งหมดใน Data Dictionary (Table Directory)
DD03L ฟิลด์ของตาราง (Field Directory)
TSTC Transaction Codes
TADIR Repository Objects (Programs, Classes, Functions)
TRDIR Program Directory (ABAP Programs)

การเรียกจาก C# (SAP .NET Connector 3.0)

using SAP.Middleware.Connector;

public class SapTableReader
{
    public List> ReadTable(
        RfcDestination dest, 
        string tableName, 
        List fields = null, 
        List options = null,
        int rowCount = 100)
    {
        var repo = dest.Repository;
        var func = repo.CreateFunction("RFC_READ_TABLE");
        
        func.SetValue("QUERY_TABLE", tableName);
        func.SetValue("DELIMITER", "|");
        func.SetValue("ROWCOUNT", rowCount);
        
        if (fields != null && fields.Count > 0)
        {
            var fieldsTable = func.GetTable("FIELDS");
            foreach (var f in fields)
            {
                var row = fieldsTable.Append();
                row.SetValue("FIELDNAME", f);
            }
        }
        
        if (options != null && options.Count > 0)
        {
            var optionsTable = func.GetTable("OPTIONS");
            foreach (var opt in options)
            {
                var row = optionsTable.Append();
                row.SetValue("TEXT", opt);
            }
        }
        
        func.Invoke(dest);
        
        var dataTable = func.GetTable("DATA");
        var result = new List>();
        
        foreach (var row in dataTable)
        {
            string raw = row.GetString("WA");
            var values = raw.Split('|');
            // Map กับ fields ที่ขอ...
            result.Add(/* mapping logic */);
        }
        
        return result;
    }
}

ข้อจำกัดและข้อควรระวัง

  • Rowcount limit - Default ประมาณ 100-500 rows (ขึ้นอยู่กับการตั้งค่า SAP)
  • Field length - ข้อมูลคืนมาเป็น RAW string ต้อง parse เอง
  • Authorization - ต้องมีสิทธิ์ S_RFC และ S_TABU_DIS
  • Performance - ไม่เหมาะสำหรับข้อมูลมหาศาล (ใช้ BAPI/ODATA แทน)
  • Unicode/Non-Unicode - ระวัง Encoding ของ Delimiter

ทางเลือกที่ดีกว่าสำหรับ Production

  1. BAPIs มาตรฐาน - เช่น BAPI_MATERIAL_GETLIST, BAPI_COMPANYCODE_GETLIST
  2. OData Services (Gateway) - RESTful, Standard, รองรับ Filter/Paging
  3. CDS Views + OData - ทันสมัย Push-down capabilities
  4. ABAP CDS Table Functions - สำหรับข้อมูลจำนวนมาก

สรุป

  • ใช้ BAPI_MONITOR_GETLIST หรือ RFC_FUNCTION_SEARCH หา BAPI
  • ใช้ RFC_READ_TABLE อ่านตารางผ่าน RFC (ระวัง Rowcount limit)
  • ตาราง DD02L เก็บรายการตารางทั้งหมด
  • ใน Production ควรใช้ BAPI/OData แทน RFC_READ_TABLE โดยตรง
No