Maintenance Optimizer всё, да здравствует Maintenance Planner



С 09.01.2017 г. Maintenance Optimizer для генерации стека для обновления SAP-систем больше не используется об этом гласит новость в окне самой транзакции.


На смену этому инструменту пришел более новый - Maintenance Planner.


Все подробности по использованию нового инструмента, мастер гайды и прочая документация тут - Maintenance Tools: Maintenance Planner and Maintenance Optimizer.


Explore Systems

Что фактически поменялось (по первым ощущениям):
  • ранее список компонентов для каждой системы хранился внутри вашего Solution Managera, теперь этот список надо выгружать в Облако SAPа.
  • По первым ощущениям калькуляция стека происходит также, как и раньше, только в Облаке. Этапы абсолютно те же.
  • В конце, когда стек скалькулирован, то можно сохранить список в Excel, в XML, распечатать отчет: кто инициировал обновление, какая текущая версия SP, какая целевая версия SP. 

Explore System Tracks

Еще не пробовал, но судя по описанию в мастер гайде, это утилита для обновления цепочками нескольких систем с одинаковыми версиями компонентов. Эффективна в случаях, когда вы последовательно обновляете DEV-> QA -> PRD.

Transaktions

Утилита для управления записями о проводимых действиях (у меня тут пока хранятся записи о том, что я сгенерировал стек и планирую выполнить обновление одной из систем).

Пока всё, но по мере знакомства с инструментом, возможно обновление статьи.

Удаление старого табличного пространства после обновления системы с помощью SUM

Написал данную заметку для внутренней корпоративной Wiki, но решил поделиться и в своем блоге немного изменив подачу материала, считаю, что моим читателям будет интересно.



Руководство по обновлению систем SAP с помощью утилиты SUM говорит, что после обновления системы старое табличное пространство можно удалить. НО, если вы обновляли систему с помощью SUM впервые, то вас может ожидать не очень приятная новость - табличное пространство вы удалите, но получите ошибку о том, что удалить физические файлы невозможно (точно не помню, но то ли потому что они используются БД, то ли brspace ждет какой-то команды  от Oracla и ее не получает).

Казалось бы, ничего страшного, подумал я и вырубив систему и БД - переименовал физические файлы, чтобы их удалить в дальнейшем, если эксперимент завершится удачно. Запустил базу и систему, они запустились - я обрадовался. Но рано...

При входе в систему посыпались дампы с указанием на таблицу TTREE. Поиск нот привел к 1819182 - Tables (TTREE*) remain in old exchange tablespace. Оказалось, что я не переместил важные таблицы, которые остались в старом табличном пространстве. Заглядываю в SE14, вижу, что таблица не существует в БД. Активирую эту таблицу и несколько следующих через SE11, перезахожу в систему - все работает. Но опять рано радоваться...

При более детальном изучении оказалось, что пропало стандартное SAP меню. Пытаюсь "нагуглить" ответ - подходящего ответа нет, нот тоже, поддержка молчит - на дворе 6-е января ж :)

Понимаю, что основной моей ошибкой было то, что я не проверил табличное пространство на заполненность. Решаю исправиться. Системный администратор (не SAP) восстанавливает виртуалку с SAP-системой из бекапа. И тут я сталкиваюсь с другой оказией, не стартует система.

Начинаю разбираться. Восстанавливаю часть файлов, система запускается.

Теперь я уже научен, и приступаю к нормальному удалению табличного пространства.

1. Иду в DB02, жму Обновить и проверяю, что табличное пространство пустое.

2. После этого из командной строки подключаюсь к БД и проверяю сколько объектов осталось в табличном пространстве.
  • SQL> select count(*) from dba_segments where tablespace_name = "PSAPSR3702";
если count не равен 0, то
  • SQL> select owner, segment_name, segment_type from dba_segments where tablespace_name = '<tablespace_name>';
Получаю список таблиц, он почти идентичен тому, который упоминается в ноте 1819182.

3. Дальше используя ноту 646681 - Reorganization of tables with BRSPACE и перемещаю все таблицы с помощью команды:
  • brspace -u / -f tbreorg -s "PSAPSR3702" -t "*" -n "PSAPSR3702X"
4.  Выполняю пункт 2 еще раз и проверяю, что табличное пространство действительно пусто.

5. Удаляю табличное пространство с помощью команды:
  • brspace -u / -f tsdrop -t "PSAPSR3702"
У меня удалились почти все файлы, которые должны были удалиться. Часть из них не удалилось по причине отсутствия прав и доступа (почему то). Я думаю, что лучше выполнять удаление при выключенной системе и БД, в дальнейшем я остановил систему, переименовал оставшиеся файлы в директории на диске, запустил систему - система стартовала успешно. Переименованные файлы удалил.

