пятница, 29 мая 2015 г.

Закладки на стандартном экране выбора

   Если вы хотите в своей программе создать несколько закладок на экране выбора, но рисовать экраны нет особого желания, то в SAPе есть альтернативное решение данной задчи.

Report ZTEST.
DATA flag(1) TYPE c.
* SUBSCREEN 1
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: Field1(20) TYPE c,
            Field2(20) TYPE c,
            Field3(20) TYPE c.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN END OF SCREEN 100.
* SUBSCREEN 2
SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME.
PARAMETERS: q1(20) TYPE c ,
            q2(20) TYPE c ,
            q3(20) TYPE c .
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN END OF SCREEN 200.
* STANDARD SELECTION SCREEN
SELECTION-SCREEN: BEGIN OF TABBED BLOCK mytab FOR 10 LINES,
                  TAB (20) button1 USER-COMMAND push1,
                  TAB (20) button2 USER-COMMAND push2,
                  END OF BLOCK mytab.
INITIALIZATION.
  button1 = 'TAB1'.
  button2 = 'TAB2'.
  mytab-prog = sy-repid.
  mytab-dynnr = 100.
  mytab-activetab = 'BUTTON1'.
AT SELECTION-SCREEN.
  CASE sy-dynnr.
    WHEN 1000.
      CASE sy-ucomm.
        WHEN 'PUSH1'.
          mytab-dynnr = 100.
          mytab-activetab = 'BUTTON1'.
        WHEN 'PUSH2'.
          mytab-dynnr = 200.
          mytab-activetab = 'BUTTON2'.
      ENDCASE.
    WHEN 100.
      MESSAGE s888(sabapdocu) WITH text-040 sy-dynnr.
    WHEN 200.
      MESSAGE s888(sabapdocu) WITH text-050 sy-dynnr.
  ENDCASE.
MODULE init_0100 OUTPUT.
  LOOP AT SCREEN.
    IF screen-group1 = 'MOD'.
      CASE flag.
        WHEN 'X'.
          screen-input = '1'.
        WHEN ' '.
          screen-input = '0'.
      ENDCASE.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
ENDMODULE.
MODULE user_command_0100 INPUT.
  MESSAGE s888(sabapdocu) WITH text-050 sy-dynnr.
  CASE sy-ucomm.
    WHEN 'TOGGLE'.
      IF flag = ' '.
        flag = 'X'.
      ELSEIF flag = 'X'.
        flag = ' '.
      ENDIF.
  ENDCASE.
ENDMODULE.
START-OF-SELECTION.
  WRITE: / 'Field1:', Field1,'Q1:', q1,
         / 'Field2:', Field2,'Q2:', q2,
         / 'Field3:', Field3,'Q3:', q3.

Результат:
TAB1


TAB2


четверг, 28 мая 2015 г.

Средство поиска текста С-должности на дату

Постоянно сталкиваюсь с построением средства поиска к какой-либо таблице с данными. 

В программе :

SELECT-OPTIONS: pa_objid FOR hrp1000-objid NO INTERVALS.

*** Средство поиска  ***
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_objid-low.
  PERFORM get_objid.


FORM get_objid.
  REFRESH dt_tabs.

  CALL FUNCTION 'ZHR_READ_C_PLANS'
    TABLES
      p_objid = pa_objid.

  IF pa_objid[] IS NOT INITIAL.
    READ TABLE pa_objid INDEX 1.
  ENDIF.
ENDFORM
.           


ФМ для поиска и формирования данных:

FUNCTION zhr_read_c_plans.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  TABLES
*"      P_OBJID
*"----------------------------------------------------------------------

  TYPES:
        BEGIN OF stab,
          plvar LIKE hrp1000-plvar,
          otype LIKE hrp1000-otype,
          objid LIKE hrp1000-objid,
          priox LIKE hrp1001-priox, " приоритет  для сортировки должностей
          sobid LIKE hrp1001-sobid,
          short LIKE p1000-short, " Код КП
         END OF stab.

  DATA:
        BEGIN OF ftab OCCURS 0,
          objid LIKE hrp1000-objid,
          short LIKE p1000-short, " Код КП
          stext TYPE zhr_char255, " Название должности
         END OF ftab.


  DATA: dt_tabs TYPE stab OCCURS 0 WITH HEADER LINE.
  DATA: it_return LIKE ddshretval OCCURS 0 WITH HEADER LINE.


  DATA: wa_fields LIKE sval,
         li_fields TYPE STANDARD TABLE OF sval WITH HEADER LINE.

