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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Ведение данных посредством TableControl
СообщениеДобавлено: Пн, фев 19 2018, 16:01 
Ассистент
Ассистент

Зарегистрирован:
Пн, апр 15 2013, 14:49
Сообщения: 48
Откуда: Санкт-Петербург
Пол: Мужской
Добрый день!
Подскажите пожалуйста каким образом можно решить следующую проблему.
Я создал экранную форму. На ней разместил панель закладок TabStrip.
На одной из закладок разместил контейнер для вывода в него подэкрана с TableControl.
Создал Tableview с помощью Wizard-а с возможностью добавления и удаления строк.
Немного подправил программу для своих нужд.
В целом все работает как нужно строки добавляются, редактируются, удаляются сохраняются.

Но есть одна неприятность! Вот он вопрос:
Когда я запускаю программу и попадаю в этот экран первый раз (когда данных не и он не заполнен).
То в tableview добавляется 7 строк (столько сколько видно на экране) и поля этих строк доступны для редактирования
Причем если ввести в поля и попытаться сохранить то ничего не получится.
Сначала нужно нажать кнопку добавить и визуально в таблице останется одна редактируемая строка которая нормально сохраняется.
После чего все становится нормально в tableview одна строка и чтобы ввести новую ее нужно добавить.
Но если строк 0 то их почему то 7!!! Как побороть такую ситуацию и сделать на начальном экране 0 редактируемых строк?

Заранее благодарен за ответы!


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ведение данных посредством TableControl
СообщениеДобавлено: Пн, фев 19 2018, 16:05 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Вт, сен 05 2017, 23:56
Сообщения: 537
1) проверьте правильность отработки PBO модулей головного экрана и дочернего ( закладки).
2) проверьте в отладчике правильность заполнения глобальных переменных


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ведение данных посредством TableControl
СообщениеДобавлено: Вт, фев 20 2018, 09:43 
Ассистент
Ассистент

Зарегистрирован:
Пн, апр 15 2013, 14:49
Сообщения: 48
Откуда: Санкт-Петербург
Пол: Мужской
Kuranov.Dmitry написал(а):
1) проверьте правильность отработки PBO модулей головного экрана и дочернего ( закладки).
2) проверьте в отладчике правильность заполнения глобальных переменных


Я над этой проблемой уже полгода бьюсь. И такая ситуация создается стандартной генерацией экранной логики
с помощью Wizarda, я бы проверил правильность модулей если бы знал как должно быть правильно.

Вот например как выглядит PBO

Code:
PROCESS BEFORE OUTPUT.
* MODULE STATUS_0110.
  MODULE get_equi.
  LOOP AT it_sdyn_equi INTO wa_sdyn_equi WITH CONTROL my_tc1  CURSOR my_tc1-CURRENT_LINE.
    MODULE trans_to_tc1.
    MODULE MY_TC1_GET_LINES.
  ENDLOOP.

MODULE TRANS_TO_TC1 OUTPUT.
  MOVE wa_sdyn_equi TO zpm_sdyn_equi.
ENDMODULE.                 " TRANS_TO_TC1  OUTPUT

MODULE MY_TC1_GET_LINES OUTPUT. " Честно говоря не очень понимаю зачем нужен этот модуль
  G_MY_TC1_LINES = SY-LOOPC.
ENDMODULE.

На экране видимых семь строк таблицы, в смысле там есть место для 7-ми строк
В таблице it_sdyn_equi может быть 0 записей а может быть >0 записей все равно цикл идет по ней 7 раз
насколько я понимаю это определяется тем что в операторе цикла есть опция WITH CONTROL my_tc1
Но почему тогда после вставки 1-ой записи в таблицу программа начинает работать корректно и
цикл проходит только 1 раз....
А если удалить вставленную строку то цикл снова крутится 7 раз!
Я бы проверил правильность заполнения глобальных переменных если бы знал куда смотреть.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ведение данных посредством TableControl
СообщениеДобавлено: Вт, фев 20 2018, 10:11 
Специалист
Специалист

Зарегистрирован:
Вт, июн 10 2014, 09:41
Сообщения: 179
Попробуйте строку MODULE MY_TC1_GET_LINES перенести до цикла LOOP AT it_sdyn_equi.
И поменять немного код этого модуля.

