Skip to Content

What this blog is about

Have you ever faced issues with inactive BW objects like Multi Provider,
Cubes, Update Rules, Transformations or Transfer structures after changes have
been imported? Implement included ABAP program which either sends you an
update of inactive objects via Email (job schedule) or just provides you a simple
list of inactive objects.

Step-by-Step Solution

Please follow the steps below.

Step 1: create an ABAP- report, e.g. ZZ_INA_OBJECTS_SENTINEL (refer to the end
of this document for the complete ABAP- code)

 Step 1

 

Step 2:  maintain the selection texts:

 Step 2

 

Step 3: create a variant which you will use for job scheduling:

e.g.

 Step 3

Step 4: define and schedule a job for this program/ variant.

 Step 4

=> you will receive an email wich contains de-activated BW- objects from the last
3 days.

 

Alternative to Step 3 and Step 4:

Run the program in SA38 w/o ticking the send email box. Then you will get a list of
inactive objects.

 ABAP List

=>

Result

Conclusion

In order to re-activate the inactive objects there are different options: either
activate and re-transport them from development to productive system or run
appropriate activation program for multi cubes, transfer rule etc. in your productive
landscape directly (remark: not for all objects a program exists/ is usable!).

With an automated process (job scheduling, email), you are prevented from
failing process chains caused by inactive objects since you are able to react on it
beforehand.

 

Report Code (Complete)

 

*&———————————————————————*
*&  Report           ZZ_INA_OBJECTS_SENTINEL
*&———————————————————————*
* Date:     31.05.2011  Created by: H.Wetzel
* Version   Change Request 20110519-0189/M013676.
*

* How to use this program?
*    Schedule this program using a job (sm36/sm37) at regular frequency.
*    The frequency should closely follow the transport request import
*    frequency.
*
* Content:
* this program lists inactive objects like multi provider, cubes, update
* rules, transformations and transfer structures based on a certain time
* range you can specify in the selection screen.
*
* Selection-screen help:
*  1) Number of days to Consider
*        Enter a value between 0 and 999 days (=D); depending on that the
*        program looks for all changed objects in the time range from D till
*        today (sy-datum)
*  2) Send email?
*        Mark this checkbox, if you want to send email notification. If you
*       don’t mark it, then you get a list as an output.
*  3) Email receipients
*        The list of people to be notified is entered here, but only if
*        ‘Send email?’ is flagged.
* ***************
* Date:  dd.mm.yyyy  Changed by: X. XXXXXXX      Highlighted with: HW001
* Version Change Request XXXXX.
* Content:
***************************************************************

REPORT  z_ina_obj_watch_dog_02
        NO STANDARD PAGE HEADING MESSAGE-ID 00.

*———————————————————————-*
* Constants
*———————————————————————-*
CONSTANTS:
  gc_false          TYPE rs_bool      VALUE ‘ ‘,
  gc_true           TYPE rs_bool      VALUE ‘X’.

*———————————————————————-*
* Internal tables                                                      *
*———————————————————————-*
DATA: wa_ur TYPE rsupdinfo,
      wa_transf TYPE rstran.

DATA: l_t_data_cube  TYPE STANDARD TABLE OF rsdcube,
      l_s_data_cube  TYPE rsdcube.

DATA: l_t_data_ur  TYPE STANDARD TABLE OF rsupdinfo,
      l_s_data_ur  TYPE rsupdinfo.

DATA: l_t_data_transf  TYPE STANDARD TABLE OF rstran,
      l_s_data_transf  TYPE rstran.

DATA: l_t_data_trstr  TYPE STANDARD TABLE OF rsts,
      l_s_data_trstr  TYPE rsts.

DATA: i_date_cube LIKE sy-datum,
      i_date_ur LIKE sy-datum,
      i_date_transf LIKE sy-datum,
      i_date_trstr LIKE sy-datum.

DATA: recv                LIKE       somlreci1 OCCURS 1 WITH HEADER LINE,
      v_document_data     LIKE sodocchgi1.

DATA: object_id           LIKE  sofolenti1-object_id,
      objcont             LIKE  soli OCCURS 10 WITH HEADER LINE,
      v_dt_mail(10),
      v_tm_mail(8).