RANGES: pa_objid FOR hrp1000-objid.

**********************************************************************
  MOVE 'Q1005' TO wa_fields-tabname.
  MOVE 'INDDA' TO wa_fields-fieldname.
  APPEND wa_fields TO li_fields.

  CALL FUNCTION 'POPUP_GET_VALUES'
    EXPORTING
*   NO_VALUE_CHECK        = ' '
      popup_title           = 'Выберите дату'
     start_column          = '5'
     start_row             = '5'
* IMPORTING
*   RETURNCODE            =
    TABLES
      fields                =  li_fields
   EXCEPTIONS
     error_in_fields       = 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.

  CHECK  li_fields IS NOT INITIAL.
  READ TABLE li_fields INDEX 1.
  sdate = li_fields-value.

  SELECT plvar priox sobid FROM hrp1001
      INTO CORRESPONDING FIELDS OF TABLE dt_tabs
            WHERE otype = 'CZ'
              AND plvar = '01'
              AND begda <= sdate
              AND endda >= sdate.

  LOOP AT dt_tabs.
    SELECT SINGLE objid otype short stext FROM hrp1000 INTO
          (dt_tabs-objid, dt_tabs-otype, dt_tabs-short, dt_tabs-stext)
            WHERE otype = 'C'
              AND plvar = '01'
              AND objid = dt_tabs-sobid
              AND begda <= sdate
              AND endda >= sdate.

    PERFORM search_ltext USING '70' dt_tabs-objid CHANGING dt_tabs-stext_70.

    MODIFY dt_tabs ."index sy-tabix.
    CLEAR dt_tabs.

  ENDLOOP.

  SORT dt_tabs BY priox objid.

  LOOP AT dt_tabs.
    MOVE-CORRESPONDING dt_tabs TO ftab.
    APPEND ftab.
    CLEAR ftab.
  ENDLOOP.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'OBJID'
      value_org       = 'S'
      multiple_choice = 'X'
    TABLES
      value_tab       = ftab
      return_tab      = it_return
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


  IF it_return[] IS NOT INITIAL.
    REFRESH: pa_objid.
  LOOP AT it_return.
    pa_objid-sign = 'I'.
    pa_objid-option = 'EQ'.
    pa_objid-low = it_return-FIELDVAL.
    APPEND pa_objid.
  ENDLOOP.
  p_objid[] = pa_objid[].
  ENDIF.

ENDFUNCTION.

ФМ для поиска полных лет

Данный ФМ возвращает количество полных лет между 2-мя датами.
Данные на выходе представлены в текстовом формате. Длина 3 символа.

FUNCTION ZRH_SEARCH_FULL_YEAR.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(I_BEGDA) TYPE  DATUM
*"     VALUE(I_ENDDA) TYPE  DATUM
*"  EXPORTING
*"     VALUE(E_AGE) TYPE  CHAR3
*"----------------------------------------------------------------------

data:
      t_years type int2.

check   I_ENDDA >= I_BEGDA.
*** разница в годах
t_years = I_ENDDA(4) - I_BEGDA(4).

*** проверяем, был ли ДР в этом году или нет, если нет то -1 год
if I_ENDDA+4(2) < I_BEGDA+4(2).
  t_years = t_years - 1.
elseif I_ENDDA+4(2) = I_BEGDA+4(2).
  if I_ENDDA+6(2) < I_BEGDA+6(2).
     t_years = t_years - 1.
  endif.
endif.

E_AGE = t_years.
SHIFT E_AGE LEFT DELETING LEADING space.

ENDFUNCTION.


среда, 1 апреля 2015 г.

Создание тестовых данных для таблиц: SFLIGHT, SPFLI, SCARR.

   Сегодня понадобилось создать пример на основе таблиц: SFLIGHT, SPFLI, SCARR, но к сожалению в нашей системе они пустые. Погуглив нашел следующее решение данной проблеммы.

   Необходимо запустить программу-генератор данных SXIDEMO_DATA_GENERATOR_XI.


Выбираем "Да" и "Полные данные рейса" и нажимаем "Выполнить". Проверяем таблицы :)

HR: Рекурсивный поиск элеменотов орг.структуры

