26 ноября 2018

Вызов программы с передачей динамических параметров селекционного экрана

При вызове программы через SUBMIT, селекционный экран которой имеет динамические параметры, используем дополнение WITH FREE SELECTIONS lt_texpr, где lt_texpr имеет тип rsds_texpr. В следующем примере вызываем программу для транзакции FBL1N и передаём в динамический параметр "Блокировка платежа" значение "A".

DATA:
  lv_sydatum          TYPE sy-datum,
  lt_items            TYPE it_rfposxext,
  lt_trange           TYPE rsds_trange,
  lt_texpr            TYPE rsds_texpr.

FIELD-SYMBOLS:
  <lfs_trange>        LIKE LINE OF lt_trange,
  <lfs_frange>        LIKE LINE OF <lfs_trange>-frange_t,
  <lfs_selopt>        LIKE LINE OF <lfs_frange>-selopt_t.

lv_sydatum = sy-datum.
  
INSERT INITIAL LINE INTO TABLE lt_trange ASSIGNING <lfs_trange>.
<lfs_trange>-tablename = 'BSIK'.
INSERT INITIAL LINE INTO TABLE <lfs_trange>-frange_t ASSIGNING <lfs_frange>.
<lfs_frange>-fieldname = 'ZLSPR'.
INSERT INITIAL LINE INTO TABLE <lfs_frange>-selopt_t ASSIGNING <lfs_selopt>.
<lfs_selopt>-sign = 'I'.
<lfs_selopt>-option = 'EQ'.
<lfs_selopt>-low = 'A'.

CALL FUNCTION 'FREE_SELECTIONS_RANGE_2_EX'
  EXPORTING
    field_ranges = lt_trange
  IMPORTING
    expressions  = lt_texpr.

SUBMIT rfitemap
  WITH kd_bukrs IN s_bukrs    " БЕ
  WITH kd_lifnr IN s_lifnr    " Кредитор
  WITH pa_stida EQ lv_sydatum " Открытые на отчетную дату
  WITH pa_vari EQ '1SAP'      " Формат
  WITH x_aisel EQ ''          " Все позиции
  WITH x_apar EQ ''           " Позиции дебиторов
  WITH x_clsel EQ ''          " Выровненные позиции
  WITH x_merk EQ ''           " Памятные позиции
  WITH x_norm EQ 'X'          " Стандартные позиции
  WITH x_opsel EQ ''          " Открытые позиции
  WITH x_park EQ ''           " Предв. зарегистрированные
  WITH x_shbv EQ ''           " Операции Особой главной книги
  WITH FREE SELECTIONS lt_texpr
  EXPORTING LIST TO MEMORY
  AND RETURN.


14 ноября 2018

Расчет суммы налога по коду налога и базовой сумме

Используется функциональный модуль CALCULATE_TAX_FROM_NET_AMOUNT.

  CALL FUNCTION 'CALCULATE_TAX_FROM_NET_AMOUNT'
    EXPORTING
      i_bukrs           = lv_bukrs
      i_mwskz           = lv_mwskz
      i_waers           = lv_waers
      i_wrbtr           = lv_wrbtr
    IMPORTING
      e_fwste           = lv_fwste
    TABLES
      t_mwdat           = lt_mwdat
    EXCEPTIONS
      bukrs_not_found   = 1
      country_not_found = 2
      mwskz_not_defined = 3
      mwskz_not_valid   = 4
      ktosl_not_found   = 5
      kalsm_not_found   = 6
      parameter_error   = 7
      knumh_not_found   = 8
      kschl_not_found   = 9
      unknown_error     = 10
      account_not_found = 11
      txjcd_not_valid   = 12
      OTHERS            = 13.

13 ноября 2018

Сумма прописью

Используется функциональный модуль SPELL_AMOUNT.

  DATA:
     lv_p1(8) TYPE p VALUE '950',
     ls_words TYPE spell.

  CALL FUNCTION 'SPELL_AMOUNT'
   EXPORTING
      amount          = lv_p1
*     currency        = ' '
*     filler          = ' '
      language        = 'R'
    IMPORTING
      in_words        = ls_words
    EXCEPTIONS
      not_found       = 1
      too_large       = 2
      OTHERS          = 3.

  IF sy-subrc EQ 0.
    " ls_words-word содержит сумму прописью
  ENDIF.

26 сентября 2018

Popup окно с выбором значения в виде таблицы ALV

Есть два (а может и больше) ФМа SRM_SELECTION_POPUP_WITH_ALV и REUSE_ALV_POPUP_TO_SELECT.

  DATA:
    lt_tab           TYPE TABLE OF rbkp_key,

    lv_selected_line TYPE i,
    lv_canceled      TYPE srmboolean,

    ls_selfield      TYPE slis_selfield,
    lv_exit.

  SELECT *
    FROM rbkp
    INTO CORRESPONDING FIELDS OF TABLE lt_tab
    WHERE bldat BETWEEN '20180901' AND '20181231'.

  CALL FUNCTION 'SRM_SELECTION_POPUP_WITH_ALV'
    EXPORTING
      im_title            = 'Title'
      im_tabname          = 'RBKP_KEY'
      im_startx           = 5
      im_stopx            = 100
      im_starty           = 1
      im_stopy            = 10
    IMPORTING
      ex_selected_line    = lv_selected_line
      ex_canceled_by_user = lv_canceled
    CHANGING
      lt_outtab           = lt_tab.

  " Or

  CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
    EXPORTING
      i_title                       = 'Это заголовок'
*     i_selection                   = 'X'
*     i_allow_no_selection          =
      i_zebra                       = 'X'
*     i_screen_start_column         = 0
*     i_screen_start_line           = 0
*     i_screen_end_column           = 0
*     i_screen_end_line             = 0
*     i_checkbox_fieldname          =
*     i_linemark_fieldname          =
*     i_scroll_to_sel_line          = 'X'
      i_tabname                     = '1'
      i_structure_name              = 'RBKP_KEY'
*     it_fieldcat                   =
*     it_excluding                  =
*     i_callback_program            =
*     i_callback_user_command       =
*     is_private                    =
    IMPORTING
      es_selfield                   = ls_selfield
      e_exit                        = lv_exit
    TABLES
      t_outtab                      = lt_tab
    EXCEPTIONS
      program_error                 = 1
      OTHERS                        = 2.

25 сентября 2018

Добавить ZZ-поле в отчет FBL1N

1. Добавить поле в структуры RFPOS (RFPOSX) через append-структуру.
2. Запустить программу RFPOSXEXTEND, чтобы сгенерировать необходимые структуры.
3. Для заполнения поля использовать BTE 00001650 "LINE ITEM DISPLAY: Add to Data per Line" (P/S Module) или BAdI "FI_ITEMS_CH_DATA".

27 августа 2018

Скрыть/показать элемент в PDF-формуляре

Скрыть/показать элемент в PDF-формуляре в зависимости от условия, пример кода (initialize, FormCalc, client):

if ($record.STRUCT_NAME.FIELD_NAME == "X") then
  $.presence = "hidden"
endif

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 содержит значения домена