Текущее время: Чт, мар 28 2024, 18:48

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Пн, фев 09 2009, 03:32 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
ФМ предназначен для вывода модальных и не модальных окон с ABAP листингом (это который write-ми рисуется)
позволяет нарисовать произвольный листинг в модальном и не модальном окне, есть возможности для обработки событий листинга at line-selection, at user-commsnd есть приятные фишки для обновления листинга без изменения Scroll позиции листинга. Вся функциональность листинга собирается в одной подпрограмме - на мой взгляд это удобно в плане читабельности/редактируемости программы

Условия использования: копирайтик мой не затирайте . Доработки приветствуются, но копирайт не трогайте (можете свой рядом дописать, если очень хочется).

Использую ФМ уже несколько лет - думаю ошибок в нём не осталось

TOP:
Code:
FUNCTION-POOL YDKLIST NO STANDARD PAGE HEADING.
*----------------------------------------------------------------------*
*& Группа функций для вывода модальных и не модальных ABAP листингов.
*& Автор: Киянов Дмитрий Евгеньевич
*& E-mail: DKiyanov@mail.ru
*----------------------------------------------------------------------*
INCLUDE YDKLIST.
INCLUDE <%_LIST>.

DATA: RCALLBACK_PROGRAM LIKE SY-REPID,
      RCALLBACK_FORM(30) TYPE C.

DATA: GCALL_MODE TYPE C.

FIELD-SYMBOLS: <GVAR>,
               <GTAB> TYPE STANDARD TABLE.

FORM CALLEVENT USING AEVENT ACTIVE.
DATA: EVENT LIKE SY-UCOMM.

DATA: PAGEINDEX LIKE SY-CPAGE,
      LINEINDEX LIKE SY-STARO,
      COLUMNIND LIKE SY-STACO,
      CURSORCOL LIKE SY-CUCOL,
      CURSORROW LIKE SY-CUROW,
      CURSOR_SET TYPE C,
      LIN TYPE I.

  IF ACTIVE = 'X'.
    PAGEINDEX = SY-CPAGE.
    LINEINDEX = SY-STARO.
    COLUMNIND = SY-STACO.

    GET CURSOR LINE CURSORROW OFFSET CURSORCOL.
    IF SY-SUBRC = 0.
      CURSOR_SET = 'X'.
    ENDIF.

    CURSORCOL = SY-CUCOL.
    CURSORROW = SY-CUROW.
  ENDIF.

  EVENT = AEVENT.
  PERFORM XCALLEVENT USING EVENT.

  CASE EVENT.
  WHEN EV_CANC.
    SY-SUBRC = 4.
    LEAVE LIST-PROCESSING.
  WHEN EV_OKAY.
    CLEAR SY-SUBRC.
    LEAVE LIST-PROCESSING.
  ENDCASE.

  CHECK ACTIVE = 'X'.

  CASE EVENT.
  WHEN EV_RESTART.
    PERFORM XCALLEVENT USING: EV_START, EV_LIST.

    SUBTRACT 1 FROM SY-LSIND.
  WHEN EV_NEW.
    PERFORM XCALLEVENT USING EV_LIST.
  WHEN EV_RENEW.
    PERFORM XCALLEVENT USING EV_LIST.

    SUBTRACT 1 FROM SY-LSIND.
  WHEN EV_REFRESH.
    PERFORM XCALLEVENT USING EV_LIST.

    IF SY-LINNO < LINEINDEX.
*      lineindex = 0.
*      lineindex = sy-linno - 2.
    ENDIF.

    SCROLL LIST INDEX SY-LSIND TO PAGE   PAGEINDEX
                                  LINE   LINEINDEX.
    SCROLL LIST INDEX SY-LSIND TO COLUMN COLUMNIND.
    IF CURSOR_SET = 'X'.
      SET CURSOR CURSORCOL CURSORROW.
    ENDIF.

    SUBTRACT 1 FROM SY-LSIND.
  ENDCASE.
ENDFORM.

FORM XCALLEVENT USING EVENT.
  CASE GCALL_MODE.
  WHEN 'X'.
    PERFORM (RCALLBACK_FORM)
    IN PROGRAM (RCALLBACK_PROGRAM)
    TABLES <GTAB>
    USING EVENT <GVAR>
    IF FOUND.
  WHEN 'T'.
    PERFORM (RCALLBACK_FORM)
    IN PROGRAM (RCALLBACK_PROGRAM)
    TABLES <GTAB>
    USING EVENT
    IF FOUND.
  WHEN 'V'.
    PERFORM (RCALLBACK_FORM)
    IN PROGRAM (RCALLBACK_PROGRAM)
    USING EVENT <GVAR>
    IF FOUND.
  WHEN ' '.
    PERFORM (RCALLBACK_FORM)
    IN PROGRAM (RCALLBACK_PROGRAM)
    USING EVENT
    IF FOUND.
  ENDCASE.
