รู้จักภาษา ABAP -9 ตอน เปิดเบื้องหลังของ SAP R/3

สำหรับเรื่อง ABAP ในฉบับนี้ จะกล่าวถึงเรื่องของฟังก์ชันโมดูลของภาษา ABAP ซึ่งถือเป็นเรื่องสำคัญเรื่องหนึ่งเลยก็ว่าได้ เพราะการเขียนโปรแกรม ABAP เพื่ออ่านข้อมูลจาก Database Server นั้น ในบางโมดูลของระบบ SAP เราไม่สามารถที่จะอ่านข้อมูลจากตารางได้โดยตรง เนื่องจากเราไม่สามารถหาความสัมพันธ์ของตารางนั้นๆ ได้ ซึ่ง SAP ได้พยายามซ่อนความสัมพันธ์ของตารางต่างๆ ไว้ แต่ SAP ได้ทำฟังก์ชันของระบบไว้ให้เราในการดึงข้อมูล เราจะได้ไม่ต้องมาปวดหัวกับการหาความสัมพันธ์ของตารางในระบบต่างๆ ของ SAP โดยเฉพาะโมดูล Plant Maintenance (PM) หรือ Material Management (MM) เป็นต้น


Function Module

เราสามารถที่จะเขียนคำสั่ง ABAP เก็บไว้เป็นฟังก์ชันเพื่อให้โปรแกรม ABAP สามารถเรียกใช้ฟังก์ชันจาก Function Library ได้ เราลองมาดูตัวอย่างของการสร้างและเรียกใช้ฟังก์ชันที่ใช้ในการคำนวณค่าของ ตัวเลขยกกำลังสองจำนวนดังต่อไปนี้

เราจะใช้ Transaction SE37 ในการสร้างฟังก์ชันในระบบ SAP ดังรูปที่ 1
รูปที่ 1
รูปที่ 2
โดยที่ชื่อของฟังก์ชันที่เราต้องการสร้างขึ้นมาใหม่นั้น จะต้องขึ้นต้นด้วย Y หรือ Z จากนั้นต้องตามด้วย _ เช่น Z_TEST เป็นต้น แต่ก่อนที่เราจะสร้างฟังก์ชันในระบบ SAP ได้นั้น เราจะต้องสร้างฟังก์ชันกรุ๊ป (Function Group) ขึ้นมาก่อน (หรืออาจใช้ฟังก์ชันกรุ๊ปเดิมที่สร้างไว้แล้วก็ได้) โดยที่หน้าจอของ Transaction SE37 ให้เลือกเมนู Goto -> Function groups -> Create group จากนั้นให้ใส่ชื่อของฟังก์ชันกรุ๊ปที่ขึ้นต้นด้วย Y หรือ Z และ Short text แล้วคลิ้ก Save ดังรูปที่ 2
สำหรับฟังก์ชันกรุ๊ปนั้น จะเป็นที่ที่เก็บรวบรวมฟังก์ชันต่างๆ หรือกล่าวอีกนัยหนึ่งก็คือ ฟังก์ชันต่างๆ จะต้องอยู่ในฟังก์ชันกรุ๊ปนั่นเอง โดยที่ในหนึ่งฟังก์ชันกรุ๊ปสามารถมีได้หลายฟังก์ชัน

จากนั้นเราจะสร้างฟังก์ชันที่ชื่อ Z_CAL ที่ Transaction SE37 โดยคลิ้กปุ่ม Create ดังรูปที่ 3
รูปที่ 3
รูปที่ 4
จากนั้นให้ระบุค่าฟังก์ชันกรุ๊ปดังรูปที่ 4
จากนั้นเราจะเข้ามาที่ส่วนของการสร้างตัวแปร Import ในที่นี้คือ number1 และ number2 ซึ่งเป็นตัวแปรชนิด I ซึ่งในส่วน Import นี้ คือตัวแปรที่ฟังก์ชันรอรับค่ามาจากโปรแกรมที่มีการเรียกใช้ฟังก์ชัน ดังรูปที่ 5
รูปที่ 5
จากนั้นเราจะมาสร้างตัวแปร Export โดยคลิ้กแท็บ Export ในที่นี้ตัวแปร Export คือตัวแปรชื่อ Result ซึ่งมีชนิดของตัวแปรเป็นชนิด I ดังรูปที่ 6
รูปที่ 6
ในส่วนของตัวแปร Export นี้ ก็คือเมื่อฟังก์ชันประมวลผลคำสั่ง ABAP ทั้งหมดในส่วนของ Source Code ของฟังก์ชันเสร็จสิ้นเรียบร้อยแล้ว ระบบก็จะส่งค่าตัวแปร Export ทั้งหมดกลับไปให้กับโปรแกรมที่มีการเรียกใช้ฟังก์ชัน

จากนั้นเราก็จะเข้าไปเขียนคำสั่ง ABAP ของฟังก์ชันนี้ โดยคลิ้กปุ่ม Source Code จากนั้นที่ Editor ก็ให้เขียนคำสั่ง ABAP ดังนี้