Ссылки:
  1. 1819182 - Tables (TTREE*) remain in old exchange tablespace
  2. 646681 - Reorganization of tables with BRSPACE 
  3. Housekeeping Unused or Old Tablespace

Подключение к внешней БД на языке ABAP

В проекте потребовалось использовать подключение к внешней базе данных расположенной в сети предприятия, в качестве СУБД используется MS SQL. Далее опишу достаточно простое решение, которое легло в основу решения. Пример будет весьма примитивным :)

Предпосылки

  1. На сервере приложений должно быть установлено ПО Microsoft SQL Server 2008 R2 Native Client (версия зависит от версии СУБД).
  2. В папке согласно параметру DIR_CT_RUN должна присутствовать библиотека dbmssslib.dll.
Подробнее требования описаны в ноте 1774329

Последовательность


1. Настройка соединения с БД
Соединение настраивается с помощью транзакции DBCO. Ниже приведен скриншот:



Ведение своих глобальных параметров БЕ в SAP ERP

Все знают, что глобальные настройки БЕ в SAP ведутся в настройке:


Но мало кто знает, что перечень настраиваемых параметров можно расширять для собственных нужд, причем все параметры будут доступны в настройке стандартно.

Для перехода к окну ведения параметров нужно в настройке выбрать вашу БЕ, далее нажать кнопку "ДопДанные". Стандартный экран ведения дополнительных данных выглядит следующим образом.


Перемещение между страницами параметров осуществляется с помощью кнопок "PageUp" и "PageDown".
Чтобы добавить в перечень свои параметры необходимо с помощью транзакции SM31 осуществить ведение ракурса V_T001I.

Способы поиска User Exit's и BADi's по коду транзакции

Дорогие друзья, сегодня будет пост-перевод, который, думаю будет полезен не только каждому новичку, но пригодится и тем, кто достаточно давно работает с ERP.

В данном посте будут описано несколько способов по поиску BADI и User-Exits (UE) для нужного кода транзакции. Поскольку цель документа - объяснить способы поиска, я не буду тратить время на то, чтобы описывать функциональность того или иного метода.

Для того, чтобы объяснить вам я взял для примера транзакцию "MM01 - Создание основной записи материала". Пожалуйста, выполните следующие шаги, чтобы знать различные способы поиска UE и BADI.

Метод №1
  • Введите в окно ввода транзакций код транзакции для которой вы ищете UE и нажмите на Enter для перехода к экрану ввода.
  • В системном меню перейдите по пути 'Система' -> 'Статус' как показано на рисунке ниже.
Рис. 1

Отчет по сбытовым фактурам

В статье ERP- как система управления я писал о функциях планирования и контроля, отчет по сбытовым фактурам и актам, который был мною разработан в январе, как раз иллюстрирует подход, которого я стараюсь придерживаться при внедрении системы SAP.

Рис. 1 - Экран выбора

Краткая инструкция по установке ядра SAP KERNEL 7.21



Ноты:

1 . Скачиваем пакет с установочными файлами ядра 51049977_6, в нем находим папки:
\51049977_6\Krnl_7.21_WIN__IA32__IA64__x64__SP09_\DATA_UNITS\K_721_U_WINDOWS_X86_64\DBINDEP
\51049977_6\Krnl_7.21_WIN__IA32__IA64__x64__SP09_\DATA_UNITS\K_721_U_WINDOWS_X86_64\ORA
Выбранные пакеты распаковываем в новую папку <new_kernel>.
2. Далее следуем ноте 1713986 (начиная с раздела 5.2) выполняем установку.
3. Стартовали систему, проверили, что все работает. Остановили систему.
4. Ставим патчи на ядро:
  • 4.1 Сначала ставим те, что не зависят от ядра: https://support.sap.com/software/patches.html -> Browse Download Catalog -> Additional Components -> SAP Kernel -> SAP KERNEL 64-BIT UNICODE -> SAP KERNEL 7.21 64-BIT UNICODE -> Windows on x64 64bit -> #Database independent
  • 4.2 Ставим те, которые соответствуют нашей БД Oracle: https://support.sap.com/software/patches.html -> Browse Download Catalog -> Additional Components -> SAP Kernel -> SAP KERNEL 64-BIT UNICODE -> SAP KERNEL 7.21 64-BIT UNICODE -> Windows on x64 64bit -> ORACLE
5. Стартуем систему проверяем, система работает.

Перечень выходных документов при внедрении SAP ERP

