четверг, 28 марта 2013 г.

Экстракция и оптимизация

Всегда поражает, что единажды написанное в примерах SAP применяется прямо и перпердикулярно.  Как пример, обработка C_T_DATA[] в расширении экстрактора.


Обычная картинка:

DATA:

  L_T_DATA type STANDARD TABLE OF mc11va0hdr.

FIELD-SYMBOLS:
  <L_S_DATA> TYPE mc11va0hdr.

L_T_DATA[] = C_T_DATA[].

LOOP AT L_T_DATA ASSIGNING <L_S_DATA>.

ENDLOOP.
C_T_DATA[] = L_T_DATA[].


При этом кроме цикла ничего нету...
Вопрос - зачем терять время и память на операции присвоения.


Да, структура C_T_DATA типа неизвестна...
Но есть же вариант проще

FIELD-SYMBOLS:
  <L_S_DATA> TYPE mc11va0hdr.

LOOP AT С_T_DATA ASSIGNING <L_S_DATA>.
ENDLOOP.

Надо знать структуру, потому что ....
Пожалуйста...
TYPES:
  LT_DATA type table of mc11va0hdr.

FIELD-SYMBOLS:
  <LT_DATA>  TYPE LT_DATA,
  <L_S_DATA> TYPE LINE OF LT_DATA.

ASSIGN C_T_DATA TO <LT_DATA>.
LOOP <LT_DATA> AT ASSIGNING <L_S_DATA>.
ENDLOOP.

Цифры:
  Было 22 сек стало 18 сек на 8000 записей
  Было 41 минут, стало 11 на 1 900 000 записях

четверг, 14 марта 2013 г.

Кнопки в Bex

Временами переставали работать кнопки в Bex. Стал разбираться... порадовал "суперкод" определения где что показывать\гасить.

Public Sub AdjustButtons()

On Error Resume Next
Dim lsheet As Worksheet
' Adjust Filter Button
If pFilterVisible Then
  For Each lsheet In ThisWorkbook.Sheets()
    If lsheet.Range("C14").Value = "Filter" Then
....
'Adjust InfoButton

If pFilterVisible Then
  For Each lsheet In ThisWorkbook.Sheets()
    If lsheet.Range("F5").Value = "Information" Then

Соответственно появление фразы Filter в ячейке C14 и Informationd F5 востанавливало работу кпопок.

Классы сообщений

Тексты в классах сообщений находяться в таблице T100. Очень удобно :)

Есть ещё таблицы

T100A Message IDs for T100
T100C Message Control by User
T100O Assignment of message to object
T100S Configurable system messages
T100SA Application Areas for Configurable Messages
T100T Table T100A text
T100U Last person to change messages
T100V Assignment of messages to tables/views
T100W Assign Messages to Workflow
T100X Error Messages: Supplements
T100ARBGB Application Area

класс R9O - сообщения похожие на Bex, но на самом деле х.з.

вторник, 5 марта 2013 г.

APPEND:

Встретил тут в коде удобный APPEND

DATA: r_typ_x TYPE RANGE OF typ_x.


APPEND:              
                'IEQ10' TO r_typ_x,  "Условие А
                'IEQ12' TO r_typ_x.  "Условие Б


append |ILE{ p_par }| to s_par[].
append |IGT{ p_par }| to k_par[].
append |IEQ00000000| to d_par[].
append |IEQ{ zcl_utils=>get_type( ) } | to lr_type.

7.4
lt_AGGA  TYPE TABLE OF abap_compname WITH EMPTY KEY. " table of  fields

  lt_AGGA  = VALUE #( ( 'Field1' ) ( 'Field2' ) ( 'Field3') ).


LOOP AT lt_AGGA ASSIGNING FIELD-SYMBOL().
              ASSIGN COMPONENT OF STRUCTURE TO .

TABLE_LINE


DATA itab TYPE RANGE OF i.
itab = VALUE #( sign = ‘I’  option = ‘BT’ ( low = 1  high = 10 )
                                          ( low = 21 high = 30 )
                                          ( low = 41 high = 50 )
                            option = ‘GE’ ( low = 61 )  ).

  lr_customer = VALUE #(
  FOR <ls_customer> IN lt_customer
  ( sign = 'I'
    option = 'EQ'
    low = )
  ).


DATA:  lr_L_Port type range of /BIC/OIZL_PORT.

    lr_L_Port = VALUE #(
      FOR <ls_t_var_range> IN i_t_var_range
        WHERE ( vnam = 'D_ZL_PORT_CEOO01' )
     ( sign   = -SIGN
       option = -OPT
       low    = -LOW
       high   = -HIGH

     ) ).

CONCATENATE LINES OF lt_sales_order INTO l_logtmp separated by ';'.

* Select fields
DATA:
    ls_view TYPE ZVTETATET,
    lo_struct TYPE REF TO cl_abap_structdescr,

    lt_fields TYPE STANDARD TABLE OF FIELDNAME.

"get list of fields
    lo_struct ?= cl_abap_typedescr=>describe_by_data( ls_view ).
    lt_fields = VALUE #(
      FOR <ls_comp> IN lo_struct->get_components( )

         ( |V~{ -name },| ) ).
...

понедельник, 4 марта 2013 г.

Тех.контект

В рамках борьбы с саботажем, активировали тех.контент. В принципе все ок, за исключение одного при первой загрузке информации по цепочкам (экстрактор 0TCT_DS21) теряли 4 часа. Переписка с SAP. Ноты. Непомогло... но при этом получили "забавный" workaround.

В таблице RSDDSTATEXTRACT по источнику храниться timestamp для выборки данных (для источника 0TCT_DS21 из таблицы RSPCPROCESSLOG). Был выяснен  интересный факт, что при загрузке данных с ограничениями в пакете, timestamp не правильно формировался. + не правильно формируется дельта при инициализации с переносом.

действия:

1. Снять ограничения с пакетов (мы не хотели грузить старые).
2. Прогрузить инициализацию без переноса
3. Прогрузить дельту - и вот тут в 1й дельте приходят все данные
4. Дальнейшие дельты идут корректно