среда, 16 декабря 2015 г.

Мы хотим ALPHA в живой справочник!

se16 -> RSDCHABAS -> фильтруем инфообъекты

Выделяем строки, редактирование -> CONVEXIT = 'ALPHA', LOWERCASE = 'X' -> сохранить -> перенос записей

Делаем перенос содержимого данной таблицы.

Далее, формируем запрос с активацией нужного инфо-объекта и всеми трансформациями, в которые он включен (иначе в трансформациях не обновится код обработки ALPHA).

Переносим всё это дело и идём дальше, искать другие косяки.

вторник, 15 декабря 2015 г.

Активировать инфо-объект

t-code SE37
BAPI_IOBJ_ACTIVATE_MULTIPLE

Добавление записей переноса с удалением объектов

Допустим, перенесли объект в ошибочной версии, и необходимо его удалить в целевой системе, но при этом оставить в исходной.
На конкретном примере: изменили тип инфообъекта с CHA на KYF. При переносе падаем в дамп с ошибкой класса CL_RSD_KYF (т.к. в цели наш объект является признаком). Необходимо удалить объект как признак, перенести и добавить как показатель.
  1. Добавляем запись переноса с удалением:
  •      Блокируем инфообъект в запрос: “rsa1 → инфообъект → дополнительная информация → записать запрос на перенос” или “se10 → изменить запрос → вставить строку R3TR<tab>IOBJ<tab><iobjname>”

  • Изменяем тип операции на удаление: se16 → E071 → TRKORR = <номер запроса>, OBJECT = ‘IOBJ’, OBJNAME = <имя объекта> → F8. Выделяем нужные строки, через /h переходим в режим редактирования и изменяем значение поля OBJFUNC = ‘D’.


  • Открываем запрос в se10 – нужные объекты помечены на удаление при переносе


  1. 2.    Чтобы перенос прошел успешно, необходимо, чтобы инфообъект переносился тем же типом, что и на целевой системе (иначе опять дамп). Для этого:
  •      Изменяем тип инфообъекта на признак: se16 → RSDIOBJ IOBJNM = <имя инфообъекта>, OBJVERS = ‘A’ (переносится активная) → F8. Выделяем необходимые строки, открываем на редактирование, изменяем тип на CHA (в целевой системе инфообъект – «признак»). Сохранить.



  1. 3.    Деблокируем наш запрос. Первое деблокирование происходит с ошибкой: «Инфо-объект ZTAREW является новым - сначала активируйте.» Повторно запускаем деблокирование, все проходит ок. Переносим на целевую систему. Перенос проходит с корректным типом инфообъекта, объект удаляется в цели.


  1. 4.    Изменяем тип инфообъекта обратно на корректный (см. п. 2, тип KYF в данном случае).



пятница, 11 декабря 2015 г.

Нарезка xml-файла по нодам

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:saxon="http://icl.com/saxon"
    extension-element-prefixes ="saxon"
    exclude-result-prefixes ="xs"
    version ="1.0">
   
<xsl:template match="*" >
       
<xsl:for-each select="/lcdata/*" >
           
<saxon:output href ="C:\Temp\LC_Splitted\{name(.)}.xml">
               
<lcdata>
                   
<xsl:for-each select ="../@*">
                       
<xsl:attribute name= "{name(.)}">
                           
<xsl:value-of select= "."/>
                       
</xsl:attribute>
                   
</xsl:for-each>
                   
<xsl:copy-of select ="current()"/>
               
</lcdata>
           
</saxon:output>
       
</xsl:for-each>
   
</xsl:template>

</xsl:stylesheet>

вторник, 3 ноября 2015 г.

Обработка даты

    DATA:
      l_date
TYPE d,
      l_tmp 
TYPE string.

    l_tmp
= source_fields-laeda .
   
CONDENSE l_tmp NO- GAPS.
   
IF strlen ( l_tmp ) >= 8.
      l_date
= substring( val = l_tmp off = 0 len = 8 ).
   
ENDIF .

   
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
     
EXPORTING
       
date = l_date.

   
IF sy- subrc NE 0 .
      l_date
