ค้นหา 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
- BAPIs มาตรฐาน - เช่น BAPI_MATERIAL_GETLIST, BAPI_COMPANYCODE_GETLIST
- OData Services (Gateway) - RESTful, Standard, รองรับ Filter/Paging
- CDS Views + OData - ทันสมัย Push-down capabilities
- ABAP CDS Table Functions - สำหรับข้อมูลจำนวนมาก
สรุป
- ใช้
BAPI_MONITOR_GETLISTหรือRFC_FUNCTION_SEARCHหา BAPI - ใช้
RFC_READ_TABLEอ่านตารางผ่าน RFC (ระวัง Rowcount limit) - ตาราง
DD02Lเก็บรายการตารางทั้งหมด - ใน Production ควรใช้ BAPI/OData แทน RFC_READ_TABLE โดยตรง