SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Сохранить положение скроллинга при перерисовке подэкрана



 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Thu Apr 07, 2011 10:12 am    Post subject: Сохранить положение скроллинга при перерисовке подэкрана Reply with quote

Для Z-программы правильно описАл действия Удав. Но мне они не подходят. Подробности ниже.

Задача собственно такая. вызывается подэкран на закладку. На подэкране широкий алв. На подэкране соответственно скроллинг. Если алв отмотать на середину, то соответсвенно часть полей пропадет с экрана. Дальше пользователь делает следующие действия: вводим какие то значения или вызывает средство поиска. соответсвенно отрабатывает PAI затем выход на экран, оттуда вызов подэккрана. И в самом начале PBO подэкрана алв уже перерисован и расположен в первоначальном положении, а не в том какое установил пользователь, когда вводил значение.

Экран и подэкран стандарт, поэтому сильно не поэкспериментируешь. Но буду рад любым идеям. Любые расширения стандарта думаю возможны.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем


Last edited by XXX_:) on Sun Apr 10, 2011 10:36 am; edited 1 time in total
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Thu Apr 07, 2011 1:43 pm    Post subject: Reply with quote

Тут не только сохраняем скроллинг, но и выделение ячейки.

На выходе с экрана помещаем этот код(если с экрана не выходим то refresh_table)
Code:
   
   DATA: ls_row_no_scroll TYPE lvc_s_roid
,ls_row_info TYPE lvc_s_row
,ls_col_info TYPE lvc_s_col
,ls_row_id TYPE lvc_s_row
,ls_col_id TYPE lvc_s_col
,ls_row_no TYPE lvc_s_roid
,lt_index_rows TYPE lvc_t_row
,lt_row_no TYPE lvc_t_roid
.

CALL METHOD mo_grid->set_selected_rows
EXPORTING
it_index_rows = lt_index_rows
it_row_no = lt_row_no.

CALL METHOD mo_grid->set_current_cell_via_id
EXPORTING
is_row_id = ls_row_id
is_column_id = ls_col_id
is_row_no = ls_row_no.

CALL METHOD mo_grid->set_scroll_info_via_id
EXPORTING
is_row_info = ls_row_info
is_col_info = ls_col_info
is_row_no = ls_row_no_scroll.


Когда экран снова загружен, то в PBO после set_table_for_first_display(если с экрана не выходили, то после refresh_table) дописываем такой код

Code:
 
CALL METHOD mo_grid->set_selected_rows
EXPORTING
it_index_rows = lt_index_rows
it_row_no = lt_row_no.

CALL METHOD mo_grid->set_current_cell_via_id
EXPORTING
is_row_id = ls_row_id
is_column_id = ls_col_id
is_row_no = ls_row_no.

CALL METHOD mo_grid->set_scroll_info_via_id
EXPORTING
is_row_info = ls_row_info
is_col_info = ls_col_info
is_row_no = ls_row_no_scroll.


_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Thu Apr 07, 2011 2:47 pm    Post subject: Reply with quote

Чуток поторопился, если каждый раз вызывается set_table_for_first_display, то метод отрисовывает АЛВ по умолчанию, а потом двигает на нужное место. Выглядит не айс. Пока в поиске
_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Thu Apr 07, 2011 3:03 pm    Post subject: Reply with quote

А не проще ли в REFRESH_TABLE_DISPLAY параметр I_STABLE заполнить?
_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Thu Apr 07, 2011 4:29 pm    Post subject: Reply with quote

Сейчас у меня все работает(код как я и раньше писаа), но я не понимаю много.

Удав, может я не правильно пользуюсь.

Code:
S_STABLE-ROW = 'X'.
S_STABLE-COL = 'X'.
mo_grid->refresh_table_display( S_STABLE = S_STABLE ).


Но это не работает. (да вызывается эта команда в PAI, хотя должна насколько я понимаю в PBO)

И у меня еще много вопросов. В PBO экрана делается set_table_for_first_display. Затем в PAI экрана вызывается refresh_table_display. Честно говоря меня такие махинации ставят в тупик.