*———————————————————————-*
* Variables                                                            *
*———————————————————————-*
DATA:
  gv_receiver TYPE somlreci1-receiver,
  gv_date1 TYPE sy-datum,
  gv_date2 TYPE sy-datum,
  gv_timestmp1 TYPE ad_tstamp,
  gv_timestmp2 TYPE ad_tstamp,
  gv_sts_cube TYPE sy-subrc,
  gv_sts_ur TYPE sy-subrc,
  gv_sts_transf TYPE sy-subrc,
  gv_sts_trstr TYPE sy-subrc.

*———————————————————————-*
* Selection-Screen                                                     *
*———————————————————————-*
SELECTION-SCREEN BEGIN OF BLOCK om1 WITH FRAME TITLE text-555.
PARAMETERS: p_days(3) TYPE n DEFAULT 1.
SELECTION-SCREEN END OF BLOCK om1.

SELECTION-SCREEN BEGIN OF BLOCK om2 WITH FRAME TITLE text-556.
PARAMETERS:
  p_email AS CHECKBOX DEFAULT ‘X’.
SELECT-OPTIONS: s_mail FOR gv_receiver LOWER CASE NO INTERVALS.
SELECTION-SCREEN END OF BLOCK om2.

AT SELECTION-SCREEN.
  IF p_email = gc_true.
    READ TABLE s_mail INDEX 1.
    IF sy-subrc <> 0.
      MESSAGE e001 WITH ‘Please enter at least one email address’.
    ENDIF.
  ENDIF.

  LOOP AT s_mail.
    IF NOT s_mail-high IS INITIAL.
      MESSAGE e001 WITH s_mail-high ‘is not valid. Please enter with no intervals’.
    ENDIF.
  ENDLOOP.

START-OF-SELECTION.

*———————————————————————-*
* Date conversions                                                     *
*———————————————————————-*

  gv_date1 = sy-datum.
  gv_date2 = sy-datum – p_days.

* today
  PERFORM convert_date USING gv_date1
                             gv_timestmp1.
* lower date-range value
  PERFORM convert_date USING gv_date2
                             gv_timestmp2.

*———————————————————————-*
* Check out inactive objects                                           *
*———————————————————————-*

  SELECT * FROM rsdcube INTO
                CORRESPONDING FIELDS OF TABLE l_t_data_cube
                WHERE  objvers = ‘A’ AND
                       objstat = ‘INA’ AND
                       ( timestmp LE gv_timestmp1 AND
                         timestmp GE gv_timestmp2 ).

  gv_sts_cube = sy-subrc.

  SELECT * FROM rsupdinfo INTO
                CORRESPONDING FIELDS OF TABLE l_t_data_ur
                WHERE objvers = ‘A’ AND
                      objstat = ‘INA’ AND
                      ( timestmp LE gv_timestmp1 AND
                        timestmp GE gv_timestmp2 ).

  gv_sts_ur = sy-subrc.

  SELECT * FROM rstran INTO
           CORRESPONDING FIELDS OF TABLE l_t_data_transf
           WHERE objvers = ‘A’ AND
                 objstat = ‘INA’ AND
                 ( timestmp LE gv_timestmp1 AND
                   timestmp GE gv_timestmp2 ).

  gv_sts_transf = sy-subrc.

  SELECT * FROM rsts INTO
           CORRESPONDING FIELDS OF TABLE l_t_data_trstr
           WHERE objvers = ‘A’ AND
                 objstat = ‘INA’ AND
                 ( timestmp LE gv_timestmp1 AND
                   timestmp GE gv_timestmp2 ).

  gv_sts_trstr = sy-subrc.

  IF gv_sts_cube = 0 OR gv_sts_ur = 0 OR gv_sts_transf = 0 OR gv_sts_trstr = 0.