Задача:
  SELECT * FROM hrp1001
   WHERE otype = 'O'
     AND objid = '80100000'
     AND plvar = '01'
     AND rsign = 'B'
     AND relat = '003'
     AND sclas = 'S'
     AND begda <= p_date
     AND endda >= p_date.

    pertab-orgeh   = '80100000'.
    pertab-sobid   = hrp1001-sobid.

    REFRESH infty_9901.
    CALL FUNCTION 'RHOM_READ_INFTY_BUFFERED'
      EXPORTING
        plvar     = '01'
        otype     = 'S'
        objid     = hrp1001-sobid
        infty     = '9901'
        begda     = p_date
        endda     = p_date
      TABLES
        infty_dat = infty_9901.

    IF sy-subrc <> 0.
    ELSE.
      pertab-oldrate = infty_9901-zrate.
    ENDIF.

    APPEND pertab.
    CLEAR  pertab.
  ENDSELECT.

четверг, 2 октября 2014 г.

Операции со строками текста

Конкатенация и разделение символьных строк
CONCATENATE
Символьные строки объединяются (конкатенируются) с помощью команды concatenate:

data: first (25), middla(2), last(25), full(54).
first = 'Con '.
middle = 'ca' .
last = ' tanate' .
concatenate first middle last into full.

После выполнения этой операции поле full будет содержать конкатенированную строку – ‘Concatanate’.

Если строки должны иметь разделители (например, строки, содержащие каталоги и имя айла в пути доступа), такой разделитель задается следующим образом:

data: directory_1(2), directory_2 (10) , file_name(10) , path(24).
directory_l = ' a:' .
directory_2 = 'usr' .
file_name = 'programs' .
concatenate directory_1 direotory_2 filename into path separated by ' \ ' .

Содержимое path в этом примере будет 'a:\usr\programs'. Система возвращает не равное нулю значение переменной sy-subrc, если длина конкатенированной строки больше, чем длина поля, в которое она записывается.

SPLIT 
Обратная операция разделения символьной строки осуществляется для произвольно выбранного разделителя:

data: list(40), name_1(25) , name_2(25) , name_3(25) .
l i s t  =  'Edison,Smith,Young'.
split  l ist  at ' , ' into name_l  name_2  name_3.

В качестве разделителей строк можно использовать различные символы, например пробел, минус,или даже последовательность символов. Если одно из полей, в которые записывается результат, имеет недостаточную длину, все компоненты усекаются и переменная sy-subrc получает ненулевое значение.
Кроме того, если число компонентов превышает число целевых полей, информация теряется, так как последнее поле содержит всю оставшуюся часть строки. Чтобы не допустить этого, в качестве целевого объекта используйте внутреннюю таблицу, которая может содержать любое число строк:

data: names  like name_1 occurs 10.
list =  'Edison,Smith,Young,Edwards' .
split  list  at ' , ' into table names.

Внутренняя таблица names будет содержать четыре строки: Edison, Smith, Young u Edwards.

Сдвиг числовых строк
SHIFT
Сдвинуть символьную строку на один символ можно посредством команды shift, а на несколько символов -  путем добавления by n places:

name_l = ' Edison' .
name 2 = ' Smith' .
name_3 = ' Young' .
shift name_l.
shift name_2 by 3 places.
shift name_3 right.

После этих операций поле name_l будет содержать символьную строку dison, поле name_2 -  th, a поле name_3 — Young (с начальными пробелами). Такие операции очень удобны, если к анализу текста приступают не сначала, а с определенного слова.

Если разработчик не хочет указывать число байтов, на которое осуществляется сдвиг (возможно, он и не знает его), можно использовать другие варианты команды shift.
Предположим, необходимо отыскать подстроку внутри строки и сдвинуть всю строку до начала этой подстроки:

names = 'Alexander Bill Charles' .
shift names up to ' Bill ' .

Так как подстрока Bill найдена в поле names, после операции содержимое поля names будет Bill Charles. Если подстрока не найдена, строка остается без изменения и система возвращает ненулевое значение переменной sy-subrc. Аналогично, если поле должно быть сдвинуто вправо так, чтобы не содержать в конце заданного символа, можно написать следующий программный фрагмент:

Name =  ' Joanna     ' .
shift name right deleting trailing space.

Эта команда shift удаляет все пробелы после последнего значащего символа в поле name и возвращает значение  ‘    Joanne’. Значение space (пробел) является предварительно определенным полем, содержащим пробелы.


