2012-05-29 13 views
6

के साथ itab पढ़ना मैं एक आंतरिक तालिका को पढ़ने के लिए एक तरीका काम करने की कोशिश कर रहा हूं जिसे गतिशील रूप से बनाया जाना है। मैंने निम्न रिपोर्ट बनाई है जो डेटा के साथ गतिशील आंतरिक तालिका भरती है। आखिरी पंक्ति पर मैं इसे एक कुंजी के साथ पढ़ने की कोशिश कर रहा हूं (उदाहरण के लिए mandt)। समस्या यह है कि मुझे त्रुटि मिलती है, "निर्दिष्ट प्रकार की कोई संरचना नहीं है और इसके लिए कोई घटक नहीं है जिसे MANDT कहा जाता है"।गतिशील कुंजी विनिर्देश

मैंने डीबग किया है और मैं देख सकता हूं कि सफलतापूर्वक पॉप्युलेट किया गया है और तालिका (फ़ील्ड नाम) की संरचना सही है। जब मैं कार्य क्षेत्र में तालिका को पढ़ने की कोशिश करता हूं तो समस्या स्वयं प्रस्तुत होती है। हो सकता है कि यह गलत कर रहा हो, लेकिन ऐसा कुछ ऐसा लगता है जो संभव होना चाहिए, और मुझे लगता है कि मुझे कुछ छोटा लगता है।

कारण मैं यह कोशिश कर रहा हूं कि मुझे एक कार्यक्रम में समान चयन मिलते हैं और स्मृति में रिकॉर्ड बफर करना चाहते हैं और डीबी एक्सेस से बचने के लिए वहां से उन्हें पढ़ना चाहते हैं। यह कार्यान्वित करना आसान है, हालांकि मैंने यह नहीं किया है जब तालिका, where खंड और into ओपन एसक्यूएल कथन का खंड मैं अनुकूलित करने की कोशिश कर रहा हूं गतिशील हैं।

चीयर्स।

DATA: t681_rep TYPE TABLE OF t681 , wa_681 LIKE LINE OF t681_rep, 
     tabref TYPE REF TO data , waref TYPE REF TO data. 

FIELD-SYMBOLS: <any_tab> TYPE ANY TABLE, 
       <any_wa> TYPE ANY, 
       <var1> TYPE ANY. 
"fill t681_rep 
SELECT * 
    FROM t681 
    INTO TABLE t681_rep 
    UP TO 1 ROWS WHERE kotab = 'A002'. 

READ TABLE t681_rep INTO wa_681 WITH KEY kotab = 'A002'. 
IF sy-subrc = 0. 

    "if A002 is found create a table of that type and fill it 
    CREATE DATA tabref TYPE TABLE OF (wa_681-kotab). 
    ASSIGN tabref->* TO <any_tab>. 
    SELECT * UP TO 10 ROWS 
    FROM (wa_681-kotab) 
    INTO TABLE <any_tab>. 

ENDIF. 

CREATE DATA waref TYPE a002. 
ASSIGN waref->* TO <any_wa>. 

READ TABLE <any_tab> ASSIGNING <any_wa> WITH KEY mandt = '800'. <- problem area 
IF sy-subrc = 0. 
    "do stuff with <any_wa>... 
ENDIF. 

उत्तर

1

AFAIK, आप यह लंबा रास्ता दौर 'क्या करना है:

FIELD-SYMBOLS: <any_field> TYPE any.  
LOOP AT <any_tab> ASSIGNING <any_wa>. 
    ASSIGN COMPONENT 'MANDT' OF STRUCTURE <any_wa> TO <any_field>. 
    IF <any_field> <> 800. 
    CONTINUE. 
    ENDIF. 
    " do stuff with <any_wa> - you will have to assign <any_field> again to access fields. 
ENDLOOP. 
3

तुम बस कोष्ठक में फ़ील्ड नाम डाल करने के लिए की जरूरत है।

data: field type string. 
field = 'MANDT'. 
READ TABLE <any_tab> ASSIGNING <any_wa> WITH KEY (field) = '800'. 
IF sy-subrc = 0. 
    "do stuff with <any_wa>... 
ENDIF. 
+0

हाय ब्रायन, आपके उत्तर के लिए धन्यवाद। यह काम करता है, हालांकि मैं पूरी तरह से गतिशील समाधान की तलाश में हूं। छद्म कोड में कुछ ऐसा है: –

+0

उस टिप्पणी से कुछ याद आ रही है ... –

2

आप दक्षता में डेटाबेस को हरा करने की कोशिश कर रहे हैं, यह एक लापता लड़ाई है।

बस SE11 पर जाएं, अपनी तालिका का चयन करें, तकनीकी सेटिंग्स पर जाएं और तकनीकी सेटिंग्स बदलें (& बफरिंग प्रकार को बफर करना), आपको इसके लिए ऑब्जेक्ट संशोधन कुंजी की आवश्यकता नहीं है। आप यह भी सुनिश्चित कर सकते हैं कि आकार श्रेणी सही है।

1

आप टेबल कुंजी प्राप्त करने के लिए आरटीटीएस का उपयोग कर सकते हैं।

data table_name type string. 
table_name = 'A002'. 

" Dynamically create the table type 
data the_table type ref to data. 
create data the_table type table of (table_name). 

" Use RTTS to get table keys 
data typedescription type ref to cl_abap_tabledescr. 
typedescription ?= cl_abap_tabledescr=>describe_by_data_ref(the_table). 
data keys type abap_table_keydescr_tab. 
keys = typedescription->get_keys(). 
0
REPORT y_test_dynamic_table. 
DATA: table_name TYPE string, 
typedescription TYPE REF TO cl_abap_tabledescr, 
keys TYPE abap_keydescr_tab, 
ls_key TYPE abap_keyname. 

table_name = 'ZYFRM_STG'. 

" Dynamically create the table type 
DATA the_table TYPE REF TO data. 
CREATE DATA the_table TYPE TABLE OF (table_name). 

" Use RTTS to get table keys 

typedescription ?= cl_abap_tabledescr=>describe_by_data_ref(the_table). 

keys = typedescription->KEY. 

loop at keys INTO ls_key. 
*** 
ENDLOOP. 
संबंधित मुद्दे