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'.