Валерка написал(а):
Решение получилось следующее:
Программы (и 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.
Зачем то у меня еще такой код выполняется, не помню что будет, если его убрать
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-заголовку думаю можно подобное найти