ABAP
गतिशील प्रोग्रामिंग
खोज…
फील्ड-चिह्न
फील्ड-सिंबल ABAP के पॉइंटर्स के समतुल्य हैं, सिवाय इसके कि फील्ड-सिंबल को हमेशा डिरेल किया जाता है (मेमोरी में वास्तविक एड्रेस को बदलना संभव नहीं है)।
घोषणा
फ़ील्ड-सिंबल घोषित करने के लिए कीवर्ड FIELD-SYMBOLS का उपयोग करना चाहिए। विभिन्न प्रकार के चर को संभालने के लिए प्रकार सामान्य ( ANY [... TABLE] ) हो सकते हैं।
FIELD-SYMBOLS: <fs_line> TYPE any, "generic
<fs_struct> TYPE kna1. "non-generic
नियत
फील्ड-चिह्न हैं unassigned घोषणा, जिसका अर्थ है कि वे कुछ भी नहीं है ओर इशारा करते हैं पर। एक अनिर्दिष्ट फील्ड-सिंबल तक पहुंचने से एक अपवाद हो जाएगा, और, यदि नहीं छोड़ा गया, तो एक छोटे डंप तक। इसलिए, राज्य को IS ASSIGNED साथ जाँच की जानी चाहिए:
IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.
जैसा कि वे केवल संदर्भ हैं, कोई भी वास्तविक डेटा अंदर संग्रहीत नहीं किया जा सकता है। इसलिए, घोषित DATA को उपयोग के हर मामले में आवश्यक है।
DATA: w_name TYPE string VALUE `Max`,
w_index TYPE i VALUE 1.
FIELD-SYMBOLS <fs_name> TYPE any.
ASSIGN w_name TO <fs_name>. "<fs_name> now gets w_name
<fs_name> = 'Manni'. "Changes to <fs_name> now also affect w_name
* As <fs_name> is generic, it can also be used for numbers
ASSIGN w_index TO <fs_name>. "<fs_name> now refers to w_index.
ADD 1 TO <fs_name>. "w_index gets incremented by one
Unassigning
कभी-कभी यह फ़ील्ड-प्रतीक को रीसेट करने के लिए उपयोगी हो सकता है। यह UNASSIGN का उपयोग करके किया जा सकता है।
UNASSIGN <fs>.
* Access on <fs> now leads to an exception again
आंतरिक तालिकाओं के लिए उपयोग करें
आंतरिक तालिकाओं को संशोधित करने के लिए फ़ील्ड-सिंबल्स का उपयोग किया जा सकता है।
LOOP AT itab INTO DATA(wa).
* Only modifies wa_line
wa-name1 = 'Max'.
ENDLOOP.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
* Directly refers to a line of itab and modifies its values
<fs>-name1 = 'Max'.
ENDLOOP.
ध्यान! लूप छोड़ने के बाद भी फील्ड-सिंबल्स को असाइन किया जाता है। यदि आप उन्हें सुरक्षित रूप से पुन: उपयोग करना चाहते हैं, तो उन्हें तुरंत असाइन करें।
डेटा संदर्भ
डेटा संदर्भों के लिए आवश्यक TYPE बाद REF TO ।
संरचनाओं का गतिशील निर्माण
यदि किसी संरचना के प्रकार को रनटाइम पर तय किया जाना चाहिए, तो हम अपने लक्ष्य संरचना को जेनेरिक प्रकार के data संदर्भ में परिभाषित कर सकते हैं।
DATA wa TYPE REF TO data.
wa एक प्रकार देने के लिए हम कथन CREATE DATA उपयोग करते हैं। इसके अलावा TYPE द्वारा निर्दिष्ट किया जा सकता है:
संदर्भ:
CREATE DATA wa TYPE kna1
- स्टेटिक चेक सक्रिय हैं, इसलिए एक अज्ञात प्रकार बनाना संभव नहीं है
नाम:
CREATE DATA wa TYPE (lw_name_as_string)
- कोष्ठक की आवश्यकता है और
lw_name_as_stringमें स्ट्रिंग के नाम प्रकार होते हैं।- यदि प्रकार नहीं मिला, तो
CX_SY_CREATE_DATA_ERRORप्रकार का अपवाद फेंक दिया जाएगा
गतिशील रूप से निर्मित प्रकारों के लिए HANDLE जोड़ को निर्दिष्ट किया जा सकता है। HANDLE को एक वस्तु मिलती है जो CL_ABAP_DATADESCR से प्राप्त CL_ABAP_DATADESCR ।
CREATE DATA dref TYPE HANDLE obj
objR un T ime T ype S ervices का उपयोग करके बनाया जा सकता है- चूँकि
drefअभी भी एक डेटरेंस है, इसे डीटैक्टर (->*) के रूप में इस्तेमाल किया जाना है जिसे डीटैकनटेनर (सामान्य रूप से फील्ड-सिंबल के माध्यम से किया जाता है)
रनटाइम टाइप सेवाएं
रनटाइम प्रकार सेवाएं ( संक्षिप्त: आरटीटीएस ) का उपयोग इसके लिए किया जाता है:
- बनाने के प्रकार (रनटाइम प्रकार निर्माण; लघु: RTTC )
- विश्लेषण प्रकार (रनटाइम प्रकार पहचान; लघु: RTTI )
कक्षाएं
CL_ABAP_TYPEDESCR
|
|--CL_ABAP_DATADESCR
| |
| |--CL_ABAP_ELEMDESCR
| |--CL_ABAP_REFDESCR
| |--CL_ABAP_COMPLEXDESCR
| |
| |--CL_ABAP_STRUCTDESCR
| |--CL_ABAP_TABLEDESCR
|
|--CL_ABAP_OBJECTDESCR
|
|--CL_ABAP_CLASSDESCR
|--CL_ABAP_INTFDESCR
CL_ABAP_TYPEDESCR आधार वर्ग है। यह वर्णन करने के लिए आवश्यक तरीकों को लागू करता है:
-
DESCRIBE_BY_DATA -
DESCRIBE_BY_NAME -
DESCRIBE_BY_OBJECT_REF -
DESCRIBE_BY_DATA_REF