ENDFORM.

MODULE LIST OUTPUT.
  LEAVE TO LIST-PROCESSING.
  PERFORM CALLEVENT USING: EV_START ' ', EV_LIST ' '.
  SET SCREEN 0. LEAVE SCREEN.
ENDMODULE.                 " LIST  OUTPUT

TOP-OF-PAGE.
  PERFORM CALLEVENT USING EV_TOP ' '.

TOP-OF-PAGE DURING LINE-SELECTION.
  PERFORM CALLEVENT USING EV_TOPD ' '.

AT LINE-SELECTION.
  PERFORM CALLEVENT USING EV_LINE 'X'.

AT USER-COMMAND.
  PERFORM CALLEVENT USING SY-UCOMM 'X'.


ФМ YDK_List:
Code:
FUNCTION YDK_LIST.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(CALLBACK_PROGRAM) TYPE  SY-REPID OPTIONAL
*"     REFERENCE(CALLBACK_FORM)
*"     REFERENCE(COL) DEFAULT 5
*"     REFERENCE(ROW) DEFAULT 5
*"     REFERENCE(WIDTH) OPTIONAL
*"     REFERENCE(HEIGHT) OPTIONAL
*"  CHANGING
*"     VALUE(VAR) OPTIONAL
*"     VALUE(TAB) OPTIONAL
*"  EXCEPTIONS
*"      CANCEL
*"----------------------------------------------------------------------

DATA: RCOL TYPE I,
      BROW TYPE I.

DATA: LCALLBACK_PROGRAM LIKE SY-REPID,
      LCALLBACK_FORM(30) TYPE C.

DATA: LCALL_MODE TYPE C.
DATA: SUBRC LIKE SY-SUBRC.

FIELD-SYMBOLS: <LVAR>,
               <LTAB> TYPE ANY TABLE.

  LCALLBACK_PROGRAM = RCALLBACK_PROGRAM.
  LCALLBACK_FORM    = RCALLBACK_FORM.

  LCALL_MODE        = GCALL_MODE.

  RCALLBACK_PROGRAM = CALLBACK_PROGRAM.
  IF RCALLBACK_PROGRAM IS INITIAL.
    CALL 'AB_GET_CALLER' ID 'PROGRAM' FIELD RCALLBACK_PROGRAM.
  ENDIF.

  RCALLBACK_FORM    = CALLBACK_FORM.

  IF <GVAR> IS ASSIGNED. ASSIGN <GVAR> TO <LVAR>. ENDIF.
  IF <GTAB> IS ASSIGNED. ASSIGN <GTAB> TO <LTAB>. ENDIF.

  UNASSIGN <GVAR>.
  UNASSIGN <GTAB>.

  IF VAR IS REQUESTED. ASSIGN VAR TO <GVAR>. ENDIF.
  IF TAB IS REQUESTED. ASSIGN TAB TO <GTAB>. ENDIF.

  IF  <GVAR> IS ASSIGNED
  AND <GTAB> IS ASSIGNED.    GCALL_MODE = 'X'.
  ELSEIF <GTAB> IS ASSIGNED. GCALL_MODE = 'T'.
  ELSEIF <GVAR> IS ASSIGNED. GCALL_MODE = 'V'.
  ELSE.                      GCALL_MODE = ' '.
  ENDIF.


  IF WIDTH IS INITIAL AND HEIGHT IS INITIAL.
    CALL SCREEN 0100.
  ELSE.
    RCOL = COL + WIDTH.
    BROW = ROW + HEIGHT.
    CALL SCREEN 0110 STARTING AT COL ROW
                     ENDING   AT RCOL BROW.
  ENDIF.
  SUBRC = SY-SUBRC.

  RCALLBACK_PROGRAM  = LCALLBACK_PROGRAM.
  RCALLBACK_FORM     = LCALLBACK_FORM.

  UNASSIGN <GVAR>.
  UNASSIGN <GTAB>.
  IF <LVAR> IS ASSIGNED. ASSIGN <LVAR> TO <GVAR>. ENDIF.
  IF <LTAB> IS ASSIGNED. ASSIGN <LTAB> TO <GTAB>. ENDIF.

  GCALL_MODE        = LCALL_MODE.

  IF SUBRC <> 0.
    RAISE CANCEL.
  ENDIF.
ENDFUNCTION.


Забыл сразу написать про экраны, спасибо Besa и Silence1 - напомнили :lol:

Надо созадать в группе функций два экрана
0100 - обычный
0110 - модальный (в свойствах экрана поставить галку "Модальное диалоговое окно")
в экранах ничего рисовать не надо, экранная логика у них одинаковая

