7 декабря 2010 г.

ABAP: Цвета в ALV GRID


Пример:

REPORT  ZTEST_ALV_COLORS.

TYPES: BEGIN OF my_itab_wa,
  COLOR(4)  TYPE C, " Поле для указания цвета строки
  TEXT(255) TYPE C, " Просто текст
  END OF my_itab_wa,
  my_itab_t TYPE TABLE OF my_itab_wa.

DATA: my_itab TYPE my_itab_t.
DATA: my_grid type ref to CL_GUI_ALV_GRID, " грид
      my_g_cont type ref to CL_GUI_DOCKING_CONTAINER, " контейнер
      my_g_fcat type LVC_T_FCAT,
      my_g_layo type LVC_S_LAYO,
      my_g_vari type DISVARIANT.

CALL SCREEN '0100'.

* Заполняем внутреннюю таблицу для ALV
FORM UPDATE_ITAB.
  DATA: lv_c1   TYPE C.
        
  DATA: ls_itab TYPE my_itab_wa.

  lv_c1 = '0'.
  DO 7 TIMES.
    lv_c1 = lv_c1 + 1.
    CONCATENATE 'C' lv_c1 '00' INTO ls_itab-COLOR.
    CONCATENATE 'This is' ls_itab-COLOR INTO ls_itab-TEXT SEPARATED BY SPACE.
    APPEND ls_itab TO my_itab.
    CONCATENATE 'C' lv_c1 '10' INTO ls_itab-COLOR.
    CONCATENATE 'This is' ls_itab-COLOR INTO ls_itab-TEXT SEPARATED BY SPACE.
    APPEND ls_itab TO my_itab.

    CONCATENATE 'C' lv_c1 '01' INTO ls_itab-COLOR.
    CONCATENATE 'This is' ls_itab-COLOR INTO ls_itab-TEXT SEPARATED BY SPACE.
    APPEND ls_itab TO my_itab.

  ENDDO.
ENDFORM.

* Создаем грид
FORM CREATE_ALV_GRID.
  DATA: ls_fcat TYPE LVC_S_FCAT.

  IF my_g_cont IS INITIAL.
    CREATE OBJECT my_g_cont
    EXPORTING
      repid     = sy-repid
      dynnr     = sy-dynnr
      extension = 3000
      side      = cl_gui_docking_container=>dock_at_top.

    CREATE OBJECT my_grid
    EXPORTING
      I_SHELLSTYLE  = 4
      I_PARENT = my_g_cont
      I_APPL_EVENTS = 'X'.

    my_g_vari-REPORT = sy-repid.
    my_g_vari-username = sy-uname.
    my_g_vari-handle = 'MYGR'.

    my_g_layo-cwidth_opt     = ''.
    my_g_layo-sel_mode       = 'A'.

*   В лэйауте указываем имя поля в котором
*   будем хранить цвет строки
    my_g_layo-info_fname     = 'COLOR'.

    ls_fcat-fieldname = 'TEXT'.
    ls_fcat-coltext   = 'Текст'.
    ls_fcat-reptext   = 'Текст'.
    ls_fcat-scrtext_l = 'Текст'.
    ls_fcat-scrtext_m = 'Текст'.
    ls_fcat-scrtext_s = 'Текст'.
    APPEND ls_fcat TO my_g_fcat.

    CALL METHOD my_grid->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      IS_LAYOUT       = my_g_layo
      IS_VARIANT      = my_g_vari
      I_SAVE          = 'A'
    CHANGING
      IT_OUTTAB       = my_itab
      IT_FIELDCATALOG = my_g_fcat.
  ENDIF.
ENDFORM.

MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'GUI_0100'.
  PERFORM UPDATE_ITAB.
  PERFORM CREATE_ALV_GRID.
ENDMODULE.                 " STATUS_0100  OUTPUT

MODULE EXIT_COMMAND_0100 INPUT.
  LEAVE TO SCREEN 0.
