การแบ่งส่วนโมดูลของ ABAP: มาโคร, ซับรูทีน และฟังก์ชันโมดูล

⚡ สรุปอย่างชาญฉลาด

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

  • 🧩 หลักการสำคัญ: หน่วยการแบ่งส่วนย่อยจะถูกสร้างขึ้นราวกับว่าซอร์สโค้ดของหน่วยนั้นมีอยู่จริงในโปรแกรมที่เรียกใช้ ดังนั้นโครงสร้างจึงดีขึ้นโดยไม่เสียค่าใช้จ่ายด้านเวลาในการทำงาน
  • มาโคร: กำหนดค่าด้วย DEFINE และ END-OF-DEFINITION สามารถใช้งานได้เฉพาะภายในโปรแกรมที่กำหนดค่าเท่านั้น และเฉพาะหลังบรรทัดการกำหนดค่าเท่านั้น
  • 📄 รวมโปรแกรม: ไม่มีอินเทอร์เฟซสำหรับส่งพารามิเตอร์ และมีอยู่เพื่อใช้ในการแบ่งปันซอร์สโค้ด เช่น การประกาศข้อมูลขนาดใหญ่ ระหว่างโปรแกรมหลายโปรแกรมเท่านั้น
  • 🔁 ซับรูทีน: ประกาศด้วย FORM และ ENDFORM เรียกใช้ด้วย PERFORM และเหมาะสำหรับตรรกะที่นำกลับมาใช้ซ้ำเฉพาะที่ภายในโปรแกรมเดียว
  • 🧱 โมดูลฟังก์ชัน: รูทีนระดับระบบที่มีอินเทอร์เฟซแบบกำหนดประเภทสำหรับนำเข้า ส่งออก เปลี่ยนแปลง พารามิเตอร์ตาราง และข้อยกเว้น
  • 📦 กลุ่มฟังก์ชัน: คอนเทนเนอร์ที่มีข้อมูลส่วนกลางที่ใช้ร่วมกันโดยทุกโมดูลฟังก์ชันภายใน ซึ่งสร้างขึ้นโดยอัตโนมัติด้วยไฟล์รวม TOP และ UXX
  • 🧭 กฎการเลือก: เลือกใช้มาโครสำหรับคำสั่งย่อเฉพาะที่ เลือกใช้ซับรูทีนสำหรับตรรกะเฉพาะที่ และใช้ฟังก์ชันโมดูลเมื่อรูทีนนั้นต้องสามารถนำกลับมาใช้ซ้ำได้ทั่วทั้งระบบ

การแบ่งส่วนโมดูลใน ABAP

การแบ่งส่วนโมดูลใน 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.

= ชื่อของรูทีนย่อย

= พารามิเตอร์ที่กำลังส่งผ่าน

ประเภทของรูทีนย่อย

  1. ภายใน
    • รูทีนย่อยที่กำหนดไว้ในโปรแกรมเดียวกันที่ถูกเรียกใช้
    • สามารถเข้าถึงออบเจ็กต์ข้อมูลทั้งหมดที่ประกาศไว้ในโปรแกรม ABAP/4 หลัก
  2. ภายนอก
    • รูทีนย่อยที่กำหนดไว้ภายนอกโปรแกรมที่กำลังถูกเรียก
    • จำเป็นต้องใช้ ตัวเลือกหรือประกาศวัตถุข้อมูลในส่วนทั่วไปของหน่วยความจำ

การเรียกรูทีนย่อย

รูทีนย่อยภายใน

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 อักขระ
  • เมื่อคุณสร้างกลุ่มฟังก์ชันหรือโมดูลฟังก์ชัน โปรแกรมหลักและโปรแกรมที่รวมจะถูกสร้างขึ้นโดยอัตโนมัติ
  • กลุ่มฟังก์ชันห่อหุ้มข้อมูล

วิธีสร้างกลุ่มฟังก์ชั่น

  1. ไปที่ธุรกรรม SE80
  2. เลือกโปรแกรมในเมนูแบบเลื่อนลง
  3. เขียนชื่อกลุ่มฟังก์ชั่นที่คุณต้องการสร้าง โดยทั่วไปกลุ่มฟังก์ชันที่ผู้ใช้สร้างจะเริ่มต้นด้วย "Z" เช่น - - กดปุ่ม Enter
  4. โปรดทราบว่าการรวม TOP จะถูกสร้างขึ้นตามค่าเริ่มต้น หากผู้ใช้เลือกตัวเลือกในการสร้างการรวม TOP

วิธีสร้างโมดูลฟังก์ชัน

  1. สร้างกลุ่มฟังก์ชัน (พูดว่า "ZCAL")
  2. สร้างโมดูลฟังก์ชัน ตั้งค่าคุณสมบัติ เช่น (กลุ่มฟังก์ชัน แอปพลิเคชัน ข้อความสั้น และประเภทกระบวนการ) แล้วบันทึก
  3. รวมไฟล์ “LZCALU01” จะมีซอร์สโค้ดของโมดูลฟังก์ชันแรก
  4. รวมไฟล์ “LZCALTOP” จะมีข้อมูลทั่วโลก
  5. โปรแกรมหลัก “SAPLZCAL” ประกอบด้วย
    • ข้อมูลทั่วโลกรวมไฟล์ “LZCALTOP”
    • โมดูลฟังก์ชันประกอบด้วยไฟล์ “LZCALUXX”
    • ผู้ใช้กำหนด รวมไฟล์ “LZCALF..”, “LZCALO..” และ “LZCALI..”
  6. กำหนดพารามิเตอร์อินเทอร์เฟซและข้อยกเว้น
  7. เขียนซอร์สโค้ด
  8. เปิดใช้งานโมดูลฟังก์ชัน
  9. การทดสอบโมดูลฟังก์ชัน - การทดสอบและการดีบักครั้งเดียว
  10. การจัดทำเอกสารและการเผยแพร่โมดูลฟังก์ชัน

