SAP جدول ABAP الداخلي: إنشاء وقراءة وملء ونسخ وحذف

⚡ ملخص ذكي

SAP تحتوي كائنات الجداول الداخلية في لغة ABAP على بيانات من بنية ثابتة لاستخدامها ديناميكيًا داخل البرنامج. تشرح هذه الصفحة مساحات العمل، وخطوط العناوين، وطرق الإنشاء الأربع، والعبارات التي تُستخدم لملء صفوف الجدول ونسخها وقراءتها وحذفها.

  • 📋 التعريف الأساسي: يخزن الجدول الداخلي صفوفًا ذات بنية متطابقة في الذاكرة الرئيسية، وغالبًا ما يكون ذلك لتنسيق البيانات المقروءة من جدول قاعدة البيانات.
  • 🧾 دور منطقة العمل: مساحة العمل عبارة عن صف واحد بنفس تنسيق الجدول، وتقوم بمعالجة الجدول سطرًا سطرًا.
  • 🏷️ سطر العنوان: الجدول الذي يحتوي على سطر رأس يحصل على مساحة عمل ضمنية، لذلك يمكن إدراج الصفوف أو قراءتها مباشرة دون تسميتها.
  • 🛠️ أربع طرق للخلق: بيان TYPES، مرجع إلى جدول موجود، مرجع إلى بنية موجودة، أو بنية جديدة معلنة باستخدام OCCURS.
  • ➕ تعبئة: تضيف APPEND صفًا واحدًا، وتجمع COLLECT الحقول الرقمية لمفتاح مكرر، وتضع INSERT صفًا في فهرس محدد.
  • 🔍 اقرأ وانسخ: تقوم عبارة LOOP AT بقراءة كل صف، بينما تقوم عبارة READ TABLE بقراءة صف واحد بواسطة الفهرس، وتقوم عبارة MOVE أو علامة المساواة بنسخ جدول كامل.
  • 🗑️ حذف: تقوم عبارة DELETE داخل حلقة LOOP بإزالة الصف الحالي، وتقوم عبارة DELETE … INDEX بإزالة الصف في موضع معروف.

SAP الجداول الداخلية في لغة ABAP

ما هو الجدول الداخلي؟

طاولة داخلية تستخدم للحصول على البيانات من بنية ثابتة للاستخدام الديناميكي في ABAP. كل سطر في الجدول الداخلي له نفس بنية الحقل. الاستخدام الرئيسي للجداول الداخلية هو تخزين وتنسيق البيانات من جدول قاعدة البيانات داخل البرنامج.

تتكامل الطاولة الداخلية دائمًا مع منطقة العمل، لذا يأتي هذا المفهوم لاحقًا.

ما هي منطقة العمل؟

مساحات العمل عبارة عن صفوف بيانات مفردة. يجب أن يكون لها نفس تنسيق أي من الجداول الداخلية. تُستخدم لمعالجة البيانات في جدول داخلي سطرًا سطرًا.

ما الفرق بين الطاولة الداخلية ومنطقة العمل؟

صورة تقول ألف كلمة

الفرق بين الجدول الداخلي ومنطقة العمل

يُظهر الرسم التخطيطي الجدول الذي يحتوي على عدة صفوف، بينما تحتوي منطقة العمل على الصف الذي تتم معالجته حاليًا فقط. ويعتمد إنشاء منطقة العمل هذه، سواءً من قِبل النظام أو المطور، على نوع الجدول الموضح أدناه.

أنواع الجداول الداخلية

هناك نوعان من الجداول الداخلية.

  1. الجداول الداخلية مع خط الرأس
  2. الجداول الداخلية بدون خط رأس.

الجداول الداخلية مع خط الرأس

  • هنا يقوم النظام تلقائيًا بإنشاء منطقة العمل.
  • منطقة العمل لها نفس نوع البيانات مثل الجدول الداخلي.
  • منطقة العمل هذه تسمى خط الرأس.
  • ومن هنا يتم تنفيذ جميع التغييرات أو أي إجراء على محتويات الجدول. ونتيجة لذلك، يمكن إدراج السجلات مباشرة في الجدول أو الوصول إليها من الجدول الداخلي مباشرة.

الجداول الداخلية بدون خط رأس :

  • هنا لا توجد منطقة عمل مرتبطة بالجدول.
  • يجب تحديد منطقة العمل بشكل صريح عندما نحتاج إلى الوصول إلى مثل هذه الجداول.
  • وبالتالي لا يمكن الوصول إلى هذه الجداول مباشرة.