Замена и преобразование символов в строке
REPLACE
Для замены определенных символов в строке используется команда replace, которая позволяет замещать первый встретившийся символ (или подстроку) внутри строки:

string = 'Variable: fi. The variable & is substituted later .
replace ' fi' with 'X' into string.

TRANSLATE
Поле string будет равно Variable: X. The variable & is substituted later. Для замены всех символов & на X вводится команда translate:

translate string using '&X' .

Все символы & в поле символьной строки будут заменены на X, т.е. строка будет иметь вид:
Variable: X. The variable X is substituted later.

Команда translate позволяет заменить сразу несколько символов в строке. Правило замены записывается как последовательность пар, где первый символ всегда заменяется на второй. Например, можно заменить все переменные в математической формуле:

expression = 'a ** 2 + b ** 2 - с ** 2' .
translate expression using 'axbycz' .

Результатом замены будет выражение х ** 2 + у ** 2 – z ** 2.

Команда translate позволяет изменить регистр строки. Например:

DATA text TYPE string.
text = `Careful with that Axe, Eugene`.
TRANSLATE text TO UPPER CASE

После преобразования переменная text будет содержать значение  "CAREFUL WITH THAT AXE, EUGENE".



Поиск символьных строк в поляхили внутренних таблицах
Предположим, нужно отыскать строку California в символьном поле:

text = 'Texas California Mew Mexico Louisiana Oregon'.
search text for ' California' .
if sy-subrc ne  0.
   write 'Not found'.
endif.

Поиск закончится успешно, и системный код возврата (sy-subrc) будет равен нулю. Кроме того, системное поле sy-fdpos содержит сдвиг найденной строки относительно начала (в этом примере sy-fdpos = 6). Команда search не различает символы верхнего и нижнего регистров, поэтому следующий оператор поиска завершится тоже успешно:

search text for 'cAliforniA' .

Можно искать подстроки, содержащие пробелы:
search text for 'New M' .
В результате выполнения этого оператора код возврата sy-subrc будет равен 0, а код sy-fdpos = 17.
Чтобы определить, содержится ли подстрока с заключительными пробелами в символьной строке, заключите подстроку в символы "точка":

data: string(6) value 'АВАР/4' .
search string for ' ./4  .' .

Заданный шаблон ./4_. не совпадает с содержимым поля, так как в поле string нет заключительного пробела, однако поиск /4_ закончится успешно.
В АВАР/4 поддерживается поиск символьных строк во внутренних таблицах. Предположим, во внутренней таблице letter содержится текст письма:

types text_line(80) .
data letter type text_line occurs 100.

Пусть первая строка письма letter равна Dear Sir, а вторая — thank you for your letter of 12/31/1999.
Оператор имеет вид:
search letter for 'you'.

В этом случае оператор даст следующий результат: sy-subrc - 0, sy-tabix - 2, sy-fdpos - 6. Системное поле sy-tabix возвращает индекс строки таблицы, содержащей искомую строку, a sy-fdpos — сдвиг относительно начала этой строки. Креме того, дополнения команды search позволяют ограничить диапазон поиска строк:

search letter for  'thank'  starting at 2 ending at 100.
search letter for  'Sincerely'  starting at 3.

Первый оператор ограничивает поиск строками от второй до сотой, для второго ператора  поиск будет производится по всем строкам, начиная с третьей.

STRLEN
Эта функция возвращает длину строки в символах.

Пример использования:
data str(30) value 'INDIA IS GREAT'.
data len type i.
len = STRLEN( STR ).
Значение len = 14.

CONDENSE
Эта функция используется для удаления пробелов в строке, с помощью дополнения NO-GAPS можно убрать все пробелы в том числе и из средины строки.

Пример использования:
data str(30) value '   INDIA IS GREAT'.
CONDENSE STR.

Результат 'INDIA IS GREAT'.

понедельник, 22 сентября 2014 г.

Свой фильтр к стандартной таблице ALV

Обработка нажатия кнопки

    CASE okcode.
      WHEN '&MY_ILT'.
        PERFORM my_filter.


Переменные в главной программе