Экранная логика
Code:
PROCESS BEFORE OUTPUT.
  MODULE LIST.

PROCESS AFTER INPUT.

В PAI ничего указывать не надо

Инклюд с константами
Code:
*** INCLUDE YDKlist.
*----------------------------------------------------------------------*
*& Инклюд с константами для группы функций YDKLIST
*& Автор: Киянов Дмитрий Евгеньевич
*& E-mail: DKiyanov@mail.ru
*----------------------------------------------------------------------*
CONSTANTS:
* Входящие события
  EV_START(5)   VALUE 'START',   " Выполняется один раз при вызове или .
  EV_LIST(4)    VALUE 'LIST',    " Отрисовка списка (Write...)
  EV_TOP(3)     VALUE 'TOP',     " Top-Of-Page
  EV_TOPD(4)    VALUE 'TOPD',    " Top-Of-Page DURING LINE-SELECTION
  EV_LINE(4)    VALUE 'LINE',    " At Line-Selection

* Прочие события             " At User-Command (sy-ucomm)

* Исходящие комманды
  EV_NEW(3)     VALUE 'NEW',     " Отрисовка нового списка
  EV_RENEW(5)   VALUE 'RENEW',   " Повторная отрисовка списка
  EV_REFRESH(7) VALUE 'REFRESH', " Повт. отрисовка списка с сохр. поз.
  EV_RESTART(7) VALUE 'RESTART', " Повтор события START и NEW
  EV_CANC(4)    VALUE 'CANC',    " Отмена - выход из модального сост.
  EV_OKAY(4)    VALUE 'OKAY'.    " Выполн. - выход из модального сост.

** Пример использования
*  CALL FUNCTION 'YDK_LIST'
*       EXPORTING
**           CALLBACK_PROGRAM = SY-CPROG
*            CALLBACK_FORM    = 'LIST'
**           COL              = 5
**           ROW              = 5
**           WIDTH            =
**           HEIGHT           =
*       EXCEPTIONS
*            CANCEL           = 1
*            OTHERS           = 2.
*
*FORM LIST USING EVENT.
*  CASE EVENT.
*  WHEN EV_START.
** например: Готовим данные
*  WHEN EV_LIST.
** Рисуем листинг
*    SET PF-STATUS 'xxx'. " Устанавливаем статус
*    SET TITLEBAR   'xxx'. " Устанавливаем заголовок
*    NEW-PAGE LINE-SIZE nnn. "  Устанавливаем ширину списка
*    WRITE ....
*  WHEN EV_TOP OR EV_TOPD.
** Рисуем заголовок
*  WHEN EV_LINE.
** Реакция на щелчёк мышью (AT LINE-SELECTION)
** WHEN ... Реакция на кнопки (AT USER-COMMAND -> event = sy-ucomm)
*  ENDCASE.
*ENDFORM.


Пример использования
Code:
REPORT  ytest_ydklist.
INCLUDE ydklist.
CALL FUNCTION 'YDK_LIST'
  EXPORTING
*   CALLBACK_PROGRAM       = "  Не обязательный - если не указан то равен текущей программе
    callback_form          = 'LIST'
*   COL                    = 5
*   ROW                    = 5
    width                  = 15 " Если указан то листинг будет модальным (в окошке)
    height                 = 5 " Если указан то листинг будет модальным (в окошке)
* CHANGING
*   VAR                    = " Переменная передаваемая в подпрограмму - влияет на набор параметров подпрограммы
*   TAB                    = " Таблица передаваемая в подпрограмму - влияет на набор параметров подпрограммы не забываем указывать  []  если таблица с заголовком
  EXCEPTIONS
    cancel                 = 1  " генерируется если event = ev_canc
    OTHERS                 = 2.

FORM LIST USING EVENT. " на набор параметров подпрограммы влияют параметры ФМ: VAR  и TAB
  CASE EVENT.
  WHEN EV_START.
* например: Готовим данные
  WHEN EV_LIST.
* Рисуем листинг
*    SET PF-STATUS 'xxx'. " Устанавливаем статус
*    SET TITLEBAR   'xxx'. " Устанавливаем заголовок
*    NEW-PAGE LINE-SIZE nnn. "  Устанавливаем ширину списка
     write: / 'Hello world!'.
  WHEN EV_TOP OR EV_TOPD.
* Рисуем заголовок
  WHEN EV_LINE.
* Реакция на щелчёк мышью (AT LINE-SELECTION)
* WHEN ... Реакция на кнопки (AT USER-COMMAND -> event = sy-ucomm)
  ENDCASE.
ENDFORM.


В событиях EV_LINE и AT USER-COMMAND можно возвращать значение переменной event
например можно написать:
event = ev_refresh.
это приведёт повторной отрисовке листинга.. генерация события ev_list...

_________________
Изображение Попытка не пытка


