Сюда я буду сохранять всякие куски кода, конфигов, ссылки, чтобы в один прекрасный день когда мне это снова понадобится - не вспоминать судорожно где и когда я это применял.
3 марта 2011 г.
ABAP: Печать штрих-кодов в SAP с помощью Smartforms
Ссылка на неплохой туториал по печати штрих-кодов в Smartforms, там все хорошо описано, с картинками и примерами.
Подробнее...
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.
*--------------------------------------------------------------*
Подробнее...
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.
*--------------------------------------------------------------*
В результате получится что-то в этом духе:
Подробнее...
*--------------------------------------------------------------*
* Объявляем специальную системную
* структуру для работы с экраном
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. Подробнее...
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. Подробнее...
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 страницы Подробнее...
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. Подробнее...
Подписаться на:
Сообщения (Atom)