ENDMODULE.                 " EXIT_COMMAND_0100  INPUT



Статья на аналогичную тему на английском: Report and ALV Colors 
Подробнее...

3 ноября 2010 г.

ABAP: добавление кнопок (и не только) в TOOLBAR ALV GRID, созданного через REUSE_ALV_GRID_DISPLAY

REUSE_ALV_GRID_DISPLAY позволяет указать PF-STATUS который будет использоваться при выводе грида, и название формы в которой будет происходить обработка юзер-комманд. Этим и стоит воспользоваться.

PF-STATUS лучше делать не с нуля, а в транзакции SE41 скопировать из программы SAPLSLVC_FULLSCREEN статус STANDARD_FULLSCREEN, чтобы иметь на тулбаре все стандартные кнопки грида.

После того как статус создан можно писать код.

ПРИМЕР:


В скопированный GUI-STATUS добавил кнопку


*--------------------------------------------------------------*

* сохраняем в перемнную имя программы
  lv_repid = sy-repid.


* вызывавем ФМ, указываем в нем названия форм которые
* устанавливают pf-status и обрабатывают команды
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM                = lv_repid
      I_CALLBACK_PF_STATUS_SET          = 'SET_PF_STATUS'
      I_CALLBACK_USER_COMMAND           = 'USER_COMMAND'
      I_GRID_TITLE                      = 'Отчет по планированию доходов'
      IT_FIELDCAT_LVC                   = lt_fcat
    TABLES
      T_OUTTAB                          = it_plantab
    EXCEPTIONS
      PROGRAM_ERROR                     = 1
      OTHERS                            = 2
            .      

* устанавливаем PF-STATUS
FORM SET_PF_STATUS USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'GUI_ALVGRIDX'.
ENDFORM.

* обрабатываем команды
FORM USER_COMMAND USING p_ucomm LIKE sy-ucomm
                        ps_selfield TYPE slis_selfield.
  CASE p_ucomm.
    WHEN 'PXLS'.
      " выполняем что-то крайне важное
  ENDCASE.
ENDFORM.

*--------------------------------------------------------------*
Подробнее...

29 октября 2010 г.

ABAP: добавление своей кнопки в TOOLBAR SELECTION-SCREEN

Один из способов добавить свою кнопку в toolbar на SELECTION-SCREEN. 

*--------------------------------------------------------------*
* Объявляем специальную системную 
* структуру для работы с экраном
  TABLES: sscrfields.
* Объявляем структуру которую будем 
* использовать для формирования текстов для кнопок
  DATA: functxt TYPE smp_dyntxt.


  SELECT-OPTIONS...
  PARAMETERS...
* Активируем кнопку номер 1
  SELECTION-SCREEN FUNCTION KEY 1.

* в этом событии создаем кнопку и записываем 
* ее в sscrfields
  AT SELECTION-SCREEN OUTPUT.
    functxt-icon_id = icon_create.
    functxt-quickinfo = 'Создать'.
    functxt-icon_text = 'Создать'.
    MOVE funcxt TO sscrfields-functxt_01.

* Обрабатываем реакцию на нажатие кнопки  
  AT SELECTION-SCREEN.
    CASE sscrfields-ucomm.
      WHEN 'FC01'.
      "тут происходит что-то важное
      "и тут
      "и еще немного тут
    ENDCASE.
*--------------------------------------------------------------*

В результате получится что-то в этом духе:


Подробнее...

25 октября 2010 г.

ABAP: Всплывающие подсказки к значениям в ALV GRID

Для этого надо заполнить таблицу типа ALV_T_QINF. В ней для каждого значения которому необходима подсказка заполнить поля:
  TYPE   - тип,
  VALUE  - значение,
  TEXT   - текст подсказки.
 

Тип берется из констант класса cl_salv_tooltip:
- C_TYPE_ICON,
- C_TYPE_SYMBOL,
- C_TYPE_COLOR,
- C_TYPE_EXCEPTION,
- C_TYPE_TREE_STYLE.

