บทช่วยสอนหน้าจอย่อย ABAP: เรียกหน้าจอย่อยเข้า SAP
⚡ สรุปอย่างชาญฉลาด
ABAP Subscreens คือการฝังหน้าจอหนึ่งไว้ภายในพื้นที่ของอีกหน้าจอหนึ่งในระหว่างการทำงาน พร้อมด้วยตรรกะการไหลของข้อมูล หน้านี้จะอธิบายเกี่ยวกับพื้นที่ของ Subscreen คำสั่ง CALL SUBSCREEN ใน PBO และ PAI การถ่ายโอนข้อมูล และข้อจำกัดที่ทำให้เกิดข้อผิดพลาดในระหว่างการทำงาน
Subscreen คืออะไรใน SAP เอบัพ?
ก่อนที่คุณจะอ่านบทแนะนำนี้ โปรดตรวจสอบให้แน่ใจว่าคุณเข้าใจความหมายของคำว่า "ก่อน" โปรแกรมสนทนา เป็น
- หน้าจอย่อยคือหน้าจออิสระที่แสดงในพื้นที่ของหน้าจออื่น (“หน้าจอหลัก”)
- หน้าจอย่อยช่วยให้คุณสามารถฝังหน้าจอหนึ่งไว้ภายในอีกหน้าจอหนึ่งขณะรันไทม์ได้ คุณสามารถรวมหลายหน้าจอย่อยบนหน้าจอหลักได้
- คำว่าหน้าจอย่อยใช้กับทั้งหน้าจอที่คุณฝัง และพื้นที่บนหน้าจอหลักที่คุณวางไว้ บทช่วยสอนนี้เกี่ยวกับพื้นที่หน้าจอย่อย หน้าจอจริงที่สร้างขึ้นผ่านธุรกรรม SE51 เรียกว่าหน้าจอย่อยหากกำหนดไว้ในคุณลักษณะหน้าจอ
- เมื่อคุณใช้หน้าจอย่อย ลอจิกโฟลว์ของหน้าจอที่ฝังจะถูกฝังอยู่ในโฟลว์ลอจิกของหน้าจอหลักด้วย ดังนั้น การใช้หน้าจอย่อยบนหน้าจอก็เหมือนกับการใช้การรวมใน โปรแกรม ABAP.
หากต้องการใช้หน้าจอย่อย คุณต้องปฏิบัติตามสามขั้นตอนง่ายๆ
- กำหนดพื้นที่หน้าจอย่อยบนหน้าจอ
- กำหนดหน้าจอย่อยที่เหมาะสม
- รวมหน้าจอย่อยไว้ในพื้นที่หน้าจอย่อย
นอกจากนี้ คุณต้องปรับกรอบของหน้าจอย่อยและหน้าจอหลักด้วย คุณต้องตั้งชื่อในช่องชื่อฟิลด์
นอกจากนี้ คุณยังต้องปรับฟิลด์ภายในหน้าจอย่อยเพื่อให้ปรากฏในหน้าจอหลักด้วย ในกรณีที่กำหนดหน้าจอย่อยให้ใหญ่กว่าพื้นที่ที่มีอยู่ในหน้าจอหลัก จะมองเห็นเฉพาะส่วนของหน้าจอย่อยที่เหมาะกับพื้นที่ที่มีอยู่เท่านั้น พื้นที่จะวัดจากมุมซ้ายบนของหน้าจอเสมอ ดังนั้นคุณควรดูแลอย่างเหมาะสมในขณะกำหนดพื้นที่หน้าจอย่อยและสร้างหน้าจอย่อย
โทรหน้าจอย่อย
ตัวอย่าง
ตัวอย่างเช่น เราได้กำหนดพื้นที่หน้าจอย่อยสองหน้าจอบนหน้าจอหลัก และได้แนบหน้าจอย่อยสองหน้าจอที่แตกต่างกันเข้ากับพื้นที่ที่เกี่ยวข้อง เมื่อใดก็ตามที่มีการเรียกหน้าจอหลัก PBO ของหน้าจอหลักจะถูกเรียก แต่ก่อนการแสดงผล จะเรียก PBO ของแต่ละหน้าจอที่แนบมากับพื้นที่หน้าจอย่อยบนหน้าจอหลักด้วย
ภาพหน้าจอแสดงหน้าจอหลักที่มีพื้นที่หน้าจอย่อยสองส่วน ซึ่งแต่ละส่วนถูกเติมเต็มด้วยหน้าจอย่อยสองหน้าแยกกัน
คุณสามารถรวมหน้าจอย่อยได้โดยใช้คำสั่ง CALL SUBSCREEN ในโฟลว์ลอจิกของหน้าจอหลัก
การเรียกใช้งานซับสกรีนใน PBO
หากต้องการรวมหน้าจอย่อยในพื้นที่หน้าจอย่อยของหน้าจอหลักและเรียกใช้ตรรกะการไหล PBO ให้ใช้คำสั่งต่อไปนี้ในเหตุการณ์ PBO ของหน้าจอหลัก:
PROCESS BEFORE OUTPUT. CALL SUBSCREEN <area> INCLUDING [<prog>] <dynp>.
คำสั่งนี้กำหนดหมายเลขให้กับหน้าจอย่อย ไปยังบริเวณหน้าจอย่อยที่เรียกว่า - คุณยังสามารถระบุโปรแกรมที่จะกำหนดหน้าจอย่อยได้ (ตัวเลือก) หากคุณไม่ระบุโปรแกรมอย่างชัดเจน ระบบจะค้นหาหน้าจอย่อยในโปรแกรม ABAP เดียวกันกับโปรแกรมหลัก หากไม่พบหน้าจอย่อยที่เกี่ยวข้อง จะเกิดข้อผิดพลาดรันไทม์ขึ้น ตรรกะการไหลของ PBO ของหน้าจอย่อยจะรวมอยู่ที่จุดเดียวกันด้วย ซึ่งสามารถเรียกโมดูล PBO ของโปรแกรม ABAP ที่กำหนดหน้าจอย่อยได้ ที่ส่วนท้ายของ PBO ของหน้าจอย่อย ฟิลด์ส่วนกลางจากโปรแกรมจะถูกส่งผ่านไปยังฟิลด์หน้าจอที่มีชื่อเหมือนกันในหน้าจอย่อย ตรรกะการไหลของ PBO ของหน้าจอย่อยสามารถรวมหน้าจอย่อยเพิ่มเติมได้
ชื่อ ของพื้นที่หน้าจอย่อยต้องป้อนโดยตรงโดยไม่มีลูกน้ำกลับหัว คุณสามารถระบุชื่อได้ และ ไม่ว่าจะเป็นตัวอักษรหรือตัวแปร หากคุณใช้ตัวแปร คุณต้องประกาศและเติมตัวแปรที่มีชื่อเหมือนกันในโปรแกรม ABAP หมายเลขหน้าจอ ต้องมีความยาว 4 ตัวอักษร หากคุณไม่ได้กำหนดหน้าจอย่อยให้กับพื้นที่ หน้าจอนั้นจะยังคงว่างเปล่า
การเรียกหน้าจอย่อยใน PAI
ในการเรียกตรรกะการไหลของ PAI ของหน้าจอย่อย ให้ใช้คำสั่งต่อไปนี้ในตรรกะการไหลของ PAI ของหน้าจอหลัก:
PROCESS AFTER INPUT. CALL SUBSCREEN <area>.
คำสั่งนี้รวมถึงตรรกะการไหลของ PAI ของหน้าจอย่อยที่รวมอยู่ในพื้นที่หน้าจอย่อย ในงาน ป.ป.ช. ซึ่งสามารถเรียกโมดูล PAI ของโปรแกรม ABAP ที่กำหนดหน้าจอย่อยได้ ข้อมูลจะถูกส่งระหว่างฟิลด์ที่มีชื่อเหมือนกันในหน้าจอย่อยและโปรแกรม ABAP เมื่อมีการทริกเกอร์เหตุการณ์ PAI หรือที่คำสั่ง FIELD ที่สอดคล้องกันในลอจิกโฟลว์ PAI ของหน้าจอย่อย
วิธีการสร้างและฝังหน้าจอย่อย
ขั้นตอนทั้งสามที่กล่าวไว้ข้างต้นนั้นดำเนินการในหน้าจอ Painter และในตรรกะการทำงานของหน้าจอหลัก ลำดับด้านล่างนี้จะสร้างหน้าจอหลักหนึ่งหน้าจอที่มีพื้นที่หน้าจอย่อยหนึ่งพื้นที่
- สร้างพื้นที่หน้าจอย่อย: เปิดหน้าจอหลัก เช่น หน้าจอ 100 ในเมนูหน้าจอ Painter (SE51) เลือก หน้าจอย่อย เลือกองค์ประกอบจากแถบองค์ประกอบ วาดลงบนเลย์เอาต์ และป้อนชื่อ เช่น SUB_AREA ในช่องชื่อ ชื่อนี้จะถูกนำไปใช้ในคำสั่ง CALL SUBSCREEN ในภายหลัง
- สร้างหน้าจอย่อย: สร้างหน้าจอที่สอง เช่น หน้าจอ 110 และตั้งค่าประเภทหน้าจอเป็น หน้าจอย่อย ในส่วนของแอตทริบิวต์ หน้าจอย่อยไม่มีช่องรหัส OK และไม่มีสถานะ GUI ของตัวเอง
- ระบุตำแหน่งช่องข้อมูล: วาดช่องป้อนข้อมูลบนหน้าจอ 110 จัดวางเลย์เอาต์ให้อยู่ภายในขนาดของพื้นที่ย่อยหน้าจอ เนื่องจากจะแสดงเฉพาะส่วนที่พอดีเท่านั้น โดยวัดจากมุมบนซ้าย
- ประกาศข้อมูลทั่วโลก: วางฟิลด์เหล่านั้นไว้ในส่วน include ด้านบนของ module pool เพื่อให้ทั้งหน้าจอหลักและหน้าจอย่อยอ่านค่าตัวแปรส่วนกลางเดียวกัน
- เรียกใช้งานหน้าจอย่อย: เพิ่มคำสั่ง CALL SUBSCREEN ลงใน PBO และ PAI ของหน้าจอหลัก ดังแสดงด้านล่าง
- เปิดใช้งานและทดสอบ: เปิดใช้งานหน้าจอและโปรแกรม จากนั้นเริ่มการทำธุรกรรม พื้นที่หน้าจอย่อยจะถูกเติมเต็มด้วยหน้าจอ 110 และโมดูลต่างๆ จะทำงานภายในตรรกะการทำงานของหน้าจอ 100
* Flow logic of the main screen 100 PROCESS BEFORE OUTPUT. MODULE status_0100. CALL SUBSCREEN sub_area INCLUDING 'SAPMZDEMO' '0110'. PROCESS AFTER INPUT. CALL SUBSCREEN sub_area. MODULE user_command_0100.
💡 เคล็ดลับ: เมื่อพื้นที่นั้นต้องแสดงหน้าจอย่อยที่แตกต่างกันไปตามข้อมูลที่ผู้ใช้ป้อน ให้เก็บหมายเลขหน้าจอไว้ในตัวแปรส่วนกลางแทนที่จะเก็บไว้ในค่าคงที่ ตัวแปรนั้นต้องมีชื่อเดียวกันทั้งในโปรแกรมและในคำสั่ง CALL SUBSCREEN
สิ่งที่น่าจดจำ
- ชื่อขององค์ประกอบของหน้าจอย่อยภายในหน้าจอไม่ควรซ้ำกัน
- คุณไม่ควรแนบ OK_CODE หรือ FCODE เข้ากับหน้าจอย่อย OK_CODE ของหน้าจอหลักคือ OK_CODE ของหน้าจอย่อย
- หน้าจอย่อยไม่สามารถมีโมดูลกล่องโต้ตอบใด ๆ ที่มี SET TITLEBAR, SET PF-STATUS, SET SCREEN, LEAVE SCREEN หรือ LEAVE TO SCREEN ซึ่งจะทำให้เกิดข้อผิดพลาดรันไทม์
- คุณต้องเรียกมันในโฟลว์ลอจิก (ทั้ง PBO และ PAI) ของหน้าจอหลัก
- ไม่อนุญาตให้ใช้ CALL SUBSCREEN ในคำสั่ง CHAIN..ENDCHAIN และ LOOP ENDLOOP
- ไม่สามารถมีโมดูล AT EXIT-COMMAND
- ฟิลด์ที่คุณใช้คือฟิลด์ส่วนกลาง จะต้องประกาศไว้ด้านบนสุด ได้แก่
- หากใช้หน้าจอย่อยจากที่อื่น โปรแกรมโต้ตอบ การถ่ายโอนข้อมูลจะไม่เกิดขึ้นเว้นแต่คุณจะเพิ่มรหัสเฉพาะ
⚠️คำเตือน: การวางคำสั่ง CALL SUBSCREEN ไว้ภายใน CHAIN … ENDCHAIN หรือภายในลูปของหน้าจอ จะทำให้เกิดข้อผิดพลาดทางไวยากรณ์ และการเรียกหมายเลขหน้าจอที่ไม่มีอยู่จริงจะทำให้เกิดข้อผิดพลาดขณะรันไทม์ในการแสดงผลครั้งแรก


