Текущее время: Пн, июл 21 2025, 01:35

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: ФМ F4IF_INT_TABLE_VALUE_REQUEST.
СообщениеДобавлено: Чт, окт 29 2009, 07:29 
Специалист
Специалист

Зарегистрирован:
Чт, сен 04 2008, 12:40
Сообщения: 119
Откуда: Пермь
Пол: Мужской
Столкнулся с очередной проблемой.
Пишу ФМ для использования его в качестве средства поиска при выборе значений признака в классификации.
Вот о чем речь. При создании признака через ct04 ему можно присвоить ФМ, который будет участвовать в проверке введенных значений и поиска доступных значений для ввода (по F4).

Для этого создал функциональную группу Z_TABNOMER_SHLP_GF.
В ней два ФМ'а Z_TABNOMER_SHLP и Z_TABNOMER_SHLP_F4 с указанными в хелпе итерфейсами.
В свойствах признака указал ФМ Z_TABNOMER_SHLP (пустой). Но выборка доступных значений ведется в Z_TABNOMER_SHLP_F4 .

Впринципе доступные значения выбираются, но есть несколько моментов, которые я никак не могу догнать.
1. В результате нажатия F4 сразу выдается результат поиска, тоесть экран для наложения ограничений игнорируется;
2. Результат поиска выдается в одном поле. ТОесть, если мне надо три столбца, то эти три столбца присутствуют, но данные каждой строки не в трех отдельных ячейках, а в одном поле.

Использую ФМ F4IF_INT_TABLE_VALUE_REQUEST.
Кто сталкивался - поясните пожалуйста!

Code:
  fields-tabname = 'LFA1'.
  fields-fieldname = 'SORTL'.
  fields-SCRTEXT_S = 'Табельный№'.
  APPEND fields.

  fields-tabname = 'LFA1'.
  fields-fieldname = 'NAME1'.
   fields-SCRTEXT_S = 'Табельный№'.
  APPEND fields.

  fields-tabname = 'LFA1'.
  fields-fieldname = 'NAME4'.
  APPEND fields.

  SELECT NAME4 NAME1 SORTL
  FROM LFA1
  up to 100 rows
  INTO CORRESPONDING FIELDS OF TABLE head_table
  WHERE ktokk = 'Z005'
  .

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      RETFIELD                          = 'SORTL'
      VALUE_ORG                         = 'S'
    TABLES
      FIELD_TAB                         = fields
      VALUE_TAB                         = head_table
      RETURN_TAB                        = return
    EXCEPTIONS
      field_not_in_ddic                 = 01
      more_then_one_selectfield         = 02
      no_selectfield                    = 03
.

  IF SY-SUBRC <> 0.

  ELSE.
    VALUES-VALUE = return-fieldval.
    APPEND VALUES.
  ENDIF.


Если не заполнять параметр FIELD_TAB, то данные выводятся как надо, в три столбца - в каждом свое значение. Но как тогда переименовать заголовок столбца? Ну и по прежнему результат вываливается вперед экрана ограничений.

_________________
Если долго биться головой об стену, то вскоре в стене появится небольшое отверстие ...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: ФМ F4IF_INT_TABLE_VALUE_REQUEST.
СообщениеДобавлено: Чт, окт 29 2009, 09:30 
Специалист
Специалист

Зарегистрирован:
Ср, апр 29 2009, 07:08
Сообщения: 197
Откуда: AUS RUSSLAND
Пол: Мужской
В этом ФМ жестко зашито, что SH должен быть типа 'D', т.е. немедленный просмотр значений, а для того, чтобы было три столбца наверно надо заполнять еще свойство POSITION у fields


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ F4IF_INT_TABLE_VALUE_REQUEST.
СообщениеДобавлено: Чт, окт 29 2009, 09:43 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
FIELDS можно вообще не заполнять/передавать для этого ФМ.

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ F4IF_INT_TABLE_VALUE_REQUEST.
СообщениеДобавлено: Чт, окт 29 2009, 11:32 
Специалист
Специалист

