Текущее время: Чт, июл 03 2025, 02:23

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Динамическое определение полей экрана.
СообщениеДобавлено: Вт, июл 14 2009, 16:03 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
Добрый день!

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

_________________
С уважением, Сергей С.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Вт, июл 14 2009, 16:14 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
east написал:
Добрый день!

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

Сама сапа иногда примерно так и делает, создает экран с избыточным кол-вом полей (с определенными именами) и в динамике ими управляет (видимость, доступ...). Можно динамически генерить программы с селекционным экраном, сап тоже так делает, например SE11 генерит сел.экран перед просмотром содержимого.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Вт, июл 14 2009, 16:25 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Тут посмотрите


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Чт, июл 16 2009, 04:11 
Специалист
Специалист

Зарегистрирован:
Ср, янв 26 2005, 05:11
Сообщения: 185
Пол: Мужской
На самом деле все просто. В динпро создаешь подэкран. А в программе делаешь selection-screen as subscreen. Потом этот selection-screen и вызываешь.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Чт, июл 16 2009, 09:26 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
Parazit написал:
Сама сапа иногда примерно так и делает, создает экран с избыточным кол-вом полей (с определенными именами) и в динамике ими управляет (видимость, доступ...). Можно динамически генерить программы с селекционным экраном, сап тоже так делает, например SE11 генерит сел.экран перед просмотром содержимого.

Тоже сталкивался с этим вариантом, только вот уж какой-то он грубоватый на мой взгляд.

Пономарев Артем написал:

Делал тест модулей. Пока не пробовал вызывать в подэкранах, но по функционалу - именно то, что нужно, спасибо! :) Знать бы еще как сам SAP такие экраны генерирует.

Serge69 написал:
На самом деле все просто. В динпро создаешь подэкран. А в программе делаешь selection-screen as subscreen. Потом этот selection-screen и вызываешь.

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

Всем спасибо! :pivo:

_________________
С уважением, Сергей С.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Чт, июл 16 2009, 14:42 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пн, сен 17 2007, 10:48
Сообщения: 190
Откуда: Нальчик, РФ
Пол: Мужской
Все-таки снял галочку "тема решена" :)

Очень инетересно как это чудо в subscreen-е вызвать.
Code:
Process Before Output.
  Module status_0100.
  Call SubScreen X Including 'SAPLSSEL' '2000'.
Process After Input.
  Call SubScreen X.
  Module user_command_0100.


Code:
Module status_0100 Output.
...
Call Function 'FREE_SELECTIONS_INIT'
Exporting
   kind                           = 'T'
...
   as_subscreen                   = gc_x
...
  Importing
    selection_id                  = selection_id
...
Call Function 'FREE_SELECTIONS_DIALOG'
  Exporting
    selection_id                  = selection_id
...
  Exceptions