Что бы работало так как надо, я считываю параметры как описал выше(методы get*) в PAI по data_changed далее после refresh_table_display я вызываю методы set*, которые описал выше. Далее в PBO после вызова set_table_for_first_display я вновь вызываю методы set*.

Короче работает, но почему такая логика была в программе ума не приложу. Буду рад если будут дельные мысли или советы.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Удав
Гуру
Гуру


Age: 48
Joined: 25 Jan 2008
Posts: 580
Location: Москва

PostPosted: Fri Apr 08, 2011 11:33 am    Post subject: Reply with quote

По порядку
1.set_table_for_first_display нужно вызывать только один раз - при первом вызове экрана
2.refresh_table_display должен вызываться только в PBO-логике при последующих вызовах экрана
3. Методы set* не нужны совсем.
Code:

if g_grid is initial.
  create object g_grid ...
  ...
  call method g_grid->set_table_for_first_diaplay
  ...
else.
  gs_stable-row = 'X'.
  gs_stable-col = 'X'.
  call method g_grid->refresh_table_diaplay( is_stable = gs_stable ).
endif.

_________________
С уважением,
Удав.
Back to top
View user's profile Send private message
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Sun Apr 10, 2011 10:29 am    Post subject: Reply with quote

Удав, да знаю я как правильно делать... Но я то правлю стандарт, а там логика именно такая. В PBO каждый раз вызывается
Code:
call method g_grid->set_table_for_first_diaplay
, затем в PAI
Code:
call method g_grid->refresh_table_diaplay
. И этот код работает не только для моего алв, но и для других случаев, поэтому переписывать его без огладки я не рискну. Если добавить параметр is_stable в refresh_table_diaplay то желаемого результата не происходит, то ли из-за того что PBO толи еще из за чего то. Выкрутился вышеописанным способом.

Завтра буду на работе напишу что за программа, и что за места и как можно на это посмотреть интеесующимся. Только для этого нужно чтобы кто нибудь из HR помог или самому немного потыкаться.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Mon Apr 11, 2011 10:11 am    Post subject: Reply with quote

Как и обещал подробности для тех кому любопытно

Группа функций HRTMC_PPOM
Отрабатывает в PBO
CLASS lcl_table_application
METHOD refresh_table.
Вызывается mo_grid->set_table_for_first_display

Отрабатывает в PAI
Тот же класс
METHOD make_unchanged_rows_readonly.
Вызывается mo_grid->refresh_table_display( ).

Запустить
Транзакция HRTMC_PPOM
Выбрать объект S или CP.
И далее в зависимости от выбранного объекта будет доступна одна из закладок TMC_SUCA(Рекомендованные должности) или TMC_SUCB(Рекомендованные лица).

Есть еще вариант, что эти закладки скрыты, или под них написан другой Z-обработчик. Думаю объяснять как их открыть и посмотреть чем они обрабатывыются не надо, вряд ли будут настолько любопытные, что будут менять настройки системы.

ЗЫ: Я еще в поиске, меня этот вариант не очень устраивает.

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
XXX_:)
Аналитик
Аналитик


Age: 41
Joined: 01 Feb 2008
Posts: 387
Location: Воронеж

PostPosted: Mon Apr 11, 2011 3:05 pm    Post subject: Reply with quote

Для текущей закладки используется грид. при переходе на другую закладку, динамически создается таблица, филдкаталог, фильтры и т.д. и вызывается тот же грид. Поэтому понятно почему каждый раз set_table_for_first_diaplay. Но вот почему каждый раз refresh_table_diaplay в PAI так и не могу понять. Я сейчас его вообще из кода убрал, вроде все работает. Возможно refresh_table_diaplay помимо функции перерисовки выполняет какую то побочную, ради которой его тут и вызывают?.

Веселенькая программа, сразу ощущаешь как много еще можно открыть в ABAPe. (хотя в данном случае, побыстрее бы закрыть и не вспоминать)

_________________
Hормальные люди делают вещи намного более безумные чем всё, что делают сумасшедшие (c) С.Лем
Back to top
View user's profile Send private message Blog
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.