DATA: g_custom_container TYPE REF TO cl_gui_custom_container,
      g_alv_grid_ref TYPE REF TO cl_gui_alv_grid,
      gt_sflight TYPE sflight OCCURS 0.

  FIELD-SYMBOLS: <my_fs> TYPE ANY TABLE.

  DATA:
    go_struct    TYPE REF TO cl_abap_structdescr,
    go_table     TYPE REF TO cl_abap_tabledescr,
    gt_comp         TYPE abap_compdescr_tab,
    wa_gt_comp like LINE OF gt_comp,
    gs_comp_a       LIKE LINE OF gt_comp,
    gdo_data     type ref to data,
    gr  TYPE REF TO data,
    grf4  TYPE REF TO data.



  FIELD-SYMBOLS: <my_table> TYPE STANDARD TABLE.
  FIELD-SYMBOLS: <fld_f4table> TYPE STANDARD TABLE.

data: dyn_table    type ref to data,
*      dyn_line     type ref to data,
      wa_fcat type lvc_s_fcat,
      it_fcat type lvc_t_fcat,
      d_table    type ref to data.



Сама процедура

FORM my_filter.

  DATA: ls_row_id TYPE lvc_s_row.
  DATA: ls_col type i.
  DATA: ls_col_id TYPE lvc_s_col.
  DATA: l_value TYPE lvc_s_data-value.
*  DATA: ls_selfield TYPE lvc_s_self.
*  DATA: ls_fieldcat TYPE slis_fieldcat_alv.
*  DATA: ls_fieldcat_lvc TYPE lvc_s_fcat.

  DATA: lt_fcat_lvc TYPE lvc_t_fcat,
*        lt_sort_lvc TYPE lvc_t_sort,
*        ls_lyout_lvc TYPE lvc_s_layo,
        lt_filter_lvc TYPE lvc_t_filt,
        wa_lt_filter_lvc LIKE LINE OF lt_filter_lvc.

  DATA:
        i_retab TYPE TABLE OF  ddshretval,
        wa_retab LIKE LINE OF i_retab OCCURS 0 WITH HEADER LINE,
        r_field TYPE  dfies-fieldname,
        r_dynprofield TYPE  help_info-dynprofld.

  FIELD-SYMBOLS:
                 <ls_wa> TYPE ANY,
                 <my_wa> TYPE ANY.


  FIELD-SYMBOLS:
                       <fs1> TYPE ANY,
                       <fs2> TYPE ANY.

**********************************************************************


  CALL METHOD gt_grid-grid->get_current_cell
    IMPORTING
      es_row_id = ls_row_id
      e_col     = ls_col
      es_col_id = ls_col_id
      e_value   = l_value.


  CALL METHOD gt_grid-grid->get_filter_criteria
    IMPORTING
      et_filter = lt_filter_lvc.

*** создаем ссылку на динамическую.таблицу
  IF <my_fs> IS NOT ASSIGNED.
    ASSIGN ('T_OUTTAB[]') TO <my_fs>.
  ENDIF.


*** создаем копию динамическ.таблицы с полными данными
  IF <my_table> IS NOT ASSIGNED.
    GET REFERENCE OF <my_fs> INTO gdo_data.

    go_table  ?= cl_abap_structdescr=>describe_by_data_ref( gdo_data ).
    go_struct ?= go_table->get_table_line_type( ).
    gt_comp = go_struct->components.

    CREATE DATA gr  TYPE HANDLE go_table. " создаем обект-данных полученного типа
    ASSIGN gr->* TO <my_table>. "создаем таблицу
    <my_table>[] = <my_fs>[].
  ENDIF.
**********************************************************************

  r_field = ls_col_id.
  r_dynprofield = ls_col_id.

clear it_fcat.
refresh it_fcat.

*  IF <fld_f4table> IS NOT ASSIGNED.
    READ TABLE gt_comp INTO wa_gt_comp WITH KEY name = ls_col_id.

    wa_fcat-fieldname = wa_gt_comp-name .
    wa_fcat-datatype  = wa_gt_comp-type_kind.
    wa_fcat-inttype   = wa_gt_comp-type_kind.
    wa_fcat-intlen    = wa_gt_comp-length.
    wa_fcat-decimals  = wa_gt_comp-decimals.

    APPEND wa_fcat TO it_fcat.

* Create dynamic internal table and assign to Field-Symbol
    CALL METHOD cl_alv_table_create=>create_dynamic_table
      EXPORTING
        it_fieldcatalog = it_fcat
      IMPORTING
        ep_table        = d_table.

    ASSIGN d_table->* TO <fld_f4table>.