Должно получиться так:
Code:
PROCESS BEFORE OUTPUT.
* MODULE STATUS_0110.
  MODULE get_equi.
  [b]MODULE MY_TC1_GET_LINES.[/b]
  LOOP AT it_sdyn_equi INTO wa_sdyn_equi WITH CONTROL my_tc1  CURSOR my_tc1-CURRENT_LINE.
    MODULE trans_to_tc1.
  ENDLOOP.

MODULE MY_TC1_GET_LINES OUTPUT. " Честно говоря не очень понимаю зачем нужен этот модуль
  G_MY_TC1_LINES = [b]lines( it_sdyn_equi )[/b].
ENDMODULE.


Видимо, у вас глобальная переменная G_MY_TC1_LINES указывает на кол-во строк в таблице, которая потом записывается в количество строк в контроллере my_tc1.

Возможно, нужно ещё будет PAI подправить, чтобы данные в таблицу записывались.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ведение данных посредством TableControl
СообщениеДобавлено: Вт, фев 20 2018, 13:04 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, ноя 01 2004, 12:17
Сообщения: 298
Пол: Мужской
Попробуйте добавить следующий код в самое начало PBO:

Code:

MODULE tc_get_lines OUTPUT.
    DESCRIBE TABLE it_sdyn_equi LINES my_tc1-lines.
ENDMODULE.             


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ведение данных посредством TableControl
СообщениеДобавлено: Вт, фев 20 2018, 15:19 
Ассистент
Ассистент

Зарегистрирован:
Пн, апр 15 2013, 14:49
Сообщения: 48
Откуда: Санкт-Петербург
Пол: Мужской
UKY написал(а):
Попробуйте строку MODULE MY_TC1_GET_LINES перенести до цикла LOOP AT it_sdyn_equi.
И поменять немного код этого модуля.
...
Видимо, у вас глобальная переменная G_MY_TC1_LINES указывает на кол-во строк в таблице, которая потом записывается в количество строк в контроллере my_tc1.

Возможно, нужно ещё будет PAI подправить, чтобы данные в таблицу записывались.

RA написал:
Попробуйте добавить следующий код в самое начало PBO:
Code:
MODULE tc_get_lines OUTPUT.
    DESCRIBE TABLE it_sdyn_equi LINES my_tc1-lines.
ENDMODULE.             

Не помогают предложенные решения, к сожалению.
Code:
PROCESS BEFORE OUTPUT.
  LOOP AT it_sdyn_equi INTO wa_sdyn_equi WITH CONTROL my_tc1.
  ENDLOOP.

Даже если я просто оставляю пустой цикл то в случае если таблица it_sdyn_equi пустая он проходит 7 шагов
и отображает на экране 7 строк с пустыми полями доступными для ввода в tableview
а если в it_sdyn_equi n записей есть то проходит столько шагов сколько записей и отображает в tablrview n
строк доступных для ввода а (7 - n) недоступных для ввода (ну то есть их как бы нет)
Если я к циклу добавлю например FROM 1 to 1 и таблица it_sdyn_equi то это вываливается в динамическую ошибку.
Переменная G_MY_TC1_LINES сгенерирована Wizard-ом но нигде не используется. Только присваивается в модуле
MODULE MY_TC1_GET_LINES (или используется но я не могу понять где)
Wizard генерировал в этом модуле строку
Code:
G_MY_TC1_LINES = SY-LOOPC.

собственно всегда присваивал этой переменной число 7.
И это никак ни на что не влияло.
Содержимое my_tc1 после прохода цикла примерно такое
    FIXED_COLS 0
    LINES 0
    TOP_LINE 1
    CURRENT_LINE 7
    LEFT_COL 0
    LINE_SEL_MODE 1
    COL_SEL_MODE 1
    LINE_SELECTOR X
    V_SCROLL
    H_GRID X
    V_GRID X
    COLS [5x5(328)]Standard Table
    INVISIBLE


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ведение данных посредством TableControl
СообщениеДобавлено: Ср, фев 21 2018, 06:49 
Специалист
Специалист