* output email
    IF p_email = gc_true.

      objcont-line = ‘The below-listed Objects are inactive which most probably will
                           cause issues.’.
      APPEND objcont.
      objcont-line = ‘Please check and take appropriate action!’.
      APPEND objcont.

      IF gv_sts_cube = 0.
        WRITE: sy-uline(66) TO objcont-line.
        APPEND objcont.
        CONCATENATE sy-vline ‘System ‘ sy-vline ‘Provider ‘ sy-vline ‘Type ‘ sy-vline
        ‘Changed by ‘ sy-vline ‘Changed on ‘ INTO objcont-line.
        APPEND objcont.
        WRITE: sy-uline(66) TO objcont-line.
        APPEND objcont.

        LOOP AT l_t_data_cube INTO l_s_data_cube.

          CALL FUNCTION ‘RS_TBBW_CONVERT_TIMESTAMP’
            EXPORTING
              i_timestamp = l_s_data_cube-timestmp
            IMPORTING
              e_dat       = i_date_cube.

          PERFORM send_email USING l_s_data_cube-infocube
                                   l_s_data_cube-cubetype
                                   l_s_data_cube-tstpnm
                                   i_date_cube.

        ENDLOOP.
      ENDIF.

      IF gv_sts_ur = 0.
        WRITE: sy-uline(66) TO objcont-line.
        APPEND objcont.
        CONCATENATE sy-vline ‘System ‘ sy-vline ‘Update Rule ‘ sy-vline ‘Target ‘
        sy-vline ‘Source’ sy-vline ‘Changed by ‘ sy-vline ‘Changed on ‘ INTO
        objcont-line.
        APPEND objcont.
        WRITE: sy-uline(66) TO objcont-line.
        APPEND objcont.

        LOOP AT l_t_data_ur INTO l_s_data_ur.

          CALL FUNCTION ‘RS_TBBW_CONVERT_TIMESTAMP’
            EXPORTING
              i_timestamp = l_s_data_ur-timestmp
            IMPORTING
              e_dat       = i_date_ur.

          PERFORM send_email02 USING l_s_data_ur-updid
                                   l_s_data_ur-infocube
                                   l_s_data_ur-isource
                                   l_s_data_ur-tstpnm
                                   i_date_ur.

        ENDLOOP.
      ENDIF.

      IF gv_sts_transf = 0.
        WRITE: sy-uline(66) TO objcont-line.
        APPEND objcont.
        CONCATENATE sy-vline ‘System ‘ sy-vline ‘Transformation ‘ sy-vline ‘Target ‘
        sy-vline ‘Source’ sy-vline ‘Changed by ‘ sy-vline ‘Changed on ‘ INTO
        objcont-line.
        APPEND objcont.
        WRITE: sy-uline(66) TO objcont-line.
        APPEND objcont.

        LOOP AT l_t_data_transf INTO l_s_data_transf.

          CALL FUNCTION ‘RS_TBBW_CONVERT_TIMESTAMP’
            EXPORTING
              i_timestamp = l_s_data_transf-timestmp
            IMPORTING
              e_dat       = i_date_transf.

          PERFORM send_email03 USING l_s_data_transf-tranid
                                   l_s_data_transf-targetname
                                   l_s_data_transf-sourcename
                                   l_s_data_transf-tstpnm
                                   i_date_transf.

        ENDLOOP.
      ENDIF.

      IF gv_sts_trstr = 0.
        WRITE: sy-uline(66) TO objcont-line.
        APPEND objcont.
        CONCATENATE sy-vline ‘System ‘ sy-vline ‘Transferstructure ‘ sy-vline
        ‘Changed by ‘ sy-vline ‘Changed on ‘ INTO objcont-line.
        APPEND objcont.
        WRITE: sy-uline(66) TO objcont-line.
        APPEND objcont.

        LOOP AT l_t_data_trstr INTO l_s_data_trstr.

          CALL FUNCTION ‘RS_TBBW_CONVERT_TIMESTAMP’
            EXPORTING
              i_timestamp = l_s_data_trstr-timestmp
            IMPORTING
              e_dat       = i_date_trstr.

          PERFORM send_email04 USING l_s_data_trstr-transtru
                                     l_s_data_trstr-tstpnm
                                     i_date_transf.

        ENDLOOP.
      ENDIF.

      REFRESH recv.
      CLEAR recv.

      LOOP AT s_mail.
* receivers
        recv-receiver = s_mail-low.                    “recipient
        recv-express = ‘X’.
        recv-rec_type = ‘U’.                           “internet email
        APPEND recv.
      ENDLOOP.

* document data – description is subject line
      v_document_data-obj_name  = ‘Inactive Objects Watchdog’.
      v_document_data-obj_descr = ‘Inactive BW- Objects!’.

* send mail message
      CALL FUNCTION ‘SO_NEW_DOCUMENT_SEND_API1’
        EXPORTING
          document_data              = v_document_data
          document_type              = ‘RAW’
          put_in_outbox              = ‘X’
          commit_work                = ‘X’
        IMPORTING
          new_object_id              = object_id
        TABLES
          object_content             = objcont
          receivers                  = recv
        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 <> 0.
        MESSAGE s001 WITH ‘Email was not sent’.
      ELSE.
        MESSAGE s001 WITH ‘Email was successfully sent’.
      ENDIF.

    ELSE.
* output list
      IF gv_sts_cube = 0.
        SKIP 2.
        WRITE: / ‘Multiprovider/ Cubes’, sy-datum .

        ULINE AT /(46).

        WRITE: / sy-vline, (9) ‘Provider’, sy-vline,
        ‘Type’, sy-vline,
        (10) ‘Changed by’, sy-vline,
        (10) ‘Changed on’, sy-vline.
        ULINE AT /(46).

        LOOP AT l_t_data_cube INTO l_s_data_cube.

          CALL FUNCTION ‘RS_TBBW_CONVERT_TIMESTAMP’
            EXPORTING
              i_timestamp = l_s_data_cube-timestmp
            IMPORTING
              e_dat       = i_date_cube.

          WRITE: / sy-vline, (9) l_s_data_cube-infocube, sy-vline,
          (4) l_s_data_cube-cubetype, sy-vline,
          (10) l_s_data_cube-tstpnm, sy-vline,
          (10) i_date_cube, sy-vline.

          ULINE AT /(46).

        ENDLOOP.

      ENDIF.

      IF gv_sts_ur = 0.
        SKIP 2.
        WRITE: / ‘Update Rules’, sy-datum .

        ULINE AT /(81).

        WRITE: / sy-vline, (25) ‘UpdateRule’, sy-vline,
        (10) ‘Target’, sy-vline,
        (10) ‘Source’, sy-vline,
        (10) ‘Changed by’, sy-vline,
        (10) ‘Changed on’, sy-vline.
        ULINE AT /(81).

        LOOP AT l_t_data_ur INTO l_s_data_ur.

          CALL FUNCTION ‘RS_TBBW_CONVERT_TIMESTAMP’
            EXPORTING
              i_timestamp = l_s_data_ur-timestmp
            IMPORTING
              e_dat       = i_date_ur.

          WRITE: / sy-vline, (25) l_s_data_ur-updid, sy-vline,
          (10) l_s_data_ur-infocube, sy-vline,
          (10) l_s_data_ur-isource, sy-vline,
          (10) l_s_data_ur-tstpnm, sy-vline,
          (10) i_date_ur, sy-vline.

          ULINE AT /(81).

        ENDLOOP.

      ENDIF.

      IF gv_sts_transf = 0.
        SKIP 2.
        WRITE: / ‘Transformations’, sy-datum .

        ULINE AT /(88).

        WRITE: / sy-vline, (32) ‘Transformation’, sy-vline,
        (10) ‘Target’, sy-vline,
        (10) ‘Source’, sy-vline,
        (10) ‘Changed by’, sy-vline,
        (10) ‘Changed on’, sy-vline.
        ULINE AT /(88).

        LOOP AT l_t_data_transf INTO l_s_data_transf.

          CALL FUNCTION ‘RS_TBBW_CONVERT_TIMESTAMP’
            EXPORTING
              i_timestamp = l_s_data_transf-timestmp
            IMPORTING
              e_dat       = i_date_transf.

          WRITE: / sy-vline, (32) l_s_data_transf-tranid, sy-vline,
          (10) l_s_data_transf-targetname, sy-vline,
          (10) l_s_data_transf-sourcename, sy-vline,
          (10) l_s_data_transf-tstpnm, sy-vline,
          (10) i_date_transf, sy-vline.

          ULINE AT /(88).

        ENDLOOP.

      ENDIF.

      IF gv_sts_trstr = 0.
        SKIP 2.
        WRITE: / ‘Transfer Strcutures’, sy-datum .

        ULINE AT /(62).

        WRITE: / sy-vline, (32) ‘Transfer Structure’, sy-vline,
        (10) ‘Changed by’, sy-vline,
        (10) ‘Changed on’, sy-vline.
        ULINE AT /(62).

        LOOP AT l_t_data_trstr INTO l_s_data_trstr.

          CALL FUNCTION ‘RS_TBBW_CONVERT_TIMESTAMP’
            EXPORTING
              i_timestamp = l_s_data_trstr-timestmp
            IMPORTING
              e_dat       = i_date_trstr.

          WRITE: / sy-vline, (32) l_s_data_trstr-transtru, sy-vline,
          (10) l_s_data_trstr-tstpnm, sy-vline,
          (10) i_date_trstr, sy-vline.

          ULINE AT /(62).

        ENDLOOP.

      ENDIF.

    ENDIF.
  ELSE.
    MESSAGE s001 WITH ‘No data for used selection’.

  ENDIF.

