19 мая 2018

Как получить разрешение экрана

  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.

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

Отключить расширенный поиск в SAP GUI


В настройках SAP Logon в меню "Интерактивный дизайн" -> "Визуализация 2" в блоке "Расширенный поиск" выбрать необходимое значение.

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

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

Изменить систему оригинала объекта

Чтобы изменить систему оригинала:
1. Запускаем SE03.
2. Выбираем "Изменение записей каталога объектов".
3. Указываем фильтр поиска объекта.
4. Встаём на объект и нажимаем "Каталог объектов".
5. Сохранить.

Если вы случайно (как я) в группе функций, относящейся к customer exit (ГрФ = "X*"), положили экран в локальный пакет, то в SE03 его можно найти по условию R3TR FUGX X*.

20 марта 2017

Чтение длинных текстов

Рассмотрим чтение длинных текстов на примере текста к основным данным материала (текстовый объект - MATERIAL, идентификатор - GRUN). Чтение длинного текста осуществляется с помощью функционального модуля READ_TEXT.

19 марта 2017

Прибавить/отнять N лет/месяцев/дней к дате

Чтобы прибавить к дате некоторое количество лет/месяцев/дней, используем функциональный модуль RP_CALC_DATE_IN_INTERVAL.

  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

Типы данных

Простые типы

Типы данных делятся на три категории: стандартные, локальные и глобальные.

Стандартные типы бывают фиксированной, заданной или переменной длины.

Фиксированной длины
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.

  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Имя пользователя

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. Режим редактирования активирован.

21 июня 2016