...
    no_action                     = 2<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<EXCEPTION :(
...
EndModule.


С описанием функций явно туго. :?

_________________
С уважением, Сергей С.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Чт, дек 02 2010, 08:56 
Специалист
Специалист

Зарегистрирован:
Чт, дек 02 2010, 08:37
Сообщения: 156
Пришлось немного поковыряться в тр. BMBC, но, в конце концов, удалось сделать FREE_SELECTIONS_DIALOG подэкраном.
Выкладываю рабочую "рыбу". В программе надо создать экран 0100 с подэкраном SUB на нем.

PBO и PAI логика:
Code:
PROCESS BEFORE OUTPUT.
  MODULE STATUS_0100.
  CALL SUBSCREEN sub INCLUDING 'SAPLSSEL' '1105'.
*
PROCESS AFTER INPUT.
  CALL SUBSCREEN sub.
  MODULE USER_COMMAND_0100.


остальной код:
Code:
REPORT  ztest.

TYPE-POOLS:
  rsds.
DATA:
  ok_code TYPE sy-ucomm.
DATA:
  BEGIN OF gs_sel
    ,selid TYPE rsdynsel-selid
,END OF gs_sel.

START-OF-SELECTION.

  CALL SCREEN 0100.

FORM free_selection_screen.
  DATA:
    ls_pfkey TYPE rsdspfkey
   ,lt_fld   TYPE rsdsfields_t            WITH HEADER LINE
   ,lt_fldt  TYPE wcb_rsdstexts_tab  WITH HEADER LINE
   ,lt_rng   TYPE rsds_trange          WITH HEADER LINE.

* field list
  CLEAR lt_fld.
  lt_fld-tablename = 'T001W'.
  lt_fld-fieldname = 'WERKS'.
  APPEND lt_fld TO lt_fld.
  lt_fld-tablename = 'MARA'.
  lt_fld-fieldname = 'MATNR'.
  APPEND lt_fld TO lt_fld.
  lt_fld-tablename = 'BKPF'.
  lt_fld-fieldname = 'BLDAT'.
  APPEND lt_fld TO lt_fld.

* custom field names for select-options
  CLEAR lt_fldt.
  lt_fldt-tablename = 'BKPF'.
  lt_fldt-fieldname = 'BLDAT'.
  lt_fldt-text      = 'Validity Period'.
  APPEND lt_fldt TO lt_fldt.

  ls_pfkey-program = sy-repid.

  IF gs_sel-selid IS INITIAL.
    CALL FUNCTION 'FREE_SELECTIONS_INIT'
      EXPORTING
        kind                           = 'F'
*       EXPRESSIONS                    =
*       FIELD_RANGES_INT               =
*       FIELD_GROUPS_KEY               =
*       RESTRICTION                    =
*       ALV                            =
*       CURR_QUAN_PROG                 = SY-CPROG
*       CURR_QUAN_RELATION             =
      IMPORTING
        selection_id                   = gs_sel-selid
*       WHERE_CLAUSES                  =
*       EXPRESSIONS                    =
*       FIELD_RANGES                   =
*       NUMBER_OF_ACTIVE_FIELDS        =
      TABLES
*       TABLES_TAB                     =
*       TABFIELDS_NOT_DISPLAY          =
        fields_tab                     = lt_fld[]
*       FIELD_DESC                     =
        FIELD_TEXTS                    = lt_fldt[]
*       EVENTS                         =
*       EVENT_FIELDS                   =
*       FIELDS_NOT_SELECTED            =
*       NO_INT_CHECK                   =
*       ALV_QINFO                      =
      EXCEPTIONS
        fields_incomplete              = 01
        fields_no_join                 = 02
        field_not_found                = 03
        no_tables                      = 04
        table_not_found                = 05
        expression_not_supported       = 06
        incorrect_expression           = 07
        illegal_kind                   = 08
        area_not_found                 = 09
        inconsistent_area              = 10
        kind_f_no_fields_left          = 11
        kind_f_no_fields               = 12
        too_many_fields                = 13
        dup_field                      = 14
        field_no_type                  = 15
        field_ill_type                 = 16
        dup_event_field                = 17
        node_not_in_ldb                = 18
        area_no_field                  = 19
        OTHERS                         = 20.
  ENDIF.

  CHECK NOT gs_sel-selid IS INITIAL.

  CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
    EXPORTING
      selection_id                  = gs_sel-selid
*     title                         =
*     frame_text                    =
*     status                        = 1
*     AS_WINDOW                     = ' '
*     START_ROW                     = 2
*     START_COL                     = 2
*     NO_INTERVALS                  = ' '
*     JUST_DISPLAY                  = ' '
*     pfkey                         =
*     ALV                           = ' '
      tree_visible                  = space
*     DIAG_TEXT_1                   =
*     DIAG_TEXT_2                   =
*     WARNING_TITLE                 =
      AS_SUBSCREEN                  = 'X'
      NO_FRAME                      = 'X'
    IMPORTING
*     WHERE_CLAUSES                 =
*     EXPRESSIONS                   =
      field_ranges                  = lt_rng[]
*     NUMBER_OF_ACTIVE_FIELDS       =
    TABLES
      fields_tab                    = lt_fld[]
*     FCODE_TAB                     =
*     FIELDS_NOT_SELECTED           =
    EXCEPTIONS
      internal_error                = 1
      no_action                     = 2
      selid_not_found               = 3
      illegal_status                = 4
      OTHERS                        = 5.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
   SET PF-STATUS '0100'.

   PERFORM free_selection_screen.
ENDMODULE.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE ok_code.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.                 " USER_COMMAND_0100  INPUT


есть еще GUI статус 0100 с кнопкой EXIT.
Кроме экрана 1105, в программе SAPLSSEL, есть еще и другие :)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Чт, дек 02 2010, 09:18 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Банальный ФМ POPUP_GET_VALUES* не устроит?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Пт, июн 24 2011, 11:09 
Начинающий
Начинающий

Зарегистрирован:
Пт, мар 26 2010, 15:15
Сообщения: 5
Добрый день всем! Использовала описанный метод для динамического определения экрана. Столкнулась с такой проблемой - поле типа дата выводится в неверном формате. Т.е. на экране первоначально все отображается корректно - подсвечивается справка в виде календаря, дату выбираем, но ......... после отработки ФМ 'FREE_SELECTIONS_DIALOG' , дата возвращается во всех таблицах ( условия Where, Range ) - в таком виде '12.06.20'. И так же отображается на экране. Два последних символа года теряются. Как можно это обойти? Может кто-то сталкивался с такой же проблемой?
Спасибо.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Ср, дек 21 2011, 12:13 
Специалист
Специалист

Зарегистрирован:
Чт, дек 02 2010, 08:37
Сообщения: 156
Только напильником. :(
Такая "фича" не только с полем даты, но и со всеми полями, где есть преобразование (у меня MATNR криво получался). А если там еще и звездочка стоит ... :x
Пришлось сделать дополнительную обработку. Что-то типа:
Code:
  LOOP AT trange ASSIGNING <trange>.
    LOOP AT <trange>-frange_t ASSIGNING <frange>.
      IF <frange>-fieldname = 'MATNR'.
        LOOP AT <frange>-selopt_t ASSIGNING <selopt>.
          IF <selopt>-low NE space.
             соответствующий CONVERSION_EXIT (необходимо учесть длину поля)
          ENDIF.
          IF <selopt>-high NE space.
             соответствующий CONVERSION_EXIT (необходимо учесть длину поля)
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDLOOP.
  ENDLOOP.

  CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_WHERE'
    EXPORTING
      field_ranges        = trange
    IMPORTING
      where_clauses       = clauses.




P.S. ничего, что через полгода :D


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое определение полей экрана.
СообщениеДобавлено: Пт, дек 23 2011, 09:52 
Ассистент
Ассистент

Зарегистрирован:
Ср, ноя 02 2011, 16:37
Сообщения: 33
Можете посмотреть в сторону функций IMPORT DYNPRO и EXPORT DYNPRO, ед. нужно учитывать что EXPORT DYNPRO соответственно перезаписывает экран...


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

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


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

Сейчас этот форум просматривают: Google [Bot]


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

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