การแบ่งส่วนโมดูลของ ABAP: มาโคร, ซับรูทีน และฟังก์ชันโมดูล
⚡ สรุปอย่างชาญฉลาด
การแบ่งส่วนโมดูลใน ABAP จะจัดลำดับคำสั่งต่างๆ ไว้ในหน่วยที่สามารถนำกลับมาใช้ใหม่ได้ ซึ่งโปรแกรมหลักจะเรียกใช้โดยตรง หน้านี้จะอธิบายเกี่ยวกับมาโคร โปรแกรมแบบรวม (include programs) ซับรูทีน โมดูลฟังก์ชัน และกลุ่มฟังก์ชัน พร้อมด้วยไวยากรณ์ ตัวอย่าง และเกณฑ์การเลือกใช้สำหรับแต่ละเทคนิค

การแบ่งส่วนโมดูลใน ABAP คืออะไร?
เมื่อคุณทำการแบ่งโค้ดต้นฉบับออกเป็นโมดูล คุณจะวางลำดับของคำสั่ง ABAP ไว้ในโมดูล จากนั้น แทนที่จะวางคำสั่งทั้งหมดไว้ในโปรแกรมหลัก คุณก็แค่เรียกใช้โมดูลนั้น เมื่อโปรแกรมถูกสร้างขึ้น โค้ดต้นฉบับในหน่วยโมดูลจะถูกประมวลผลราวกับว่ามันมีอยู่จริงในโปรแกรมหลัก
ความจำเป็นของการทำให้เป็นโมดูล
- ปรับปรุงโครงสร้างของโปรแกรม
- ง่ายต่อการอ่านรหัส
- ง่ายต่อการรักษารหัส
- หลีกเลี่ยงความซ้ำซ้อนและส่งเสริมการนำโค้ดกลับมาใช้ใหม่
เทคนิคการทำให้เป็นโมดูลต่างๆ
- การใช้มาโคร
- การใช้ไฟล์รวม
- รูทีนย่อย
- โมดูลฟังก์ชัน
มาดูรายละเอียดแต่ละข้อกัน:
SAP- เอแบคมาโคร
ถ้าคุณต้องการใช้ชุดคำสั่งเดียวกันซ้ำมากกว่าหนึ่งครั้งในโปรแกรม คุณสามารถรวมไว้ในแมโครได้
คุณสามารถใช้มาโครได้เฉพาะภายในโปรแกรมที่กำหนดมาโครนั้นไว้เท่านั้น และสามารถเรียกใช้ได้เฉพาะในบรรทัดของโปรแกรมถัดจากบรรทัดที่กำหนดมาโครนั้นเท่านั้น
มาโครมีประโยชน์สำหรับการคำนวณที่ยาวนานหรือคำสั่งเขียนข้อมูลที่ซับซ้อน
วากยสัมพันธ์
DEFINE <macro_name> 'Macro Statements END-OF-DEFINITION
แมโครสามารถใช้พารามิเตอร์ได้ &N โดยที่ N = 1,2,3…
ตัวอย่าง:-
DATA: number1 TYPE I VALUE 1. DEFINE increment. ADD 1 to &1. WRITE &1. END-OF-DEFINITION. Increment number1. WRITE number1.
เอาต์พุต: 2
มาโครจะถูกขยายในระหว่างการคอมไพล์ภายในโปรแกรมเดียวเท่านั้น เมื่อต้องการใช้โค้ดเดียวกันร่วมกันระหว่างโปรแกรม จะใช้โปรแกรม include แทน
รวมโปรแกรมต่างๆ
โปรแกรมรวมมีไว้เพื่อการปรับซอร์สโค้ดแบบโมดูลาร์เท่านั้น และไม่มีส่วนต่อประสานพารามิเตอร์
คำสั่ง Include ช่วยให้คุณสามารถใช้ซอร์สโค้ดเดียวกันในโปรแกรมต่างๆ ได้ ซึ่งจะมีประโยชน์หากคุณมีคำสั่งประกาศข้อมูลที่ยาวและต้องการนำไปใช้ในโปรแกรมต่างๆ
วากยสัมพันธ์
Include <include program Name>
คะแนนหมายเหตุ
- รวมโปรแกรมไม่สามารถเรียกตัวเองได้
- รวมโปรแกรมจะต้องมีคำสั่งที่สมบูรณ์
ตัวอย่าง:
INCLUDE ZILX0004. WRITE: / 'User', SY-UNAME,/ 'Date', SY-DATUM. ================================ PROGRAM ZRPM0001. INCLUDE ZILX0004.
โปรแกรมแบบ Include ใช้โค้ดร่วมกัน แต่ไม่สามารถรับพารามิเตอร์ได้ ซับรูทีนจึงเข้ามาเพิ่มส่วนต่อประสานสำหรับการรับพารามิเตอร์ที่ขาดหายไปนี้
รูทีนย่อย
รูทีนย่อยเป็นขั้นตอนที่คุณสามารถกำหนดได้ โปรแกรมเอแบค และยังเรียกใช้จากโปรแกรมใดก็ได้ โดยปกติซับรูทีนจะถูกเรียกใช้จากภายใน ซึ่งหมายความว่าซับรูทีนจะประกอบด้วยส่วนของโค้ดหรืออัลกอริทึมที่ใช้บ่อยภายในเครื่อง หากคุณต้องการให้ฟังก์ชันนั้นสามารถนำมาใช้ซ้ำได้ทั่วทั้งระบบ ให้ใช้โมดูลฟังก์ชัน
ไวยากรณ์-
FORM <Subroutine> [<pass>]. <Statement block>. ENDFORM.
= ชื่อของรูทีนย่อย
= พารามิเตอร์ที่กำลังส่งผ่าน
ประเภทของรูทีนย่อย
- ภายใน
- รูทีนย่อยที่กำหนดไว้ในโปรแกรมเดียวกันที่ถูกเรียกใช้
- สามารถเข้าถึงออบเจ็กต์ข้อมูลทั้งหมดที่ประกาศไว้ในโปรแกรม ABAP/4 หลัก
- ภายนอก
- รูทีนย่อยที่กำหนดไว้ภายนอกโปรแกรมที่กำลังถูกเรียก
- จำเป็นต้องใช้ ตัวเลือกหรือประกาศวัตถุข้อมูลในส่วนทั่วไปของหน่วยความจำ
การเรียกรูทีนย่อย
รูทีนย่อยภายใน
PERFORM <subroutine> [<pass>]
= ชื่อของรูทีนย่อย
= พารามิเตอร์ที่กำลังส่งผ่าน
ข้อมูลที่ประกาศในโปรแกรมหลักจะพร้อมใช้งานโดยอัตโนมัติ
รูทีนย่อยภายนอก
PERFORM <subroutine>(<Program>) [<pass>]. PERFORM <subroutine> (<Program>) [<pass>] [IF FOUND]. PERFORM (<subroutine>) IN PROGRAM (<Program>) [<pass>] [IF FOUND]. PERFORM <index> OF <subroutine1> <subroutine2> <subroutine3> [<pass>].
คะแนนหมายเหตุ
- อนุญาตให้ใช้การโทรแบบซ้อนในรูทีนย่อย (เช่น PERFORM ภายใน FORM … ENDFORM )
- สามารถโทรซ้ำได้
- หากต้องการกำหนดข้อมูลในเครื่อง ให้ใช้คำสั่ง DATA หลัง FORM แต่ละครั้งที่คุณเข้าสู่รูทีนย่อย ข้อมูลจะถูกสร้างขึ้นใหม่ (ด้วยค่าเริ่มต้น) และปล่อยออกมาที่ส่วนท้าย (จากสแต็ก)
- หากต้องการกำหนดข้อมูลโกลบอลที่ใช้ภายในรูทีนย่อย ให้ใช้คำสั่ง LOCAL หลัง FORM ค่าจะถูกบันทึกเมื่อคุณเข้าสู่รูทีนย่อยแล้วปล่อยเมื่อสิ้นสุด (จากสแต็ก)
💡 เคล็ดลับ: ใน ABAP Objects นั้น ซับรูทีนถือว่าล้าสมัยแล้ว การพัฒนาใหม่ควรจัดวางตรรกะที่นำกลับมาใช้ใหม่ได้ไว้ในเมธอดของคลาส และใช้ฟังก์ชันโมดูลเมื่อต้องการอินเทอร์เฟซที่เปิดใช้งานจากระยะไกลหรืออินเทอร์เฟซระดับระบบ
โมดูลฟังก์ชัน
โมดูลฟังก์ชันเป็นรูทีน ABAP/4 วัตถุประสงค์ทั่วไปที่ใครๆ ก็สามารถใช้ได้ Infact มีโมดูลฟังก์ชันมาตรฐานให้เลือกมากมาย
โมดูลฟังก์ชันถูกจัดเป็นกลุ่มฟังก์ชัน: คอลเลกชันของฟังก์ชันที่เกี่ยวข้องกับตรรกะ โมดูลฟังก์ชันจะอยู่ในกลุ่มฟังก์ชันเสมอ
ไวยากรณ์-
FUNCTION <function module> <Statements> ENDFUNCTION.
ข้อมูลสำคัญที่เกี่ยวข้องกับโมดูลฟังก์ชัน
- การบริหารจัดการ
- นำเข้า/เปลี่ยน/ส่งออกพารามิเตอร์
- พารามิเตอร์ตาราง/ข้อยกเว้น
- เอกสาร
- ซอร์สโค้ด – L U01 . คือกลุ่มฟังก์ชั่น
- ข้อมูลทั่วโลก – L TOP ข้อมูลส่วนกลางสำหรับกลุ่มฟังก์ชัน- เข้าถึงได้จากโมดูลฟังก์ชันต่างๆ ในกลุ่มฟังก์ชัน
- โปรแกรมหลัก – SAPล - ประกอบด้วยรายการไฟล์รวมทั้งหมดสำหรับกลุ่มฟังก์ชันนั้น
เรียกโมดูลฟังก์ชัน
หากต้องการเรียกใช้โมดูลฟังก์ชัน ให้ใช้คำสั่ง CALL FUNCTION:
CALL FUNCTION <module> [EXPORTING f1 = a 1.... f n = a n] [IMPORTING f1 = a 1.... f n = a n] [CHANGING f1 = a 1.... f n = a n] [TABLES f1 = a 1.... f n = a n] [EXCEPTIONS e1 = r 1.... e n = r n [ERROR_MESSAGE = r E] [OTHERS = ro]].
โมดูลฟังก์ชันทุกตัวจะอยู่ภายในกลุ่มฟังก์ชัน ดังนั้นส่วนถัดไปจะอธิบายวิธีการทำงานของคอนเทนเนอร์นั้น
กลุ่มฟังก์ชั่น
กลุ่มฟังก์ชันคือคอนเทนเนอร์สำหรับโมดูลฟังก์ชัน Infact มีกลุ่มฟังก์ชั่นมาตรฐานจำนวนมาก
โมดูลฟังก์ชันทั้งหมดในกลุ่มฟังก์ชันสามารถเข้าถึงข้อมูลส่วนกลางของกลุ่มได้
เช่นเดียวกับโปรแกรมปฏิบัติการ (ประเภท 1) และ พูลโมดูล (ประเภท M) กลุ่มฟังก์ชันสามารถประกอบด้วยหน้าจอ หน้าจอการเลือก และรายการได้
คะแนนหมายเหตุ
- ไม่สามารถดำเนินการกลุ่มฟังก์ชันได้
- ชื่อของกลุ่มฟังก์ชันสามารถมีความยาวได้สูงสุด 26 อักขระ
- เมื่อคุณสร้างกลุ่มฟังก์ชันหรือโมดูลฟังก์ชัน โปรแกรมหลักและโปรแกรมที่รวมจะถูกสร้างขึ้นโดยอัตโนมัติ
- กลุ่มฟังก์ชันห่อหุ้มข้อมูล
วิธีสร้างกลุ่มฟังก์ชั่น
- ไปที่ธุรกรรม SE80
- เลือกโปรแกรมในเมนูแบบเลื่อนลง
- เขียนชื่อกลุ่มฟังก์ชั่นที่คุณต้องการสร้าง โดยทั่วไปกลุ่มฟังก์ชันที่ผู้ใช้สร้างจะเริ่มต้นด้วย "Z" เช่น - - กดปุ่ม Enter
- โปรดทราบว่าการรวม TOP จะถูกสร้างขึ้นตามค่าเริ่มต้น หากผู้ใช้เลือกตัวเลือกในการสร้างการรวม TOP
วิธีสร้างโมดูลฟังก์ชัน
- สร้างกลุ่มฟังก์ชัน (พูดว่า "ZCAL")
- สร้างโมดูลฟังก์ชัน ตั้งค่าคุณสมบัติ เช่น (กลุ่มฟังก์ชัน แอปพลิเคชัน ข้อความสั้น และประเภทกระบวนการ) แล้วบันทึก
- รวมไฟล์ “LZCALU01” จะมีซอร์สโค้ดของโมดูลฟังก์ชันแรก
- รวมไฟล์ “LZCALTOP” จะมีข้อมูลทั่วโลก
- โปรแกรมหลัก “SAPLZCAL” ประกอบด้วย
- ข้อมูลทั่วโลกรวมไฟล์ “LZCALTOP”
- โมดูลฟังก์ชันประกอบด้วยไฟล์ “LZCALUXX”
- ผู้ใช้กำหนด รวมไฟล์ “LZCALF..”, “LZCALO..” และ “LZCALI..”
- กำหนดพารามิเตอร์อินเทอร์เฟซและข้อยกเว้น
- เขียนซอร์สโค้ด
- เปิดใช้งานโมดูลฟังก์ชัน
- การทดสอบโมดูลฟังก์ชัน - การทดสอบและการดีบักครั้งเดียว
- การจัดทำเอกสารและการเผยแพร่โมดูลฟังก์ชัน
วิธีการเลือกเทคนิคการแบ่งส่วนโมดูลที่เหมาะสม
เทคนิคทั้งสี่อย่างนั้นมีความทับซ้อนกัน ดังนั้นการตัดสินใจจึงขึ้นอยู่กับขอบเขตของการนำไปใช้ซ้ำและว่าจำเป็นต้องมีอินเทอร์เฟซพารามิเตอร์หรือไม่
| เทคนิค | ขอบเขตของการนำกลับมาใช้ใหม่ | อินเทอร์เฟซพารามิเตอร์ | ใช้ดีที่สุดสำหรับ |
|---|---|---|---|
| แมโคร | โปรแกรมหนึ่ง หลังจากบรรทัดนิยาม | ตัวยึดตำแหน่ง &1 ถึง &9 | คำสั่งสั้นๆ ที่ซ้ำกัน การคำนวณที่ยาวนาน ผลลัพธ์การเขียนข้อมูลที่ซับซ้อน |
| รวมโปรแกรม | โปรแกรมใดก็ตามที่ตั้งชื่อรวมไว้ | ไม่มี | การประกาศข้อมูลที่ใช้ร่วมกันและซอร์สโค้ดที่ใช้ร่วมกัน |
| ซับรูทีน (ฟอร์ม) | ในพื้นที่ หรือภายนอก โดยใช้โปรแกรม PERFORM … IN PROGRAM | การใช้ การเปลี่ยน ตาราง | มีการนำตรรกะมาใช้ซ้ำบ่อยครั้งภายในโปรแกรมเดียวกัน |
| โมดูลฟังก์ชัน | ทั้งระบบ รวมถึงการโทรทางไกล | การนำเข้า การส่งออก การเปลี่ยนแปลง ตาราง ข้อยกเว้น | รูทีนที่ใช้ร่วมกันระหว่างแอปพลิเคชันต่างๆ และถูกห่อหุ้มไว้ในกลุ่มฟังก์ชัน |
กฎง่ายๆ ข้อหนึ่งครอบคลุมกรณีส่วนใหญ่: ใช้มาโครสำหรับการเขียนแบบย่อภายในโปรแกรมเดียว ใช้ include สำหรับการประกาศที่ใช้ร่วมกัน ใช้ซับรูทีนสำหรับตรรกะภายใน และใช้ฟังก์ชันโมดูลเมื่อใดก็ตามที่รูทีนนั้นต้องสามารถเรียกใช้งานได้จากทุกที่ในระบบ นั่นคือทั้งหมดเกี่ยวกับหลักการแบ่งส่วนโมดูลใน ABAP