Потом необходимо передать эту таблицу в методе SET_TABLE_FOR_FIRST_DISPLAY во входном параметре IT_EXCEPT_QINFO.

Пример:

   DATA: l_t_qinf TYPE ALV_T_QINF.
   DATA: l_s_qinf TYPE ALV_S_QINF.

   l_s_qinf-TYPE  = cl_salv_tooltip=>C_TYPE_ICON.
   l_s_qinf-VALUE = ICON_HISTORY.
   l_s_qinf-TEXT  = 'Есть ПП'.

   APPEND l_s_qinf TO l_t_qinf.

   CALL METHOD my_alv_grid->SET_TABLE_FOR_FIRST_DISPLAY
     EXPORTING
       IS_LAYOUT       = my_alv_layo
       IS_VARIANT      = my_alv_vari
       I_SAVE          = 'A'
       IT_EXCEPT_QINFO = l_t_qinf
     CHANGING
       IT_OUTTAB       = my_alv_it[]
       IT_FIELDCATALOG = my_alv_fcat.
Подробнее...

14 октября 2010 г.

ABAP: Установка позиции вертикального скролла в ALV GRID

  DATA: LS_COL_INFO TYPE LVC_S_COL,
        LS_ROW_INFO TYPE LVC_S_ROW.
 
* Получаем информацию о текущей позиции скролла
  CALL METHOD req_grid->GET_SCROLL_INFO_VIA_ID
    IMPORTING
      ES_ROW_INFO = LS_ROW_INFO
      ES_COL_INFO = LS_COL_INFO.

* нужно для того чтобы не вываливалось в дамп 
* после вызова предыдущего метода
  CALL METHOD CL_GUI_CFW=>FLUSH
  EXCEPTIONS
    CNTL_SYSTEM_ERROR = 1
    CNTL_ERROR        = 2.
 
* Указываем индекс нужной нам строки
  LS_ROW_INFO-INDEX = lv_index.
 
* Устанавливаем скролл в нужную позицию
  CALL METHOD req_grid->SET_SCROLL_INFO_VIA_ID
    EXPORTING
      IS_ROW_INFO = LS_ROW_INFO
      IS_COL_INFO = LS_COL_INFO.
 
* нужно для того чтобы не вываливалось в дамп 
* после вызова предыдущего метода
  CALL METHOD CL_GUI_CFW=>FLUSH
  EXCEPTIONS
    CNTL_SYSTEM_ERROR = 1
    CNTL_ERROR        = 2. 
Подробнее...

22 сентября 2010 г.

ABAP: Поиск текста документа с помощью функционального модуля READ_TEXT

Иногда требуется вытащить текст из документов Сбыта (SAP R/3 SD), этот текст может содержаться в любом документе, но храниться он в системе не в явном виде, поэтому может пригодиться следующий алгоритм... Подробнее...

10 сентября 2010 г.

ABAP: Common SAP R/3 Functions Manual. William Lawlor.

САБЖ, книжка на гугло-книгах, по сути справочник по саповским ФМ-ам. Есть у нас и в твердом варианте, но и в электронном не помешает.

UPD: упс облом, там только 143 страницы Подробнее...

23 августа 2010 г.

.Net Compact Framework: Изменения цвета фона определенных строк DataGrid'а

// Для подсветки необходимых строк в датагриде создал класс,
// по примеру показанному здесь

class DataGridCustomColumnRowColor : DataGridTextBoxColumn
{
    #region Privates
    private DataGrid _owner = null;
    private StringFormat _stringFormat = null;
    private Color _customRowBackColor = SystemColors.Window; // Back color for odd numbered rows
    private SolidBrush _customBrush = null;
    #endregion