*  else.
*    UNASSIGN   <fld_f4table>.
*
*    READ TABLE gt_comp INTO wa_gt_comp WITH KEY name = ls_col_id.
*
*    wa_fcat-fieldname = wa_gt_comp-name .
*    wa_fcat-datatype  = wa_gt_comp-type_kind.
*    wa_fcat-inttype   = wa_gt_comp-type_kind.
*    wa_fcat-intlen    = wa_gt_comp-length.
*    wa_fcat-decimals  = wa_gt_comp-decimals.
*
*    APPEND wa_fcat TO it_fcat.
*
** Create dynamic internal table and assign to Field-Symbol
*    CALL METHOD cl_alv_table_create=>create_dynamic_table
*      EXPORTING
*        it_fieldcatalog = it_fcat
*      IMPORTING
*        ep_table        = d_table.
*
*    ASSIGN d_table->* TO <fld_f4table>.
*  ENDIF.

  REFRESH <fld_f4table>.

  ASSIGN COMPONENT r_field OF STRUCTURE <fld_f4table> TO <fs2>.
  LOOP AT <my_table> ASSIGNING <ls_wa>.
    ASSIGN COMPONENT r_field OF STRUCTURE <ls_wa> TO <fs1>.
    APPEND <fs1> TO <fld_f4table>.
  ENDLOOP.


**********************************************************************
  DATA h_field_tab LIKE dfies OCCURS 0 WITH HEADER LINE.
  DATA h_field_wa LIKE dfies.
  DATA wa_it_fieldcat LIKE LINE OF it_fieldcat OCCURS 0 WITH HEADER LINE.

  READ TABLE it_fieldcat INTO wa_it_fieldcat WITH KEY fieldname = wa_gt_comp-name.

  h_field_wa-tabname   = 'LT_VALUES'.
  CONCATENATE '1~' wa_gt_comp-name INTO h_field_wa-fieldname.
  r_field = h_field_wa-fieldname.
  h_field_wa-intlen    = wa_gt_comp-length.                 "'000008'.
  h_field_wa-outputlen = wa_gt_comp-length.                 "'000008'.
  h_field_wa-inttype   = wa_gt_comp-type_kind."'N'.
  h_field_wa-LOWERCASE = 'X'.
  IF wa_it_fieldcat-seltext_l IS NOT INITIAL.
    h_field_wa-reptext   = wa_it_fieldcat-seltext_l.
  ELSEIF wa_it_fieldcat-seltext_m IS NOT INITIAL.
    h_field_wa-reptext   = wa_it_fieldcat-seltext_m.
  ELSE.
    h_field_wa-reptext   = wa_it_fieldcat-seltext_s.
  ENDIF.

  APPEND h_field_wa TO h_field_tab.
**********************************************************************

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield    =  r_field   "<---Return field column name
*      dynpprog    = sy-repid
*      dynpnr      = sy-dynnr
     dynprofield =  'RSCSEL-SLOW_I' "r_dynprofield
      value_org        = 'S'
      multiple_choice  = 'X'
    TABLES
      value_tab   = <fld_f4table>
      field_tab   = h_field_tab
      return_tab  = i_retab.
  IF sy-subrc EQ 0.

  ENDIF.


  LOOP AT i_retab INTO wa_retab.

    wa_lt_filter_lvc-fieldname = wa_gt_comp-name.
    wa_lt_filter_lvc-tabname   = '1'.
    wa_lt_filter_lvc-seltext   =  h_field_wa-reptext.
    wa_lt_filter_lvc-lowercase = 'X'.
    wa_lt_filter_lvc-inttype   = wa_gt_comp-type_kind.
    wa_lt_filter_lvc-no_sign   = 'X'.
    wa_lt_filter_lvc-order     = ls_col.
    wa_lt_filter_lvc-REF_FIELD = wa_gt_comp-name.
    wa_lt_filter_lvc-low       = wa_retab-fieldval.
    wa_lt_filter_lvc-sign      = 'I'.
    wa_lt_filter_lvc-option    = 'EQ'.
    APPEND  wa_lt_filter_lvc TO lt_filter_lvc.
    CLEAR wa_lt_filter_lvc.
  ENDLOOP.

  CALL METHOD gt_grid-grid->set_filter_criteria
    EXPORTING
      it_filter = lt_filter_lvc.

    CALL METHOD gt_grid-grid->REFRESH_TABLE_DISPLAY.
ENDFORM.                    "my_filter