FUNCTION Z_CAL.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(NUMBER1) TYPE I
*" VALUE(NUMBER2) TYPE I
*" EXPORTING
*" VALUE(RESULT) TYPE I
*"----------------------------------------------------------------------
RESULT = NUMBER1 ** NUMBER2.

ENDFUNCTION.

ก็คือ เป็นการคำนวณค่าของตัวเลขยกกำลังที่รับมาจากโปรแกรมที่เรียกใช้ฟังก์ชันนี้ ให้กับตัวแปร result ซึ่งเป็นตัวแปรแบบ Export จากนั้นให้คลิ้ก Activate เพื่อ Activate ในส่วนของฟังก์ชันดังนี้
ณ จุดนี้ ถ้าเรา Activate แล้วเกิด Error แสดงข้อความว่า Function module Z_CAL .The main program of the function "Z_CAL" does not begin with "FUNCTION-POOL" ก็ให้เราเพิ่มบรรทัด Function-pool test. เข้าไปที่ส่วนของ Main Program ของฟังก์ชันกรุ๊ป โดยที่หน้าจอ Function Module : Editing ให้เลือกเมนู Goto -> Main program จากนั้นให้เราแทรกคำสั่ง Function-pool test. ไว้ที่บรรทัดแรก จากนั้นก็ให้ Activate ในส่วนของฟังก์ชันใหม่อีกครั้ง ณ จุดนี้เราก็จะได้ฟังก์ชัน Z_CAL เพื่อใช้ในการคำนวณตัวเลขยกกำลัง ขั้นตอนต่อไปก็คือการเขียนโปรแกรม ABAP เพื่อเรียกใช้ฟังก์ชัน Z_CAL โดยให้มีการรับค่าตัวเลขสองจำนวนจากหน้าจอ Selection Screen ดังนี้

Report ztest.
Data resultcal type I.
Parameters: no1 type I,
no2 type I.
รูปที่ 7


โดยที่ตัวแปร resultcal เป็นตัวแปรที่เราสร้างไว้เพื่อรอรับค่าจากฟังก์ชัน Z_CAL นั่นเอง จากนั้นให้ใช้คำสั่ง CALL FUNCTION 'Z_CAL' เพื่อเรียกใช้ฟังก์ชัน Z_CAL แต่ถ้าเราเขียนคำสั่ง CALL FUNCTION เอง เราก็จำเป็นที่จะต้องรู้ว่าฟังก์ชัน Z_CAL มีการรอรับค่าตัวแปรอะไร แล้วจะส่งค่าของตัวแปรอะไรกลับมา วิธีที่ง่ายและสะดวกที่สุดในการใช้ฟังก์ชันในโปรแกรมก็คือ ให้คลิ้กปุ่ม Pattern ที่ ABAP Editor หรือเลือกเมนู Edit -> Insert statement... จากนั้นให้ใส่ชื่อฟังก์ชันแล้วกด Enter ดังรูปที่ 7
เราก็จะได้คำสั่ง CALL FUNCTION ดังรูปที่ 8


CALL FUNCTION 'Z_CAL'
EXPORTING
number1 =
number2 =
IMPORTING
Resultcal =
รูปที่ 8 .


ให้เราใส่ชื่อตัวแปรในโปรแกรมทางฝั่งขวา (Actual Parameter หรือตัวแปรที่อยู่ในโปรแกรม) ของฟังก์ชันดังรูปที่ 9


CALL FUNCTION 'Z_CAL'
EXPORTING
number1 = no1
number2 = no2
IMPORTING
Resultcal = result .
รูปที่ 9


ที่ส่วนของ Exporting ก็คือ เมื่อมีการเรียกใช้ฟังก์ชัน Z_CAL ระบบจะส่งค่าตัวแปร Actual Parameter ในที่นี้คือ no1 และ no2 ไปให้กับตัวแปร Import (Formal Parameter หรือตัวแปรที่ฝั่งฟังก์ชัน)ที่ชื่อ number1 และ number2 ของฟังก์ชัน Z_CAL ตามลำดับ จากนั้นเมื่อฟังก์ชัน Z_CAL ประมวลผลคำสั่ง ABAP ในฟังก์ชันเสร็จสิ้นเรียบร้อยแล้ว ระบบก็จะส่งค่าข้อมูลตัวแปร Export ที่ชื่อ result ของฟังก์ชัน Z_CAL กลับมาให้กับตัวแปร resultcal ในส่วน IMPORTING ของโปรแกรม ztest ดังรูปที่ 10


* เมื่อมีการเรียกใช้ฟังก์ชัน Z_CAL
Number1 < - - - no1
Number 2 < - - - no2
* เมื่อฟังก์ชัน Z_CAL ทำงานเสร็จสิ้น
result - - -> resultcal
รูปที่ 10 

สำหรับโปแกรม ztest ที่สมบูรณ์จะเป็นดังนี้

Report ztest.
Data resultcal type I.
Parameters: no1 type I,
no2 type I.

CALL FUNCTION 'Z_CAL'
EXPORTING
number1 = no1
number2 = no2
IMPORTING
resultcal = result .
Write: / result.