Зарегистрирован:
Чт, сен 04 2008, 12:40
Сообщения: 119
Откуда: Пермь
Пол: Мужской
Ха, я красавчик!
Вот как сделал
Создал ФМ с интерфейсом, описанным в хелпе транзакции ct04 (изменение признака) для поля, где нужно указать ФМ, который будет проверять введенные пользователем значения (In this field, you can enter the name of a function module for checking characteristic values entered by the user...). Этот ФМ у меня абсолютно пустой. Задачи проверить значения пользователя не было. Для этого создал Функциональную группу, куда поместил данный ФМ (не знаю точно, надо делать именно так или можно как то еще).
Затем создал еще один ФМ, который выдает список допустимых значений признака (Function Module for Possible Entries) с интерфейсом, указанным все в том же хелпе (Его имя должно быть таким <function module for value check> + suffix "_F4" , где <function module for value check> - имя первого ФМ'а, который я создал). Вот код второго ФМ'а:

Code:
FUNCTION Z_TABNOMER_SHLP_F4 .
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(CHARACT_NO) LIKE  CABN-ATINN
*"     REFERENCE(CHARACT) LIKE  CABN-ATNAM
*"     REFERENCE(DISPLAY)
*"     REFERENCE(ADDITIONAL_VALUES) LIKE  CABN-ATSON
*"     REFERENCE(MULTIPLE_VALUES) LIKE  RCTMV-ATLIS
*"     REFERENCE(LANGUAGE) LIKE  SY-LANGU
*"     REFERENCE(DISPLAY_WITH_LANGUAGE)
*"  TABLES
*"      VALUES STRUCTURE  RCTVALUES
*"  EXCEPTIONS
*"      NOT_FOUND
*"----------------------------------------------------------------------
  TABLES: LFA1.
  DATA:
     BEGIN OF head_table OCCURS 0,
      sortl LIKE LFA1-SORTL,
      NAME1 LIKE LFA1-NAME1,
      NAME4 LIKE LFA1-NAME4,
     END OF head_table.

  DATA: return     LIKE DDSHRETVAL OCCURS 0 WITH HEADER LINE.

  CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
    EXPORTING
      tabname           = 'LFA1'
      fieldname         = 'SORTL'
      SEARCHHELP        = 'Z_CLOCK_NUMBER_BY_SURNAME'
    TABLES
      RETURN_TAB        = return
    EXCEPTIONS
      FIELD_NOT_FOUND   = 1
      NO_HELP_FOR_FIELD = 2
      INCONSISTENT_HELP = 3
      NO_VALUES_FOUND   = 4
      OTHERS            = 5.
  IF SY-SUBRC <> 0.

  ELSE.
    MOVE 'I'   TO VALUES-STATUS.
    VALUES-VALUE = return-fieldval.
    APPEND VALUES.
  ENDIF.

ENDFUNCTION.


Как видно из кода, создал серч хелп 'Z_CLOCK_NUMBER_BY_SURNAME'. В нем указал ФМ для SearchHelpExit.
Код ФМ'а созданного для SearchHelpExit:


Code:
FUNCTION Z_CLOCK_NUMBER_BY_SURNAME.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------
DATA:
       BEGIN OF head_table OCCURS 0,
        sortl LIKE LFA1-SORTL,
        NAME1 LIKE LFA1-NAME1,
        NAME4 LIKE LFA1-NAME4,
       END OF head_table.

DATA: SEL LIKE LINE OF SHLP-SELOPT.

  ranges rng_SORTL for LFA1-SORTL.
  ranges rng_NAME1 for LFA1-NAME1.
  ranges rng_NAME4 for LFA1-NAME4.

* EXIT immediately, if you do not want to handle this step
  IF CALLCONTROL-STEP <> 'SELONE' AND
     CALLCONTROL-STEP <> 'SELECT' AND
     " AND SO ON
     CALLCONTROL-STEP <> 'DISP'.
     EXIT.
  ENDIF.

*"----------------------------------------------------------------------
* STEP SELONE  (Select one of the elementary searchhelps)
*"----------------------------------------------------------------------
* This step is only called for collective searchhelps. It may be used
* to reduce the amount of elementary searchhelps given in SHLP_TAB.
* The compound searchhelp is given in SHLP.
* If you do not change CALLCONTROL-STEP, the next step is the
* dialog, to select one of the elementary searchhelps.
* If you want to skip this dialog, you have to return the selected
* elementary searchhelp in SHLP and to change CALLCONTROL-STEP to
* either to 'PRESEL' or to 'SELECT'.
  IF CALLCONTROL-STEP = 'SELONE'.
*   PERFORM SELONE .........
    EXIT.
  ENDIF.

*"----------------------------------------------------------------------
* STEP PRESEL  (Enter selection conditions)
*"----------------------------------------------------------------------
* This step allows you, to influence the selection conditions either
* before they are displayed or in order to skip the dialog completely.
* If you want to skip the dialog, you should change CALLCONTROL-STEP
* to 'SELECT'.
* Normaly only SHLP-SELOPT should be changed in this step.
  IF CALLCONTROL-STEP = 'PRESEL'.
  EXIT.
  ENDIF.
*"----------------------------------------------------------------------
* STEP SELECT    (Select values)
*"----------------------------------------------------------------------
* This step may be used to overtake the data selection completely.
* To skip the standard seletion, you should return 'DISP' as following
* step in CALLCONTROL-STEP.
* Normally RECORD_TAB should be filled after this step.
* Standard function module F4UT_RESULTS_MAP may be very helpfull in this
* step.
  IF CALLCONTROL-STEP = 'SELECT'.
    LOOP AT SHLP-SELOPT INTO sel.
      CASE sel-SHLPFIELD.
        when 'SORTL'.
          move-corresponding sel to rng_SORTL.
          append rng_SORTL.
        when 'NAME1'.
        TRANSLATE sel-low  TO UPPER CASE.
        TRANSLATE sel-high TO UPPER CASE.
          move-corresponding sel to rng_NAME1.
          append rng_NAME1.
        when 'NAME4'.
          move-corresponding sel to rng_NAME4.
          append rng_NAME4.
      ENDCASE.
    ENDLOOP.

  SELECT NAME4 NAME1 SORTL
  FROM LFA1
  INTO CORRESPONDING FIELDS OF TABLE head_table
  WHERE       ktokk = 'Z005'
        and   sortl IN rng_sortl
        and   MCOD1 IN rng_name1
        and   name4 IN rng_name4
  .



    CALL FUNCTION 'F4UT_RESULTS_MAP'
    TABLES
      SHLP_TAB    = SHLP_TAB
      RECORD_TAB  = RECORD_TAB
      SOURCE_TAB  = HEAD_TABLE
    CHANGING
      SHLP        = SHLP
      CALLCONTROL = CALLCONTROL
    EXCEPTIONS
      OTHERS      = 2.

   IF SY-SUBRC = 0.
     CALLCONTROL-STEP = 'DISP'.
   ELSE.
     CALLCONTROL-STEP = 'EXIT'.
   ENDIF.
    EXIT. "Don't process STEP DISP additionally in this call.
  ENDIF.
*"----------------------------------------------------------------------
* STEP DISP     (Display values)
*"----------------------------------------------------------------------
* This step is called, before the selected data is displayed.
* You can e.g. modify or reduce the data in RECORD_TAB
* according to the users authority.
* If you want to get the standard display dialog afterwards, you
* should not change CALLCONTROL-STEP.
* If you want to overtake the dialog on you own, you must return
* the following values in CALLCONTROL-STEP:
* - "RETURN" if one line was selected. The selected line must be
*   the only record left in RECORD_TAB. The corresponding fields of
*   this line are entered into the screen.
* - "EXIT" if the values request should be aborted
* - "PRESEL" if you want to return to the selection dialog
* Standard function modules F4UT_PARAMETER_VALUE_GET and
* F4UT_PARAMETER_RESULTS_PUT may be very helpfull in this step.
  IF CALLCONTROL-STEP = 'DISP'.
*   PERFORM AUTHORITY_CHECK TABLES RECORD_TAB SHLP_TAB
*                           CHANGING SHLP CALLCONTROL.
    EXIT.
  ENDIF.
ENDFUNCTION.


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

_________________
Если долго биться головой об стену, то вскоре в стене появится небольшое отверстие ...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB