SAP ตารางภายใน ABAP: สร้าง อ่าน เติม คัดลอก และลบ

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

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

  • 📋 คำจำกัดความหลัก: ตารางภายใน (Internal Table) ทำหน้าที่จัดเก็บแถวที่มีโครงสร้างเหมือนกันในหน่วยความจำหลัก โดยส่วนใหญ่ใช้เพื่อจัดรูปแบบข้อมูลที่อ่านจากตารางในฐานข้อมูล
  • 🧾 บทบาทหน้าที่ในพื้นที่ปฏิบัติงาน: พื้นที่ทำงานคือแถวเดียวที่มีรูปแบบเดียวกับตาราง และจะประมวลผลตารางทีละบรรทัด
  • 🏷️ บรรทัดหัวเรื่อง: ตารางที่มีบรรทัดส่วนหัวจะได้รับพื้นที่ทำงานโดยปริยาย ดังนั้นจึงสามารถแทรกหรืออ่านแถวได้โดยตรงโดยไม่ต้องตั้งชื่อแถว
  • 🛠️ สี่วิธีการสร้าง: คำสั่ง TYPES, การอ้างอิงถึงตารางที่มีอยู่แล้ว, การอ้างอิงถึงโครงสร้างที่มีอยู่แล้ว หรือโครงสร้างใหม่ที่ประกาศด้วย OCCURS
  • เติมข้อมูล: คำสั่ง APPEND เพิ่มแถวหนึ่งแถว คำสั่ง COLLECT รวบรวมฟิลด์ตัวเลขสำหรับคีย์ที่ซ้ำกัน และคำสั่ง INSERT วางแถวที่ดัชนีที่เลือก
  • 🔍 อ่านและคัดลอก: คำสั่ง LOOP AT จะอ่านทุกแถว คำสั่ง READ TABLE จะอ่านทีละแถวตามดัชนี และคำสั่ง MOVE หรือเครื่องหมายเท่ากับจะคัดลอกทั้งตาราง
  • 🗑️ ลบ: คำสั่ง DELETE ภายในลูปจะลบแถวปัจจุบัน และคำสั่ง DELETE … INDEX จะลบแถวที่ตำแหน่งที่ทราบ

SAP ตารางภายใน ABAP

ตารางภายในคืออะไร?

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

โต๊ะภายในมักใช้งานร่วมกับพื้นที่ทำงาน ดังนั้นแนวคิดนี้จึงเป็นเรื่องต่อไป

พื้นที่ทำงานคืออะไร?

พื้นที่ทำงานคือแถวข้อมูลเดี่ยวๆ ควรมีรูปแบบเดียวกันกับตารางภายในอื่นๆ ใช้สำหรับประมวลผลข้อมูลในตารางภายในทีละบรรทัด

ความแตกต่างระหว่างโต๊ะภายในและพื้นที่ทำงานคืออะไร?

รูปภาพแทนคำพูดได้นับพันคำ

ความแตกต่างระหว่างตารางภายในและพื้นที่ทำงาน

แผนภาพแสดงตารางที่มีหลายแถว ในขณะที่พื้นที่ทำงานแสดงเฉพาะแถวที่กำลังประมวลผลอยู่เท่านั้น พื้นที่ทำงานนั้นถูกสร้างขึ้นโดยระบบหรือโดยนักพัฒนา ขึ้นอยู่กับประเภทของตารางที่อธิบายไว้ด้านล่าง

ประเภทของตารางภายใน

ตารางภายในมีสองประเภท

  1. ตารางภายในที่มีบรรทัด HEADER
  2. ตารางภายในที่ไม่มีบรรทัด 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

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

คำสั่ง CLEAR itab จะล้างเฉพาะบรรทัดส่วนหัว และคำสั่ง CLEAR itab[] จะล้างส่วนเนื้อหา คำสั่ง REFRESH จะล้างส่วนเนื้อหาเสมอ แต่จะคงหน่วยความจำที่สงวนไว้ คำสั่ง FREE จะล้างส่วนเนื้อหาและปล่อยหน่วยความจำด้วย

SY-TABIX เก็บหมายเลขแถวของตารางภายในที่กำลังประมวลผลอยู่ SY-INDEX เก็บหมายเลขรอบของลูป DO หรือ WHILE ตารางแฮชจะทำให้ SY-TABIX เป็นศูนย์ เนื่องจากไม่มีดัชนี

การกำหนดสัญลักษณ์ฟิลด์ให้กับ itab ด้วยวิธี LOOP AT ช่วยหลีกเลี่ยงการคัดลอกทุกแถวลงในพื้นที่ทำงาน ทำให้ทำงานได้เร็วขึ้นในตารางขนาดใหญ่ และช่วยให้สามารถเปลี่ยนแปลงแถวได้โดยตรงโดยไม่ต้องใช้คำสั่ง MODIFY

ใช่แล้ว ผู้ช่วย AI ในเครื่องมือพัฒนา ABAP จะเขียนคำสั่ง OCCURS และการประกาศบรรทัดส่วนหัวใหม่ให้เป็น TYPE STANDARD TABLE OF โดยระบุพื้นที่ทำงานอย่างชัดเจน และจะแจ้งเตือนคำสั่งที่เกิดข้อผิดพลาดเมื่อบรรทัดส่วนหัวหายไป

ที่ปรึกษาด้านประสิทธิภาพของ AI จะตรวจสอบวิธีการเติมและอ่านตาราง จากนั้นจะแนะนำให้ใช้ตารางที่เรียงลำดับหรือตารางแฮชเมื่อการค้นหาเชิงเส้นใช้เวลาในการทำงานมากกว่า คำแนะนำนี้ได้รับการยืนยันด้วย trace ในธุรกรรม SAT

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