Как да скрия контролната колона на таблицата?

Следният код в PBO не работи за пълно скриване на колоната.

LOOP AT SCREEN.

    IF SCREEN-NAME EQ 'GT_SO-POSNR'
      SCREEN-INPUT = 0.
      SCREEN-ACTIVE = 0.
      SCREEN-INVISIBLE = 1.
      MODIFY SCREEN.
    ENDIF.
ENDLOOP.

Но по-горе е деактивирането на колоната, а не скриването й. Някаква помощ как да скрия колоната?


person Pasan Eeriyagama    schedule 28.06.2013    source източник


Отговори (4)


Използвайте полето INVISIBLE на таблицата COLS в структурата, дефинирана от оператора CONTROLS. Цялата структура е документирана тук. Трябва да има примерна програма с име RSDEMO02 във вашата система, която ви позволява да променяте свойствата на контролата на таблицата и да изследвате резултатите, докато правите това.

person vwegert    schedule 28.06.2013
comment
Здравейте, има ли друго свойство освен невидимо? Опитах INVISIBLE, но без успех, той не го прави невидим, вместо това преобразува съдържанието в „*********“, предполагам, че това има за цел да направи съдържанието невидимо? Вероятно като поле за парола.. Но трябва да скрия цялата колона с данни и заглавка. Благодаря. - person Pasan Eeriyagama; 01.07.2013

Имахме същия проблем в нашия проект и измислихме как да го направим.

Вижте примера по-долу:

PROCESS BEFORE OUTPUT.
MODULE STATUS.
LOOP WITH CONTROL TABCTRL.
  MODULE MODIFY_100.
ENDLOOP.


MODULE MODIFY_100 OUTPUT.
  DATA wa_tabctrl TYPE cxtab_column .

* loop at the table control
  LOOP AT TABCTRL-COLS INTO WA_TABCTRL.
    IF WA_TABCTRL-NAME =  'POSNR'.  
*     once you get to the desired screen, flag the INVISIBLE field for the table control, not the SCREEN table.             
      WA_TABCTRL-INVISIBLE =  'X'. 
*     Modify the table for table control
      MODIFY TABCTRL-COLS FROM WA_TABCTRL.
     ENDIF.
  ENDLOOP.

ENDMODULE.
person Ice    schedule 12.09.2014

Проверете начина, по който се опитвате да скриете конкретната колона. Всеки път, когато имате контрола Table на екрана, има CXTAB структура, която се създава срещу нея. Така че деактивирането на поле не е толкова просто, колкото да напишете името на вътрешната таблица, последвано от името на колоната.

Вашият код трябва да бъде нещо подобно

PROCESS BEFORE OUTPUT.
MODULE STATUS.
LOOP WITH CONTROL TABCTRL.
  MODULE MODIFY_100.
ENDLOOP.


MODULE MODIFY_100 OUTPUT.
  DATA wa_tabctrl TYPE cxtab_column .

  LOOP AT TABCTRL-COLS INTO WA_TABCTRL.
    IF WA_TABCTRL-NAME =  'POSNR'.                    
      WA_TABCTRL-SCREEN-INVISIBLE =  '1'. 
      MODIFY TABCTRL-COLS FROM WA_TABCTRL.
    ENDIF.
  ENDLOOP.

ENDMODULE.
person Rahul Kadukar    schedule 10.12.2013

Не би трябвало да е необходимо да преминавате през контролното съдържание на таблицата, за да скриете колоната за всеки ред поотделно, тъй като дефиницията на колоните е централна за табличния изглед.

По-чисто и много по-ефективно решение може да изглежда така:

*********************************
* PBO include
*********************************
PROCESS BEFORE OUTPUT.
  MODULE hide_column_0100.

*********************************
MODULE hide_column_0100 OUTPUT.
  PERFORM hide_column.
ENDMODULE.

*********************************
* form include
*********************************
FORM hide_column.
  FIELD-SYMBOL <col> TYPE cxtab_column.
  LOOP AT table_control_0100-cols ASSIGNING <col>.
    IF <col>-screen-name = 'HIDE'.
      <col>-invisible = 1.
    ENDIF.
  ENDLOOP.
ENDFORM.

По-добре е да поставите кода в собствена подпрограма (FORM), за да избегнете ненужни глобални променливи (като за работната област на LOOP). Често се забравя, че кодът MODULE принадлежи към глобалния обхват.

person kybos    schedule 21.07.2020