💡 نصيحة: يحمل الجدول الذي يحتوي على سطر عنوان نفس اسم الجدول ومساحة العمل الخاصة به، مما يجعل الكود غامضًا. يجب على البرامج الجديدة تعريف جدول بدون سطر عنوان وتمرير مساحة عمل محددة بوضوح.

الجداول الداخلية القياسية والمرتبة والمجزأة

إلى جانب تمييز سطر العنوان، يحتوي كل جدول داخلي أيضًا على نوع جدول يحدد كيفية العثور على الصف. يتم اختيار النوع باستخدام إضافة TYPE STANDARD TABLE أو TYPE SORTED TABLE أو TYPE HASHED TABLE، وله تأثير مباشر على وقت التشغيل.

نوع الطاولة طريقة الوصول القفل أفضل يستخدم لـ
Standard الفهرس والمفتاح، مع بحث خطي على المفتاح غير فريد المعالجة التسلسلية، والجداول الصغيرة التي تُقرأ باستخدام فهرس
مرتبة الفهرس والمفتاح، مع بحث ثنائي على المفتاح سواء كانت فريدة أم غير فريدة، يتم الاحتفاظ بها مرتبة تلقائيًا تقوم الجداول الأكبر حجماً بقراءة حقول المفاتيح الرئيسية بشكل متكرر
تجزئته المفتاح فقط، باستخدام خوارزمية تجزئة التفرُّد جداول كبيرة جدًا تُقرأ دائمًا باستخدام المفتاح الكامل، مثل مخزن مؤقت لسجلات قاعدة البيانات

يُعد الجدول القياسي هو الجدول الافتراضي وهو مناسب للمعالجة التسلسلية. أما الجدول المُجزأ فيحافظ على وقت الوصول ثابتًا بغض النظر عن عدد الصفوف المخزنة، ولهذا السبب فإن قواعد الأداء الخاصة به Open 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 بإنشاء خط هيكل كما هو محدد.

لإنشاء جدول داخلي 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 Lines` سطرًا مُهيأً وفقًا لنوع بيانات الأعمدة، أي مسافة لـ `col1` وصفر لـ `col2`.

2.استخدام بيان جمع

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 LINES أو أدخل 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 TABLE <itable> [INTO <wa>] INDEX <idx>.

يقرأ هذا البيان السطر الحالي أو السطر المحدد بواسطة الفهرس قيمة SY-TABIX هي فهرس السطر المقروء. إذا تم العثور على مدخل بالفهرس المحدد، فسيتم تعيين SY-SUBRC إلى 0. إذا كان الفهرس المحدد أقل من 0، فسيحدث خطأ أثناء التشغيل. إذا تجاوز الفهرس المحدد حجم الجدول، فسيتم تعيين SY-SUBRC إلى 4.

⚠️ تحذير: يؤدي الأمر READ TABLE … INDEX 0 إلى ظهور خطأ وقت التشغيل، لذلك يجب التحقق من الفهرس المحسوب في وقت التشغيل قبل تنفيذ العبارة.

حذف الجداول الداخلية

هناك طرق عديدة لحذف الأسطر من جدول داخلي.

1. حذف الأسطر في الحلقة.

هذه هي أبسط طريقة لحذف الخطوط.

بناء الجملة

DELETE <ITABLE>.

هذا البيان يعمل فقط داخل حلقة. يقوم بحذف السطر الحالي. يمكنك حذف الأسطر الموجودة في حلقة مشروطة عن طريق إضافة حيث الشرطية.

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 صفرًا، لأنه لا يحتوي على فهرس.

يؤدي استخدام LOOP AT itab ASSIGNING a field symbol إلى تجنب نسخ كل صف إلى مساحة العمل، لذا فهو يعمل بشكل أسرع على الجداول الكبيرة ويسمح بتغيير الصف في مكانه دون الحاجة إلى عبارة MODIFY.

نعم. تقوم مساعدات الذكاء الاصطناعي في أدوات تطوير ABAP بإعادة كتابة OCCURS وتصريحات سطر العنوان إلى TYPE STANDARD TABLE OF مع منطقة عمل صريحة، كما أنها تشير إلى العبارات التي تتعطل بمجرد اختفاء سطر العنوان.

يقوم مستشارو أداء الذكاء الاصطناعي بفحص كيفية ملء الجدول وقراءته، ثم يوصون بجدول مُرتب أو مُجزأ عندما يهيمن البحث الخطي على وقت التشغيل. ويتم تأكيد التوصية من خلال trace في معاملة SAT.

تلخيص هذه التدوينة بـ: