SAPфорум.RU
https://sapboard.ru/forum/

Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка
https://sapboard.ru/forum/viewtopic.php?f=13&t=96341
Страница 1 из 1

Автор:  Валерка [ Чт, апр 26 2018, 14:53 ]
Заголовок сообщения:  Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

Наконец-то решил сделать WIZARD для генерации шаблона программы на основе ALV. Т.е. на селекционном экране вводим имя программы+запрос+пакет+описание и генерируется сама программ (с инициализацией ALV) + экран + GUI- статус (R_BACK+R_CANCEL+R_EXIT) + заголовок.

Собственно вопрос есть что-то для добавления экранов и GUI статусов (а может и программ) чтобы не писать пакетники на все это дело?

Автор:  LAT [ Чт, апр 26 2018, 20:28 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

А не проще сделать программу-шаблон, и просто копировать ее?

Автор:  Валерка [ Чт, апр 26 2018, 20:38 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

Системы могут быть разные.

Автор:  hoar [ Чт, апр 26 2018, 21:00 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

Валерка написал(а):
.....Собственно вопрос есть что-то для добавления экранов и GUI статусов (а может и программ) чтобы не писать пакетники на все это дело?


Есть внутри ABAP команды: generate dynpro, activate dynpro и еще парочка команд для создания модификации окон. Но эти команды описаны в Хелпе, как "для внутреннего использования SAP-ом". Для программ есть аналогичные. Про генерацию GUI статусов ничего сказать не могу.

Автор:  Валерка [ Пт, апр 27 2018, 07:38 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка  Тема решена

Решение получилось следующее:
Программы (и INCLUDE) - можно создать через пакетный ввод
GUI-Заголовок - тоже через пакетный ввод
Экран - создать экран можно, но без спец элемента. Поэтому подумав понял что можно копировать стандартный экран группы функций SLVC_FULLSCREEN экран 500 (ну или что-то другое подходящее из стандарта)
GUI-статус - это сложнее всего, так как указать команды через пакетный ввод не получается. Однако тоже можно копировать из какой-нибудь стандартной программы подходящий.

Автор:  NeMurometz [ Пт, апр 27 2018, 07:52 ]
Заголовок сообщения:  Re:Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

Посмотрите как это реализовано в SAPLINK

Автор:  LAT [ Пт, апр 27 2018, 10:07 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

Валерка написал(а):
Системы могут быть разные.
Не понятно, почему эта проблема касается программы-шаблона, но не касается визарда. Но если так надо: по поводу гуи-статустов имеет смысл обратить внимание на ФМ-ы RS_CUA* (RS_CUA_INTERNAL_FETCH, RS_CUA_INTERNAL_WRITE, RS_CUA_GENERATE_STATUS и т.д.). С экранами можно побороться с помощью IMPORT/EXPORT DYNPRO. В принципе, на этом форуме участники Parazit и DKiyanov выкладывали свои разработки, в которых производится выгрузка-загрузка программ, примеры создания экранов и гуи-статусов можно глянуть в их коде.

Автор:  Валерка [ Пт, апр 27 2018, 13:49 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

С GUI решил все через создание нового GUI с помощью пакетника. А потом RS_CUA_INTERNAL_FETCH+<добавление своих команд>+RS_CUA_INTERNAL_WRITE.

Автор:  Saperx [ Сб, апр 28 2018, 09:31 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса,

Валерка написал(а):
Решение получилось следующее:
Программы (и INCLUDE) - можно создать через пакетный ввод
GUI-Заголовок - тоже через пакетный ввод
Экран - создать экран можно, но без спец элемента. Поэтому подумав понял что можно копировать стандартный экран группы функций SLVC_FULLSCREEN экран 500 (ну или что-то другое подходящее из стандарта)
GUI-статус - это сложнее всего, так как указать команды через пакетный ввод не получается. Однако тоже можно копировать из какой-нибудь стандартной программы подходящий.

Программы - можно генерировать на прямую, без пакетника.
Только перед этим необходимо проверить:
1) нет ли уже такой программы
я использовал кусок ниже для поиска по маске, т.к. у меня все инклюды генерятся по одному шаблону, например:
ZABAP_test
ZABAP_test_TOP
ZABAP_test_PBO
...
Code:
      SELECT DISTINCT name
             FROM trdir
             INTO CORRESPONDING FIELDS OF TABLE lt_programm
             WHERE name LIKE l_programm.

2) прогнать имя программы через ФМ RS_PROGRAM_CHECK_NAME, чтобы проверить корректность имени.
3) проверить корректность пакета
Code:
      SELECT SINGLE *
        FROM tdevc
        INTO CORRESPONDING FIELDS OF ls_tdevc
        WHERE devclass = pr_devcl.

для генерации текста можно использовать макросы и писать его прямо в коде(как я делал ниже), а можно вынести например в документы smw0
Code:
  DEFINE _0_.
    append &1 to lt_abaptext[].
  END-OF-DEFINITION.

FORM create_include_t
  CHANGING
    ct_abaptext             TYPE abapprog.

  DATA:
    lt_abaptext             TYPE abapprog.

  _0_ ''.
  _0_ ' DATA: gt_data type table of but000.'.
  _0_ ''.
  _0_ ' CLASS cl_alv_handler DEFINITION DEFERRED.'.
  _0_ '*ALV'.
  _0_ ' DATA: g_grid            TYPE REF TO cl_gui_alv_grid,'.
  _0_ '       g_container       TYPE REF TO cl_gui_custom_container,'.
  _0_ '       g_event_receiver  TYPE REF TO cl_alv_handler.'.

  INSERT LINES OF lt_abaptext INTO TABLE ct_abaptext[].
ENDFORM.

После того как получили текст - создаём программу. В своей программе я почему-то делал свой перформ, точно почему - не помню. Можете попробовать использовать ФМ RPY_PROGRAM_INSERT.
Проверки полномочий:
Code:
  CALL FUNCTION 'RS_ACCESS_PERMISSION'
    EXPORTING
      authority_check          = 'X'
      global_lock              = space
      mode                     = 'INSERT'
      object                   = i_programm
      object_class             = 'ABAP'
...
  CALL FUNCTION 'RS_ACCESS_PERMISSION'
    EXPORTING
      authority_check          = 'X'
      global_lock              = space
      mode                     = 'INSERT'
      object                   = i_programm
      object_class             = 'TEXT'
...

Добавление в запрос
Code:
    CALL FUNCTION 'RS_CORR_INSERT'
      EXPORTING
        object       = i_programm
        object_class = 'ABAP'
        global_lock  = abap_true
        devclass     = pr_devcl
        korrnum      = l_trkorr
      EXCEPTIONS
        OTHERS       = 1.

Создание программы
Code:

  CLEAR:
    lw_trdir.
  lw_trdir-name   = i_programm.  "Наименование программы
  lw_trdir-edtx   = abap_false.  "Блокировка редактора
  lw_trdir-dbna   = abap_false.  "Log. Datenbank
  CLEAR:
    lw_trdir-sqlx,               "Lesen/Aendern mit SAP-SQL
    lw_trdir-dbapl,              "Datenbank aus der Anwendung
    lw_trdir-clas,               "Programmklasse
    lw_trdir-type,               "Nr. des Selektionsbildes der
    lw_trdir-occurs,             "OCCURS-Paramater dynamisch
    lw_trdir-unam,               "Name des letzten Anderers
    lw_trdir-udat.               "Фnderungsdatum
  IF ( i_type = 'M' ).
    lw_trdir-subc = '1'.         "Тип программы
  ELSE.
    lw_trdir-subc = 'I'.         "Тип программы
  ENDIF.
  lw_trdir-appl   = '*'.         "Приложение
  lw_trdir-secu   = space.       "Группа полномочий
  lw_trdir-cnam   = sy-uname.    "Автор
  lw_trdir-cdat   = sy-datum.    "Дата создания
  lw_trdir-vern   = 1.           "№ версии
  lw_trdir-levl   = sy-saprl.    "Номер версии создания/посл. изменения
  UNPACK sy-mandt TO lw_trdir-rmand. "Мандант создания/посл. изменения
  CLEAR:
    lw_trdir-rstat,              "Status
    lw_trdir-rload,              "???
*    lw_trdir-fixpt,              "Festpunktarithmetik
    lw_trdir-sset,               "Start nur ueber Variante
    lw_trdir-sdate,              "Generierung Standardselektion
    lw_trdir-stime,              "Generierung Standardselektion
    lw_trdir-idate,              "Generierung eigenes Selektion
    lw_trdir-itime.              "Generierung eigenes Selektion
  lw_trdir-fixpt = 'X'.
  lw_trdir-uccheck = 'X'.
* Подготовка заголовка
  CLEAR:
    lw_textpool,
    lt_textpool[].
  lw_textpool-id    = 'R'.
  lw_textpool-entry = i_title.
  INSERT lw_textpool INTO TABLE lt_textpool[].

  INSERT TEXTPOOL lw_trdir-name FROM lt_textpool LANGUAGE sy-langu.
  INSERT REPORT i_programm FROM it_abaptext.
  MODIFY trdir FROM lw_trdir.
  COMMIT WORK.

Зачем то у меня еще такой код выполняется, не помню что будет, если его убрать :D
Code:
*----------------------------------------------------------------------*
* Актуализация и освобождение объектов
*----------------------------------------------------------------------*

  ls_pname-program = i_programm.
  CALL FUNCTION 'WB_TREE_ACTUALIZE'
    EXPORTING
      tree_name = ls_pname.
  CALL FUNCTION 'RS_TREE_OBJECT_PLACEMENT'
    EXPORTING
      object    = lw_trdir-name
      program   = lw_trdir-name
      operation = 'INSERT'
      type      = 'CP'.
  CALL FUNCTION 'RS_ACCESS_PERMISSION'
    EXPORTING
      mode         = 'FREE'
      object       = i_programm
      object_class = 'ABAP'.
  CALL FUNCTION 'RS_ACCESS_PERMISSION'
    EXPORTING
      mode         = 'FREE'
      object       = i_programm
      object_class = 'TEXT'.

Экран и GUI-статус - делал также как и вы решили, копированием. Но только раз уж я сделал программу для генерации, зачем мне их искать в других программах? Я просто создал их у себя
Копирование статуса
Code:
  CALL FUNCTION 'RS_CUA_COPY_STA'
    EXPORTING
      im_program      = source_programm
      im_status       = 'STATUS_0100'
      im_tprogram     = target_programm
      im_tstatus      = 'STATUS_0100'
      suppress_dialog = 'X'
    EXCEPTIONS
      OTHERS          = 12.

Копирование экрана
Code:
  CALL FUNCTION 'RS_SCRP_COPY'
    EXPORTING
      source_dynnr    = '0100'
      source_progname = source_programm
      target_dynnr    = '0100'
      target_progname = target_programm
    EXCEPTIONS
      OTHERS          = 2.

По gui-заголовку думаю можно подобное найти

Автор:  Валерка [ Сб, апр 28 2018, 09:41 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

Вставлять текст программы через пакетник - нашел один плюс: можно сделать структурную печать :)

За наводки спасибо. Может как-нибудь доработаю свою поделку.

Автор:  LAT [ Вс, апр 29 2018, 15:07 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

Структурная печать: ФМ PRETTY_PRINTER.

Автор:  AFH [ Чт, май 03 2018, 07:56 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

В abapgit не смотрели?

https://github.com/larshp/abapGit/blob/ ... .clas.abap

Code:
METHOD serialize_dynpros.
METHOD deserialize_dynpros.

Автор:  Валерка [ Чт, май 03 2018, 09:22 ]
Заголовок сообщения:  Re: Динамическое добавление в программу экрана (+добавить на экран компонент), GUI-статуса, Заголовка

Не смотрел. Не знал про такой проект.

Задачу свою решил через пакетники. Вроде работает. Посмотрю ещё по результатам эксплуатации.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/