Данная тема не актуальна для консалтинговых компаний, так как там с этим все понятно, ну а если вы руководите внутренним проектом внедрения/перевнедрения/развития системы, то думаю, что сегодняшний обзор вам понравится.



Изначально хотели сделать список только тех документов, которые необходимы для внутренних проектов, но останавливаться не стали - решили сделать список всех возможных, чтобы можно было выбрать нужный по необходимости.

ERP - как система управления

Сегодня пост будет посвящен не отдельному модулю ERP, а системе, как систему управления в целом. SAP ERP называют системой управления предприятием, но так ли это на самом деле - попробуем порассуждать. Тема очень широкая, поэтому статья будет очень поверхностная и направлена, в первую очередь, на то, чтобы просто дать пищу для размышлений, во-вторую, чтобы зафиксировать свои рассуждения.


В теории система управления строится на понятиях: планирование, организация, мотивация и контроль. Говоря простым языком, чтобы добиться успеха, необходимо спланировать работу, организовать процесс по ее исполнению, мотивировать персонал на достижение результата и проконтролировать выполнение.


Использование трассировки ST05

Итак, пока готовится большой пост по FI, сегодня будет короткий на тему трассировки с помощью транзакции ST05.

ST05 - Трассировка

Если вы разрабатываете технические задания, а вы их непременно разрабатываете, если работаете с SAP, то вы должны уметь искать необходимые таблицы. Зачастую простой вызов F1 по полю ничего не дает, вот тогда один из вариантов это воспользоваться ST05.

Установка SAP Solution Manager 7.1

Подвернулась возможность немного позаниматься базисом, решил воспользоваться. Установил SAP Solution Manager 7.1 на Windows 2008 R2, база Oracle. До этого никогда не сталкивался, но разобрался. Благо есть документация на портале support.sap.com и конечно же на блоге у Вячеслава Шиболова http://sidadm.blogspot.ru/, за что ему отдельное спасибо.


Отмечу моменты, которые необходимо добавить в его инструкции:

  1. На чистую Win2008 R2 перед установкой надо ставить пакет Microsoft Visual С++ 2008.
  2. Если Oracle у вас выше 11-го, то не используйте в паролях символ '@'.
  3. Сразу расширьте файл подкачки до 20гб, и проверьте чтобы оперативной памяти у сервера было хотя бы 6-8Гб.
На этом пока всё, делаем бекап существующей установки и будем обновлять стек.

Подпрограмма для получения отфильтрованной таблицы при работе с cl_salv_table

Есть у меня программа, которая формирует график платежей построенный на Z-таблицах. Решили ее доработать и сделать нормальный выбор записей по кнопке "Выбрать все", если ALV отфильтрован.

Проблема была в том, что если предварительно отфильтровать ALV, а потом нажать выбрать все, то в программе выбирались все записи, включая и те, что не попали под значения фильтра. Стандартного метода у cl_salv_table по получению отфильтрованных значений нет и это немного усложнило задачу.

Свое решение я выкладываю ниже:

DATA: lt_comp_details TYPE abap_compdescr_tab,
        ls_comp_details TYPE abap_compdescr,
        ref_descr TYPE REF TO cl_abap_structdescr,
        lt_output type standard table of ts_sdata_bot,
        lo_cols TYPE REF TO cl_salv_columns,
        lo_cols_tab TYPE salv_t_column_ref,
        lo_col LIKE LINE OF lo_cols_tab,
        lo_filters TYPE REF TO cl_salv_filters,
        lo_filter TYPE REF TO cl_salv_filter,
        lv_filter_val TYPE salv_t_selopt_ref,
        lr_range TYPE RANGE OF char80,
        lv_index type sytabix,
        lo_selopt TYPE REF TO cl_salv_selopt,
        lwa_range LIKE LINE OF lr_range,
        indx      TYPE i.

  TYPES: BEGIN OF ty_filters,
    index type sytabix,
    fname type NAME_KOMP,
    range LIKE lr_range,
  END OF ty_filters.
  DATA: lt_filters TYPE SORTED TABLE OF ty_filters WITH NON-UNIQUE key index,
        ls_filters type ty_filters.

  FIELD-SYMBOLS: <lt_output> like line of  lt_output,
                 <comp> TYPE ANY.


  ref_descr ?= cl_abap_typedescr=>describe_by_name( 'TS_SDATA_BOT' ).
  lt_comp_details[] = ref_descr->components[].
  lt_output[] = gt_sdata_bot[].

  TRY .
* Columns and Filters
    lo_cols = go_grid_bot->get_columns( ).
    lo_cols_tab = lo_cols->get( ).
    lo_filters = go_grid_bot->get_filters( ).

    LOOP AT lt_output ASSIGNING  <lt_output>.
      AT FIRST.
        CLEAR: ls_filters, lt_filters[].
        LOOP AT lt_comp_details INTO ls_comp_details.
          CLEAR: lr_range, lr_range[].
          lv_index = sy-tabix.
          TRY .
* Получаем имя колонки с фильтром
            lo_filter = lo_filters->get_filter( ls_comp_details-name ).
            lv_filter_val = lo_filter->get( ).
            LOOP AT lv_filter_val INTO lo_selopt.
              lwa_range-sign = lo_selopt->get_sign( ).
              lwa_range-option = lo_selopt->get_option( ).
              lwa_range-low = lo_selopt->get_low( ).
              lwa_range-high = lo_selopt->get_high( ).

              ls_filters-fname = ls_comp_details-name.
              ls_filters-index = lv_index.
              APPEND lwa_range to lr_range.
              ls_filters-range = lr_range.
              INSERT ls_filters INTO TABLE lt_filters.
              CLEAR: lwa_range.
            ENDLOOP.
          CATCH cx_salv_not_found.
          ENDTRY.
        ENDLOOP.
      ENDAT.

      LOOP AT lt_filters INTO ls_filters.
        ASSIGN COMPONENT ls_filters-index OF STRUCTURE <lt_output> to <comp>.
        IF <comp> NOT IN ls_filters-range.
          DELETE lt_output.
          EXIT.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
  CATCH CX_SY_REF_IS_INITIAL.

  ENDTRY.
**************************************************************************

  DATA: ls_output LIKE LINE OF lt_output.
  LOOP AT lt_output INTO ls_output.
    LOOP AT gt_sdata_bot INTO gl_sdata_bot
      WHERE ebeln EQ ls_output-ebeln
        AND ebelp EQ ls_output-ebelp
        AND kolvo EQ ls_output-kolvo.
      gl_sdata_bot-sel = 'X'.
      MODIFY gt_sdata_bot INDEX sy-tabix FROM gl_sdata_bot.
    ENDLOOP.
  ENDLOOP.
  go_grid_bot->refresh( refresh_mode = IF_SALV_C_REFRESH=>FULL ).

Основная идея взята отсюда: https://scn.sap.com/message/10767989#10767989

Возврат ранее уплаченного аванса с точки зрения FM

Бывают ситуации когда перечислили деньги поставщику, а услуга не была оказана и поставщик возвращает вам деньги. С точки зрения FI все понятно, провели через банковскую выписку выровняли исходящий платеж с входящим, открытые позиции на счете кредитора при это закрылись и все хорошо. Но что при этом происходит в FM?
Интересно? Тогда об этом и будет сегодняшний пост.

Итак, имеем следующие условия: заключили договор с поставщиком, создали Заказ на поставку, создали Требование авансового платежа, Оплатили (загрузили выписку в систему).

Технические настройки в модуле FM: 350-й профиль обновления, два регистра АКН - 9H и 9I. В АКН участвуют следующие документы: Заказ на поставку, Счет-фактура - БО; ТАП и Платеж - БП.

Итого, после всего ранее проделанного, на момент платежа у нас по бюджетам БО и БП виден расход на сумму Заказа на поставку для БО, Платежа для БП. Т.е. бюджет потреблен.

И тут вдруг происходит какое-то событие, после которого Поставщик не оказывает нам услуги, а возвращает платеж. В данном случае, бухгалтер загрузит выписку и входящий платеж будет проведен с техническими контировками, в отчетах по бюджету по нашей статье мы входящий документ не увидим. И это не ошибка - так работает стандарт. Для того, чтобы все встало на место и финансовые средства вернулись в бюджет именно нашей расходной статьи, а не висели на технической - нужно сделать выравнивание входящего платежа с исходящим.
До выравнивания обратите внимание, какой тип документа имеет Документ УБ для входящего платежа - он должен быть "счет-фактура". Если все так, то проводим выравнивание. Платеж обновит контировки счета-фактуры и вернет денежные средства в бюджет платежей (БП).

Но не забывайте, что в БО у вас тоже денежные средства израсходованы. Чтобы их вернуть идем в Заказ на поставку и на вкладке "Счет-фактура" поднимаем галочку "Последний счет".

После этого проверяем БО и БП - все должно быть ОК.

В одной из следующих статей я попытаюсь раскрыть такие важные моменты, как настройка счетов, финансовых позиций и типов финансовых позиций для того, чтобы вся цепочка работала так, как я описал выше.