في كثير من الأحيان أثناء ترميز ABAP ، تنشأ مهمة نموذجية - لتهيئة الحقول الأخرى حسب قيم بعض حقول الجدول الداخلي (حدد من جدول قاعدة البيانات ، عن طريق استدعاء FM ، روتين فرعي). والرمز في هذه الحالة بسيط للغاية من حيث الخوارزمية ، ولكنه كثير جدًا. كنت أرغب دائمًا في تقليل الوقت المنقضي في مثل هذه العمليات الروتينية. حتى أنه كتب طريقة تعتمد على الإنشاء الديناميكي للبرامج
لتحديد القيم المرجعية بمفاتيحها من جداول قاعدة البيانات .
في التعليقات المشار إليها
"عدم
قابلية قراءة الشفرة " هي لغتك الدقيقة التي تحتاج إلى تعلمها.
"
المكالمات الديناميكية " -
المكالمات الديناميكية غير مرحب بها ، بما في ذلك أنه في هذه الحالة لا يجد سجل الاستخدام مكانًا لاستخدام الجداول / الحقول المقابلة.
كبديل ، كنت لا أزال أقترح خيارًا باستخدام الإنشاء التلقائي للكود ، ولكن الآن فقط أحضرت هذا الشيء إلى
أداة منتهية . من يهتم ، من فضلك ، تحت القطة.
الفكرة بسيطة: هناك مجموعة من المعلمات التي يتم من خلالها إنشاء رمز ABAP وفقًا لنموذج معين.
لنأخذ مثالاً بسيطًا: في الجدول الداخلي ضع اسم BE في قيمة BE. التحدث باللغة التقنية للمطور:
في الجدول الداخلي ، حسب قيمة حقل BUKRS ، ضع قيمة حقل BUTXT وفقًا لجدول قاعدة البيانات T001 .
عبارة بسيطة في جملة واحدة فقط. ولكن من أجل تحقيق ذلك ، تحتاج إما إلى إجراء LOOP على الطاولة الداخلية واختيار SELECT SINGLE في حلقة (وهو سريع ، ولكن من وجهة نظر السرعة ، لا يُرحب به كثيرًا ، خاصة إذا كان هناك الكثير من الصفوف في الجدول الداخلي) ، أو حدد قيم BUKRS الفريدة ، استعلامًا إلى جدول قاعدة البيانات T001 ، ثم نضع القيم المقابلة لحقل BUTXT من خلال جدول القراءة. في هذه الحالة ، سيكون الرمز أكثر مثالية ، لكن كتابته ليست سريعة جدًا ، لأن هذا الرمز كثير بالفعل. علاوة على ذلك ، لا يوجد شيء معقد فيه - عمل "قرد" بسيط على الكتابة.
وهنا يأتي المولد الأوتوماتيكي للإنقاذ ، لأن مثل هذا الرمز له شكل مرجل ، مما يعني أنه يمكن أتمتة كتابته.
حدد المعلمات التالية:
جدول DB:
T001مجالات الاتصال:
BUKRSالحقول التي تمت تهيئتها:
BUTXTوالحصول على الرمز التالي الذي تم إنشاؤه*-- T001 FORM values_from_tab_T001 USING "-- () uv_in_BUKRS TYPE any "-- uv_out_BUTXT TYPE any CHANGING "-- ct_table TYPE ANY TABLE . "-- ? CHECK NOT ( ct_table[] IS INITIAL ). "-- TYPES: BEGIN OF lty_item, BUKRS TYPE T001-BUKRS, BUTXT TYPE T001-BUTXT, END OF lty_item. DATA ls_item TYPE lty_item. DATA lt_item LIKE TABLE OF ls_item. FIELD-SYMBOLS <ls_item> LIKE LINE OF lt_item. FIELD-SYMBOLS <ls_table> TYPE any. FIELD-SYMBOLS <lv_BUKRS> TYPE any. FIELD-SYMBOLS <lv_BUTXT> TYPE any. "-- LOOP AT ct_table ASSIGNING <ls_table>. CLEAR ls_item. ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. APPEND ls_item TO lt_item. ENDLOOP. "-- SORT lt_item BY BUKRS. DELETE ADJACENT DUPLICATES FROM lt_item COMPARING BUKRS. "-- SELECT BUKRS BUTXT FROM T001 INTO TABLE lt_item FOR ALL ENTRIES IN lt_item WHERE BUKRS = lt_item-BUKRS . "-- SORT lt_item BY BUKRS. "-- LOOP AT ct_table ASSIGNING <ls_table>. "-- ASSIGN COMPONENT uv_in_BUKRS OF STRUCTURE <ls_table> TO <lv_BUKRS>. ls_item-BUKRS = <lv_BUKRS>. "-- ASSIGN COMPONENT uv_out_BUTXT OF STRUCTURE <ls_table> TO <lv_BUTXT>. "-- READ TABLE lt_item ASSIGNING <ls_item> WITH KEY BUKRS = ls_item-BUKRS BINARY SEARCH. IF sy-subrc = 0. IF <lv_BUTXT> IS ASSIGNED. <lv_BUTXT> = <ls_item>-BUTXT. ENDIF. ELSE. IF <lv_BUTXT> IS ASSIGNED. CLEAR <lv_BUTXT>. ENDIF. ENDIF. ENDLOOP. ENDFORM.
الآن يكفي استدعاء روتين فرعي تم إنشاؤه في برنامجك
PERFORM values_from_tab_T001 USING 'BUKRS' 'BUTXT' CHANGING lt_TABLE.
عرض الكود على موقع
مولد ABAPيتم تمرير أسماء الحقول في الجدول الداخلي والجدول الداخلي نفسه كمعلمات إلى الروتين الفرعي. بعد المكالمة ، سيكون الحقل BUTXT القيمة المطلوبة.
يتم إنشاء أسماء الحقول في الجدول الداخلي في شكل معلمات بحيث يمكن استدعاء نفس الروتين لحقول مختلفة. على سبيل المثال إذا كان لديك حقلين BE في الجدول الداخلي (على سبيل المثال ، BUKRS1 و BUKRS2) ، فأنت بحاجة فقط إلى إنشاء روتين فرعي واحد وتسميته مرتين
PERFORM values_from_tab_T001 USING 'BUKRS1' 'BUTXT1' CHANGING lt_TABLE. PERFORM values_from_tab_T001 USING 'BUKRS2' 'BUTXT1' CHANGING lt_TABLE.
في هذه الحالة ، تظهر "غير مثالية" ، حيث سيكون هناك نوعان من SELECT من جدول قاعدة البيانات T001 ، على الرغم من أنه في الحالة المثالية يمكنك القيام بكل شيء من خلال واحد. لكن هذه هي تكلفة الأتمتة. من غير المحتمل أن يؤدي ذلك إلى إبطاء تنفيذ البرنامج بشكل ملحوظ ، ولكن إذا لزم الأمر ، يمكنك دائمًا "إنهاء" البرنامج الفرعي لاحتياجاتك الخاصة.
يمكنك تهيئة عدة حقول في وقت واحد ، وفي الشروط حدد الثوابت (على سبيل المثال ، لغة SY ، التي غالبًا ما تستخدم عند اختيار النصوص). في المثال القياسي ، يتم اختيار
أسماء تجهيزات المستعمل وفقًا للجدول T006A.
عند إنشاء الكود ، يتم أيضًا إنشاء ارتباط يمكن من خلاله فتح المثال الذي تم إنشاؤه في المستعرض.
يوجد حاليًا العديد من القوالب في المولد:
- تحديد الهيكل [+ نوع الجدول] - تحديد الهيكل + نوع الجدول + جدول من هذا النوع + مساحة عمل الجدول + رمز الحقل للجدول. هذا ليس ضروريًا دائمًا ، ولكن حذف العنصر الذي تم إنشاؤه أسهل من كتابته يدويًا
- إن إزالة السجلات المكررة من الجدول الداخلي عن طريق الحقول هو مولد بسيط للغاية وبشكل عام ، يمكن كتابة هذه الشفرة يدويًا ، ولكن إذا كان هناك العديد من الحقول ، في رأيي ، فمن الأفضل استخدام هذا القالب
- حدد القيم المرجعية من جدول قاعدة البيانات - القالب الموضح أعلاه
- حدد القيم المرجعية - يسمح لك القالب بتعيين قيم الحقول من خلال استدعاء FM ، البرامج الفرعية. في هذه الحالة ، يتم تخزين المكالمات مؤقتًا.
- حدد القيم المرجعية من المجال - لا يحتوي هذا القالب على معلمات وتمت إضافته ليتمكن فقط من نسخ هذا الرمز في برنامجك
أعتقد أن الوصف التفصيلي لتشغيل كل قالب لا معنى له ، لأنه من الأسهل رؤية نتيجة عمله على
الموقع . يحتوي كل قالب على قيم افتراضية لمعلماته وإذا كنت مطورًا للأباب ، فسوف تفهم الرمز بسرعة.