2017-09-26 53 views
2

我有一個搜索幫助,其中包含許多要顯示給用戶以應用值的字段。我想從用戶處獲得3個字段APOFASI,SKOPOSKATDANL如何從搜索幫助中返回值給用戶退出

在退出調頻中的CALLCONTROL-STEP = SELECT,我想獲取這些值的變量,然後做出一些選擇,並找到另一個字段APOFASISAP。 我想回傳到搜索幫助字段APOFASSISAP的選擇字段,但APOFASI字段似乎是空白的。 的代碼是:

TYPES: BEGIN OF ty_apofasisap_tr, 
      apofasisap_tr TYPE zglk_sap_afopasi, 
     END OF ty_apofasisap_tr. 

    DATA: it_apofasisap_tr TYPE TABLE OF ty_apofasisap_tr, 
     wa_apofasisap_tr LIKE LINE OF it_apofasisap_tr. 

    DATA: lv_apofasi TYPE zglk_kyanr_ap, 
     lv_skopos TYPE zskopos, 
     lv_katdanl TYPE zsl_cat_dan, 
     lv_apofasisap_arx TYPE zglk_sap_afopasi.   
    lv_apofasi = wa_shlp_selopt-low. 
    ls_result-apofasi = ''. 
    IF lv_apofasi <> ''. 
     wa_shlp_selopt-low = ''. 
     MODIFY shlp-selopt FROM wa_shlp_selopt INDEX sy-tabix. 
    ENDIF. 

    READ TABLE shlp-selopt INTO wa_shlp_selopt WITH KEY shlpfield = 'SKOPOS'. 

    lv_skopos = wa_shlp_selopt-low. 

    READ TABLE shlp-selopt INTO wa_shlp_selopt WITH KEY shlpfield = 'KATDANL'. 

    lv_katdanl = wa_shlp_selopt-low. 

    SELECT SINGLE apofasisap INTO lv_apofasisap_arx 
     FROM zsl_glk_apof 
     WHERE apofasi = lv_apofasi. 

    SELECT * FROM zsl_glk_apof_tr 
     WHERE apofasisap_trp = lv_apofasisap_arx. 

     wa_apofasisap_tr-apofasisap_tr = zsl_glk_apof_tr-apofasisap_tr. 
     APPEND wa_apofasisap_tr TO it_apofasisap_tr. 

    ENDSELECT. 
    wa_shlp_selopt-shlpname = 'ZAPOF_TROP'. 
    wa_shlp_selopt-shlpfield = 'APOFASISAP'. 
    wa_shlp_selopt-sign  = 'I'. 
    wa_shlp_selopt-option = 'EQ'. 
    wa_shlp_selopt-low  = wa_apofasisap_tr-apofasisap_tr. 
    APPEND wa_shlp_selopt TO shlp-selopt. 

此代碼不替換/的值添加到相應的字段。 有人可以幫助嗎?

PS。讓我添加我在互聯網幫助下編寫的另一個代碼。它在DISPLAY的步驟中。

IF callcontrol-step = 'DISP'. 
TYPES: BEGIN OF ls_result, 
     apofasi LIKE zsl_glk_apof-apofasi, 
     apofasidate LIKE zsl_glk_apof-apofasidate, 
     apofasisap LIKE zsl_glk_apof-apofasisap, 
     apofasi_trp_x LIKE zsl_glk_apof-apofasi_trp_x, 
     apofasi_tr_x LIKE zsl_glk_apof-apofasi_tr_x, 
     fek LIKE zsl_glk_apof-fek, 
     katdanl LIKE zsl_glk_apof-katdanl, 
     reference LIKE zsl_glk_apof-reference, 
     skopos LIKE zsl_glk_apof-skopos, 
     thema LIKE zsl_glk_apof-thema, 
     type_desc LIKE zsl_glk_apof-type_desc, 
     ya_first LIKE zsl_glk_apof-ya_first, 
END OF ls_result. 

DATA: lt_result TYPE STANDARD TABLE OF ls_result. 

CLEAR: lt_result, record_tab, record_tab[]. 
* Read the value that user gave 
READ TABLE shlp-selopt INTO wa_shlp_selopt 
         WITH KEY shlpfield = 'APOFASI'. 

lv_apofasi = wa_shlp_selopt-low. 

IF lv_apofasi <> ''. 

    * Clear this value 
    wa_shlp_selopt-low = ''. 
    MODIFY shlp-selopt FROM wa_shlp_selopt INDEX sy-tabix. 
ENDIF. 

* Find the number starting APOFASISAP from the APOFASI text 
SELECT SINGLE apofasisap INTO lv_apofasisap_arx 
    FROM zsl_glk_apof 
    WHERE apofasi = lv_apofasi. 

IF sy-subrc = 0. 

* Find the APOFASISAPs which changes the starting one and display the 
    *fields 
    SELECT a~apofasi a~apofasidate a~apofasisap 
     a~apofasi_tr_x a~apofasi_trp_x 
     a~thema a~fek a~reference a~ya_first 
     INTO CORRESPONDING FIELDS OF TABLE lt_result 
    FROM zsl_glk_apof AS a INNER JOIN zsl_glk_apof_tr AS b 
          ON a~apofasisap = b~apofasisap_tr 
    WHERE b~apofasisap_trp = lv_apofasisap_arx. 

    IF sy-subrc = 0. 
    *Pass them to display the result. 
    CALL FUNCTION 'F4UT_RESULTS_MAP' 
     EXPORTING 
    * SOURCE_STRUCTURE   = 
     apply_restrictions  = 'X' 
     TABLES 
     shlp_tab     = shlp_tab 
     record_tab    = record_tab 
     source_tab    = lt_result 
     CHANGING 
     shlp      = shlp 
     callcontrol    = callcontrol 
     EXCEPTIONS 
     illegal_structure  = 1 
     OTHERS     = 2 
       . 
    IF sy-subrc <> 0. 
     MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 
       WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. 
    ENDIF. 
    ENDIF. 
    FREE lt_result. 

