пятница, 1 февраля 2019 г.

Арифметические операции с timestamp

DATA:
      lv_time_stamp_sy TYPE timestamp.


CONVERT DATE  sy-datlo TIME sy-timlo INTO TIME STAMP lv_time_stamp_sy TIME ZONE sy-zonlo.

TRY.
    CALL METHOD cl_abap_tstmp=>add
      EXPORTING
        tstmp   = lv_time_stamp_sy
        secs    = -1200  "20minutes
      RECEIVING
        r_tstmp = lv_time_stamp_sy.
  CATCH cx_parameter_invalid_range .
  CATCH cx_parameter_invalid_type .
ENDTRY.

четверг, 24 января 2019 г.

Отправка писем через АБАП

DATA:
      lt_mailsubject    TYPE sodocchgi1,
      lt_mailtxt        TYPE STANDARD TABLE OF soli,
      wa_mailtxt        LIKE LINE OF lt_mailtxt,
      lt_mailrecipients TYPE STANDARD TABLE OF somlrec90,
      wa_mailrecipients LIKE LINE OF lt_mailrecipients.
*"----------------------------------------------------------------------
lt_mailsubject-obj_name     = `Audit Check`.
lt_mailsubject-obj_langu    = sy-langu.
lt_mailsubject-obj_descr    = `Результат проверок`.

wa_mailtxt                  = `Это письмо отправлено из АБАПа :)`.
APPEND wa_mailtxt TO lt_mailtxt.
wa_mailtxt                  = `Программа такая-то`.
APPEND wa_mailtxt TO lt_mailtxt.

wa_mailrecipients-rec_type  = `C`.  "Список рассылки, ведётся через SO15
                                    "Между системами не переносится...
wa_mailrecipients-receiver  = `SUPPORT_TEAM`.

*wa_mailrecipients- rec_type  = 'U'. "Адрес напрямую
*wa_mailrecipients- receiver  = 'mail@mail.com'.
APPEND wa_mailrecipients TO lt_mailrecipients.


CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
  EXPORTING
    document_data              = lt_mailsubject
  TABLES
    object_content             = lt_mailtxt
    receivers                  = lt_mailrecipients
  EXCEPTIONS
    too_many_receivers         = 1
    document_not_sent          = 2
    document_type_not_exist    = 3
    operation_no_authorization = 4
    parameter_error            = 5
    x_error                    = 6
    enqueue_error              = 7
    OTHERS                     = 8.
IF sy-subrc EQ 0.
  COMMIT WORK.
*   Push mail out from SAP outbox
  SUBMIT rsconn01 WITH mode = 'INT' AND RETURN.
ENDIF.

вторник, 25 декабря 2018 г.

Архивировать и удалять старые журналы и логи загрузок

https://wiki.scn.sap.com/wiki/display/BI/Archiving+Request+Information+in+BW

отсюда https://wiki.scn.sap.com/wiki/display/BI/BW+Archiving (а это отсюда https://wiki.scn.sap.com/wiki/display/BI/Reduce+BW+Request+Administration+Tables)

Если статья потеряется, основное:
транзакции AOBJ (for the archiving object 'BWREQARCH') и RSREQARCH.
В первой найдём нужные программы для планирования задания.


Это очень нужная тема, после 3-5 лет система начинает сильно тормозить и скрипеть, если забывать на контроль за этими журналами.

четверг, 13 декабря 2018 г.

Бэкапим таблицу TVARVC

Уже второй раз на моей практике умудряются эту таблицу ушатать.

Делаем программу, планируем ежедневно.

*&---------------------------------------------------------------------*
*& Report  ZPSB_BW_TVARVC_BACKUP
*&
*&---------------------------------------------------------------------*
*& Handmate TVARVC backup
*&
*&---------------------------------------------------------------------*
REPORT  zpsb_bw_tvarvc_backup.
*&---------------------------------------------------------------------*
DATA:
      l_sydate            TYPE d,
      lt_tvarvc           TYPE TABLE OF tvarvc,
      lo_struct_descr     TYPE REF TO cl_abap_structdescr,
       lt_struct_fields   TYPE cl_abap_structdescr=>component_table,
      l_string            TYPE string,
      lt_ztvarvc_backup   TYPE TABLE OF ztvarvc_backup,
      ls_ztvarvc_backup   LIKE LINE OF lt_ztvarvc_backup.

FIELD-SYMBOLS:
                <fs_struct_fields>  LIKE LINE OF lt_struct_fields,
                <comp>              TYPE ANY,
                <fs_tvarvc>         LIKE LINE OF lt_tvarvc.