    #region Public properties
    public Color CustomRowBackColor
    {
        get
        {
            return _customRowBackColor;
        }
        set
        {
            if (_customRowBackColor != value) // Setting new color?
            {
                if (this._customBrush != null) // See if got brush
                {
                    this._customBrush.Dispose(); // Yes, get rid of it.
                }

                this._customRowBackColor = value; // Set new color

                this._customBrush = new SolidBrush(value); // Create new brush.

                Invalidate();
            }
        }
    }

    public StringFormat StringFormat
    {
        get
        {
            if (null == _stringFormat) // No format yet?
            {
                _stringFormat = new StringFormat(); // Create one.

                this.Alignment = HorizontalAlignment.Left; // And set default aligment.
            }

            return _stringFormat; // Return our format
        }
    }

    public DataGrid Owner
    {
        get
        {
            if (null == _owner)
            {
                throw new InvalidOperationException("DataGrid owner of this ColumnStyle must be set prior to this operation.");
            }
            return _owner;
        }
        set
        {
            if (null != _owner)
            {
                throw new InvalidOperationException("DataGrid owner of this ColumnStyle is already set.");
            }

            _owner = value;
        }
    }

    public virtual HorizontalAlignment Alignment
    {
        get
        {
            return (this.StringFormat.Alignment == StringAlignment.Center) ? HorizontalAlignment.Center :
                   (this.StringFormat.Alignment == StringAlignment.Far) ? HorizontalAlignment.Right : HorizontalAlignment.Left;
        }
        set
        {
            if (this.Alignment != value) // New aligment?
            {
                this.StringFormat.Alignment = (value == HorizontalAlignment.Center) ? StringAlignment.Center :
                                              (value == HorizontalAlignment.Right) ? StringAlignment.Far : StringAlignment.Near;
                // Set it.
                Invalidate(); // Aligment just changed, repaint.
            }
        }
    }
    #endregion

    protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source, int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
    {
        RectangleF textBounds; // Bounds of text
        Object cellData; // Object to show in the cell

        DrawBackground(g, bounds, rowNum, backBrush); // Draw cell background

        bounds.Inflate(-2, -2); // Shrink cell by couple pixels for text.

        textBounds = new RectangleF(bounds.X, bounds.Y, bounds.Width, bounds.Height);
        // Set text bounds.
        cellData = this.PropertyDescriptor.GetValue(source.List[rowNum]); // Get data for this cell from data source.

        g.DrawString(FormatText(cellData), this.Owner.Font, foreBrush, textBounds, this.StringFormat);
        // Render contents
    }


    protected virtual void DrawBackground(Graphics g, Rectangle bounds, int rowNum, Brush backBrush)
    {
        Brush background = backBrush; // Use default brush by... hmm... default.

        DataTable datatab = (DataTable)Owner.DataSource;

        if ((null != background) && (Boolean)datatab.Rows[rowNum]["_CustomColor"] && !Owner.IsSelected(rowNum))
        { // If have alternating brush, row is odd and not selected...
            background = _customBrush; // Then use alternating brush.
        }

        g.FillRectangle(background, bounds); // Draw cell background
    }

    protected virtual String FormatText(Object cellData)
    {
        String cellText; // Formatted text.

        if ((null == cellData) || (DBNull.Value == cellData)) // See if data is null
        {
            cellText = this.NullText; // It's null, so set it to NullText.
        }
        else if (cellData is IFormattable) // Is data IFormattable?
        {
            cellText = ((IFormattable)cellData).ToString(this.Format, this.FormatInfo);
            // Yes, format it.
        }
        else if (cellData is IConvertible) // May be it's IConvertible?
        {
            cellText = ((IConvertible)cellData).ToString(this.FormatInfo); // We'll take that, no problem.
        }
        else
        {
            cellText = cellData.ToString(); // At this point we'll give up and simply call ToString()
        }

        return cellText;
    }
    protected void Invalidate()
    {
        if (this.Owner != null) // Got parent?
        {
            this.Owner.Invalidate(); // Repaint it.
        }
    }
}