Зарегистрирован:
Пн, июл 11 2011, 10:50
Сообщения: 197
Попробуйте добавить REFRESH CONTROL делается всегда после добавления или удаления строк, чтобы лишних строк не было в таблице

Внутри цикла оставить MODULE MY_TC1_GET_LINES OUTPUT.
с кодом
Code:
MODULE MY_TC1_GET_LINES OUTPUT.
  G_MY_TC1_LINES = sy-loopc.
ENDMODULE.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ведение данных посредством TableControl  Тема решена
СообщениеДобавлено: Чт, мар 01 2018, 11:30 
Ассистент
Ассистент

Зарегистрирован:
Пн, апр 15 2013, 14:49
Сообщения: 48
Откуда: Санкт-Петербург
Пол: Мужской
Bimit написал(а):
Попробуйте добавить REFRESH CONTROL делается всегда после добавления или удаления строк, чтобы лишних строк не было в таблице

Внутри цикла оставить MODULE MY_TC1_GET_LINES OUTPUT.
с кодом
Code:
MODULE MY_TC1_GET_LINES OUTPUT.
  G_MY_TC1_LINES = sy-loopc.
ENDMODULE.


Это решение также не помогло. Но я понял сам как решить проблему.
Количество проходов цикла определяется либо количеством записей в таблице it_sdyn_equi либо если эта таблица пустая
цикл проходит столько раз сколько строк возможно отобразить на экране и на каждом шаге добавляет на экран
в таблицу элементы управления. Цикл может быть даже пустым - элементы управления все равно будут добавлены.

В этом случае в переменная my_tc1-lines = 0
а переменная my_tc1-top_line = 1
Случайно!!! я заметил что если значение переменной my_tc1-lines будет равно 1
а переменная my_tc1-top_line будет 2
То входа в цикл не будет! Таким образом я добавил два модуля устанавливающих и снимающих эти значения
Тем самым добился нужного эффекта.
Причем если таблица it_sdyn_equi будет заполнена то программа все равно работает корректно

Code:
  MODULE tocheat_tc1.
  LOOP AT it_sdyn_equi INTO wa_sdyn_equi WITH CONTROL my_tc1.
    MODULE trans_to_tc1.
    MODULE MY_TC1_GET_LINES.
  ENDLOOP.
  MODULE uncheat_tc1.

MODULE UNCHEAT_TC1 OUTPUT.
if my_tc1-lines = 1 and my_tc1-top_line = 2.
    my_tc1-lines = 0.
    my_tc1-top_line = 1.
    my_tc1-current_line = 1.
  endif.
ENDMODULE.       

MODULE TOCHEAT_TC1 OUTPUT.
if my_tc1-lines = 0.
    my_tc1-lines = 1.
    my_tc1-top_line = 2.
    my_tc1-current_line = 1.
* Гвоздь
    G_MY_TC1_LINES = 1.
endif.
ENDMODULE.   


Переменная G_MY_TC1_LINES которая была сгенерирована Wizard-ом
оказывается используется в функциях добавления и удаления строк также сгенерированных Wizard-ом
просто в неявном виде :
Code:
...
*&SPWIZARD: get looplines of TableControl                              *
  CONCATENATE 'G_' P_TC_NAME '_LINES' INTO L_LINES_NAME.
  ASSIGN (L_LINES_NAME) TO <LINES>
....


Спасибо всем за ответы!


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ведение данных посредством TableControl
СообщениеДобавлено: Вт, мар 13 2018, 12:14 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Посмотрите примеры
DEMO_DYNPRO_TABCONT_LOOP Table Control with LOOP - ENDLOOP
DEMO_DYNPRO_TABCONT_LOOP_AT Table Control with LOOP AT ITAB
DEMO_DYNPRO_TABLE_CONTROL_1 Table Control with LOOP Statement
DEMO_DYNPRO_TABLE_CONTROL_2 Table Control with LOOP AT ITAB

Когда то давно, точно помню этот визард генерил кривой код.

А в целом, возможно Вам имеет смысл посмотреть в сторону АЛВ.
Иногда, удобно получается вызвать какой нибудь popup Фм по кнопке для диалога с пользователем.
Давно не встречал использование table control :)


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

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


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

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


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

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