= '00000000'.
   
ENDIF .
    result = l_date.

понедельник, 19 октября 2015 г.

The ASSERT condition was violated.

Мы уже знаем, что переносить структуру инфо-областей для цепочек нужно таблицей.

Хотели так же перенести структуру областей инфо-провайдеров, таблица - RSDAREA. Как оказалось - зря. Видимо, кто-то из коллег делал изменения в своей ветке инфо-области, в перенос эти изменения не включил... В итоге - дам при попытке зайти в RSA1->инфопровайдеры.

Пересобрали все инфо-области через связь с переносом.

пятница, 16 октября 2015 г.

Сообщение об ошибке при загрузке трансформации

Код для сбора ошибки:

    data :
      l_error 
type abap_bool value abap_false , 
      l_error_text 
like table of monitor_rec -msgv1 initial size 4,
      l_error_str type string .

        l_error_text value # ( 
          
|Не заполнен Материал ) 
          
|BAL_ACC { SOURCE_FIELDS - BAL_ACC }| ) 
        
). 

        monitor_rec 
value #( 
          msgid 
'RSRMON' 
          msgty 
'E' 
          msgno 
'000' 
          msgv1 
l_error_text[ ]
          msgv2 
l_error_text[ ]
        
). 
        
append monitor_rec to MONITOR . 
*        call function 'SOTR_SERV_TABLE_TO_STRING' 
*          importing 
*            text                      = l_error_str 
*          tables 
*            text_tab                  = l_error_text 
*        . 
*        write / l_error_str.
        l_error abap_true .

    if l_error abap_true .
      
"Обнаружены ошибки в данных. 
      
raise exception type CX_RSROUT_SKIP_RECORD .
    endif .

Включаем обработчик в dtp:

вторник, 13 октября 2015 г.

Виртуальный показатель и BEx'ы

Всё хорошо и быстро настроили, но BEx начал капризничать:

Системная ошибка в программе CL_RSR_RRK0_QUERY_RT_FACTORY и FORM FILL_CEL_MEM-03


Оказывается, для десятичных чисел с расширенной точностью, BEx'у нужна нота:
https://websmp130.sap-ag.de/sap(bD1ydSZjPTAwMQ==)/bc/bsp/sno/ui_entry/entry.htm?param=69765F6D6F64653D3030312669765F7361706E6F7465735F6E756D6265723D3232323538303626

четверг, 1 октября 2015 г.

Подсветка синтаксиса ABAP в Blogger

Наконец-то нашёл способ, как не терять подсветку синтаксиса - нужно копировать код через Evernote!

Правда теперь нужно весь блог отредактировать...

среда, 30 сентября 2015 г.

Сообщение в монитор загрузки

        l_error_text value #(
          |Не заполнен Материал)
          |BAL_ACC { SOURCE_FIELDS-BAL_ACC }| )
        ).

        monitor_rec value #(
          msgid 'RSRMON'
          msgty 'E'
          msgno '000'
          msgv1 l_error_text[ ]
          msgv2 l_error_text[ ]
        ).
        append monitor_rec to MONITOR.