วิธีการเลือกเทคนิคการแบ่งส่วนโมดูลที่เหมาะสม

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

เทคนิค ขอบเขตของการนำกลับมาใช้ใหม่ อินเทอร์เฟซพารามิเตอร์ ใช้ดีที่สุดสำหรับ
แมโคร โปรแกรมหนึ่ง หลังจากบรรทัดนิยาม ตัวยึดตำแหน่ง &1 ถึง &9 คำสั่งสั้นๆ ที่ซ้ำกัน การคำนวณที่ยาวนาน ผลลัพธ์การเขียนข้อมูลที่ซับซ้อน
รวมโปรแกรม โปรแกรมใดก็ตามที่ตั้งชื่อรวมไว้ ไม่มี การประกาศข้อมูลที่ใช้ร่วมกันและซอร์สโค้ดที่ใช้ร่วมกัน
ซับรูทีน (ฟอร์ม) ในพื้นที่ หรือภายนอก โดยใช้โปรแกรม PERFORM … IN PROGRAM การใช้ การเปลี่ยน ตาราง มีการนำตรรกะมาใช้ซ้ำบ่อยครั้งภายในโปรแกรมเดียวกัน
โมดูลฟังก์ชัน ทั้งระบบ รวมถึงการโทรทางไกล การนำเข้า การส่งออก การเปลี่ยนแปลง ตาราง ข้อยกเว้น รูทีนที่ใช้ร่วมกันระหว่างแอปพลิเคชันต่างๆ และถูกห่อหุ้มไว้ในกลุ่มฟังก์ชัน

กฎง่ายๆ ข้อหนึ่งครอบคลุมกรณีส่วนใหญ่: ใช้มาโครสำหรับการเขียนแบบย่อภายในโปรแกรมเดียว ใช้ include สำหรับการประกาศที่ใช้ร่วมกัน ใช้ซับรูทีนสำหรับตรรกะภายใน และใช้ฟังก์ชันโมดูลเมื่อใดก็ตามที่รูทีนนั้นต้องสามารถเรียกใช้งานได้จากทุกที่ในระบบ นั่นคือทั้งหมดเกี่ยวกับหลักการแบ่งส่วนโมดูลใน ABAP

คำถามที่พบบ่อย

มาโครจะถูกขยายเมื่อสร้างขึ้นและใช้งานได้เฉพาะภายในโปรแกรมที่กำหนดมันเท่านั้น ส่วนซับรูทีนเป็นขั้นตอนการทำงานจริงที่มีอินเทอร์เฟซพารามิเตอร์แบบกำหนดประเภท ซึ่งสามารถเรียกใช้จากโปรแกรมอื่นได้ด้วยคำสั่ง PERFORM

โมดูลฟังก์ชันที่มีประเภทการประมวลผลตั้งค่าเป็น Remote-Enabled Module สามารถเรียกจากโมดูลอื่นได้ SAP อาจมาจากระบบภายในหรือจากแอปพลิเคชันภายนอก พารามิเตอร์จะต้องถูกส่งผ่านโดยค่า และข้อยกเว้นจะถูกจัดการในฐานะความล้มเหลวของระบบ

ไม่สามารถตรวจสอบการทำงานของมาโครทีละบรรทัดในดีบักเกอร์ได้ เนื่องจากมาโครจะถูกขยายก่อนที่จะสร้างขึ้น เมื่อต้องการดีบักแบบบรรทัดต่อบรรทัด ควรย้ายตรรกะไปไว้ในซับรูทีนหรือเมธอด และควรจำกัดมาโครให้มีคำสั่งสั้นๆ เท่านั้น

เครื่องมือช่วยเขียนโค้ด AI ภายในโปรแกรมพัฒนา ABAP สามารถร่างโครงร่างของโมดูลฟังก์ชัน อินเทอร์เฟซพารามิเตอร์ และข้อยกเว้นได้จากคำอธิบายธรรมดา นักพัฒนาซอฟต์แวร์ยังคงต้องตรวจสอบตรรกะ เปิดใช้งานโมดูล และทดสอบก่อนส่งใช้งาน

เครื่องมือ AI จะสแกนโปรแกรม ตรวจจับบล็อกที่ซ้ำกัน และแนะนำว่าควรเพิ่มซับรูทีน เมธอด หรือโมดูลฟังก์ชันที่ใดtracเท็ด. ข้อเสนอแนะนี้ช่วยเร่งกระบวนการปรับปรุงโครงสร้างโค้ด แต่การทดสอบหน่วยยังคงจำเป็นเพื่อยืนยันว่าพฤติกรรมเหมือนกันทุกประการ

สรุปโพสต์นี้ด้วย: