Текущее время: Вт, июл 01 2025, 00:08

Часовой пояс: 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 часа


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

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


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

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