Replace drop-down list value with text

Before calling the Floe API, it may be necessary to convert drop-down list values to descriptions for the purpose of variable substitution.

The following function shows how to re-run the FLM drop-down list logic to find the correct descriptions:

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
FUNCTION ZHR_FLM_REPLACE_F4_TEXTS.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(IM_FORMS_DATA) TYPE  /FLM/XML_TAB_T
*"     REFERENCE(IM_FPE) TYPE  /FLM/FPE
*"     REFERENCE(IM_FIELD_NAME) TYPE  FIELDNAME OPTIONAL
*"     REFERENCE(IM_FIELD_VALUE) TYPE  /FLM/FORM_DATA-VALUE OPTIONAL
*"  EXPORTING
*"     REFERENCE(EX_FORMS_DATA) TYPE  /FLM/XML_TAB_T
*"     REFERENCE(EX_FIELD_TEXT) TYPE  /FLM/FORM_DATA-VALUE
*"----------------------------------------------------------------------

***********Notes on Usage **********************************************
* If IM_FIELD_NAME and IM_FIELD_VALUE are supplied, EX_FIELD_TEXT will
* contain the result. Otherwise ex_forms_data will be updated.
*************************************************************************
  DATA:   l_cust_class     TYPE string,
          l_node_name      TYPE string,
          l_sfs            TYPE REF TO object,
          l_name           TYPE string VALUE 'FORM_DATA',
          l_tab_row        TYPE /flm/form_data,
          l_tab_row2       TYPE /flm/form_data,
          l_routine        TYPE string,
          l_f4_data        TYPE /flm/sfs_form_data_t,
          l_f4_data_block  TYPE /flm/sfs_form_data_t WITH HEADER LINE,
          l_message        TYPE natxt,
          l_fver           TYPE /flm/fver,
          l_field_name     TYPE fieldname,                    
          l_sticky         TYPE /flm/sticky,
          l_f4_db_data     TYPE /flm/f4_data,
          l_vindex         TYPE /flm/index,
          l_subrc          TYPE sysubrc,
          l_v1             TYPE symsgv,
          l_v2             TYPE symsgv,
          l_doc10          TYPE char10,
          l_error          TYPE REF TO cx_root,             "295++
          l_long_text      TYPE string,                     "295++
          l_f4_name        TYPE text20,                       
          l_f4_value       TYPE text60,                       
          l_f4_vindex      TYPE numc3.                        
 
* Data for manipulating form data
  DATA: lt_forms_data TYPE /flm/xml_tab_t,
        temp_data     TYPE /flm/xml_tab_t,
        wa_forms_data TYPE /flm/xml_tab,
        l_form_data   TYPE /flm/xml_tab,
        l_posnr       TYPE plans,
        l_ok,
        l_msg         TYPE symsgv,
        l_fpe         TYPE /flm/fpe,
        lv_gsval      TYPE gsval,
        lv_subrc      TYPE sysubrc,
        it_f4_fields  TYPE TABLE OF /flm/fdd_fld,
        wa_f4_field   TYPE /flm/fdd_fld,
        l_get_values  TYPE flag,
        l_field_string  TYPE string,
        l_tabix       TYPE sytabix,
        l_parent      TYPE string,
        l_path        TYPE string,
        l_offset      TYPE i,
        l_result      TYPE  string,
        l_amrisid     TYPE  string,
        it_errors     TYPE bapireturn_t,
        l_str         TYPE string,
        l_plans       TYPE plans,
        l_plvar       TYPE plvar,
        l_stext       TYPE stext,
        l_objid       TYPE objid,
        l_scale       TYPE scale_id,
        l_pstext      TYPE profc_text,
        l_instance    TYPE string.

* Copy form data (helps when debugging)
  temp_data[] = lt_forms_data[] = im_forms_data[].

*Are we processing a whole form?
  IF im_field_name IS INITIAL.
* Get all fields that are F4s

    SELECT * FROM /flm/fdd_fld INTO TABLE it_f4_fields
      WHERE ccode = im_fpe-ccode
      AND   ftype = im_fpe-ftype
      AND   flang = im_fpe-flang
      AND   fver  = im_fpe-fver
      AND   f4_flag = 'X'.
* Or just one field.
  ELSEIF im_field_value IS NOT INITIAL.
* Get single field details
    SELECT * FROM /flm/fdd_fld INTO TABLE it_f4_fields
    WHERE ccode = im_fpe-ccode
    AND   ftype = im_fpe-ftype
    AND   flang = im_fpe-flang
    AND   fver  = im_fpe-fver
    AND   field_name = im_field_name
    AND   f4_flag = 'X'.
*Otherwise not enough data to do anything, so stop.
  ELSE.
    RETURN.
  ENDIF.

* Process 1 field at a time

  LOOP AT it_f4_fields INTO wa_f4_field.
    CLEAR l_get_values.
    REFRESH l_f4_data_block[].


* Are we doing whole form or single field?
    IF im_field_name IS INITIAL.

