Текущее время: Пт, мар 29 2024, 01:45

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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