SAP ตารางภายใน ABAP: สร้าง อ่าน เติม คัดลอก และลบ
⚡ สรุปอย่างชาญฉลาด
SAP อ็อบเจ็กต์ตารางภายในของ ABAP เก็บข้อมูลจากโครงสร้างคงที่เพื่อนำไปใช้แบบไดนามิกภายในโปรแกรม หน้านี้อธิบายเกี่ยวกับพื้นที่ทำงาน บรรทัดส่วนหัว วิธีการสร้างทั้งสี่วิธี และคำสั่งที่ใช้ในการเติมข้อมูล คัดลอก อ่าน และลบแถวในตาราง

ตารางภายในคืออะไร?
ตารางภายใน ใช้เพื่อรับข้อมูลจากโครงสร้างคงที่สำหรับการใช้งานแบบไดนามิกใน ABAP แต่ละบรรทัดในตารางภายในมีโครงสร้างฟิลด์เหมือนกัน การใช้งานหลักสำหรับตารางภายในคือการจัดเก็บและจัดรูปแบบข้อมูลจากตารางฐานข้อมูลภายในโปรแกรม
โต๊ะภายในมักใช้งานร่วมกับพื้นที่ทำงาน ดังนั้นแนวคิดนี้จึงเป็นเรื่องต่อไป
พื้นที่ทำงานคืออะไร?
พื้นที่ทำงานคือแถวข้อมูลเดี่ยวๆ ควรมีรูปแบบเดียวกันกับตารางภายในอื่นๆ ใช้สำหรับประมวลผลข้อมูลในตารางภายในทีละบรรทัด
ความแตกต่างระหว่างโต๊ะภายในและพื้นที่ทำงานคืออะไร?
รูปภาพแทนคำพูดได้นับพันคำ
แผนภาพแสดงตารางที่มีหลายแถว ในขณะที่พื้นที่ทำงานแสดงเฉพาะแถวที่กำลังประมวลผลอยู่เท่านั้น พื้นที่ทำงานนั้นถูกสร้างขึ้นโดยระบบหรือโดยนักพัฒนา ขึ้นอยู่กับประเภทของตารางที่อธิบายไว้ด้านล่าง
ประเภทของตารางภายใน
ตารางภายในมีสองประเภท
- ตารางภายในที่มีบรรทัด HEADER
- ตารางภายในที่ไม่มีบรรทัด HEADER
ตารางภายในพร้อมบรรทัดส่วนหัว
- ที่นี่ระบบจะสร้างพื้นที่ทำงานโดยอัตโนมัติ
- พื้นที่ทำงานมีประเภทข้อมูลเดียวกันกับตารางภายใน
- พื้นที่งานนี้เรียกว่าบรรทัด HEADER
- ที่นี่เป็นที่ที่การเปลี่ยนแปลงทั้งหมดหรือการดำเนินการใดๆ กับเนื้อหาของตารางเสร็จสิ้นแล้ว ด้วยเหตุนี้จึงสามารถแทรกบันทึกลงในตารางได้โดยตรงหรือเข้าถึงได้จากตารางภายในได้โดยตรง
ตารางภายในที่ไม่มีบรรทัดส่วนหัว :
- ที่นี่ไม่มีพื้นที่ทำงานที่เกี่ยวข้องกับตาราง
- พื้นที่ทำงานจะต้องระบุอย่างชัดเจนเมื่อเราต้องการเข้าถึงตารางดังกล่าว
- ดังนั้นจึงไม่สามารถเข้าถึงตารางเหล่านี้ได้โดยตรง
💡 เคล็ดลับ: ตารางที่มีบรรทัดส่วนหัวจะใช้ชื่อเดียวกันทั้งสำหรับตารางและพื้นที่ทำงาน ซึ่งทำให้โค้ดไม่ชัดเจน โปรแกรมใหม่ควรประกาศตารางโดยไม่มีบรรทัดส่วนหัวและส่งค่าพื้นที่ทำงานที่ระบุอย่างชัดเจน
ตารางภายในแบบมาตรฐาน แบบเรียงลำดับ และแบบแฮช
นอกเหนือจากความแตกต่างของบรรทัดหัวตารางแล้ว ตารางภายในทุกตารางยังมีชนิดของตารางที่กำหนดวิธีการค้นหาแถว ชนิดของตารางจะถูกเลือกด้วยส่วนเพิ่มเติม TYPE STANDARD TABLE, TYPE SORTED TABLE หรือ TYPE HASHED TABLE และมีผลโดยตรงต่อการทำงานในขณะรันไทม์
| โต๊ะชนิด | วิธีการเข้าถึง | คีย์ | ใช้ดีที่สุดสำหรับ |
|---|---|---|---|
| Standard | ดัชนีและคีย์ พร้อมการค้นหาเชิงเส้นบนคีย์ | ไม่เหมือนใคร | การประมวลผลตามลำดับ และการอ่านตารางขนาดเล็กโดยใช้ดัชนี |
| เรียง | ดัชนีและคีย์ โดยใช้การค้นหาแบบไบนารีบนคีย์ | ไม่ว่าจะเป็นข้อมูลที่ไม่ซ้ำกัน ระบบจะจัดเรียงข้อมูลโดยอัตโนมัติ | ตารางขนาดใหญ่จะอ่านข้อมูลซ้ำๆ ผ่านฟิลด์หลักสำคัญ |
| แฮช | เฉพาะคีย์เท่านั้น พร้อมด้วยอัลกอริธึมแฮช | เป็นเอกลักษณ์ | ตารางขนาดใหญ่มากที่อ่านข้อมูลโดยใช้คีย์ทั้งหมดเสมอ เช่น บัฟเฟอร์ของระเบียนฐานข้อมูล |
ตารางมาตรฐานเป็นค่าเริ่มต้นและเหมาะสำหรับการประมวลผลแบบเรียงลำดับ ส่วนตารางแฮชจะรักษาเวลาในการเข้าถึงให้คงที่ ไม่ว่าจะมีจำนวนแถวที่จัดเก็บกี่แถวก็ตาม ซึ่งเป็นเหตุผลว่าทำไมจึงมีประสิทธิภาพดีกว่าตารางแฮช เปิด SQL แนะนำให้ใช้สำหรับบัฟเฟอร์ข้อมูล
การสร้างตารางภายใน
มีหลายวิธีในการสร้างตารางภายใน มาดูพวกเขาทีละคน -
1.โดยใช้คำสั่งประเภท
ต่อไปนี้เราจะสร้างตารางภายใน (itab) โดยใช้คำสั่ง TYPE กัน
ไวยากรณ์คือ -
Types : begin of line, column1 type I, column2 type I, end of line.
ตัวอย่าง:
TYPES : begin of line, empno type I, empname(20) type c , end of line.
คำสั่ง TYPES สร้างเส้นโครงสร้างตามที่กำหนดไว้
ในการสร้าง Internal Table itab จริงๆ ให้ใช้คำสั่งต่อไปนี้
Data itab type line occurs 10.
itab ตารางภายในถูกสร้างขึ้นด้วยโครงสร้างของเส้น นอกเหนือจากการประกาศโครงสร้างของตารางภายในแล้ว ส่วนคำสั่ง OCCURS ยังกำหนดจำนวนรายการตารางที่ถูกเก็บรักษาไว้ในที่เก็บข้อมูลหลัก (ในกรณีนี้คือ 10) เร็กคอร์ดพิเศษจะถูกเขียนลงในพื้นที่การเพจ และอาจส่งผลต่อประสิทธิภาพการทำงาน
2.โดยอ้างอิงถึงตารางอื่น
คุณสามารถสร้างตารางภายในโดยอ้างอิงจากตารางที่มีอยู่แล้วได้ ตารางที่มีอยู่แล้วนั้นอาจเป็นตารางมาตรฐานก็ได้ SAP ตาราง ตาราง Z หรือตารางภายในอื่น
ไวยากรณ์-
Data <f> <type> [with header line].
ตัวอย่าง-
DATA itab TYPE line OCCURS 10 with header line.
ที่นี่ itab ตารางภายในจะถูกสร้างขึ้นจากบรรทัดประเภทที่มีบรรทัดส่วนหัว โปรดทราบว่า "พร้อมบรรทัดส่วนหัว" เป็นทางเลือก
3.โดยอ้างอิงถึงโครงสร้างที่มีอยู่
ไวยากรณ์-
Data <f> LIKE <struct> occurs n [with header line].
ตัวอย่าง-
DATA itab LIKE sline OCCURS 10.
ในที่นี้ ตาราง itab ถูกสร้างขึ้นโดยมีโครงสร้างเหมือนกับตาราง sline
4.โดยการสร้างโครงสร้างใหม่
ให้เราสร้างตารางภายในด้วยโครงสร้างของเราเอง ที่นี่ตารางจะถูกสร้างขึ้นด้วยบรรทัดส่วนหัว โดยค่าเริ่มต้น.
ไวยากรณ์ –
Data : Begin of <f> occurs <n>, <component declaration>, ................................, End of <f>.
ตัวอย่าง -
Data : Begin of itab occurs 10, column1 type I, column2(4) type C, column3 like mara-ernam, End of itab.
ตารางภายใน itab ถูกสร้างขึ้น
ตารางที่ว่างเปล่านั้นไม่มีประโยชน์ ดังนั้นในส่วนถัดไปจึงเป็นการเติมแถวลงในตารางนั้น
การเติมตารางภายใน
ตอนนี้เราได้สร้างตารางภายในสำเร็จแล้ว มาดูกันว่าเราจะเติมข้อมูลเหล่านั้นด้วยเรกคอร์ดได้อย่างไร มีหลายวิธีในการเติมข้อมูลตาราง
1. ผนวกข้อมูลทีละบรรทัด
วิธีแรกที่ใช้ได้คือการใช้คำสั่ง APPEND
การใช้คำสั่ง APPEND ทำให้เราสามารถเพิ่มหนึ่งบรรทัดจากพื้นที่ทำงานอื่นไปยังตารางภายใน หรือเราสามารถเพิ่มบรรทัดเริ่มต้นหนึ่งบรรทัดลงในตารางภายในได้
ไวยากรณ์ –
APPEND [<wa> TO / INITIAL LINE TO] <itable>.
ที่นี่พื้นที่ทำงาน หรือบรรทัดเริ่มต้นถูกต่อท้ายตารางภายใน -
ตัวแปรระบบ SY-TABIX มีดัชนีของบรรทัดที่ต่อท้าย
ตัวอย่าง:
Data: Begin of itab occurs 10, col1 type C, col2 type I, end of itab. Append initial line to itab.
ผลลัพธ์ : ' ' '0'
คำสั่ง Initial lines จะเพิ่มบรรทัดที่เริ่มต้นด้วยค่าที่ถูกต้องสำหรับชนิดของข้อมูลในตาราง ในที่นี้ col1 เป็นอักขระ และ col2 เป็นจำนวนเต็ม จากนั้นคำสั่ง APPEND initial line จะเพิ่มบรรทัดที่เริ่มต้นด้วยค่าที่ถูกต้องสำหรับชนิดของข้อมูลในคอลัมน์ เช่น เว้นวรรคสำหรับ col1 และ 0 สำหรับ col2
2.การใช้คำสั่ง COLLECT
COLLECT เป็นคำสั่งอีกรูปแบบหนึ่งที่ใช้สำหรับการเติมข้อมูลในตารางภายใน โดยทั่วไป COLLECT จะใช้ในขณะที่แทรกบรรทัดลงในตารางภายในด้วยคีย์มาตรฐานเฉพาะ
ไวยากรณ์-
COLLECT [<wa> INTO] <itable>.
ในกรณีที่ตารางมีบรรทัดส่วนหัว ตัวเลือก INTO จะถูกละเว้น สมมติว่ามีรายการที่มีคีย์เหมือนกับรายการที่คุณพยายามจะผนวกอยู่แล้ว ไม่มีการเพิ่มบรรทัดใหม่ลงในตาราง แต่มีการเพิ่มช่องตัวเลขของทั้งสองรายการและมีเพียงรายการเดียวที่สอดคล้องกับคีย์เท่านั้นที่มีอยู่ . ค่าของ SY-TABIX จะถูกเปลี่ยนเป็นแถวของรายการต้นฉบับ COLLECT อื่นทำหน้าที่คล้ายกับ APPEND และ SY-TABIX มีดัชนีของบรรทัดที่ประมวลผล
3. การใช้คำสั่ง INSERT
คำสั่ง INSERT เพิ่มเส้น/พื้นที่ทำงานให้กับตารางภายใน คุณสามารถระบุตำแหน่งที่จะเพิ่มบรรทัดใหม่ได้โดยใช้คำสั่งย่อย INDEX กับคำสั่ง INSERT
วากยสัมพันธ์
INSERT [<wa> INTO / INITIAL LINE INTO] <itable> [index <idx>].
นี่คือพื้นที่ทำงาน หรือชื่อย่อ LINE ถูกแทรกเข้าไปในตารางภายใน ที่ดัชนี .
การคัดลอกตารางภายใน
สามารถคัดลอกเนื้อหาจากตารางภายในหนึ่งไปยังอีกตารางหนึ่งได้โดยใช้คำสั่ง APPEND LINEส หรือ อินเสิร์ต LINEคำสั่ง S วิธีที่ง่ายกว่าคือการใช้ไวยากรณ์ใดๆ ต่อไปนี้
MOVE <itab1> To <itab2>. OR <itab1> = <itab2>.
สิ่งเหล่านี้คัดลอกเนื้อหาของ ITAB1 ไปยัง ITAB2 ในกรณีของตารางภายในที่มีบรรทัดส่วนหัว เราต้องใช้ [] เพื่อแยกความแตกต่างจากพื้นที่ทำงาน ดังนั้นในการคัดลอกเนื้อหาของตารางภายในด้วยบรรทัดส่วนหัวไวยากรณ์จะกลายเป็น
itab1[] = itab2[].
อ่านตารางภายใน
ตอนนี้เราคุ้นเคยกับการสร้างตารางภายในและการใส่ข้อมูลลงในตารางเหล่านั้นแล้ว ต่อไปเราจะมาดูวิธีการใช้งานข้อมูลหรือดึงข้อมูลจากตารางภายในกัน
1. การใช้ลูป -Endloop
วิธีหนึ่งในการเข้าถึงหรืออ่านตารางภายในคือการใช้ LOOP-ENDLOOP
วากยสัมพันธ์
LOOP AT <itable> [INTO <wa>] ................................... ENDLOOP.
ที่นี่เมื่อคุณพูดว่า LOOP AT ITABLE ตารางภายใน ITABLE จะถูกอ่านทีละบรรทัด คุณสามารถเข้าถึงค่าของคอลัมน์สำหรับบรรทัดนั้นในระหว่างส่วนใดๆ ของโครงสร้าง LOOP-ENDLOOP ค่าของ SY-SUBRC ถูกตั้งค่าเป็น 0แม้ว่าจะอ่านเพียงบันทึกเดียวก็ตาม
2. การใช้การอ่าน
อีกวิธีหนึ่งในการอ่านตารางภายในคือการใช้คำสั่ง READ
ไวยากรณ์-
READ TABLE <itable> [INTO <wa>] INDEX <idx>.
คำสั่งนี้อ่านบรรทัดปัจจุบันหรือบรรทัดตามที่ระบุโดยดัชนี ค่าของ SY-TABIX คือดัชนีของบรรทัดที่อ่าน หากพบรายการที่มีดัชนีที่ระบุ SY-SUBRC จะถูกตั้งค่าเป็น 0 หากดัชนีที่ระบุมีค่าน้อยกว่า 0 จะเกิดข้อผิดพลาดขณะทำงาน หากดัชนีที่ระบุมีค่าเกินขนาดของตาราง SY-SUBRC จะถูกตั้งค่าเป็น 4
⚠️คำเตือน: คำสั่ง READ TABLE … INDEX 0 จะทำให้เกิดข้อผิดพลาดขณะรันไทม์ ดังนั้นควรตรวจสอบดัชนีที่คำนวณขณะรันไทม์ก่อนที่จะเรียกใช้คำสั่งนี้
การลบตารางภายใน
มีหลายวิธีในการลบบรรทัดออกจากตารางภายใน
1. การลบบรรทัดในลูป
นี่เป็นวิธีที่ง่ายที่สุดในการลบบรรทัด
วากยสัมพันธ์
DELETE <ITABLE>.
คำสั่งนี้ใช้ได้เฉพาะภายในวงเท่านั้น มันจะลบบรรทัดปัจจุบัน คุณสามารถลบบรรทัดในลูปแบบมีเงื่อนไขได้โดยการเพิ่ม WHERE ข้อ.
2. การลบบรรทัดโดยใช้ดัชนี
ใช้เพื่อลบบรรทัดออกจากตารางภายในที่ดัชนีรู้ใดๆ
วากยสัมพันธ์
DELETE <ITABLE> INDEX <IDX>.
เส้นที่มีดัชนี ถูกลบทิ้ง ดัชนีของบรรทัดถัดไปจะลดลงทีละ 1
3. การลบรายการที่ซ้ำกัน
แถวที่ซ้ำกันจะถูกลบออกหลังจากที่ตารางได้รับการจัดเรียงตามฟิลด์หลักแล้ว
SORT itab BY col1. DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.
ระบบจะเปรียบเทียบเฉพาะแถวที่อยู่ติดกันเท่านั้น ซึ่งเป็นเหตุผลว่าทำไมคำสั่ง SORT จึงต้องทำงานก่อน หากต้องการล้างตารางทั้งหมด ให้ใช้คำสั่ง CLEAR itab[] หรือ REFRESH itab

