DATA: lo_consumer TYPE REF TO cl_gui_props_consumer, ls_metric_factors TYPE cntl_metric_factors. lo_consumer = cl_gui_props_consumer=>create_consumer( ). ls_metric_factors = lo_consumer->get_metric_factors( ). WRITE: ls_metric_factors-screen-x, ls_metric_factors-screen-y.
19 мая 2018
Как получить разрешение экрана
18 мая 2018
Как получить размер окна
DATA: lv_begin_row TYPE i, lv_begin_col TYPE i, lv_end_row TYPE i, lv_end_col TYPE i. CALL 'GET_WINDOW_DATA' ID 'BEGROW' FIELD lv_begin_row ID 'BEGCOL' FIELD lv_begin_col ID 'ENDROW' FIELD lv_end_row ID 'ENDCOL' FIELD lv_end_col. CALL SCREEN 0900 STARTING AT 5 1 ENDING AT lv_end_col lv_end_row.
14 февраля 2018
Изменить размер шрифта в поле в PDF-формуляре
Изменение размера шрифта в зависимости от длины поля, пример кода (FormCalc, client):
var ln = Len($.rawValue) if (ln > 150) then $.font.size = "7 pt" $.para.lineHeight = "7pt" endif
13 февраля 2018
12 февраля 2018
Класс для работы с символами
Класс CL_ABAP_CHAR_UTILITIES. В частности константа:
cl_abap_char_utilities=>cr_lf
09 февраля 2018
Средство поиска для файла, диалог открытия файла
Для открытия диалога выбора файла используем метод cl_gui_frontend_services=>file_open_dialog.
*&---------------------------------------------------------------------* *& Form F4_FILENAME *&---------------------------------------------------------------------* * File name search help *----------------------------------------------------------------------* FORM f4_filename CHANGING value(cv_filename). DATA: lt_filename TYPE filetable, ls_filename LIKE LINE OF lt_filename, lv_def_filename TYPE string, lv_file_filter TYPE string, lv_rc TYPE i. CLEAR cv_filename. CLEAR lv_def_filename. lv_file_filter = 'Excel-файлы (*.XLS;*.XLSX)|*.XLS;*.XLSX|'. CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING * default_extension = lv_def_extension " 'DBF' default_filename = lv_def_filename file_filter = lv_file_filter CHANGING file_table = lt_filename rc = lv_rc EXCEPTIONS file_open_dialog_failed = 1 cntl_error = 2 error_no_gui = 3 not_supported_by_gui = 4 OTHERS = 5. IF sy-subrc NE 0. ELSEIF lt_filename IS NOT INITIAL. READ TABLE lt_filename INTO ls_filename INDEX 1. cv_filename = ls_filename-filename. ENDIF. ENDFORM. " F4_FILENAME
08 февраля 2018
Транзакция для ракурса ведения
Имеем ракурс ведения ZVTEST01.
Идём в SE93, вводим код транзакции, нажимаем "Создать", вводим Краткий текст, выбираем тип "Транзакция с параметрами". Далее вводим транзакцию SM30, ставим галку "Пропустить первый экран", указываем параметры:
VIEWNAME = ZVTEST01
UPDATE = X
Идём в SE93, вводим код транзакции, нажимаем "Создать", вводим Краткий текст, выбираем тип "Транзакция с параметрами". Далее вводим транзакцию SM30, ставим галку "Пропустить первый экран", указываем параметры:
VIEWNAME = ZVTEST01
UPDATE = X
02 февраля 2018
Средство поиска со значениями из внутренней таблицы
Используем функциональный модуль F4IF_INT_TABLE_VALUE_REQUEST.
DATA: lt_tab1 TYPE TABLE OF ztab1, lt_return_tab TYPE TABLE OF ddshretval, ls_return_tab LIKE LINE OF lt_return_tab. SELECT * FROM ztab1 INTO TABLE lt_tab1. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING * ddic_structure = ' ' retfield = 'DOCTYPE' " for example * pvalkey = ' ' * dynpprog = ' ' * dynpnr = ' ' * dynprofield = ' ' * stepl = 0 * window_title = * value = ' ' value_org = 'S' * multiple_choice = ' ' * display = ' ' * callback_program = ' ' * callback_form = ' ' * callback_method = * mark_tab = * IMPORTING * user_reset = TABLES value_tab = lt_tab1 * field_tab = return_tab = lt_return_tab * dynpfld_mapping = EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. IF sy-subrc EQ 0. READ TABLE lt_return_tab INTO ls_return_tab INDEX 1. IF sy-subrc EQ 0. " ls_return_tab-fieldval содержит выбранное значение ENDIF. ENDIF.
01 февраля 2018
Чтение значений домена
Для чтения значений домена используем функциональный модуль BKK_DOMAIN_TEXTS_READ.
DATA: lt_domain_text TYPE bkkdc_t_domain_text. CALL FUNCTION 'BKK_DOMAIN_TEXTS_READ' EXPORTING i_langu = sy-langu i_domname = 'ZDOMNAME' IMPORTING et_domain_text = lt_domain_text. " Внутренняя таблица lt_domain_text содержит значения домена
20 декабря 2017
Чтение набора, созданного в GS01
Имеем набор значений, созданный в транзакции GS01.
* Importing: * iv_setname TYPE c " Set name * Exporting: * et_range TYPE TABLE " Range with values DATA: lv_setid TYPE sethier-setid, lt_set_values TYPE TABLE OF rgsb4. FIELD-SYMBOLS: <lfs_set_values> LIKE LINE OF lt_set_values, <lfs_range> TYPE any, <lfs_value> TYPE any. * Чтение набора CALL FUNCTION 'G_SET_GET_ID_FROM_NAME' EXPORTING shortname = iv_setname IMPORTING new_setid = lv_setid * set_info = * TABLES * t_sets = EXCEPTIONS no_set_found = 1 no_set_picked_from_popup = 2 wrong_class = 3 wrong_subclass = 4 table_field_not_found = 5 fields_dont_match = 6 set_is_empty = 7 formula_in_set = 8 set_is_dynamic = 9 OTHERS = 10 . CHECK sy-subrc EQ 0. CALL FUNCTION 'G_SET_GET_ALL_VALUES' EXPORTING setnr = lv_setid TABLES set_values = lt_set_values EXCEPTIONS set_not_found = 1 OTHERS = 2. CHECK sy-subrc EQ 0. LOOP AT lt_set_values ASSIGNING <lfs_set_values>. INSERT INITIAL LINE INTO TABLE et_range ASSIGNING <lfs_range>. ASSIGN COMPONENT 'SIGN' OF STRUCTURE <lfs_range> TO <lfs_value>. IF sy-subrc EQ 0. <lfs_value> = 'I'. ENDIF. ASSIGN COMPONENT 'OPTION' OF STRUCTURE <lfs_range> TO <lfs_value>. IF sy-subrc EQ 0. IF <lfs_set_values>-to IS NOT INITIAL. <lfs_value> = 'BT'. ELSE. <lfs_value> = 'EQ'. ENDIF. ENDIF. ASSIGN COMPONENT 'LOW' OF STRUCTURE <lfs_range> TO <lfs_value>. IF sy-subrc EQ 0. <lfs_value> = <lfs_set_values>-from. ENDIF. ASSIGN COMPONENT 'HIGH' OF STRUCTURE <lfs_range> TO <lfs_value>. IF sy-subrc EQ 0. <lfs_value> = <lfs_set_values>-to. ENDIF. ENDLOOP.
11 ноября 2017
Выгрузка текстового файла на сервер приложений (Application Server)
DATA: lv_file(100) VALUE '/tmp/txtupload20171110.txt', lv_string TYPE string, lv_n2(2) TYPE n. OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT WITH WINDOWS LINEFEED IGNORING CONVERSION ERRORS. CHECK sy-subrc EQ 0. DO 4 TIMES. lv_n2 = sy-index. lv_string = 'test ' && lv_n2 && lv_n2. TRANSFER lv_string TO lv_file. ENDDO. CLOSE DATASET lv_file.
05 июля 2017
Изменить систему оригинала объекта
Чтобы изменить систему оригинала:
Если вы случайно (как я) в группе функций, относящейся к customer exit (ГрФ = "X*"), положили экран в локальный пакет, то в SE03 его можно найти по условию R3TR FUGX X*.
1. Запускаем SE03.
2. Выбираем "Изменение записей каталога объектов".
3. Указываем фильтр поиска объекта.
3. Указываем фильтр поиска объекта.
4. Встаём на объект и нажимаем "Каталог объектов".
5. Сохранить.
Если вы случайно (как я) в группе функций, относящейся к customer exit (ГрФ = "X*"), положили экран в локальный пакет, то в SE03 его можно найти по условию R3TR FUGX X*.
20 марта 2017
Чтение длинных текстов
Рассмотрим чтение длинных текстов на примере текста к основным данным материала (текстовый объект - MATERIAL, идентификатор - GRUN). Чтение длинного текста осуществляется с помощью функционального модуля READ_TEXT.
19 марта 2017
Прибавить/отнять N лет/месяцев/дней к дате
Чтобы прибавить к дате некоторое количество лет/месяцев/дней, используем функциональный модуль RP_CALC_DATE_IN_INTERVAL.
Чтобы отнять от даты некоторое количество лет/месяцев/дней используем signum = '-'.
DATA: lv_days(2) TYPE n, lv_months(2) TYPE n, lv_years(2) TYPE n, lv_date TYPE d. " Прибавить к текущей дате 6 месяцев lv_months = '6'. CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date = sy-datum days = lv_days months = lv_months * signum = '+' years = lv_years IMPORTING calc_date = lv_date.
Чтобы отнять от даты некоторое количество лет/месяцев/дней используем signum = '-'.
Последний день месяца
Для определения последнего дня месяца используем функциональный модуль BKK_GET_MONTH_LASTDAY.
DATA: lv_date TYPE d. CALL FUNCTION 'BKK_GET_MONTH_LASTDAY' EXPORTING i_date = sy-datum IMPORTING e_date = lv_date. " lv_date содержит последний день текущего месяца
Чтение признаков партии и материала
Для чтения признаков партии используем функциональный модуль BAPI_OBJCL_GETDETAIL.
DATA: lv_objkey TYPE bapi1003_key-object, lt_num TYPE TABLE OF bapi1003_alloc_values_num, lt_char TYPE TABLE OF bapi1003_alloc_values_char, lt_curr TYPE TABLE OF bapi1003_alloc_values_curr, lt_return TYPE TABLE OF bapiret2. FIELD-SYMBOLS: <lfs_char> LIKE LINE OF lt_char. CONCATENATE p_matnr p_werks p_charg INTO lv_objkey. " или lv_objkey+0(18) = p_matnr. lv_objkey+18(4) = p_werks. lv_objkey+22(10) = p_charg. CALL FUNCTION 'BAPI_OBJCL_GETDETAIL' EXPORTING objectkey = lv_objkey objecttable = 'MCHA' classnum = 'ZCLASS01' classtype = '022' TABLES allocvaluesnum = lt_num allocvalueschar = lt_char allocvaluescurr = lt_curr return = lt_return. READ TABLE lt_char ASSIGNING <lfs_char> WITH KEY charact = 'Z_PARAM01'. IF sy-subrc EQ 0. " <lfs_char>-value_char содержит значение признака Z_PARAM01 ENDIF.
Для чтения признаков материала используем objecttable = 'MARA'.
11 сентября 2016
Типы данных
Простые типы
Типы данных делятся на три категории: стандартные, локальные и глобальные.
Стандартные типы бывают фиксированной, заданной или переменной длины.
Стандартные типы могут использоваться для определения локальных типов данных. Локальные типы существуют только в программе и могут использоваться только в ней. Локальный тип определяется служебным словом TYPES.
Глобальные типы определяются в ABAP-словаре и могут использоваться во всей системе (во всей рассматриваемой SAP-системе).
Структуры
Структуры содержат фиксированное число полей и служат для объединения простых полей в более сложный, например, данные о сотруднике. Структуры объявляются служебными словами BEGIN OF и END OF.
Аналогично можно объявить тип структуры, чтобы в дальнейшем использовать его для объявления полей.
Для обращения к полю структуры надо указать её имя и через дефис имя поля.
Системные поля
В системе предусмотрена глобальная структура SYST, которая хранит системные данные. Доступ к ней в программе осуществляется по имени SY. Некоторые значения системных переменных указаны ниже.
Типы данных делятся на три категории: стандартные, локальные и глобальные.
Стандартные типы бывают фиксированной, заданной или переменной длины.
Фиксированной длины | |
D | Дата (Date) |
Формат – ГГГГММДД | |
Длина – 8 | |
Значение по умолчанию – ‘00000000’ | |
T | Время (Time) |
Формат – ЧЧММСС | |
Длина – 6 | |
Значение по умолчанию – ‘000000’ | |
I | Целое число (Integer) |
Длина – 4 | |
Значение по умолчанию – 0 | |
F | Число с плавающей запятой (Float) |
Длина – 8 | |
Значение по умолчанию – 0.0 | |
Заданной длины | |
C | Последовательность символов (Character) |
Длина по умолчанию – 1 | |
Значение по умолчанию – ‘’ (пустая строка) | |
N | Последовательность числовых символов (Numericalcharacter) |
Длина по умолчанию – 1 | |
Значение по умолчанию – ‘0’ | |
X | Байтовая последовательность (Hexadecimal) |
Длина по умолчанию – 1 | |
Значение по умолчанию – ‘00’ | |
P | Упакованное число (Packed number) |
Длина по умолчанию – 8 | |
Значение по умолчанию – 0 | |
Переменной длины | |
STRING | Последовательность символов переменной длины (String) |
XSTRING | Байтовая последовательность переменной длины (Hexadecimal string) |
Поле – это переменная, которая хранит данные. Поля объявляются служебным словом DATA с указанием типа данных, а также длины и количества десятичных разрядов, если это применимо.
" Объявление поля name символьного типа длиной 30 символов DATA name TYPE c LENGTH 30. " Также длину поля можно указать в скобках DATA name(30) TYPE c. " Можно задать начальное значение поля служебным словом VALUE DATA name(30) TYPE c VALUE 'John'. " Если не указан тип поля, по умолчанию используется " символьный тип C DATA name(30) VALUE 'John'. " Если не указана длина поля, используется длина по умолчанию " для указанного типа DATA flag TYPE c. " Объявление поля flag символьного типа длиной 1 символ DATA flag. " Объявление поля count целого типа DATA count TYPE i. " Объявление поля amount упакованного типа длиной 10 " с количеством десятичных разрядов 3 DATA amount(10) TYPE p DECIMALS 3.
Объявление нескольких полей можно объединить, поставив после DATA двоеточие и записав объявление полей через запятую.
DATA: name(30), count TYPE i, flag.
При объявлении упакованного типа надо учитывать, что на один символ приходится полбайта, включая знак числа. Т.е. при указании длины 10 подразумевается, что итоговая разрядность числа будет 16 (1 символ определяет знак числа +/-, 3 символа приходится на десятичную часть и оставшиеся 16 символов – на целую часть). Таким образом, диапазон чисел, которые может хранить поле amount из последнего примера от -9 999 999 999 999 999,999 до 9 999 999 999 999 999,999.
Чтобы определить поле того же типа, что и ранее объявленное, вместо TYPE используется LIKE.
Чтобы определить поле того же типа, что и ранее объявленное, вместо TYPE используется LIKE.
DATA: first_name(50) TYPE c, last_name LIKE first_name.
Константа определяется словом CONSTANTS с указанием типа, длины и числа десятичных разрядов аналогично объявлению полей. Дополнение VALUE для константы обязательно. Таким образом определяется её значение.
CONSTANTS name_john TYPE c LENGTH 30 VALUE 'John'.
Стандартные типы могут использоваться для определения локальных типов данных. Локальные типы существуют только в программе и могут использоваться только в ней. Локальный тип определяется служебным словом TYPES.
" Определяется символьный тип длиной 30 символов TYPES t_name(30). " Определяется поле типа t_name DATA name TYPE t_name.
Глобальные типы определяются в ABAP-словаре и могут использоваться во всей системе (во всей рассматриваемой SAP-системе).
Структуры
Структуры содержат фиксированное число полей и служат для объединения простых полей в более сложный, например, данные о сотруднике. Структуры объявляются служебными словами BEGIN OF и END OF.
DATA: BEGIN OF employee, first_name(50), last_name(50), birthday TYPE d, END OF employee.
TYPES: BEGIN OF t_employee, first_name(50), last_name(50), birthday TYPE d, END OF t_employee. DATA: employee TYPE t_employee.
Для обращения к полю структуры надо указать её имя и через дефис имя поля.
employee-first_name = 'John'. employee-last_name = 'Smith'. employee-birthday = '19820101'.
Системные поля
В системе предусмотрена глобальная структура SYST, которая хранит системные данные. Доступ к ней в программе осуществляется по имени SY. Некоторые значения системных переменных указаны ниже.
SY-DATUM | Актуальная дата сервера приложений |
SY-UZEIT | Актуальное время сервера приложений |
SY-INDEX | Счетчик цикла DO |
SY-TABIX | Индекс в цикле LOOP |
SY-SUBRC | Код возврата, содержит результат последней выполненной операции. SY-SUBRC = 0 в случае успешного выполнения. |
SY-LANGU | Язык входа в систему |
SY-BATCH | Программа выполняется в фоновом режиме |
SY-BINPT | Программа выполняется в рамках пакетного ввода |
SY-REPID | Имя текущей программы |
SY-UNAME | Имя пользователя |
28 августа 2016
Расширение Документа материала
Расширение структур MSEG, BAPI_TE_XMSEG, IMSEG и пример использования BAPI BAPI_GOODSMVT_CREATE.
03 августа 2016
Прямое редактирование записей в таблице
1. Запускаем транзакцию SE16N.
2. Вводим имя таблицы.
3. Активируем отладку ("/h" в поле команды и Enter).
4. Нажимаем "Выполнить" (клавиша F8).
5. В отладчике подменяем значение полей GD-EDIT и GD-SAPEDIT на "X".
6. Нажимаем "Далее" (клавиша F8).
7. Режим редактирования активирован.
Ещё один вариант:
1. Запускаем транзакцию SE16N.
2. Вводим "&SAP_EDIT" в поле команды и Enter.
3. Нажимаем "Выполнить" (клавиша F8).
4. Режим редактирования активирован.
2. Вводим имя таблицы.
3. Активируем отладку ("/h" в поле команды и Enter).
4. Нажимаем "Выполнить" (клавиша F8).
5. В отладчике подменяем значение полей GD-EDIT и GD-SAPEDIT на "X".
6. Нажимаем "Далее" (клавиша F8).
7. Режим редактирования активирован.
Ещё один вариант:
1. Запускаем транзакцию SE16N.
2. Вводим "&SAP_EDIT" в поле команды и Enter.
3. Нажимаем "Выполнить" (клавиша F8).
4. Режим редактирования активирован.
21 июня 2016
Расширение ОЗМ
Расширение структур MARA, BAPI_TE_MARA, BAPI_TE_MARAX и пример использования BAPI BAPI_MATERIAL_SAVEDATA.
Подписаться на:
Сообщения (Atom)