CONSTANTS:
    l_nl(1)   TYPE c VALUE cl_abap_char_utilities=>newline,
    l_tab(1)  TYPE c VALUE cl_abap_char_utilities=>horizontal_tab.
*&---------------------------------------------------------------------*
BREAK-POINT ID break.

*& История за последние полтора месяца
l_sydate = sy-datum - 45.
DELETE FROM ztvarvc_backup WHERE sy_date < l_sydate.

SELECT
    *
  FROM tvarvc
  INTO TABLE lt_tvarvc.

*& Header
TRY.
    lo_struct_descr ?= cl_abap_typedescr=>describe_by_name( 'TVARVC' ).
    lt_struct_fields = lo_struct_descr->get_components( ).

    LOOP AT lt_struct_fields ASSIGNING <fs_struct_fields>.
      CONCATENATE l_string <fs_struct_fields>-name l_tab INTO l_string.
    ENDLOOP.

    CONCATENATE l_string l_nl INTO l_string.
  CATCH cx_root.
ENDTRY.

*& Body
LOOP AT lt_tvarvc ASSIGNING <fs_tvarvc>.
  IF lt_struct_fields IS NOT INITIAL.
    LOOP AT lt_struct_fields ASSIGNING <fs_struct_fields>.
      ASSIGN COMPONENT <fs_struct_fields>-name OF STRUCTURE <fs_tvarvc> TO <comp>.
      CONCATENATE l_string <comp> l_tab INTO l_string.
    ENDLOOP.

    CONCATENATE l_string l_nl INTO l_string.
  ENDIF.
ENDLOOP.

ls_ztvarvc_backup-sy_date     = sy-datum.
ls_ztvarvc_backup-table_value = l_string.

MODIFY ztvarvc_backup FROM ls_ztvarvc_backup.

WRITE l_string.
*&---------------------------------------------------------------------*

понедельник, 10 декабря 2018 г.

Получить значения из последнего журнала загрузки в ДСО

*"----------------------------------------------------------------------
  types:
    begin of ty_paccount,
      /bic/paccount type /bic/oipaccount,
    end of ty_paccount.

  data:
        l_dsoname           type rsbktgtnm,
        l_odsrnr            type rsrequid,
        lt_paccount         type hashed table of ty_paccount
          with unique default key,
        l_idx               like sy-tabix,
        l_odsobject         type rsdodsobject,
        l_changelog_tabname type tabname.

  field-symbols:
                 <fs_paccount> like line of lt_paccount.
*"----------------------------------------------------------------------
  break-point id break.
*"  Get DSO name and last activated request
  l_dsoname   = i_r_request->get_tgt( ).
  l_odsobject = l_dsoname.

  select single
      odsrnr
    from rsstatmanpart
    into l_odsrnr
   where dta eq l_dsoname
     and dta_type eq `ODSO`
     and odsrnrsid eq ( select
                          max( odsrnrsid ) as odsrnrsid
                          from rsstatmanpart
                         where dta eq l_dsoname
                           and dta_type eq `ODSO`
                        ).

  read table l_t_range with key
       fieldname = 'F1'.
  l_idx = sy-tabix.

  if l_odsrnr is not initial.
    call method cl_rsd_odso=>get_tablnm
      exporting
        i_odsobject = l_odsobject
        i_tabt      = 3 "Changelog
      importing
        e_tablnm    = l_changelog_tabname.

    select distinct
        /bic/paccount
      into table lt_paccount
      from (l_changelog_tabname)
     where request eq l_odsrnr.

    loop at lt_paccount assigning <fs_paccount>.
      l_t_range-iobjnm    = 'F1'.
      l_t_range-fieldname = 'F1'.
      l_t_range-sign      = 'I'.
      l_t_range-option    = 'EQ'.
      l_t_range-low       = <fs_paccount>-/bic/paccount.

      if l_idx <> 0.
        modify l_t_range index l_idx.
      else.
        append l_t_range.
      endif.
    endloop.
  endif.

  p_subrc = 0.
*-----------------------------------------------------------------------


понедельник, 3 декабря 2018 г.

ORA-01654: unable to extend index на таблицу DDPRS

Очень старая система, данная таблица забита парой десятком лямов логов. При переносе или активации объекта - дамп, при попытке вставки записей в эту таблицу.

Очищать её можно программой RADPROTB. 
https://www.erptraining9.com/sap-bw-cleanup-of-dictionary-logs-ddprs/