Последний раз редактировалось DKiyanov Чт, май 14 2009, 00:52, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Ср, май 13 2009, 06:40 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Вещь интересная, хочу посмотреть ее в деле, но вот с экранами 0100 и 0110 не магу разобраться, что в них надо прописать? :oops:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Ср, май 13 2009, 08:11 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, дек 17 2008, 19:38
Сообщения: 434
Откуда: Санкт-Петербург
Пол: Женский
Besa написал:
Вещь интересная, хочу посмотреть ее в деле, но вот с экранами 0100 и 0110 не магу разобраться, что в них надо прописать? :oops:

я создала 100 экран обычный и 110 модальное окно
не забыть прописать pai и pbo! :D

_________________
Silence v.2.0


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Ср, май 13 2009, 08:24 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Silence1 написала:
Besa написал:
Вещь интересная, хочу посмотреть ее в деле, но вот с экранами 0100 и 0110 не магу разобраться, что в них надо прописать? :oops:

я создала 100 экран обычный и 110 модальное окно
не забыть прописать pai и pbo! :D

Спасибо, забыл совсем про PBO :oops:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Ср, май 13 2009, 08:31 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, дек 17 2008, 19:38
Сообщения: 434
Откуда: Санкт-Петербург
Пол: Женский
ну у меня почему-то не заполняется экран :(
Вы что в паи и пбо прописали?

_________________
Silence v.2.0


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Ср, май 13 2009, 08:33 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Silence1 написала:
ну у меня почему-то не заполняется экран :(
Вы что в паи и пбо прописали?

У меня все работает, в PAI ничего не надо, в PBO пишем MODULE LIST


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Ср, май 13 2009, 08:36 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, дек 17 2008, 19:38
Сообщения: 434
Откуда: Санкт-Петербург
Пол: Женский
Спасибо! с выводом получилось, а вот с уходом с экрана - нет :(

_________________
Silence v.2.0


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Ср, май 13 2009, 08:50 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, дек 17 2008, 19:38
Сообщения: 434
Откуда: Санкт-Петербург
Пол: Женский
добавила в module list строку
Code:
SET PF-STATUS space.

теперь все ок :D

Киянову :pivo:

_________________
Silence v.2.0


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Ср, май 13 2009, 15:37 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
Silence1 написала:
добавила в module list строку
Code:
SET PF-STATUS space.



это надо делать в подпрограмме при событии EV_LIST (я обычно устанавливаю статус и заголовок перед началом формирования листинга)
и не обязательно space можно поставить любой статус созданный в вашей программе

также очень полезной бывает команда NEW-PAGE LINE-SIZE nnn - устанавливает ширину листинга, помогает избавиться от полос скроллинга в окне

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Вт, июл 14 2009, 10:40 
Председатель
Председатель

Зарегистрирован:
Чт, май 10 2007, 09:15
Сообщения: 1558
Вопрос такой: а что такое передается в:
CHANGING
* VAR = " Переменная передаваемая в подпрограмму - влияет на набор параметров подпрограммы
* TAB = " Таблица передаваемая в подпрограмму - влияет на набор параметров подпрограммы не забываем указывать [] если таблица с заголовком

TAB - это таблица с данными или параметры какие-то.
И что за параметры - если это параметры ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Вт, июл 14 2009, 15:44 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
1. CHANGING - это не обязательные параметры
если указан параметр VAR то подпрограмме в которой рисуется листинг должно быть такое объявление
FORM xxx USING event var.
если указан TAB то подпрограмме в которой рисуется листинг должно быть такое объявление
FORM xxx TABLES tab USING event.
если оба то соответственно....
сделано это ну например ингда хочется в окошке отобразить данные из таблички которая обявлена локальна в подпрограмме или например вернуть какое то значение из обработки но создавать глабальную переменную не хочется....
Для tab - если у вас табличка с заголовком то при передаче её в ФМ обязательно надо поставить tab[]

2.
Цитата:
Вызываю ФМ когда на экране ALV. Получается так что на экране который создается, имеются те же кнопки, на экране где я вызываю ФМ.
не очень понимаю почему?

надо в подпрограмме в которой рисуешь листинг сделать set pf-status 'xxx'
xxx - имя вашего статуса ну или на крайняк можно set pf-status space - тогда поставится дефалтовый
я обычно set pf-status делаю непосредственно перед тем как начать рисовать листинг в событии ev_list

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дарю народу ФМ для вывода модальных ABAP листингов
СообщениеДобавлено: Вт, июл 14 2009, 15:54 
Председатель
Председатель

Зарегистрирован:
Чт, май 10 2007, 09:15
Сообщения: 1558
со статусами я понял уже.. - разобрался. спасибо.
а вот с табличкой интересно попробовать.
Спасибо


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

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


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

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


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

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