*&———————————————————————*
*&      Form  send_email
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM send_email USING  p_provider TYPE rsdcube-infocube
                                   p_cubetype TYPE rsdcube-cubetype
                                   p_changer TYPE rsdcube-tstpnm
                                   p_date TYPE sy-datum.

  CLEAR objcont.

  CONCATENATE sy-vline sy-sysid(7) sy-vline p_provider(8) sy-vline p_cubetype(1)
  sy-vline p_changer(8)  sy-vline p_date(8) INTO objcont-line.
  APPEND objcont.

ENDFORM.                    ” send_email
*&———————————————————————*
*&      Form  send_email02
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM send_email02 USING  p_updid TYPE rsupdinfo-updid
                                   p_infocube TYPE rsupdinfo-infocube
                                   p_isource TYPE rsupdinfo-isource
                                   p_tstpnm TYPE rsupdinfo-tstpnm
                                   p_date TYPE sy-datum.

  CLEAR objcont.
  CONCATENATE sy-vline sy-sysid(7) sy-vline p_updid sy-vline p_infocube sy-vline
  p_isource  sy-vline p_tstpnm sy-vline p_date INTO objcont-line.
  APPEND objcont.

ENDFORM.                    ” send_email02

*&———————————————————————*
*&      Form  send_email03
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM send_email03 USING  p_tranid TYPE rstran-tranid
                                   p_targetname TYPE rstran-targetname
                                   p_sourcename TYPE rstran-sourcename
                                   p_tstpnm TYPE rstran-tstpnm
                                   p_date TYPE sy-datum.

  CLEAR objcont.
  CONCATENATE sy-vline sy-sysid(7) sy-vline p_tranid sy-vline p_targetname
  sy-vline p_sourcename  sy-vline p_tstpnm sy-vline p_date INTO objcont-line.
  APPEND objcont.

ENDFORM.                    ” send_email03

*&———————————————————————*
*&      Form  send_email04
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        text
*  <–  p2        text
*———————————————————————-*
FORM send_email04 USING  p_transtru TYPE rsts-transtru
                         p_tstpnm   TYPE rstran-tstpnm
                         p_date     TYPE sy-datum.

  CLEAR objcont.
  CONCATENATE sy-vline sy-sysid(7) sy-vline p_transtru sy-vline p_tstpnm sy-vline
  p_date INTO objcont-line.
  APPEND objcont.

ENDFORM.                    ” send_email04

*&———————————————————————*
*&      Form  convert_date
*&———————————————————————*
*       text
*———————————————————————-*
*  –>  p1        date
*  <–  p2        timestamp
*———————————————————————-*
FORM convert_date USING  p_date TYPE sy-datum
                         p_timestmp TYPE ad_tstamp.

  CALL FUNCTION ‘ADDR_CONVERT_DATE_TO_TIMESTAMP’
    EXPORTING
      iv_date            = p_date
*   IV_HIGH            = ‘ ‘
    IMPORTING
      ev_timestamp       = p_timestmp.

ENDFORM.                    “convert_date

To report this post you need to login first.

1 Comment

You must be Logged on to comment or reply to a post.

Leave a Reply