или
 DATA(l_error_text|Повторная загрузкаCalday {
                              <fs_rez>-calday+6(2)
                              }.{
                              <fs_rez>-calday+4(2)
                              }.{
                              <fs_rez>-calday(4)
                              }|.
        APPEND VALUE #(
          msgid 'RSRMON'
          msgty 'E'
          msgno '000'
          msgv1 l_error_text
        TO monitor.


*******

    if l_error abap_true.
      "Обнаружены ошибки в данных.
      raise exception type CX_RSROUT_SKIP_RECORD.


или 

RAISE EXCEPTION TYPE cx_rsrout_abort.
    endif.

понедельник, 28 сентября 2015 г.

Разные длины полей для FOR ALL ENTRIES IN

Оказывается, ошибку про разные длины полей можно обойти так:

    SELECT /bic/zref
           /bic/zmateria
           /bic/zunit
      FROM /bic/azlcdocl00
      INTO TABLE gt_unit
       FOR ALL ENTRIES IN source_package
     WHERE /bic/zref EQ source_package-/bic/snz
       AND /bic/zmateria EQ source_package-/bic/snomen+0(18).

среда, 2 сентября 2015 г.

Сюрприз от WEB-сервиса

Полезли к заказчику забирать файлы, а там ссылка на общий сайт, а на нём кнопки лайков от социальных сетей...

Как загрузить\выгрузить программу\ФМ\класс из системы (SAPLink)

Очень интересный способ переноса разработок между системами.

Как всегда, на всякий случай дублирую:

Skip to end of metadata
Go to start of metadata

Install

Known ABAP basis versions compatible with SAPlink include:
  • 6.20
  • 6.40(NetWeaver 2004)
  • 7.0 (NetWeaver 2004s)
  • 7.4

Initial

  1. Download the latest version of the SAPlink installer zip file from the SAPlink Project page which contains the following files:
    • SAPlink_installer.txt - hopefully the last program you will ever have to copy and paste
    • NUGG_SAPLINK.nugg - nugget containing necessary objects to install
  2. Extract contents of the SAPlink installer zip file
  3. Copy, paste, save, and activate the contents of the SAPlink_installer.txt file into a new program ZSAPLINK_INSTALLER onto the target SAP system
  4. Execute newly activated program ZSAPLINK_INSTALLER
  5. Use the extracted file NUGG_SAPLINK_INSTALL.nugg for the selection parameter "Installation Nugget"
    WARNING: Using checkbox "Overwrite Originals", will overwrite any existing version of the SAPlink objects that were previously installed onto the system.  Only use when reinstalling or installing a major release where a brand new install is required. Otherwise, follow the normal procedures for upgrade below.
  6. Execute
  7. To avoid an error that the implementation of an abstract class does not exist please run the installation a second time.
  8. Newly installed objects need to be activated manually, as all objects are installed as local and inactive
    1. Run transaction code SE38
    2. On initial screen of SE38, enter program name ZSAPLINK into selection parameter "Program" and hit activate command to show worklist
    3. On worklist screen, select "Whole Worklist" button on bottom to show all inactive objects in your worklist IMPORTANT NOTE: You must click the button labeled "Whole Worklist" to show and select all SAPlink related objects. There are multiple objects that are imported during the initial install and must all be activated for SAPlink to run properly
    4. Select all newly installed SAPlink related objects (ZSAPLINK) and activate
    5. Once activation for all objects is complete, SAPlink can be executed via program ZSAPLINK

среда, 26 августа 2015 г.

Добавить пользовательскую формулу в редактор формул в трансформациях

Взято отсюда, но на всякий случай, продублирую:

4. Step-By-Step Procedure

The guide starts you off by creating a BAdi implementation. This implementation will generate a class which we will use to store our custom functions (implemented as methods) in. When the custom methods are written and activated, we can then reference them in our BAdi implementation. Once linked, we will have them available in the Process Type 'Decision' in Process chain maintenance.

 For this example, we will use TVARVC table entry which will decide what process flow/steps executed in Process chain.

среда, 12 августа 2015 г.

среда, 22 июля 2015 г.

XML-парсер

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

В BW есть встроенный инструмент, "Редактор трансформаций", транзакция STRANS, с ним и будем работать.

https://www.dropbox.com/s/oa1r6bc0xmffo0a/PROG%20%28XML%20from%20WEB-server%29.docx?dl=0

После переноса цепочки, появляются "Неизвестные задания"

Вылечили такой программой:
report z_jobs_wo_variant.

data:
  lt_jobs type table of tbtcp,
  lt_valtab type table of rsparams.

field-symbols:
  <lfs_job> like line of lt_jobs.

parametersp_delete type abap_bool.

select
    j~progname
    j~variant
    j~jobcount
    j~jobname
from tbtcp as j
  join tbtco as js
    on j~jobname js~jobname
      and j~jobcount js~jobcount
      and js~status 'S'
  into corresponding fields of table @lt_jobs
where progname 'RSPROCESS'.

loop at lt_jobs
  assigning <lfs_job>.

  call function 'RS_VARIANT_CONTENTS'
    exporting
      report <lfs_job>-progname
      variant <lfs_job>-variant
      execute_direct 'X'
    tables
      valutab lt_valtab
    exceptions
      others 1.

  if sy-subrc <> 0.
    write/ <lfs_job>-jobname<lfs_job>-jobcount.

    if p_delete abap_true.
      call function 'BP_JOB_DELETE'
        exporting
          jobcount <lfs_job>-jobcount
          jobname  <lfs_job>-jobname
        exceptions
          others   1.

      if sy-subrc <> 0.
        write 'not deleted'.
      else.
        write 'successfully deleted'.
      endif.
    endif.
  endif.

endloop.

NW 7.4 не работал стек ошибок DTP

Одна из переменных (Error_stack) не заполнялась, помогла нота  2037459

пятница, 3 июля 2015 г.

Если большая таблица партицирована

Если большая таблица партицирована.
Партиции закрыты для записи, только чтение.

Поэтому: 1) Табл.спейс надо открывать
2) При добавлении признака SAP заполняет его пробелом, это доло.





----  Открываем партиции активной таблицы DSO для изменения
alter tablespace WAY_OSTATKI_2008 read write;
alter tablespace WAY_OSTATKI_2009 read write;
alter tablespace WAY_OSTATKI_2010 read write;
alter tablespace WAY_OSTATKI_2011 read write;
alter tablespace WAY_OSTATKI_2012 read write;
alter tablespace WAY_OSTATKI_2013 read write;
alter tablespace WAY_OSTATKI_2014 read write;
alter tablespace WAY_OSTATKI_2015 read write;
alter tablespace WAY_OSTATKI_2016 read write;
alter tablespace WAY_OSTATKI_2017 read write;
alter tablespace WAY_OSTATKI_2018 read write;
alter tablespace WAY_OSTATKI_2019 read write;

---- Создаем копию активной таблицы и переносим индексы на новую таблицу
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00"   RENAME TO "/BIC/ANORSTWAY00_SAV";

ALTER INDEX SAPSR3."/BIC/ANORSTWAY00~0" RENAME TO "/BIC/ANORSTWAY00~0_";
ALTER INDEX SAPSR3."/BIC/ANORSTWAY0001" RENAME TO "/BIC/ANORSTWAY0001_";
ALTER INDEX SAPSR3."/BIC/ANORSTWAY0002" RENAME TO "/BIC/ANORSTWAY0002_";
ALTER INDEX SAPSR3."/BIC/ANORSTWAY0003" RENAME TO "/BIC/ANORSTWAY0003_";


---- Запускаем транспорт в системе KH2

---- Добавляем поле NCPASOO во временную таблицу
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" ADD "/BIC/NCNETTUR" VARCHAR2(9) NULL ;
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" MODIFY ("/BIC/NCNETTUR" DEFAULT ' ' );

---- Добавляем поле NCPASOO во временную таблицу
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" ADD "/BIC/NCSIMV102" VARCHAR2(75) NULL ;
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" MODIFY ("/BIC/NCSIMV102" DEFAULT ' ' );

---- Добавляем поле NCPASOO во временную таблицу
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" ADD "/BIC/NCREPAYM" VARCHAR2(18) NULL ;
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" MODIFY ("/BIC/NCREPAYM" DEFAULT ' ' );

---- Добавляем поле NCPASOO во временную таблицу
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" ADD "/BIC/NCDEDT" VARCHAR2(18) NULL ;
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" MODIFY ("/BIC/NCDEDT" DEFAULT ' ' );


---- Удаляем активную таблицу DSO
drop table SAPSR3."/BIC/ANORSTWAY00";

---- Переименовывем временную таблицу в активную таблицу DSO + индексы
ALTER TABLE SAPSR3."/BIC/ANORSTWAY00_SAV" RENAME TO "/BIC/ANORSTWAY00";