//Пример использования

//Создаем таблицу
DataTable myDataTable = new DataTable();

//Добаляем необходимые нам колонки
...

//добавляем колонку с именем "_CustomColor", которая будет служить флагом,
//если значение в этой колонке - true, тогда надо подсвечивать эту строку
myDataTable.Columns.Add("_CustomColor", System.Type.GetType("System.Boolean"));
...

//Заполняем таблицу значениями
DataRow myDataRow = myDataTable.NewRow();
...
myDataRow["_CustomColor"] = true/false;
...
myDataTable.Rows.Add(myDataRow);

//Указываем DataSource грида
myDataGrid.DataSource = myDataTable;
...

//Создаем TableStyle
DataGridTableStyle myTbStyle = new DataGridTableStyle();
//Cоздаем цвет подсветки
Color myCustomColor = System.Drawing.Color.Red;

//Добавляем колонки в DataGrid, все добавляемые колонки должны быть нашего класса
DataGridCustomColumnRowColor myDataGridCustomColumn1 = new DataGridCustomColumnRowColor();
...
//Указываем датагрид
myDataGridCustomColumn1.Owner = myDataGrid;
//Указывем наш цвет
myDataGridCustomColumn1.CustomRowBackColor = myCustomColor;
...

myTbStyle.GridColumnStyles.Add(myDataGridCustomColumn1);
//Так повторяем дял каждой колонки

//После всего добвляем стиль в DataGrid
myDataGrid.TableStyles.Add(myTbStyle);
Подробнее...

20 августа 2010 г.

ABAP: Узнать какие строки выделены (selected rows) в ALV GRID.


  DATA: gi_index_rows TYPE lvc_t_row,
        g_selected_row LIKE lvc_s_row.
 

  CALL METHOD %ALV_GRID%->GET_SELECTED_ROWS
    IMPORTING
      ET_INDEX_ROWS = gi_index_rows.
Подробнее...

ABAP: Шаблоны для BDC CALL TRANSACTION

* tables
  DATA: bdc_tab TYPE TABLE OF bdcdata. 

* structures
  DATA: bdc_line TYPE bdcdata.

  DEFINE bdc_dynpro.
    CLEAR bdc_line.
    bdc_line-PROGRAM = &1.
    bdc_line-DYNPRO  = &2.
    bdc_line-DYNBEGIN = 'X'.
    APPEND bdc_line TO bdc_tab.
  END-OF-DEFINITION.

  DEFINE bdc_field.
    CLEAR bdc_line.
    bdc_line-FNAM = &1.
    bdc_line-FVAL = &2.
    APPEND bdc_line TO bdc_tab.
  END-OF-DEFINITION.
  
  ...
 
  CALL TRANSACTION lv_tcod USING bdc_tab MODE '%MODE%' UPDATE '%UPDATE%'.

* %MODE%
* "A" Processing with display of screens 
* "E" Display of screens only if an error occurs 
* "N" Processing without display of screens. If a breakpoint is reached in one of the called transactions, processing is terminated with sy-subrc same as 1001. The field sy-msgty contains "S", sy-msgid contains "00", sy-msgno contains "344", sy-msgv1 contains "SAPMSSY3", and sy-msgv2 contains "0131". 
* "P" Processing without display of the screens. If a breakpoint is reached in one of the called transactions, the system branches to the ABAP Debugger. 
* Others Like "A". 
* %UPDATE%
* "A" Asynchronous update. Updates of called programs are executed in the same way as if in the COMMIT WORK statement the AND WAIT addition was not specified. 
* "S" Synchronous processing. Updates of the called programs are executed in the same way as if in the COMMIT WORK statement the AND WAIT addition had been specified. 
* "L" Local update. Updates of the called program are executed in such a way as if the SET UPDATE TASK LOCAL statement had been executed in it. 
* Other As for "A". 
Подробнее...