ENDIF. 

它說沒有這個選擇的價值。表lt_result包含11條記錄。

再次感謝。

+0

這是代碼指的是一些自定義的只是一個任意片段對象人,但你知道,並沒有明確說明什麼地方它被稱爲和究竟發生了什麼問題。請嘗試提供[MCVE] https://stackoverflow.com/help/mcve – vwegert

+0

我已經創建了一個SH,向用戶顯示4個字段,並等待填寫其中的3個字段。用戶必須填寫的字段是:APOFASI-SKOPOS-KATDAL。因此,當用戶按下輸入CALLCONTROL-STEP的值是由於選擇和在EXIT FM中我希望找到第四個字段APOFASISAP並將其傳遞到搜索幫助字段的相應字段。我也想要刪除字段APOFASI的值並繼續字段APOFASISAP-SKOPOS-KATDANL並向用戶顯示適當的記錄以便選擇一個。這是FM中唯一的代碼(僅缺少數據VAR)。 – ekekakos

+0

你的'F4UT_RESULTS_MAP'調用看起來很好。 'IF sy-subrc = 0'檢查通過了嗎? – Suncatcher

回答

0

我同意前面的提示,提供的代碼是一團糟,從中無法想象出來。

首先,在SHELP FM出口處使用DISP事件,而不是SELECT。其次,你填寫錯誤的表格(或者不要顯示我們正確填寫上面的代碼片段)。爲了將值傳遞給用戶,您應該修改RECORD_TAB表。

您的代碼應該是這個樣子(加入選擇從zsl_glk_apofzsl_glk_apof_tr表):

CHECK callcontrol-step = 'DISP'. 
DATA: ls_selopt TYPE ddshselopt. "loc str for shlp-selopt 
DATA: BEGIN OF ls_record. 
     INCLUDE STRUCTURE seahlpres. 
DATA: END OF ls_record. 
DATA: lv_glk_apof_tr TYPE zsl_glk_apof_tr-apofasisap_tr. 

LOOP AT shlp-selopt INTO ls_selopt. 

* finding SKOPOS and KATDANL values 
    CASE ls_selopt-shlpfield. 
    WHEN 'SKOPOS'. 
    lv_skopos = ls_selopt-low. 
    WHEN 'KATDANL'. 
    lv_katdanl = ls_selopt-low. 
    WHEN OTHERS. 
    ENDCASE. 

    * doing smth 

    * finding some stuff from Z-tables 
    SELECT SINGLE tr~apofasisap_tr 
    FROM zsl_glk_apof AS ap 
    JOIN zsl_glk_apof_tr AS tr 
    ON ap~apofasisap = tr~apofasisap_trp 
    INTO lv_glk_apof_tr 
    WHERE ap~apofasi = lv_apofasi. 
ENDLOOP. 

* modify record_tab with the found value lv_glk_apof_tr 
LOOP AT record_tab INTO ls_record. 
    ls_record-string+25(5) = lv_glk_apof_tr. "field shift should be based on your values 
ENDLOOP. 
+0

我會試試你的解決方案。謝謝。 – ekekakos

0

您好,感謝所有的寶貴幫助。 最後我做到了如下:

if callcontrol-step = 'SELECT'. 
get parameter id 'ZAP' field p_apofasi. 
get parameter id 'ZSK' field p_skopos. 
get parameter id 'ZKATDANL' field p_katdanl. 

select single apofasisap into lv_apofasisap_arx 
    from zsl_glk_apof 
    where apofasi = p_apofasi and 
     katdanl = p_katdanl and 
     skopos = p_skopos. 

select * into corresponding fields of table it_apofasisap_tr 
    from zsl_glk_apof_tr 
    where apofasisap_trp = lv_apofasisap_arx. 

* Display the results to the user 
types: begin of ls_result, 
     apofasi like zsl_glk_apof-apofasi, 
     apofasidate like zsl_glk_apof-apofasidate, 
     apofasisap like zsl_glk_apof-apofasisap, 
     apofasi_trp_x like zsl_glk_apof-apofasi_trp_x, 
     apofasi_tr_x like zsl_glk_apof-apofasi_tr_x, 
     katdanl like zsl_glk_apof-katdanl, 
     skopos like zsl_glk_apof-skopos, 
     type_desc like zsl_glk_apof-type_desc, 
    end of ls_result. 

data: lt_result type standard table of ls_result. 

clear: lt_result, record_tab, record_tab[]. 

* Fill all the fields of the Search-Help with the data according to the 
*selections of the user. 
select apofasi apofasidate apofasisap 
     apofasi_tr_x apofasi_trp_x 
     katdanl skopos type_desc 
    into corresponding fields of table lt_result 
    from zsl_glk_apof 
    for all entries in it_apofasisap_tr 
    where apofasisap = it_apofasisap_tr-apofasisap_tr and 
     apofasi_tr_x = 'X'. "lv_apofasi_tr_x. 


call function 'F4UT_RESULTS_MAP' 
    tables 
    shlp_tab   = shlp_tab 
    record_tab  = record_tab 
    source_tab  = lt_result 
    changing 
    shlp    = shlp 
    callcontrol  = callcontrol 
    exceptions 
    illegal_structure = 1 
    others   = 2. 

if sy-subrc = 0. 
    callcontrol-step = 'DISP'. 
else. 
    callcontrol-step = 'EXIT'. 
endif. 
endif. 

問候 埃利亞斯