ALTER INDEX SAPSR3."/BIC/ANORSTWAY0001_"  RENAME TO "/BIC/ANORSTWAY0001";
ALTER INDEX SAPSR3."/BIC/ANORSTWAY0002_"  RENAME TO "/BIC/ANORSTWAY0002";
ALTER INDEX SAPSR3."/BIC/ANORSTWAY0003_"  RENAME TO "/BIC/ANORSTWAY0003";
ALTER INDEX SAPSR3."/BIC/ANORSTWAY00~0_"  RENAME TO "/BIC/ANORSTWAY00~0";

---- Копируем данные в активную таблицу DSO
select * from SAPSR3."/BIC/ANORSTWAY00";



---- Закрываем партиции активной таблицы DSO на изменение
alter tablespace WAY_OSTATKI_2008 read only;
alter tablespace WAY_OSTATKI_2009 read only;
alter tablespace WAY_OSTATKI_2010 read only;
alter tablespace WAY_OSTATKI_2011 read only;
alter tablespace WAY_OSTATKI_2012 read only;
alter tablespace WAY_OSTATKI_2013 read only;
alter tablespace WAY_OSTATKI_2014 read only;
alter tablespace WAY_OSTATKI_2015 read only;
alter tablespace WAY_OSTATKI_2016 read only;
alter tablespace WAY_OSTATKI_2017 read only;
alter tablespace WAY_OSTATKI_2018 read only;

alter tablespace WAY_OSTATKI_2019 read only;

среда, 3 июня 2015 г.

Как мы сделали дельту сами

Исходная система не выдаёт нормальную дельты.
Но в таблицах есть поле даты, показывающее, когда были сделаны изменения.

Поехали.

понедельник, 1 июня 2015 г.

Поиск использования Основных данных в хранилищах

*&---------------------------------------------------------------------*
*& Report  ZNN_MD_USAGE
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT znn_md_usage.

TYPE-POOLS:
  rsddv
,
  rsd
.

TABLES:
  dd02l
.

DATA:
  l_valtable        
TYPE dd02l-tabname,
  l_obj_sid         
TYPE i,
  l_iobjnm          
TYPE rsd_iobjnm,
  lt_outl_sid       
TYPE rrsi_t_sid,
  lt_outl_sid_used  
TYPE rsr_th_sid,

  lt_ulist_sid      
TYPE rsddv_t_ulist_sid,
  lt_ulist_dim      
TYPE rsddv_t_ulist_dim,
  lt_ulist_mdata    
TYPE rsddv_t_ulist_mdata,
  lt_ulist_atr      
TYPE rsddv_t_ulist_atr,
  lt_ulist_atr_nav  
TYPE rsddv_t_ulist_atr,
  lt_ulist_cmp      
TYPE rsddv_t_ulist_cmp,
  lt_ulist_hie      
TYPE rsddv_t_ulist_hie,
  lt_ulist_hie_node 
TYPE rsddv_t_ulist_hie_node,
  lt_ulist_query    
TYPE rsddv_t_ulist_query,
  lt_ulist_odso     
TYPE rsddv_t_ulist_odso,

  gc_alv_table      
TYPE REF TO cl_salv_table,
  gc_columns        
TYPE REF TO cl_salv_columns_table,
  gc_colwork        
TYPE REF TO cl_salv_column_table,
  tab_name          
TYPE lvc_title.

FIELD-SYMBOLS:
  <so_val>           
TYPE rrrange,
  <lt_ulist_dim>     
LIKE LINE OF lt_ulist_dim,
  <lt_ulist_atr_nav> 
LIKE LINE OF lt_ulist_atr_nav,
  <lt_ulist_odso>    
LIKE LINE OF lt_ulist_odso.
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS:
  l_iobj 
TYPE rsdiobjv-iobjnm OBLIGATORY" rsd_iobjnm.
SELECTION-SCREEN END OF BLOCK b1.

l_valtable 
'/BIC/S' && l_iobj.   " модный in-line

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002.
SELECT-OPTIONS:
  lt_val 
FOR (l_valtableNO INTERVALS.
SELECTION-SCREEN END OF BLOCK b2.
*&---------------------------------------------------------------------*