* Check that there is an F4 Code in the data to replace, need to loop round as DD may be optional and on a repeating seciton
      LOOP AT temp_data INTO wa_forms_data WHERE name = wa_f4_field-field_name
                                               AND   value IS NOT INITIAL.
* Set the flag if we find one with a value.
        l_get_values = 'X'.
        EXIT.
      ENDLOOP.

* Move onto next field if flag has not been set.
      IF l_get_values IS INITIAL.
        CONTINUE.
      ENDIF.
* Single field, so set the flag.
    ELSE.
      l_get_values = 'X'.
    ENDIF.

* Get the form class
    l_cust_class = /flm/core=>get_form_class( im_cust  = im_fpe-ccode
                                              im_ftype = im_fpe-ftype ).
*----------------------------------------------------------------------*
    l_fver = im_fpe-fver.
    l_field_string = wa_f4_field-field_name.
*
* Run F4 routines:
*

*
* If it's a sticky field, see if there is any data already available:
*
    CLEAR l_sticky.
    l_sticky = wa_f4_field-sticky.
*
    IF l_sticky IS NOT INITIAL.
*
      SELECT * FROM  /flm/f4_data INTO l_f4_db_data
             WHERE  ccode       = im_fpe-ccode
             AND    ftype       = im_fpe-ftype
             AND    flang       = im_fpe-flang
             AND    fver        = im_fpe-fver
             AND    fid         = im_fpe-id
             AND    field_name  = l_field_string
        ORDER BY vindex ASCENDING.
*
        CLEAR: l_tab_row2.
        l_tab_row2-name  = l_f4_db_data-v_key.
        l_tab_row2-value = l_f4_db_data-v_value.
        APPEND l_tab_row2 TO l_f4_data_block.
*
      ENDSELECT.
*
    ELSE.
*
      CONCATENATE 'F4_' im_fpe-ftype '_' wa_f4_field-field_name
             INTO l_routine.

*
* Check if userexit is activate  
*
      l_subrc = /flm/core=>check_userexit_active( im_ccode  = im_fpe-ccode
                                                  im_ftype  = im_fpe-ftype
                                                  im_flang  = im_fpe-flang
                                                  im_fver   = im_fpe-fver
                                                  im_name   = l_field_string
                                                  im_ue_typ = 'F4' ).
      IF l_subrc IS NOT INITIAL.
        DELETE temp_data WHERE name = l_field_string.
        CONTINUE.
      ENDIF.

      TRY.
*
* Get any F4 list entries:
*
          SELECT name value vindex FROM  /flm/f4_list INTO (l_f4_name, l_f4_value, l_f4_vindex)  "295sp2+- Performance Improvement
                 WHERE  ccode       = im_fpe-ccode
                 AND    ftype       = im_fpe-ftype
                 AND    flang       = im_fpe-flang
                 AND    fver        = im_fpe-fver
                 AND    field_name  = wa_f4_field-field_name
            ORDER BY vindex ASCENDING.
*
            CHECK l_f4_name IS NOT INITIAL AND                                            l_f4_value IS NOT INITIAL.                            
 *
            CLEAR: l_tab_row2.
            l_tab_row2-name  = l_f4_name.
            l_tab_row2-value = l_f4_value.
            APPEND l_tab_row2 TO l_f4_data_block.
*
          ENDSELECT.
*
          CALL METHOD (l_cust_class)=>(l_routine)
            EXPORTING
              im_data      = im_forms_data
              im_ccode     = im_fpe-ccode
              im_ftype     = im_fpe-ftype
              im_field     = l_field_string
              im_document  = im_fpe-document
              im_user      = sy-uname
            IMPORTING
              ex_message   = l_message
            CHANGING
              ch_form_data = l_f4_data_block[].

*
        CATCH cx_sy_dyn_call_illegal_method.
*
        CATCH cx_dynamic_check
               cx_static_check.
*
**
      ENDTRY.
*-----------------------------------------------------*
*If we find a message, bail out completely, otherwise onto next field:
      IF l_message IS NOT INITIAL.
*
        RETURN.
      ENDIF.
    ENDIF.

* Replace Value with text
    IF l_f4_data_block[] IS NOT INITIAL.
* Whole form
      IF im_field_name IS INITIAL.
        LOOP AT lt_forms_data INTO l_form_data WHERE name = wa_f4_field-field_name.
          l_tabix = sy-tabix.
          READ TABLE l_f4_data_block WITH KEY name = l_form_data-value.
          IF sy-subrc = 0.
            l_form_data-value = l_f4_data_block-value.             
            MODIFY lt_forms_data FROM l_form_data INDEX l_tabix.
          ENDIF.
        ENDLOOP.
* Single Field
      ELSE.
        READ TABLE l_f4_data_block WITH KEY name = im_field_value.
        IF sy-subrc = 0.
          ex_field_text = l_f4_data_block-value.
        ENDIF.
      ENDIF.
    ENDIF.

    DELETE temp_data WHERE name = l_field_string.

  ENDLOOP.

  ex_forms_data = lt_forms_data.

ENDFUNCTION.