เมื่อ Execute โปรแกรม ztest เราจะได้หน้าจอ Selection Screen ดังรูปที่ 11
รูปที่ 11
รูปที่ 12
จากนั้นเมื่อกด Execute เราจะได้ผลลัพธ์ดังรูปที่ 12

ตัวแปร Exception

ถ้าเราลองส่งค่า no1 และ no2 เป็นค่าที่มากกว่า 9 ดังรูปที่ 13
รูปที่ 13
รูปที่ 14
เมื่อ Execute เราจะได้ Short Dump หรือ Run Time Error เพราะการทำงานของคำสั่ง result = number1 ** number2. นั้น ค่าที่ได้จากการคำนวณจะได้ค่าที่เกินกว่าตัวแปร result จะเก็บค่าได้ ดังนั้นจึงเกิด Run Time Error ในฟังก์ชัน Z_CAL ทางแก้ไขก็คือ การใช้ตัวแปร Exception นั่นเอง โดยที่ส่วนของ Exception ในฟังก์ชันนั้น เราสามารถที่จะสร้างตัวแปร Exception ได้ดังรูปที่ 14
โดยที่ตัวแปร Exception นั้น เราจะใช้สำหรับเหตุการณ์ที่เราต้องการเช็กเงื่อนไขที่อาจเกิดข้อผิดพลาดใน ฟังก์ชัน จากนั้นที่ Source Code ของฟังก์ชัน Z_CAL ให้แก้ไขใหม่ดังรูปที่ 15


FUNCTION Z_CAL.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(NUMBER1) TYPE I
*" VALUE(NUMBER2) TYPE I
*" EXPORTING
*" VALUE(RESULT) TYPE I
*" EXCEPTIONS
*" INVALID
*"----------------------------------------------------------------------
IF NUMBER1 > 9 AND NUMBER2 > 9.
RAISE INVALID.
ELSE.
RESULT = NUMBER1 ** NUMBER2.
ENDIF.
ENDFUNCTION.
รูปที่ 15


เมื่อแก้ไขซอร์สโค้ดในฟังก์ชัน เราก็จำเป็นที่จะต้อง Activate ฟังก์ชันใหม่ทุกครั้ง และเราจะใช้ตัวแปร Exception ในคำสั่ง raise ก็คือ เมื่อใดที่มีการทำงานของคำสั่ง raise ระบบก็จะหยุดการทำงานคำสั่งในฟังก์ชันทันที โดยที่ไม่มีการส่งค่าตัวแปร Export กลับไปที่โปรแกรมแต่อย่างใด จากนั้นระบบก็จะไปดูที่ส่วนของ EXCEPTIONS ในโปรแกรม ว่ามีการให้ค่าตัวแปร Exception ไว้เป็นค่าตัวเลขอะไร จากนั้นจึงให้ค่าตัวเลขกับตัวแปรระบบที่ชื่อ sy-subrc ซึ่งเราจะต้องตรวจสอบเองในโปรแกรมหลังจากมีการเรียกใช้ฟังก์ชัน ดังตัวอย่างโปรแกรมดังรูปที่ 16


Report ztest.
Data resultcal type I.
Parameters: no1 type I,
no2 type I.
CALL FUNCTION 'Z_CAL'
EXPORTING
number1 = no1
number2 = no2
IMPORTING
resultcal = result
EXCEPTIONS
invalid = 1
others = 2.
If sy-subrc = 1.
Write: / 'Please enter number < 10'.
Else.
Write: / result.
Endif.
รูปที่ 16

รูปที่ 17


ก็คือถ้าผู้ใช้ระบบใส่ค่า no1 และ no2 เป็นค่า 10 เมื่อมีการเรียกใช้ฟังก์ชัน และมีการเช็กด้วยคำสั่ง if number1 > 9 and number2 > 9. ในฟังก์ชัน Z_CAL ระบบจึงทำคำสั่ง raise invalid. แล้วระบบก็จะจบการทำงานของฟังก์ชัน Z_CAL โดยทันที และจะกลับไปเช็กที่ค่าตัวเลขของตัวแปร invalid ในส่วนของ EXCEPTIONS ในโปรแกรม ztest ปรากฏว่าเป็นค่า 1 ดังนั้นระบบจึงให้ค่า 1 กับตัวแปร sy-subrc และเมื่อเรานำมาเช็กค่าจากคำสั่ง if sy-subrc = 1. เราจึงได้หน้าจอดังรูปที่ 17

ไม่ยากเลยใช่ไหมครับสำหรับการสร้างและเรียกใช้ฟังก์ชันในระบบ SAP ซึ่งจริงๆ และฟังก์ชันของระบบ SAP ก็คือโปรแกรม ABAP เราดีๆ นั่นเอง เพียงแต่ว่าเราไปสร้างไว้เป็นฟังก์ชันเก็บไว้ใน Function Library เพื่อให้โปรแกรมเรียกใช้ร่วมกันได้นั่นเอง แล้วพบกันใหม่ครับ

ที่มา : http://www.arip.co.th/articles.php?id=406433

ไม่มีความคิดเห็น:

แสดงความคิดเห็น