Class (ABAP Objects)
Description Key Figure (of a Version)
Package RSD
Module Metadata (Repository)
Module ID BW-WHM-MTD
Creator SAP
Description BW: Data Basis InfoObjects and Core Services
Available at 30A
Component SAP_BW
Version 1
Category General Object Type
Exposure Public

There is only no documentation for this object available. Sorry.

You could find some helpful information in the inline-coding section.

Attributes (2)

Exposure Dekleration Name Typecast Reference type Defaultvalue
Public Instance attribute N_S_KYF Type reference (TYPE) RSDO_S_KYF -
Public Instance attribute N_T_CMP Type reference (TYPE) RSDO_T_CMP -

Coding

CL_RSD_KYF definition 
  public 
  inheriting from CL_RSD_IOBJ_VERS 
  final 
  create public . 
public section. 
*"* public components of class CL_RSD_KYF 
*"* do not include other source files here!!! 
  type-pools RSD . 
  data N_S_KYF type RSDO_S_KYF read-only . 
  data N_T_CMP type RSDO_T_CMP read-only . 
  type-pools RS . 
  methods CONSTRUCTOR 
    importing 
      !I_IOBJNM type RSIOBJNM 
      !I_OBJVERS type RSOBJVERS 
      !I_S_VIOBJ type RSD_S_VIOBJ optional 
      !I_T_CMP type RSDO_T_CMP optional 
      !I_R_VERS type ref to CL_RSD_IOBJ_VERS optional 
      !I_ALL_TEXTS_IF_NEW type RS_BOOL default RS_C_FALSE 
    exceptions 
      INPUT_INVALID 
      NOT_FOUND . 
  methods BUILD_CONTENT 
    redefinition . 
  methods COMPARE 
    redefinition . 
protected section. 
*"* protected components of class CL_RSD_KYF 
*"* do not include other source files here!!! 
  methods AFTER_ACTIVATION_CHECK_VERS_A 
    redefinition . 
  methods CHECK_EXTERNAL 
    redefinition . 
  methods CHECK_INTERNAL 
    redefinition . 
  methods CHECK_VERS_A 
    redefinition . 
  methods CHECK_VERS_A_DTA_IMPACT_INT 
    redefinition . 
  methods CHECK_VERS_A_IOBJ_IMPACT 
    redefinition . 
  methods CHECK_VERS_A_ISCS_IMPACT 
    redefinition . 
  methods DEEP_COPY 
    redefinition . 
  methods GET_DEPENDENT 
    redefinition . 
  methods GET_INFO 
    redefinition . 
  methods REPAIR 
    redefinition . 
  methods SAVE 
    redefinition . 
  methods XPRA 
    redefinition . 
  methods IS_TRFN_IMPACT_NECESSARY 
    redefinition . 
private section. 
*"* private components of class CL_RSD_KYF 
*"* do not include other source files here!!! 
  class-methods CAST_FROM_IOBJ_VERS 
    importing 
      !I_R_VERS type ref to CL_RSD_IOBJ_VERS 
    returning 
      value(R_R_KYF) type ref to CL_RSD_KYF . 
  methods CHECK_HIGHPRECFL 
    importing 
      !I_DETLEVEL type BALLEVEL 
    changing 
      !C_R_MSG type ref to CL_RSO_MSG . 
  type-pools RS . 
  methods CHECK_EXTERNAL_AGGR_CMP 
    importing 
      !I_TH_TLOGO type RSO_TH_TLOGO optional 
      !I_DETLEVEL type BALLEVEL 
    changing 
      !C_DYFIE type RS_DYFIE 
      !C_SUBRC type SYSUBRC 
      !C_R_MSG type ref to CL_RSO_MSG optional . 
  methods CHECK_EXTERNAL_ICE 
    importing 
      !I_TH_TLOGO type RSO_TH_TLOGO optional 
      !I_DETLEVEL type BALLEVEL 
    changing 
      !C_DYFIE type RS_DYFIE 
      !C_TABIX type SYTABIX 
      !C_SUBRC type SYSUBRC 
      !C_R_MSG type ref to CL_RSO_MSG optional . 
  methods CHECK_ICE_SINGLE 
    importing 
      !I_TH_TLOGO type RSO_TH_TLOGO optional 
      !I_DETLEVEL type BALLEVEL 
      !I_IOBJNM type RSIOBJNM 
      !I_IOBJNM_OTHER type RSIOBJNM 
      !I_POSIT type RSPOSIT 
    exporting 
      !E_S_VIOBJ type RSD_S_VIOBJ 
      !E_SUBRC type SYSUBRC 
    changing 
      !C_R_MSG type ref to CL_RSO_MSG optional . 
  methods CHECK_INCREASE_DECREASE 
    importing 
      !I_KYFNM type RSKYFNM 
      !I_TEXT type C 
      !I_TH_TLOGO type RSO_TH_TLOGO optional 
      !I_DETLEVEL type BALLEVEL 
    exporting 
      !E_S_KYF type RSDO_S_KYF 
      !E_SUBRC type SYSUBRC 
    changing 
      !C_R_MSG type ref to CL_RSO_MSG optional . 
ENDCLASS. 
CLASS CL_RSD_KYF IMPLEMENTATION. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->AFTER_ACTIVATION_CHECK_VERS_A 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_VERS_A TYPE REF TO CL_RSD_IOBJ_VERS 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO 
* | [--->] I_AFTER_IMPORT_MODE TYPE RS_BOOL (default =RS_C_FALSE) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [--->] I_PERCENTAGE TYPE I(optional) 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* +-------------------------------------------------------------------------------------- 
METHOD after_activation_check_vers_a . 
* call super-implementation 
  CALL METHOD super->after_activation_check_vers_a 
    EXPORTING 
      i_r_vers_a   = i_r_vers_a 
      i_th_tlogo   = i_th_tlogo 
      i_detlevel   = i_detlevel 
      i_after_import_mode = i_after_import_mode 
      i_percentage = i_percentage 
    CHANGING 
      c_subrc      = c_subrc. 
* cast from IOBJ_VERS to KYF 
  DATA: l_r_kyf_a   TYPE  REF TO cl_rsd_kyf. 
  l_r_kyf_a = cast_from_iobj_vers( i_r_vers_a ). 
  CHECK: NOT l_r_kyf_a IS INITIAL. 
* 1. aggregation changed or assigned unit 
  IF n_s_kyf-aggrgen NE l_r_kyf_a->n_s_kyf-aggrgen OR 
     n_s_kyf-uninm NE l_r_kyf_a->n_s_kyf-uninm. 
* reset ODS program status 
    CALL METHOD me->reset_ods_program_status 
      EXPORTING 
        i_iobjnm   = n_s_kyf-kyfnm 
        i_th_tlogo = i_th_tlogo 
      CHANGING 
        c_subrc    = c_subrc. 
  ENDIF. 
ENDMETHOD. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Public Method CL_RSD_KYF->BUILD_CONTENT 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_VERS_MERGE TYPE REF TO CL_RSD_IOBJ_VERS 
* | [--->] I_OBJFUNC TYPE RSOBJFUNC 
* | [--->] I_CHECK_MODE TYPE RS_BOOL 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [--->] I_PERCENTAGE TYPE I 
* | [<---] E_T_FIELDS_MANUAL TYPE RSD_T_C30 
* | [<---] E_S_VIOBJ TYPE RSD_S_VIOBJ 
* | [<-->] C_NO_DIALOG TYPE RS_BOOL 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* | [<-->] C_T_CMP TYPE RSDO_T_CMP(optional) 
* | [<-->] C_T_ATR TYPE RSDO_T_ATR(optional) 
* | [<-->] C_T_ATR_NAV TYPE RSDO_T_ATR_NAV(optional) 
* | [<-->] C_T_ATRNAVT TYPE RSDO_T_ATRNAVT(optional) 
* | [!CX!] CX_RS_CANCELLED 
* +-------------------------------------------------------------------------------------- 
METHOD build_content . 
  CLEAR: e_t_fields_manual. 
* cast to kyf 
  DATA: l_r_kyf_merge   TYPE  REF TO cl_rsd_kyf. 
  l_r_kyf_merge = cast_from_iobj_vers( i_r_vers_merge ). 
  CHECK: NOT l_r_kyf_merge IS INITIAL. 
* 1. merge compund 
* key figure type 
  APPEND 'KYFTP' TO e_t_fields_manual. 
* non cumulative --> decision for ncumfl inplies decision for 
* increase / decrease 
  APPEND 'NCUMFL' TO e_t_fields_manual. 
* fix currency 
  APPEND 'FIXCUKY' TO e_t_fields_manual. 
* fix unit 
  APPEND 'FIXUNIT' TO e_t_fields_manual. 
* aggregation 
  APPEND 'AGGRGEN' TO e_t_fields_manual. 
* exception aggregation 
  APPEND 'AGGREXC' TO e_t_fields_manual. 
* aggregation charact. 
  APPEND 'AGGRCHA' TO e_t_fields_manual. 
* decimal places 
  APPEND 'KYFDECIM' TO e_t_fields_manual. 
* scaling 
  APPEND 'KYFPRSNT' TO e_t_fields_manual. 
* unit InfoObject 
  APPEND 'UNINM' TO e_t_fields_manual. 
* data type 
  APPEND 'DATATP' TO e_t_fields_manual. 
* fixed keyfigure 
  APPEND 'FIXEDKYF' TO e_t_fields_manual. 
* delta value 
  IF n_s_kyf-ncumfl            = rsd_c_ncumfl-delta OR 
     l_r_kyf_merge->n_s_kyf-ncumfl = rsd_c_ncumfl-delta. 
    APPEND 'DELTAVAL' TO e_t_fields_manual. 
  ENDIF. 
* increase / decrease 
  IF n_s_kyf-ncumfl            = rsd_c_ncumfl-incdec OR 
     l_r_kyf_merge->n_s_kyf-ncumfl = rsd_c_ncumfl-incdec. 
    APPEND 'INCREASE' TO e_t_fields_manual. 
    APPEND 'DECREASE' TO e_t_fields_manual. 
  ENDIF. 
* precison flag 
  APPEND 'PACKFL' TO e_t_fields_manual. 
* call manual selection 
  DATA: l_s_viobj    TYPE  rsd_s_viobj. 
  CALL METHOD super->build_content 
    EXPORTING 
      i_r_vers_merge    = i_r_vers_merge 
      i_objfunc         = i_objfunc 
      i_check_mode      = i_check_mode 
      i_detlevel        = i_detlevel 
      i_percentage      = i_percentage 
    IMPORTING 
      e_t_fields_manual = e_t_fields_manual 
      e_s_viobj         = l_s_viobj 
    CHANGING 
      c_no_dialog       = c_no_dialog 
      c_subrc           = c_subrc 
      c_t_cmp           = n_t_cmp. 
  CHECK: c_subrc = 0. 
  MOVE-CORRESPONDING l_s_viobj TO n_s_kyf. 
ENDMETHOD. 
* ---------------------------------------------------------------------------------------+ 
* | Static Private Method CL_RSD_KYF=>CAST_FROM_IOBJ_VERS 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_VERS TYPE REF TO CL_RSD_IOBJ_VERS 
* | [<-()] R_R_KYF TYPE REF TO CL_RSD_KYF 
* +-------------------------------------------------------------------------------------- 
METHOD cast_from_iobj_vers. 
  CHECK: NOT i_r_vers IS INITIAL. 
  CATCH SYSTEM-EXCEPTIONS move_cast_error = 4. 
    r_r_kyf ?= i_r_vers. 
  ENDCATCH. 
  IF sy-subrc = 4. 
    CLEAR: r_r_kyf. 
  ENDIF. 
ENDMETHOD. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->CHECK_EXTERNAL 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [--->] I_AFTER_IMPORT_MODE TYPE RS_BOOL (default =RS_C_FALSE) 
* | [<-->] C_DYFIE TYPE RS_DYFIE 
* | [<-->] C_TABIX TYPE SY-TABIX 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD check_external. 
  CALL METHOD super->check_external 
    EXPORTING 
      i_th_tlogo          = i_th_tlogo 
      i_detlevel          = i_detlevel 
      i_after_import_mode = i_after_import_mode 
    CHANGING 
      c_dyfie             = c_dyfie 
      c_tabix             = c_tabix 
      c_subrc             = c_subrc 
      c_r_msg             = c_r_msg. 
* 1. check unit InfoObject 
  DATA: l_s_viobj_uni    TYPE rsd_s_viobj. 
  IF ( n_s_kyf-kyftp = rsd_c_kyftp-amount OR 
       n_s_kyf-kyftp = rsd_c_kyftp-quantity  ) AND 
     n_s_kyf-fixcuky IS INITIAL                AND 
     n_s_kyf-fixunit IS INITIAL. 
    TRY. 
        CALL METHOD cl_rsd_iobj=>get_info_current 
          EXPORTING 
            i_iobjnm   = n_s_kyf-uninm 
            i_th_tlogo = i_th_tlogo 
          IMPORTING 
            e_s_viobj  = l_s_viobj_uni. 
      CATCH cx_rsd_iobj_not_found. 
        CLEAR: l_s_viobj_uni. 
    ENDTRY. 
    IF l_s_viobj_uni-iobjtp <> rsd_c_objtp-unit. 
      MESSAGE e201 WITH n_s_iobj-iobjnm n_s_kyf-uninm 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: Das Einheiten InfoObject &2 ist nicht (aktiv) vorhanden 
      c_subrc = 4. 
      set_if_initial c_dyfie 'RSDGSCIOBJ-UNINM'. 
    ELSE. 
* unit exits: check type 
      IF ( n_s_kyf-kyftp        = rsd_c_kyftp-amount   AND 
           l_s_viobj_uni-unitp <> rsd_c_unitp-currency    ) OR 
         ( n_s_kyf-kyftp        = rsd_c_kyftp-quantity AND 
           l_s_viobj_uni-unitp <> rsd_c_unitp-unit        )  . 
        MESSAGE e206 WITH n_s_kyf-uninm l_s_viobj_uni-unitp 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel =  i_detlevel ). 
* Das Einheiten InfoObject &1 hat den falschen Typ &2 
        c_subrc = 4. 
        set_if_initial c_dyfie 'RSDGSCIOBJ-UNINM'. 
      ENDIF. 
* check pure attribute 
      IF n_s_iobj-atronlyfl      = rs_c_false AND 
         l_s_viobj_uni-atronlyfl = rs_c_true. 
* key figure may not be used in cubes 
        MESSAGE e571 WITH n_s_iobj-iobjnm n_s_kyf-uninm 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel =  i_detlevel ). 
* Kennzahl &1: EinheiteninfoObject &2 ist ausschließlich Attribut 
        c_subrc = 4. 
      ENDIF. 
* check component 
      CALL METHOD check_bct_component 
        EXPORTING 
          i_iobjnm_dep  = l_s_viobj_uni-iobjnm 
          i_bctcomp_dep = l_s_viobj_uni-bctcomp 
          i_depmode     = 'UNINM' 
          i_detlevel    = i_detlevel 
        CHANGING 
          c_subrc       = c_subrc 
          c_r_msg       = c_r_msg. 
    ENDIF.                       "unit found 
  ENDIF.                         "amount / quantity 
* 2. check aggregation charact. 
  CALL METHOD check_external_aggr_cmp 
    EXPORTING 
      i_th_tlogo = i_th_tlogo 
      i_detlevel = i_detlevel 
    CHANGING 
      c_dyfie    = c_dyfie 
      c_subrc    = c_subrc 
      c_r_msg    = c_r_msg. 
* 3. check elimination 
  CALL METHOD check_external_ice 
    EXPORTING 
      i_th_tlogo = i_th_tlogo 
      i_detlevel = i_detlevel 
    CHANGING 
      c_dyfie    = c_dyfie 
      c_tabix    = c_tabix 
      c_subrc    = c_subrc 
      c_r_msg    = c_r_msg. 
ENDMETHOD.                    
* ---------------------------------------------------------------------------------------+ 
* | Instance Private Method CL_RSD_KYF->CHECK_EXTERNAL_AGGR_CMP 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<-->] C_DYFIE TYPE RS_DYFIE 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD check_external_aggr_cmp . 
  DATA: l_s_viobj_aggrcha   TYPE rsd_s_viobj. 
  DATA: l_s_viobj_fixkyf    TYPE rsd_s_viobj. 
  DATA: l_s_kyf_increase    TYPE rsdo_s_kyf. 
  DATA: l_s_kyf_decrease    TYPE rsdo_s_kyf. 
  DATA: l_s_cmp             TYPE rsdo_s_cmp. 
  DATA: l_subrc             TYPE sysubrc. 
  DATA: l_text(132)         TYPE c. 
* check existence and type of aggregation charact. 
  IF NOT n_s_kyf-aggrcha IS INITIAL. 
    TRY. 
        CALL METHOD cl_rsd_iobj=>get_info_current 
          EXPORTING 
            i_iobjnm   = n_s_kyf-aggrcha 
            i_th_tlogo = i_th_tlogo 
          IMPORTING 
            e_s_viobj  = l_s_viobj_aggrcha. 
      CATCH cx_rsd_iobj_not_found. 
        CLEAR: l_s_viobj_aggrcha. 
    ENDTRY. 
    IF l_s_viobj_aggrcha-iobjtp <> rsd_c_objtp-charact AND 
       l_s_viobj_aggrcha-iobjtp <> rsd_c_objtp-time. 
      MESSAGE e404 WITH n_s_iobj-iobjnm n_s_kyf-aggrcha 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1: Aggregationsbezugsmerkmal &2 ist nicht (aktiv) vorhanden 
      c_subrc = 4. 
      set_if_initial c_dyfie 'RSDGSCIOBJ-AGGRCHA'. 
    ELSE. 
* check component 
      CALL METHOD check_bct_component 
        EXPORTING 
          i_iobjnm_dep  = l_s_viobj_aggrcha-iobjnm 
          i_bctcomp_dep = l_s_viobj_aggrcha-bctcomp 
          i_depmode     = 'AGGRCHA' 
          i_detlevel    = i_detlevel 
        CHANGING 
          c_subrc       = c_subrc 
          c_r_msg       = c_r_msg. 
    ENDIF. 
  ENDIF. 
* rest of the checks is not relvant for reference charact 
  READ TABLE n_t_cmp transporting no fields 
       WITH KEY cmptp = rsd_c_cmptp-ref_keyfigure. 
  IF sy-subrc <> 0. 
* check delta / increase 
    IF n_s_kyf-ncumfl = rsd_c_ncumfl-delta OR 
       n_s_kyf-ncumfl = rsd_c_ncumfl-incdec. 
* check increase / delta 
      CLEAR: l_s_cmp. 
      READ TABLE n_t_cmp INTO l_s_cmp 
           WITH KEY cmptp  = rsd_c_cmptp-increase. 
      IF n_s_kyf-ncumfl = rsd_c_ncumfl-delta. 
        l_text = 'Bestandveränderung'(120). 
      ELSE. 
        l_text = 'Zugang'(121). 
      ENDIF. 
      CALL METHOD check_increase_decrease 
        EXPORTING 
          i_kyfnm    = l_s_cmp-iobjcmp 
          i_text     = l_text 
          i_th_tlogo = i_th_tlogo 
          i_detlevel = i_detlevel 
        IMPORTING 
          e_s_kyf    = l_s_kyf_increase 
          e_subrc    = l_subrc 
        CHANGING 
          c_r_msg    = c_r_msg. 
      IF l_subrc <> 0. 
        c_subrc = 4. 
        IF n_s_kyf-ncumfl = rsd_c_ncumfl-delta. 
          set_if_initial c_dyfie 'RSDGSCIOBJ-DELTAVAL'. 
        ELSE. 
          set_if_initial c_dyfie 'RSDGSCIOBJ-INCREASE'. 
        ENDIF. 
      ENDIF. 
    ENDIF. 
* check compatibility of delta 
    IF n_s_kyf-ncumfl = rsd_c_ncumfl-delta. 
      IF NOT l_s_kyf_increase-kyfnm IS INITIAL             AND 
         ( n_s_kyf-kyftp   <> l_s_kyf_increase-kyftp   OR 
           n_s_kyf-uninm   <> l_s_kyf_increase-uninm   OR 
           n_s_kyf-fixcuky <> l_s_kyf_increase-fixcuky OR 
           n_s_kyf-fixunit <> l_s_kyf_increase-fixunit   ) . 
        MESSAGE e535 WITH n_s_iobj-iobjnm l_s_kyf_increase-kyfnm 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Bestandskennzahl &1 und Bestandsveränderung &2 sind inkonsistent 
        c_subrc = 4. 
        set_if_initial c_dyfie 'RSDGSCIOBJ-DELTAVAL'. 
      ENDIF. 
    ENDIF. 
* check decrease 
    IF n_s_kyf-ncumfl = rsd_c_ncumfl-incdec. 
* check existence of decrease 
      CLEAR: l_s_cmp. 
      READ TABLE n_t_cmp INTO l_s_cmp 
           WITH KEY cmptp  = rsd_c_cmptp-decrease. 
      CALL METHOD check_increase_decrease 
        EXPORTING 
          i_kyfnm    = l_s_cmp-iobjcmp 
          i_text     = 'Abgang'(119) 
          i_th_tlogo = i_th_tlogo 
          i_detlevel = i_detlevel 
        IMPORTING 
          e_s_kyf    = l_s_kyf_decrease 
          e_subrc    = l_subrc 
        CHANGING 
          c_r_msg    = c_r_msg. 
      IF l_subrc <> 0. 
        c_subrc = 4. 
        set_if_initial c_dyfie 'RSDGSCIOBJ-DECREASE'. 
      ENDIF. 
* check compatibility of decrease and increase 
      IF NOT l_s_kyf_increase-kyfnm IS INITIAL             AND 
         NOT l_s_kyf_decrease-kyfnm IS INITIAL             AND 
         ( n_s_kyf-kyftp   <> l_s_kyf_increase-kyftp   OR 
           n_s_kyf-kyftp   <> l_s_kyf_decrease-kyftp   OR 
           n_s_kyf-uninm   <> l_s_kyf_increase-uninm   OR 
           n_s_kyf-uninm   <> l_s_kyf_decrease-uninm   OR 
           n_s_kyf-fixunit <> l_s_kyf_increase-fixunit OR 
           n_s_kyf-fixunit <> l_s_kyf_decrease-fixunit OR 
           n_s_kyf-fixcuky <> l_s_kyf_increase-fixcuky OR 
           n_s_kyf-fixcuky <> l_s_kyf_decrease-fixcuky   ) . 
        MESSAGE e532 WITH n_s_iobj-iobjnm l_s_kyf_increase-kyfnm 
                          l_s_kyf_decrease-kyfnm 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1: Zugang &2 und Abgang &3 sind inkonsistent 
        c_subrc = 4. 
        set_if_initial c_dyfie 'RSDGSCIOBJ-INCREASE'. 
      ENDIF. 
    ENDIF. 
* check fixed keyfigure 
    READ TABLE n_t_cmp INTO l_s_cmp 
         WITH KEY cmptp  = rsd_c_cmptp-fixed_keyfigure. 
    IF sy-subrc = 0. 
      TRY. 
          CALL METHOD cl_rsd_iobj=>get_info_current 
            EXPORTING 
              i_iobjnm   = l_s_cmp-iobjcmp 
              i_th_tlogo = i_th_tlogo 
            IMPORTING 
              e_s_viobj  = l_s_viobj_fixkyf. 
          IF l_s_viobj_fixkyf-kyftp    <> n_s_kyf-kyftp    OR 
             l_s_viobj_fixkyf-datatp   <> n_s_kyf-datatp   OR 
             l_s_viobj_fixkyf-uninm    <> n_s_kyf-uninm    OR 
             l_s_viobj_fixkyf-fixcuky  <> n_s_kyf-fixcuky  OR 
             l_s_viobj_fixkyf-fixunit  <> n_s_kyf-fixunit  OR 
             l_s_viobj_fixkyf-aggrgen  <> n_s_kyf-aggrgen  OR 
             l_s_viobj_fixkyf-aggrexc  <> n_s_kyf-aggrexc  OR 
             l_s_viobj_fixkyf-aggrcha  <> n_s_kyf-aggrcha  OR 
             l_s_viobj_fixkyf-ncumfl   <> rsd_c_ncumfl-cumulative. 
            MESSAGE e593 WITH n_s_iobj-iobjnm 
                              l_s_cmp-iobjcmp 
                    INTO o_dummy_msg. 
            c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1: Fixierte Kennzahl &2 kann nicht verwendet werden 
            c_subrc = 4. 
            set_if_initial c_dyfie 'RSDGSCIOBJ-FIXEDKYF'. 
          ENDIF. 
* check component 
          CALL METHOD check_bct_component 
            EXPORTING 
              i_iobjnm_dep  = l_s_viobj_fixkyf-iobjnm 
              i_bctcomp_dep = l_s_viobj_fixkyf-bctcomp 
              i_depmode     = 'IOBJCMP' 
              i_detlevel    = i_detlevel 
            CHANGING 
              c_subrc       = c_subrc 
              c_r_msg       = c_r_msg. 
        CATCH cx_rsd_iobj_not_found. 
          MESSAGE e592 WITH n_s_iobj-iobjnm l_s_cmp-iobjcmp 
                  INTO o_dummy_msg. 
          c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1: fixierte Kennzahl &2 ist nicht (aktiv) vorhanden 
          c_subrc = 4. 
      ENDTRY. 
    ENDIF.                               "fixed keyfigure exists 
  ENDIF.                               "no reference 
ENDMETHOD.                    
* ---------------------------------------------------------------------------------------+ 
* | Instance Private Method CL_RSD_KYF->CHECK_EXTERNAL_ICE 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<-->] C_DYFIE TYPE RS_DYFIE 
* | [<-->] C_TABIX TYPE SYTABIX 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD check_external_ice . 
  DATA: l_s_ice  TYPE  rsd_s_ice. 
  DATA: l_dyfie  TYPE  rs_dyfie. 
  DATA: l_tabix  TYPE  sytabix. 
  DATA: l_subrc  TYPE  sysubrc. 
  LOOP AT n_s_kyf-t_ice INTO l_s_ice. 
    l_tabix = sy-tabix. 
* 1. check first charact. 
    DATA l_s_viobj1  TYPE  rsd_s_viobj. 
    CALL METHOD check_ice_single 
      EXPORTING 
        i_th_tlogo     = i_th_tlogo 
        i_detlevel     = i_detlevel 
        i_iobjnm       = l_s_ice-iobjnm1 
        i_iobjnm_other = l_s_ice-iobjnm2 
        i_posit        = l_s_ice-posit 
      IMPORTING 
        e_s_viobj      = l_s_viobj1 
        e_subrc        = l_subrc 
      CHANGING 
        c_r_msg        = c_r_msg. 
    IF l_subrc <> 0. 
      l_dyfie = 'RSDGSCICE-IOBJNM1'. 
      c_subrc = 4. 
    ENDIF. 
* 2. check second charact. 
    DATA l_s_viobj2  TYPE  rsd_s_viobj. 
    CALL METHOD check_ice_single 
      EXPORTING 
        i_th_tlogo     = i_th_tlogo 
        i_detlevel     = i_detlevel 
        i_iobjnm       = l_s_ice-iobjnm2 
        i_iobjnm_other = l_s_ice-iobjnm1 
        i_posit        = l_s_ice-posit 
      IMPORTING 
        e_s_viobj      = l_s_viobj2 
        e_subrc        = l_subrc 
      CHANGING 
        c_r_msg        = c_r_msg. 
    IF l_subrc <> 0. 
      l_dyfie = 'RSDGSCICE-IOBJNM2'. 
      c_subrc = 4. 
    ENDIF. 
* 3. check: equal basic charact. 
    IF NOT l_s_viobj1      IS INITIAL           AND 
       NOT l_s_viobj2      IS INITIAL           AND 
       l_s_viobj1-chabasnm <> l_s_viobj2-chabasnm. 
      MESSAGE e206(r7b) WITH l_s_ice-iobjnm1 l_s_ice-iobjnm2 n_s_iobj-iobjnm 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Merkmal &1 und &3 aus der Eliminierung müssen dieselbe Referenz haben 
      c_subrc = 4. 
      l_dyfie = 'RSDGSCICE-IOBJNM1'. 
    ENDIF. 
* 4. check not equal 
    IF  l_s_ice-iobjnm1 = l_s_ice-iobjnm2. 
      MESSAGE e209(r7b) WITH n_s_iobj-iobjnm l_s_ice-iobjnm1 l_s_ice-posit 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Merkmal &2 wird in Zeile &3 der Eliminierung doppelt verwendet 
      c_subrc = 4. 
      l_dyfie = 'RSDGSCICE-IOBJNM1'. 
    ENDIF. 
    IF c_subrc     <> 0       AND 
       c_dyfie     IS INITIAL AND 
       NOT l_dyfie IS INITIAL. 
      c_dyfie = l_dyfie. 
      c_tabix = l_tabix. 
    ENDIF. 
  ENDLOOP. 
ENDMETHOD.                    
* ---------------------------------------------------------------------------------------+ 
* | Instance Private Method CL_RSD_KYF->CHECK_HIGHPRECFL 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG 
* +-------------------------------------------------------------------------------------- 
METHOD check_highprecfl. 
  IF me->n_s_kyf-packfl IS NOT INITIAL  " flag is set, check if allowed 
     and not ( 
       (    me->n_s_kyf-datatp  EQ rsd_c_datatp-amount 
           OR me->n_s_kyf-datatp  EQ rsd_c_datatp-quantity 
           OR me->n_s_kyf-datatp  EQ rsd_c_datatp-number ) 
     AND me->n_s_kyf-aggrexc NE rro01_c_aggr-var 
     AND me->n_s_kyf-aggrexc NE rro01_c_aggr-std 
     AND me->n_s_kyf-aggrexc NE rro01_c_aggr-av1 
     AND me->n_s_kyf-aggrexc NE rro01_c_aggr-av2 
     AND me->n_s_kyf-aggrexc NE rro01_c_aggr-avs 
     AND me->n_s_kyf-aggrexc NE rro01_c_aggr-avg 
     AND me->n_s_kyf-aggrexc NE rro01_c_aggr-av0 
     AND me->n_s_kyf-kyftp   NE rsd_c_kyftp-integer ). 
    not allowed 
    " unset and message 
    CLEAR me->n_s_kyf-packfl. 
    MESSAGE w658(r7b). 
* Kennzeichen für hohe Genauigkeit wurde zurückgesetzt 
    c_r_msg->add_msg( i_detlevel = i_detlevel ). 
  ENDIF. 
ENDMETHOD. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Private Method CL_RSD_KYF->CHECK_ICE_SINGLE 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [--->] I_IOBJNM TYPE RSIOBJNM 
* | [--->] I_IOBJNM_OTHER TYPE RSIOBJNM 
* | [--->] I_POSIT TYPE RSPOSIT 
* | [<---] E_S_VIOBJ TYPE RSD_S_VIOBJ 
* | [<---] E_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD check_ice_single . 
  CLEAR: e_s_viobj, e_subrc. 
* 1. check if incomplete lines exist 
  IF     i_iobjnm       IS INITIAL AND 
     NOT i_iobjnm_other IS INITIAL. 
    MESSAGE e204(r7b) WITH n_s_iobj-iobjnm i_posit 
            INTO o_dummy_msg. 
    c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1: Die Binnenumsatzelim. ist unvollständig (Zeile &2) 
    e_subrc = 4. 
  ENDIF. 
* 2. check if charact. or navigation attribute exist 
  IF NOT i_iobjnm IS INITIAL. 
    TRY. 
        DATA: l_attrinm TYPE rsattrinm. 
        DATA: l_chanm   TYPE rschanm. 
        CALL FUNCTION 'RSD_ATTRINM_GET_FROM_ATRNAVNM'
          EXPORTING 
            i_atrnavnm = i_iobjnm 
          IMPORTING 
            e_attrinm  = l_attrinm 
            e_chanm    = l_chanm 
          EXCEPTIONS 
            name_error = 1. 
        IF sy-subrc <> 0. 
          CLEAR: l_attrinm. 
          l_chanm = i_iobjnm. 
        ENDIF. 
        DATA: l_t_atr_nav TYPE rsdo_t_atr_nav. 
        DATA: l_s_atr_nav TYPE rsdo_s_atr_nav. 
        CALL METHOD cl_rsd_iobj=>get_info_current 
          EXPORTING 
            i_iobjnm    = l_chanm 
            i_th_tlogo  = i_th_tlogo 
          IMPORTING 
            e_s_viobj   = e_s_viobj 
            e_t_atr_nav = l_t_atr_nav. 
* get navigation attribute 
        IF NOT l_attrinm IS INITIAL. 
          CLEAR: l_s_atr_nav. 
          READ TABLE l_t_atr_nav INTO l_s_atr_nav 
               WITH KEY attrinm = l_attrinm. 
          l_chanm = l_s_atr_nav-attrinm. 
          CALL METHOD cl_rsd_iobj=>get_info_current 
            EXPORTING 
              i_iobjnm    = l_chanm 
              i_th_tlogo  = i_th_tlogo 
            IMPORTING 
              e_s_viobj   = e_s_viobj. 
        ENDIF. 
* pure attribute not allowed 
        IF e_s_viobj-atronlyfl = rs_c_true. 
          MESSAGE e207(r7b) WITH n_s_iobj-iobjnm e_s_viobj-iobjnm 
                  INTO o_dummy_msg. 
          c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Merkmal &2 ist ausschl. Attribut und in der Eliminierung nicht erlaubt 
          e_subrc = 4. 
        ENDIF. 
* only charact. and time charact. allowed 
        IF e_s_viobj-iobjtp <> rsd_c_objtp-charact AND 
           e_s_viobj-iobjtp <> rsd_c_objtp-time. 
          MESSAGE e208(r7b) WITH n_s_iobj-iobjnm e_s_viobj-iobjnm 
                  INTO o_dummy_msg. 
          c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &2 in der Eliminierung kann nicht verwendet werden 
          e_subrc = 4. 
        ENDIF. 
      CATCH cx_rs_error. 
        MESSAGE e205(r7b) WITH n_s_iobj-iobjnm l_chanm 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1: Merkmal &2 aus der Eliminierung ist nicht aktiv vorhanden 
        e_subrc = 4. 
    ENDTRY. 
  ENDIF. 
* 3. check system type 
  DATA: l_systp         TYPE rs_systp. 
  IF is_sap_obj( )      = rs_c_true. 
* get system type of compound charact 
    CALL FUNCTION 'RSD_NSPACE_PAR_GET_FROM_NAME'
      EXPORTING 
        i_objnm    = i_iobjnm 
      IMPORTING 
        e_systp    = l_systp 
      EXCEPTIONS 
        name_error = 1. 
    IF sy-subrc = 0                   AND 
       l_systp = rs_sys_cus. 
      MESSAGE e218(r7) WITH i_iobjnm l_systp 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Das Merkmal &1 hat den falschen Systemtyp &2 
      e_subrc = 4. 
    ENDIF. 
  ENDIF. 
* 4 check component 
  CALL METHOD check_bct_component 
    EXPORTING 
      i_iobjnm_dep  = i_iobjnm 
      i_bctcomp_dep = e_s_viobj-bctcomp 
      i_depmode     = 'ICE_IOBJNM' 
      i_detlevel    = i_detlevel 
    CHANGING 
      c_subrc       = e_subrc 
      c_r_msg       = c_r_msg. 
ENDMETHOD.                    
* ---------------------------------------------------------------------------------------+ 
* | Instance Private Method CL_RSD_KYF->CHECK_INCREASE_DECREASE 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_KYFNM TYPE RSKYFNM 
* | [--->] I_TEXT TYPE C 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<---] E_S_KYF TYPE RSDO_S_KYF 
* | [<---] E_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD check_increase_decrease . 
  DATA: l_s_viobj_kyf      TYPE  rsd_s_viobj. 
  CLEAR: e_s_kyf, e_subrc. 
  TRY. 
      CALL METHOD cl_rsd_iobj=>get_info_current 
        EXPORTING 
          i_iobjnm   = i_kyfnm 
          i_th_tlogo = i_th_tlogo 
        IMPORTING 
          e_s_viobj  = l_s_viobj_kyf. 
      MOVE-CORRESPONDING l_s_viobj_kyf TO e_s_kyf. 
      e_s_kyf-kyfnm = i_kyfnm. 
* check cumulative type 
      IF e_s_kyf-ncumfl <> rsd_c_ncumfl-cumulative. 
        MESSAGE e536 WITH n_s_iobj-iobjnm i_text i_kyfnm 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Bestandkennzahl &1: &2 &3 muß eine Flußgröße sein 
        e_subrc = 4. 
      ENDIF. 
* check aggregation 
      IF e_s_kyf-aggrgen <> rsd_c_aggr-sum or 
         e_s_kyf-aggrexc <> rsd_c_aggr-sum. 
        MESSAGE e533 WITH n_s_iobj-iobjnm i_text i_kyfnm 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Bestandkennzahl &1: die Aggregation von &2 &3 muß Summe sein 
        e_subrc = 4. 
      ENDIF. 
* get usage in key figures 
      DATA: l_t_kyf_usage TYPE rso_t_tlogo_asc. 
      DATA: l_s_tlogo     TYPE rso_s_tlogo_asc. 
      CALL FUNCTION 'RSD_IOBJ_USAGE'
        EXPORTING 
          i_iobjnm    = i_kyfnm 
          i_th_tlogo  = i_th_tlogo 
          i_objvers   = rs_c_objvers-active 
        IMPORTING 
          e_t_cmp_kyf = l_t_kyf_usage. 
* check database first 
      LOOP AT l_t_kyf_usage INTO l_s_tlogo 
        WHERE objnm   <> n_s_iobj-iobjnm               and 
              ( asc_type = rsoc_c_asc_type-increase or 
                asc_type = rsoc_c_asc_type-decrease   ). 
* check if used in reference key figure 
        DATA: l_s_viobj_tmp     TYPE  rsd_s_viobj. 
        data: l_kyfnm           type  rskyfnm. 
        l_kyfnm = l_s_tlogo-objnm. 
        CALL METHOD cl_rsd_iobj=>get_info_current 
          EXPORTING 
            i_iobjnm   = i_kyfnm 
            i_th_tlogo = i_th_tlogo 
          IMPORTING 
            e_s_viobj  = l_s_viobj_tmp. 
        check: l_s_viobj_tmp-bchreffl = rs_c_false. 
* used as increase / decrease or delta in other keyfigure: 
        MESSAGE e564 WITH n_s_iobj-iobjnm i_text i_kyfnm 
                          l_s_tlogo-objnm 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Bestandkennzahl &1: &2 &3 wird schon bei Bestandkennzahl &4 verwendet 
        e_subrc = 4. 
      ENDLOOP. 
* check component 
      CALL METHOD check_bct_component 
        EXPORTING 
          i_iobjnm_dep  = l_s_viobj_kyf-iobjnm 
          i_bctcomp_dep = l_s_viobj_kyf-bctcomp 
          i_depmode     = 'IOBJCMP' 
          i_detlevel    = i_detlevel 
        CHANGING 
          c_subrc       = e_subrc 
          c_r_msg       = c_r_msg. 
    CATCH cx_rsd_iobj_not_found CX_RS_INPUT_INVALID. 
      MESSAGE e529 WITH n_s_iobj-iobjnm i_text i_kyfnm 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Bestandkennzahl &1: &2 &3 ist nicht (aktiv) vorhanden 
      e_subrc = 4. 
  ENDTRY. 
ENDMETHOD.                    
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->CHECK_INTERNAL 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_REPAIR TYPE RS_BOOL (default =RS_C_TRUE) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<---] E_DYFIE TYPE RS_DYFIE 
* | [<---] E_DYFIE_WARNING TYPE RS_DYFIE 
* | [<---] E_TABIX TYPE SY-TABIX 
* | [<---] E_TABIX_WARNING TYPE SY-TABIX 
* | [<-->] C_SUBRC TYPE SYSUBRC(optional) 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD check_internal. 
  DATA: l_t_chavt TYPE rsdm_t_chavt. 
* 1. call super class 
  CALL METHOD super->check_internal 
    EXPORTING 
      i_repair        = i_repair 
      i_detlevel      = i_detlevel 
    IMPORTING 
      e_dyfie         = e_dyfie 
      e_dyfie_warning = e_dyfie_warning 
      e_tabix         = e_tabix 
      e_tabix_warning = e_tabix_warning 
    CHANGING 
      c_subrc         = c_subrc 
      c_r_msg         = c_r_msg. 
  DATA: l_systp         TYPE rs_systp. 
  DATA: l_subrc         TYPE sysubrc. 
  DATA: l_chavl         TYPE rsd_chavl. 
  DATA: l_err_char      TYPE rs_char1. 
* 0 check / adjust data type 
  DATA: l_s_msg  TYPE  bal_s_msg. 
  DATA: l_t_msg  TYPE  rs_t_msg. 
  CALL FUNCTION 'RSD_KYFTP_DATATP_CHECK'
    EXPORTING 
      i_kyfnm       = n_s_iobj-iobjnm 
* 30B SP10 with domain 
      i_domanm      = n_s_kyf-domanm 
    IMPORTING 
      e_s_msg       = l_s_msg 
    CHANGING 
      c_kyftp       = n_s_kyf-kyftp 
      c_datatp      = n_s_kyf-datatp 
    EXCEPTIONS 
      illegal_kyftp = 1. 
  IF sy-subrc <> 0. 
    c_subrc = 4. 
    e_dyfie = 'RSDGSCIOBJ-AMOFL'. 
    MESSAGE e423(r7) WITH n_s_iobj-iobjnm n_s_kyf-kyftp 
            INTO o_dummy_msg. 
    c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Die Kennzahl &1 hat den ungültigen Typ &2 
  ELSEIF NOT l_s_msg IS INITIAL. 
* add warning 
    APPEND l_s_msg TO l_t_msg. 
    CALL METHOD c_r_msg->add_messages( i_detlevel = i_detlevel 
      i_t_msg = l_t_msg ). 
  ENDIF. 
* 1 check currency / unit 
  IF n_s_kyf-kyftp <> rsd_c_kyftp-amount. 
    CLEAR: n_s_kyf-fixcuky. 
  ENDIF. 
  IF n_s_kyf-kyftp <> rsd_c_kyftp-quantity. 
    CLEAR: n_s_kyf-fixunit. 
  ENDIF. 
  IF n_s_kyf-kyftp = rsd_c_kyftp-amount OR 
     n_s_kyf-kyftp = rsd_c_kyftp-quantity. 
    IF ( NOT n_s_kyf-uninm IS INITIAL        AND 
         ( NOT n_s_kyf-fixcuky IS INITIAL OR 
           NOT n_s_kyf-fixunit IS INITIAL   )    ) OR 
       ( n_s_kyf-uninm   IS INITIAL          AND 
         n_s_kyf-fixcuky IS INITIAL          AND 
         n_s_kyf-fixunit IS INITIAL             ) . 
      MESSAGE e186 INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Entweder Einheiten InfoObject oder Feste Währung/Einheit angeben 
      c_subrc = 4. 
      set_if_initial e_dyfie 'RSDGSCIOBJ-UNINM'. 
    ENDIF. 
* check system type 
    IF NOT n_s_kyf-uninm IS INITIAL  AND 
       is_sap_obj( )     = rs_c_true. 
* get system type of unit 
      CALL FUNCTION 'RSD_NSPACE_PAR_GET_FROM_NAME'
        EXPORTING 
          i_objnm    = n_s_kyf-uninm 
        IMPORTING 
          e_systp    = l_systp 
        EXCEPTIONS 
          name_error = 1. 
      IF sy-subrc = 0                   AND 
         l_systp  = rs_sys_cus. 
        MESSAGE e218 WITH n_s_kyf-uninm l_systp 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Das InfoObject &1 hat den falschen Systemtyp &2 
        c_subrc = 4. 
        set_if_initial e_dyfie 'RSDGSCIOBJ-UNINM'. 
      ENDIF. 
    ENDIF. 
  ELSE. 
    CLEAR: n_s_kyf-uninm. 
  ENDIF. 
* check characters of fix currency / unit 
  IF NOT n_s_kyf-fixcuky IS INITIAL. 
    l_chavl = n_s_kyf-fixcuky. 
    CALL FUNCTION 'RSKC_CHAVL_CHECK'
      EXPORTING 
        i_chavl     = l_chavl 
      IMPORTING 
        e_err_subrc = l_subrc. 
    IF l_subrc <> 0. 
      c_subrc = 4. 
      set_if_initial e_dyfie 'RSDGSCIOBJ-FIXCUKY'. 
      MESSAGE e060(brain) WITH n_s_kyf-fixcuky rsd_c_uninm-currency 
              INTO o_dummy_msg ##MG_PAR_CNT. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Der Merkmalswert '&1' des Merkmals &2 enthält unerlaubte Zeichen 
    ENDIF. 
* check if the fix-value is valid (AP vs. non-AP) 
    CALL FUNCTION 'RSD_CHA_GET_VALUES_SIMPLE'
      EXPORTING 
        i_chanm                   = rsd_c_uninm-currency 
      IMPORTING 
        E_T_CHAVT                 = l_t_chavt 
      EXCEPTIONS 
        ILLEGAL_INFOCUBE          = 1 
        ILLEGAL_INFOOBJECT        = 2 
        X_MESSAGE                 = 3 
        NO_VALUES_AVAILABLE       = 4 
        ILLEGAL_INPUT             = 5 
        OTHERS                    = 99. 
    IF sy-subrc <> 0. 
* Die fixe Währung &1 existiert nicht im System 
      MESSAGE w618(r7) WITH l_chavl INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
    ELSE. 
      READ TABLE l_t_chavt TRANSPORTING NO FIELDS 
           WITH KEY chavl_int = n_s_kyf-fixcuky. 
      IF sy-subrc NE 0. 
* Die fixe Währung &1 existiert nicht im System 
        MESSAGE w618(r7) WITH l_chavl INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
      ENDIF. 
    ENDIF. 
  ENDIF. 
  IF NOT n_s_kyf-fixunit IS INITIAL. 
    l_chavl = n_s_kyf-fixunit. 
    CALL FUNCTION 'RSKC_CHAVL_CHECK'
      EXPORTING 
        i_chavl     = l_chavl 
      IMPORTING 
        e_err_subrc = l_subrc. 
    IF l_subrc <> 0. 
      c_subrc = 4. 
      set_if_initial e_dyfie 'RSDGSCIOBJ-FIXUNIT'. 
      MESSAGE e060(brain) WITH n_s_kyf-fixunit rsd_c_uninm-unit 
              INTO o_dummy_msg ##MG_PAR_CNT . 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Der Merkmalswert '&1' des Merkmals &2 enthält unerlaubte Zeichen 
    ENDIF. 
* check if the fix-value is valid (AP vs. non-AP) 
    CALL FUNCTION 'RSD_CHA_GET_VALUES_SIMPLE'
      EXPORTING 
        i_chanm                   = rsd_c_uninm-unit 
      IMPORTING 
        E_T_CHAVT                 = l_t_chavt 
      EXCEPTIONS 
        ILLEGAL_INFOCUBE          = 1 
        ILLEGAL_INFOOBJECT        = 2 
        X_MESSAGE                 = 3 
        NO_VALUES_AVAILABLE       = 4 
        ILLEGAL_INPUT             = 5 
        OTHERS                    = 99. 
    IF sy-subrc <> 0. 
* Die fixe Einheit &1 existiert nicht im System 
      MESSAGE w617(r7) WITH l_chavl INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
    ELSE. 
      READ TABLE l_t_chavt TRANSPORTING NO FIELDS 
           WITH KEY chavl_int = n_s_kyf-fixunit. 
      IF sy-subrc NE 0. 
* Die fixe Einheit &1 existiert nicht im System 
        MESSAGE w617(r7) WITH l_chavl INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
      ENDIF. 
    ENDIF. 
  ENDIF. 
* 2. check aggregation / cumulative / decrease / increase .... 
  DATA: l_s_cmp            TYPE  rsdo_s_cmp. 
  DATA: l_iobjnm_decrease  TYPE  rsd_iobjnm. 
  DATA: l_iobjnm_increase  TYPE  rsd_iobjnm. 
* call check of OLAP processor 
  CLEAR: l_subrc. 
  DATA: l_s_aggr  TYPE  rri1_s_aggr. 
  MOVE-CORRESPONDING n_s_iobj TO l_s_aggr. 
  MOVE-CORRESPONDING n_s_kyf  TO l_s_aggr. 
  CLEAR: l_t_msg. 
  CALL FUNCTION 'RRI_IOBJ_AGGR_CHECK'
    IMPORTING 
      e_t_msg  = l_t_msg 
      e_subrc  = l_subrc 
    CHANGING 
      c_s_aggr = l_s_aggr. 
  IF l_subrc <> 0. 
    set_if_initial e_dyfie 'RSDGSCIOBJ-AGGRCHA'. 
    c_subrc = 4. 
  ENDIF. 
  CALL METHOD c_r_msg->add_messages( i_detlevel = i_detlevel 
    i_t_msg = l_t_msg ). 
  MOVE-CORRESPONDING l_s_aggr TO n_s_kyf. 
* check system type of aggregation charact. 
  IF NOT n_s_kyf-aggrcha IS INITIAL  AND 
     is_sap_obj( )       =  rs_c_true. 
* get system type of aggregation charact. 
    CALL FUNCTION 'RSD_NSPACE_PAR_GET_FROM_NAME'
      EXPORTING 
        i_objnm    = n_s_kyf-aggrcha 
      IMPORTING 
        e_systp    = l_systp 
      EXCEPTIONS 
        name_error = 1. 
    IF sy-subrc = 0                   AND 
       l_systp  = rs_sys_cus. 
      MESSAGE e218 WITH n_s_kyf-aggrcha l_systp 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Das InfoObject &1 hat den falschen Systemtyp &2 
      c_subrc = 4. 
      set_if_initial e_dyfie 'RSDGSCIOBJ-AGGRCHA'. 
    ENDIF. 
  ENDIF. 
* BI 7.0 SP10: Warning for KeyFigures of type Date / Time 
* and Aggregation SUM 
  IF ( n_s_kyf-kyftp EQ rsd_c_kyftp-date OR 
       n_s_kyf-kyftp EQ rsd_c_kyftp-time ) AND 
       n_s_kyf-aggrgen EQ rsd_c_aggr-sum. 
    MESSAGE w631(r7b) WITH n_s_iobj-iobjnm INTO o_dummy_msg. 
* Kennzahl &1: Aggregation 'Summe' wurde gewählt 
    c_r_msg->add_msg( i_detlevel = i_detlevel ). 
  ENDIF. 
* BI 7.0 SP14: Warning for KeyFigures of type Date / Time 
* and ExceptionalAggregation SUM 
  IF ( n_s_kyf-kyftp EQ rsd_c_kyftp-date OR 
       n_s_kyf-kyftp EQ rsd_c_kyftp-time ) AND 
       n_s_kyf-aggrexc EQ rsd_c_aggr-sum. 
    MESSAGE w630(r7b) WITH n_s_iobj-iobjnm INTO o_dummy_msg. 
* Kennzahl &1: Ausnahmeaggregation 'Summe' wurde gewählt 
    c_r_msg->add_msg( i_detlevel = i_detlevel ). 
  ENDIF. 
* BI 7.0, SP15: KeyFigures of type Date / Time and datatype 
* DATS or TIMS and ExceptionalAggregation SUM is not valid anymore 
  IF ( ( n_s_kyf-kyftp EQ rsd_c_kyftp-date AND 
         n_s_kyf-datatp EQ rsd_c_datatp-date ) OR 
       ( n_s_kyf-kyftp EQ rsd_c_kyftp-time AND 
         n_s_kyf-datatp EQ rsd_c_datatp-time ) ) AND 
       ( n_s_kyf-aggrexc EQ rsd_c_aggr-sum OR 
         n_s_kyf-aggrgen EQ rsd_c_aggr-sum ). 
    MESSAGE w634(r7b) WITH n_s_iobj-iobjnm n_s_kyf-datatp 
      INTO o_dummy_msg. 
* Kennzahl &1: (Ausnahme-) Aggregation 'Summe' für Datentyp 
* &2 unzulässig 
    c_r_msg->add_msg( i_detlevel = i_detlevel ). 
  ENDIF. 
* cumulative type 
  CASE n_s_kyf-ncumfl. 
    WHEN rsd_c_ncumfl-cumulative. 
      DELETE n_t_cmp WHERE cmptp = rsd_c_cmptp-increase OR 
                           cmptp = rsd_c_cmptp-decrease. 
      IF sy-subrc = 0. 
        MESSAGE w530 WITH n_s_iobj-iobjnm n_s_kyf-ncumfl 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1: Zeilen wurden aus der Klammerung gelöscht (Bestandst. &2) 
      ENDIF. 
    WHEN rsd_c_ncumfl-delta. 
      DELETE n_t_cmp WHERE cmptp = rsd_c_cmptp-decrease. 
      IF sy-subrc = 0. 
        MESSAGE w530 WITH n_s_iobj-iobjnm n_s_kyf-ncumfl 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1: Zeilen wurden aus der Klammerung gelöscht (Bestandst. &2) 
      ENDIF. 
    WHEN rsd_c_ncumfl-incdec. 
* delete additional decreases 
      CLEAR: l_s_cmp. 
      READ TABLE n_t_cmp INTO l_s_cmp 
           WITH KEY cmptp  = rsd_c_cmptp-decrease. 
      l_iobjnm_decrease = l_s_cmp-iobjcmp. 
      DELETE n_t_cmp WHERE iobjcmp <> l_s_cmp-iobjcmp   AND 
                           cmptp   =  rsd_c_cmptp-decrease. 
* check system type of decrease 
      IF NOT l_iobjnm_decrease IS INITIAL  AND 
         is_sap_obj( )          =  rs_c_true. 
* get system type of decrease 
        CALL FUNCTION 'RSD_NSPACE_PAR_GET_FROM_NAME'
          EXPORTING 
            i_objnm    = l_iobjnm_decrease 
          IMPORTING 
            e_systp    = l_systp 
          EXCEPTIONS 
            name_error = 1. 
        IF sy-subrc = 0                   AND 
           l_systp  = rs_sys_cus. 
          MESSAGE e218 WITH l_iobjnm_decrease l_systp 
                  INTO o_dummy_msg. 
          c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Das InfoObject &1 hat den falschen Systemtyp &2 
          c_subrc = 4. 
          set_if_initial e_dyfie 'RSDGSCIOBJ-DECREASE'. 
        ENDIF. 
      ENDIF. 
    WHEN OTHERS. 
      n_s_kyf-ncumfl = rsd_c_ncumfl-cumulative. 
  ENDCASE. 
* check compound type of delta / increase 
  IF n_s_kyf-ncumfl = rsd_c_ncumfl-delta OR 
     n_s_kyf-ncumfl = rsd_c_ncumfl-incdec. 
* check compound type of delta / increase 
    CLEAR: l_s_cmp. 
    READ TABLE n_t_cmp INTO l_s_cmp 
         WITH KEY cmptp  = rsd_c_cmptp-increase. 
    l_iobjnm_increase = l_s_cmp-iobjcmp. 
    DELETE n_t_cmp WHERE iobjcmp <> l_s_cmp-iobjcmp    AND 
                         cmptp   =  rsd_c_cmptp-increase. 
* check system type of increase 
    IF NOT l_iobjnm_increase IS INITIAL  AND 
       is_sap_obj( )          =  rs_c_true. 
* get system type of increase 
      CALL FUNCTION 'RSD_NSPACE_PAR_GET_FROM_NAME'
        EXPORTING 
          i_objnm    = l_iobjnm_increase 
        IMPORTING 
          e_systp    = l_systp 
        EXCEPTIONS 
          name_error = 1. 
      IF sy-subrc = 0                   AND 
         l_systp  = rs_sys_cus. 
        MESSAGE e218 WITH l_iobjnm_increase l_systp 
                INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Das InfoObject &1 hat den falschen Systemtyp &2 
        c_subrc = 4. 
        IF n_s_kyf-ncumfl = rsd_c_ncumfl-delta. 
          set_if_initial e_dyfie 'RSDGSCIOBJ-DELTAVAL'. 
        ELSE. 
          set_if_initial e_dyfie 'RSDGSCIOBJ-INCREASE'. 
        ENDIF. 
      ENDIF. 
    ENDIF. 
  ENDIF. 
* check system type of aggregation charact. 
  IF NOT n_s_kyf-aggrcha IS INITIAL  AND 
     is_sap_obj( )       =  rs_c_true. 
* get system type of aggregation charact. 
    CALL FUNCTION 'RSD_NSPACE_PAR_GET_FROM_NAME'
      EXPORTING 
        i_objnm    = n_s_kyf-aggrcha 
      IMPORTING 
        e_systp    = l_systp 
      EXCEPTIONS 
        name_error = 1. 
    IF sy-subrc = 0                   AND 
       l_systp  = rs_sys_cus. 
      MESSAGE e218 WITH n_s_kyf-aggrcha l_systp 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Das InfoObject &1 hat den falschen Systemtyp &2 
      c_subrc = 4. 
      set_if_initial e_dyfie 'RSDGSCIOBJ-AGGRCHA'. 
    ENDIF. 
  ENDIF. 
* check decrease unequal increase 
  IF n_s_kyf-ncumfl       = rsd_c_ncumfl-incdec AND 
     NOT l_iobjnm_decrease IS INITIAL             AND 
     l_iobjnm_decrease     =  l_iobjnm_increase. 
    MESSAGE e534 WITH n_s_iobj-iobjnm 
            INTO o_dummy_msg. 
    c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Bestandkennzahl &1: Abgang und Zugang müssen unterschiedlich sein 
    c_subrc = 4. 
    set_if_initial e_dyfie 'RSDGSCIOBJ-INCREASE'. 
  ENDIF. 
* fixed keyfigure not allowed for non cumulative keyfigures 
  IF n_s_kyf-ncumfl <> rsd_c_ncumfl-cumulative. 
    DELETE n_t_cmp WHERE cmptp  = rsd_c_cmptp-fixed_keyfigure. 
    IF sy-subrc = 0. 
      MESSAGE w594 WITH n_s_iobj-iobjnm 
              INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1 ist Bestandsgröße: Fixierte Kennzahl ist nicht erlaubt 
    ENDIF. 
  ENDIF. 
* check not compound to itself 
  READ TABLE n_t_cmp TRANSPORTING NO FIELDS 
       WITH KEY iobjcmp = n_s_iobj-iobjnm. 
  IF sy-subrc = 0. 
    MESSAGE e595 WITH n_s_iobj-iobjnm 
                 INTO o_dummy_msg. 
    c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1 darf nicht mit sich selbst verbunden sein 
    c_subrc = 4. 
  ENDIF. 
* check flag for high precision 
  me->check_highprecfl( EXPORTING i_detlevel = i_detlevel 
                        CHANGING  c_r_msg = c_r_msg ). 
ENDMETHOD. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->CHECK_VERS_A 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_VERS_A TYPE REF TO CL_RSD_IOBJ_VERS 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_AFTER_IMPORT_MODE TYPE RS_BOOL (default =RS_C_FALSE) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD check_vers_a. 
  CALL METHOD super->check_vers_a 
  EXPORTING 
    i_r_vers_a          = i_r_vers_a 
    i_th_tlogo          = i_th_tlogo 
    i_after_import_mode = i_after_import_mode 
    i_detlevel          = i_detlevel 
  CHANGING 
    c_subrc             = c_subrc 
    c_r_msg             = c_r_msg. 
* cast from IOBJ_VERS to KYF 
  DATA: l_r_kyf_a   TYPE  REF TO cl_rsd_kyf. 
  l_r_kyf_a = cast_from_iobj_vers( i_r_vers_a ). 
  CHECK: NOT l_r_kyf_a IS INITIAL. 
* 1. aggregation charact. changed --> warning aggregates 
  IF n_s_kyf-aggrcha <> l_r_kyf_a->n_s_kyf-aggrcha. 
    MESSAGE w580 WITH n_s_iobj-iobjnm 
                      l_r_kyf_a->n_s_kyf-aggrcha 
                      n_s_kyf-aggrcha 
            INTO O_DUMMY_MSG. 
    c_r_msg->add_msg( I_detlevel = i_detlevel ). 
* Kennzahl &1: Aggr.Bezugsmerkmal geändert --> Bitte Aggregate anpassen 
  ENDIF. 
* change of reference is possible although only via transport - not in the dialog 
ENDMETHOD. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->CHECK_VERS_A_DTA_IMPACT_INT 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_TLOGO TYPE RSTLOGO 
* | [--->] I_R_VERS_A TYPE REF TO CL_RSD_IOBJ_VERS 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_CHECK_MODE TYPE RS_BOOL (default =RS_C_TRUE) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<---] E_T_DTA_DEACTIV TYPE RSO_T_TLOGO 
* | [<-->] C_R_MSG_ERROR TYPE REF TO CL_RSO_MSG 
* | [<-->] C_R_MSG_DATA TYPE REF TO CL_RSO_MSG 
* | [<-->] C_R_MSG_DATA_REF TYPE REF TO CL_RSO_MSG 
* | [<-->] C_R_MSG_DEACTIV_DATA TYPE REF TO CL_RSO_MSG 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG 
* +-------------------------------------------------------------------------------------- 
METHOD check_vers_a_dta_impact_int. 
  CALL METHOD super->check_vers_a_dta_impact_int 
    EXPORTING 
      i_tlogo              = i_tlogo 
      i_r_vers_a           = i_r_vers_a 
      i_th_tlogo           = i_th_tlogo 
      i_check_mode         = i_check_mode 
      i_detlevel           = i_detlevel 
    IMPORTING 
      e_t_dta_deactiv      = e_t_dta_deactiv 
    CHANGING 
      c_r_msg_error        = c_r_msg_error 
      c_r_msg_data         = c_r_msg_data 
      c_r_msg_data_ref     = c_r_msg_data_ref 
      c_r_msg_deactiv_data = c_r_msg_deactiv_data 
      c_r_msg              = c_r_msg. 
* cast from IOBJ_VERS to KYF 
  DATA: l_r_kyf_a   TYPE  REF TO cl_rsd_kyf. 
  l_r_kyf_a = cast_from_iobj_vers( i_r_vers_a ). 
  CHECK: NOT l_r_kyf_a IS INITIAL. 
* data type changed --> only allowed if no data in data target 
  IF n_s_kyf-datatp              <> l_r_kyf_a->n_s_kyf-datatp AND 
     ( NOT l_r_kyf_a->n_s_kyf-datatp IS INITIAL                ) . 
    MESSAGE e528 WITH n_s_iobj-iobjnm 
                      'Datentyp'(073) 
                      l_r_kyf_a->n_s_kyf-datatp 
                      n_s_kyf-datatp 
            INTO o_dummy_msg. 
    CALL METHOD c_r_msg_data->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
  ENDIF. 
* length or decimal places changed -> only allowed if no data in data target 
  IF n_s_kyf-domanm <> l_r_kyf_a->n_s_kyf-domanm. 
    DATA: l_domanm   TYPE domname. l_domanm = n_s_kyf-domanm. 
    DATA: l_domanm_a TYPE domname. l_domanm = l_r_kyf_a->n_s_kyf-domanm. 
    IF l_domanm IS INITIAL. 
      DATA: l_s_viobj  TYPE  rsd_s_viobj. 
      CALL METHOD get_info 
        IMPORTING 
          e_s_viobj = l_s_viobj. 
      CALL FUNCTION 'RSD_DOMANM_GET_FOR_IOBJ'
        EXPORTING 
          i_s_viobj = l_s_viobj 
        IMPORTING 
          e_domanm  = l_domanm. 
    ENDIF. 
    IF l_domanm_a IS INITIAL. 
      CALL METHOD l_r_kyf_a->get_info 
        IMPORTING 
          e_s_viobj = l_s_viobj. 
      CALL FUNCTION 'RSD_DOMANM_GET_FOR_IOBJ'
        EXPORTING 
          i_s_viobj = l_s_viobj 
        IMPORTING 
          e_domanm  = l_domanm_a. 
    ENDIF. 
    DATA: l_s_doma   TYPE  rsd_s_doma. 
    DATA: l_s_doma_a TYPE  rsd_s_doma. 
    CALL FUNCTION 'RSD_DOMA_GET'
      EXPORTING 
        i_domanm       = l_domanm 
      IMPORTING 
        e_s_doma       = l_s_doma 
      EXCEPTIONS 
        doma_not_found = 1 
        illegal_input  = 2. 
    IF sy-subrc = 0. 
      CALL FUNCTION 'RSD_DOMA_GET'
        EXPORTING 
          i_domanm       = l_domanm_a 
        IMPORTING 
          e_s_doma       = l_s_doma_a 
        EXCEPTIONS 
          doma_not_found = 1 
          illegal_input  = 2. 
      IF sy-subrc = 0. 
        IF l_s_doma-digits < l_s_doma_a-digits. 
          MESSAGE e528 WITH n_s_iobj-iobjnm 
                            'Zahl der Stellen'(001) 
                            l_s_doma_a-digits 
                            l_s_doma-digits 
                  INTO o_dummy_msg. 
          CALL METHOD c_r_msg_data->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
        ENDIF. 
        IF l_s_doma-decimals <> l_s_doma_a-decimals. 
          MESSAGE e528 WITH n_s_iobj-iobjnm 
                            'Dezimalstellen'(002) 
                            l_s_doma_a-decimals 
                            l_s_doma-decimals 
                  INTO o_dummy_msg. 
          CALL METHOD c_r_msg_data->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
        ENDIF. 
      ENDIF. 
    ENDIF. 
  ENDIF. 
* fix unit changed --> only allowed if no data in data target 
  IF n_s_kyf-fixunit <> l_r_kyf_a->n_s_kyf-fixunit. 
    MESSAGE e528 WITH n_s_iobj-iobjnm 
                      'Feste Einheit            '(126) 
                      l_r_kyf_a->n_s_kyf-fixunit 
                      n_s_kyf-fixunit 
            INTO o_dummy_msg. 
    CALL METHOD c_r_msg_data->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
  ENDIF. 
* fix currency changed --> only allowed if no data in data target 
  IF n_s_kyf-fixcuky <> l_r_kyf_a->n_s_kyf-fixcuky. 
    MESSAGE e528 WITH n_s_iobj-iobjnm 
                      'Feste Währung            '(127) 
                      l_r_kyf_a->n_s_kyf-fixcuky 
                      n_s_kyf-fixcuky 
            INTO o_dummy_msg. 
    CALL METHOD c_r_msg_data->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
  ENDIF. 
* SP13 check if reference field new -> deactivate data targets 
* otherwise this leads to automatic activation in DDIC but the 
* dependent tables become inconsistent (reference field is missing) 
* this stops the upgrade in the ddic activation phase !!! 
* details: see not 616361 
  IF ( n_s_kyf-kyftp = rsd_c_kyftp-amount OR 
       n_s_kyf-kyftp = rsd_c_kyftp-quantity ) AND 
     n_s_kyf-kyftp <> l_r_kyf_a->n_s_kyf-kyftp. 
    MESSAGE e528 WITH n_s_iobj-iobjnm 
                      'Kennzahltyp          '(003) 
                      l_r_kyf_a->n_s_kyf-kyftp 
                      n_s_kyf-kyftp 
                 INTO o_dummy_msg. 
    CALL METHOD c_r_msg_deactiv_data->add_msg( 
      i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
  ENDIF. 
* end SP13 
* unit InfoObject changed --> only allowed if no data in data target 
* --> deactivation of data target 
  IF n_s_kyf-uninm <> l_r_kyf_a->n_s_kyf-uninm. 
    MESSAGE e528 WITH n_s_iobj-iobjnm 
                      'Einheit / Währung          '(128) 
                      l_r_kyf_a->n_s_kyf-uninm 
                      n_s_kyf-uninm 
            INTO o_dummy_msg. 
    CALL METHOD c_r_msg_deactiv_data->add_msg( 
      i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
  ENDIF. 
* fixed keyfigure changed --> only allowed if no data in data target 
* --> deactivation of data target 
  DATA: l_s_cmp_active    TYPE rsdo_s_cmp. 
  DATA: l_s_cmp           TYPE rsdo_s_cmp. 
  READ TABLE n_t_cmp INTO l_s_cmp 
       WITH KEY cmptp  = rsd_c_cmptp-fixed_keyfigure. 
  READ TABLE l_r_kyf_a->n_t_cmp INTO l_s_cmp_active 
       WITH KEY cmptp  = rsd_c_cmptp-fixed_keyfigure. 
  IF l_s_cmp-iobjcmp <> l_s_cmp_active-iobjcmp. 
    MESSAGE e528 WITH n_s_iobj-iobjnm 
                      'Fixierte Kennzahl'(025) 
                      l_s_cmp_active-iobjcmp 
                      l_s_cmp-iobjcmp 
            INTO o_dummy_msg. 
    CALL METHOD c_r_msg_deactiv_data->add_msg( 
      i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
  ENDIF. 
  IF i_tlogo = rs_c_tlogo-infocube. 
* aggregation changed --> only allowed if no data in cube 
    IF n_s_kyf-aggrgen <> l_r_kyf_a->n_s_kyf-aggrgen. 
      MESSAGE e528 WITH n_s_iobj-iobjnm 
                        'Aggregation                '(129) 
                        l_r_kyf_a->n_s_kyf-aggrgen 
                        n_s_kyf-aggrgen 
             INTO o_dummy_msg. 
      CALL METHOD c_r_msg_data->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
    ENDIF. 
* cumulative type changed --> only allowed if no data in cube 
* --> deactivation of InfoCube 
    IF n_s_kyf-ncumfl <> l_r_kyf_a->n_s_kyf-ncumfl. 
      MESSAGE e528 WITH n_s_iobj-iobjnm 
                        'Bestandstyp               '(131) 
                        l_r_kyf_a->n_s_kyf-ncumfl 
                        n_s_kyf-ncumfl 
              INTO o_dummy_msg. 
      CALL METHOD c_r_msg_deactiv_data->add_msg( 
        i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
    ENDIF. 
* delta / increase changed --> only allowed if no data in cube 
* --> deactivation of InfoCube 
    IF n_s_kyf-ncumfl = rsd_c_ncumfl-delta OR 
       n_s_kyf-ncumfl = rsd_c_ncumfl-incdec. 
      CLEAR: l_s_cmp, l_s_cmp_active. 
      READ TABLE n_t_cmp INTO l_s_cmp 
           WITH KEY cmptp  = rsd_c_cmptp-increase. 
      READ TABLE l_r_kyf_a->n_t_cmp INTO l_s_cmp_active 
           WITH KEY cmptp  = rsd_c_cmptp-increase. 
      IF l_s_cmp-iobjcmp <> l_s_cmp_active-iobjcmp. 
        MESSAGE e528 WITH n_s_iobj-iobjnm 
                 'Bestandveränderung / Zugang                '(132) 
                          l_s_cmp_active-iobjcmp 
                          l_s_cmp-iobjcmp 
                INTO o_dummy_msg. 
        CALL METHOD c_r_msg_deactiv_data->add_msg( 
          i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
      ENDIF. 
    ENDIF. 
* decrease changed --> only allowed if no data in cube 
* --> deactivation of InfoCube 
    IF n_s_kyf-ncumfl = rsd_c_ncumfl-incdec. 
      CLEAR: l_s_cmp, l_s_cmp_active. 
      READ TABLE n_t_cmp INTO l_s_cmp 
           WITH KEY cmptp  = rsd_c_cmptp-decrease. 
      READ TABLE l_r_kyf_a->n_t_cmp INTO l_s_cmp_active 
           WITH KEY cmptp  = rsd_c_cmptp-decrease. 
      IF l_s_cmp-iobjcmp <> l_s_cmp_active-iobjcmp. 
        MESSAGE e528 WITH n_s_iobj-iobjnm 
                          'Abgang'(133) 
                          l_s_cmp_active-iobjcmp 
                          l_s_cmp-iobjcmp 
                INTO o_dummy_msg. 
        CALL METHOD c_r_msg_deactiv_data->add_msg( 
          i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
      ENDIF. 
    ENDIF. 
  ENDIF.          "InfoCube 
ENDMETHOD.                    
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->CHECK_VERS_A_IOBJ_IMPACT 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_VERS_A TYPE REF TO CL_RSD_IOBJ_VERS 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_CHECK_MODE TYPE RS_BOOL (default =RS_C_TRUE) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD check_vers_a_iobj_impact. 
  CALL METHOD super->check_vers_a_iobj_impact 
    EXPORTING 
      i_r_vers_a   = i_r_vers_a 
      i_th_tlogo   = i_th_tlogo 
      i_check_mode = i_check_mode 
      i_detlevel   = i_detlevel 
    CHANGING 
      c_subrc      = c_subrc 
      c_r_msg      = c_r_msg. 
* cast from IOBJ_VERS to KYF 
  DATA: l_r_kyf_a   TYPE  REF TO cl_rsd_kyf. 
  l_r_kyf_a = cast_from_iobj_vers( i_r_vers_a ). 
  CHECK: NOT l_r_kyf_a IS INITIAL. 
  DATA: l_s_usage          TYPE  rs_s_used_by. 
* 1.change of keyfigure type / unit not allowed for keyfigures 
* used in noncumulative keyfigures 
  DATA: l_t_cmp_usage      TYPE  rs_t_used_by. 
  IF i_check_mode      = rs_c_true                       AND 
     ( n_s_kyf-kyftp   <> l_r_kyf_a->n_s_kyf-kyftp   OR 
       n_s_kyf-uninm   <> l_r_kyf_a->n_s_kyf-uninm   OR 
       n_s_kyf-fixunit <> l_r_kyf_a->n_s_kyf-fixunit OR 
       n_s_kyf-fixcuky <> l_r_kyf_a->n_s_kyf-fixcuky   ). 
* get usage in compound 
    CALL FUNCTION 'RSD_IOBJ_USAGE'
         EXPORTING 
              i_iobjnm     = l_r_kyf_a->n_s_iobj-iobjnm 
              i_iobjtp     = l_r_kyf_a->n_s_iobj-iobjtp 
* mix usage with current InfoObjects 
              i_th_tlogo   = i_th_tlogo 
              i_objvers    = rs_c_objvers-active 
         IMPORTING 
              e_t_cmp_iobj = l_t_cmp_usage. 
* usage in fixed key figure "!&APO 
    LOOP AT l_t_cmp_usage INTO l_s_usage. 
* get the current non cumulative keyfigure 
* (may be changed simultaneously) 
      DATA: l_s_viobj  TYPE  rsd_s_viobj. 
      TRY. 
          CALL METHOD cl_rsd_iobj=>get_info_current 
            EXPORTING 
              i_iobjnm   = l_s_usage-tobjnm 
              i_th_tlogo = i_th_tlogo 
            IMPORTING 
              e_s_viobj  = l_s_viobj. 
* and check type / unit 
          IF l_s_viobj-iobjtp = rsd_c_objtp-keyfigure    AND 
             ( n_s_kyf-kyftp   <> l_s_viobj-kyftp   OR 
               n_s_kyf-uninm   <> l_s_viobj-uninm   OR 
               n_s_kyf-fixunit <> l_s_viobj-fixunit OR 
               n_s_kyf-fixcuky <> l_s_viobj-fixcuky   ) . 
            c_subrc = 4. 
            MESSAGE e548 WITH l_r_kyf_a->n_s_iobj-iobjnm l_s_usage-tobjnm 
                    INTO o_dummy_msg. 
            c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1 wird in Bestandkennzahl &2 verwendet Typ nicht änderbar 
          ENDIF. 
        CATCH cx_rsd_iobj_not_found. 
* nothing to do 
      ENDTRY. 
    ENDLOOP. 
  ENDIF. 
* 2. from SP13 change of unit not allowed for keyfigures 
* used as attributes (except if new unit is also attribute) 
  DATA: l_t_atr_usage      TYPE  rs_t_used_by. 
  IF i_check_mode  = rs_c_true                 AND 
     n_s_kyf-uninm <> l_r_kyf_a->n_s_kyf-uninm AND 
     NOT n_s_kyf-uninm IS INITIAL. 
* get usage as attibute 
    CALL FUNCTION 'RSD_IOBJ_USAGE'
         EXPORTING 
              i_iobjnm     = n_s_iobj-iobjnm 
              i_iobjtp     = l_r_kyf_a->n_s_iobj-iobjtp 
* mix usage with current InfoObjects 
              i_th_tlogo   = i_th_tlogo 
              i_objvers    = rs_c_objvers-active 
         IMPORTING 
              e_t_atr_iobj = l_t_atr_usage. 
    LOOP AT l_t_atr_usage INTO l_s_usage. 
* get the current attributes 
* (may be changed simultaneously) 
      TRY. 
          DATA: l_t_atr TYPE rsdo_t_atr. 
          CALL METHOD cl_rsd_iobj=>get_info_current 
            EXPORTING 
              i_iobjnm   = l_s_usage-tobjnm 
              i_th_tlogo = i_th_tlogo 
            IMPORTING 
              e_t_atr    = l_t_atr. 
* check if new unit as attribute as well 
          READ TABLE l_t_atr TRANSPORTING NO FIELDS 
               WITH KEY attrinm = n_s_kyf-uninm. 
          IF sy-subrc = 4. 
            c_subrc = 4. 
            MESSAGE e244(r7b) WITH n_s_iobj-iobjnm l_s_usage-tobjnm n_s_kyf-uninm 
                    INTO o_dummy_msg. 
            c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Kennzahl &1 wird ist Attribut von Merkmal &2 Einheit &3 aber nicht 
          ENDIF. 
        CATCH cx_rsd_iobj_not_found. 
* nothing to do 
      ENDTRY. 
    ENDLOOP. 
  ENDIF. 
* 3. from SP13 
* check if reference field new -> deactivate data targets 
* otherwise this leads to automatic activation in DDIC but the 
* dependent tables become inconsistent (reference field is missing) 
* this stops the upgrade in the ddic activation phase !!! 
* details: see not 616361 
  IF ( n_s_kyf-kyftp = rsd_c_kyftp-amount OR 
       n_s_kyf-kyftp = rsd_c_kyftp-quantity ) AND 
     n_s_kyf-kyftp <> l_r_kyf_a->n_s_kyf-kyftp. 
* get usage as attribute 
    CALL FUNCTION 'RSD_IOBJ_USAGE'
         EXPORTING 
              i_iobjnm     = n_s_iobj-iobjnm 
              i_iobjtp     = l_r_kyf_a->n_s_iobj-iobjtp 
* mix usage with current InfoObjects 
              i_th_tlogo   = i_th_tlogo 
              i_objvers    = rs_c_objvers-active 
         IMPORTING 
              e_t_atr_iobj = l_t_atr_usage. 
* remove InfoObjects that are activated as well 
* their tables will be adjusted (reference field will be included) 
    LOOP AT l_t_atr_usage INTO l_s_usage. 
      READ TABLE i_th_tlogo TRANSPORTING NO FIELDS 
           WITH table KEY tlogo = rs_c_tlogo-infoobject 
                          objnm = l_s_usage-tobjnm. 
      IF sy-subrc = 0. 
        DELETE l_t_atr_usage. 
      ENDIF. 
    ENDLOOP. 
    IF NOT l_t_atr_usage IS INITIAL. 
      MESSAGE w528 WITH n_s_iobj-iobjnm 
                        'Kennzahltyp          '(003) 
                        l_r_kyf_a->n_s_kyf-kyftp 
                        n_s_kyf-kyftp 
                   INTO o_dummy_msg. 
      CALL METHOD c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
    ENDIF. 
* deactivate InfoObjects 
    LOOP AT l_t_atr_usage INTO l_s_usage. 
      IF i_check_mode = rs_c_false. 
        DATA: l_r_iobj  TYPE  REF TO cl_rsd_iobj. 
        CLEAR: l_s_viobj. 
        l_r_iobj = cl_rsd_iobj=>factory( l_s_usage-tobjnm ). 
        IF sy-subrc = 0. 
          CALL METHOD l_r_iobj->get_info 
            EXPORTING 
              i_objvers = rs_c_objvers-active 
            IMPORTING 
              e_s_viobj = l_s_viobj 
            EXCEPTIONS 
              not_found = 1. 
          IF sy-subrc           = 0                        AND 
             ( l_s_viobj-objstat = rs_c_objstat-active   OR 
               l_s_viobj-objstat = rs_c_objstat-productive ) . 
            CALL METHOD l_r_iobj->deactivate. 
            MESSAGE w482 WITH l_s_usage-tobjnm INTO o_dummy_msg. 
            CALL METHOD c_r_msg->add_msg( i_detlevel = i_detlevel 
              i_probclass = '1' ). 
* InfoObject &1 wurde deaktiviert (Der Status wurde auf 'inaktiv' gesetzt) 
          ENDIF. 
        ENDIF. 
      ELSEIF i_check_mode = rs_c_true. 
        MESSAGE w018(r7i) WITH l_s_usage-tobjnm INTO o_dummy_msg. 
        c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Datenziel &1 wird beim Aktivieren auf "inaktiv" gesetzt 
      ENDIF. 
    ENDLOOP.                         " i_t_dta_deactiv 
  ENDIF.   "reference field new 
ENDMETHOD.                    
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->CHECK_VERS_A_ISCS_IMPACT 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_VERS_A TYPE REF TO CL_RSD_IOBJ_VERS 
* | [--->] I_TH_TLOGO TYPE RSO_TH_TLOGO(optional) 
* | [--->] I_CHECK_MODE TYPE RS_BOOL (default =RS_C_TRUE) 
* | [--->] I_AFTER_IMPORT_MODE TYPE RS_BOOL (default =RS_C_FALSE) 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG(optional) 
* +-------------------------------------------------------------------------------------- 
method CHECK_VERS_A_ISCS_IMPACT. 
* new in SP13 
  CALL METHOD super->check_vers_a_iscs_impact 
    EXPORTING 
      i_r_vers_a          = i_r_vers_a 
      i_th_tlogo          = i_th_tlogo 
      i_check_mode        = i_check_mode 
      i_after_import_mode = i_after_import_mode 
      i_detlevel          = i_detlevel 
    CHANGING 
      c_subrc             = c_subrc 
      c_r_msg             = c_r_msg. 
* cast from IOBJ_VERS to KYF 
  DATA: l_r_kyf_a   TYPE  REF TO cl_rsd_kyf. 
  l_r_kyf_a = cast_from_iobj_vers( i_r_vers_a ). 
  CHECK: NOT l_r_kyf_a IS INITIAL. 
* 3. from SP13 
* check if reference field new -> deactivate communication structures 
* otherwise this leads to automatic activation in DDIC but the 
* dependent tables become inconsistent (reference field is missing) 
* this stops the upgrade in the ddic activation phase !!! 
* details: see not 616361 
  IF ( n_s_kyf-kyftp = rsd_c_kyftp-amount OR 
       n_s_kyf-kyftp = rsd_c_kyftp-quantity ) AND 
     n_s_kyf-kyftp <> l_r_kyf_a->n_s_kyf-kyftp. 
* get usage in commstructures 
    DATA: l_t_iscs_usage TYPE rs_t_used_by. 
    DATA: l_s_usage      TYPE rs_s_used_by. 
    CALL FUNCTION 'RSD_IOBJ_USAGE'
         EXPORTING 
              i_iobjnm     = n_s_iobj-iobjnm 
              i_iobjtp     = l_r_kyf_a->n_s_iobj-iobjtp 
* mix usage with current objects 
              i_th_tlogo   = i_th_tlogo 
              i_objvers    = rs_c_objvers-active 
         IMPORTING 
              e_t_iscs     = l_t_iscs_usage. 
* remove Communication Structures that are activated as well 
* their tables will be adjusted (reference field will be included) 
    LOOP AT l_t_iscs_usage INTO l_s_usage. 
      READ TABLE i_th_tlogo TRANSPORTING NO FIELDS 
           WITH TABLE KEY tlogo = rs_c_tlogo-infoobject 
                          objnm = l_s_usage-tobjnm. 
      IF sy-subrc = 0. 
        DELETE l_t_iscs_usage. 
      ENDIF. 
    ENDLOOP. 
    IF NOT l_t_iscs_usage IS INITIAL. 
      MESSAGE w528 WITH n_s_iobj-iobjnm 
                        'Kennzahltyp          '(003) 
                        l_r_kyf_a->n_s_kyf-kyftp 
                        n_s_kyf-kyftp 
                   INTO o_dummy_msg. 
      CALL METHOD c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* InfoObject &1: &2 wurde von '&3' auf '&4' geändert 
    ENDIF. 
* deactivate Communication Structures 
    LOOP AT l_t_iscs_usage INTO l_s_usage. 
      MESSAGE w245(r7b) WITH l_s_usage-tobjnm INTO o_dummy_msg. 
      c_r_msg->add_msg( i_detlevel = i_detlevel ). 
* Komm.Struktur &1 wird inkonsistent und muß erneut aktiviert werden 
* IF i_check_mode = rs_c_false. 
* Joachim wegen Baustein und Nachrichten fragen !!!! 
* CALL FUNCTION 'RSAR_COMSTRUCTURE_DEACTIVATE' 
* EXPORTING 
* i_comstru = l_s_usage-tobjnm 
* EXCEPTIONS 
* unknown_comstructure = 1 
* invalid_comstructure = 2 
* object_locked = 3 
* OTHERS = 4. 
* IF sy-subrc = 0. 
* MESSAGE w482 WITH l_s_usage-tobjnm INTO o_dummy_msg. 
* CALL METHOD c_r_msg->add_msg( i_detlevel = i_detlevel 
* i_probclass = '1' ). 
** InfoObject &1 wurde deaktiviert (Der Status wurde auf 'inaktiv' gesetzt) 
* ENDIF. 
* ELSEIF i_check_mode = rs_c_true. 
* MESSAGE w018(r7i) WITH l_s_usage-tobjnm INTO o_dummy_msg. 
* c_r_msg->add_msg( i_detlevel = i_detlevel ). 
** Datenziel &1 wird beim Aktivieren auf "inaktiv" gesetzt 
* ENDIF. 
    ENDLOOP. 
  ENDIF.   "reference field new 
endmethod. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Public Method CL_RSD_KYF->COMPARE 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_VERS TYPE REF TO CL_RSD_IOBJ_VERS 
* | [<-()] R_IS_EQUAL TYPE RS_BOOL 
* +-------------------------------------------------------------------------------------- 
METHOD compare . 
  CALL METHOD super->compare 
    EXPORTING 
      i_r_vers   = i_r_vers 
    RECEIVING 
      r_is_equal = r_is_equal. 
  CHECK: r_is_equal = rs_c_true. 
* cast from IOBJ_VERS to kyf 
  DATA: l_r_kyf   TYPE  REF TO cl_rsd_kyf. 
  l_r_kyf = cast_from_iobj_vers( i_r_vers ). 
  IF l_r_kyf IS INITIAL. 
    r_is_equal = rs_c_false. 
    EXIT. 
  ENDIF. 
* ignore version 
  DATA: l_s_kyf  TYPE rsdo_s_kyf. 
  l_s_kyf = l_r_kyf->n_s_kyf. 
  l_s_kyf-objvers  = n_s_kyf-objvers. 
  IF n_s_kyf     <> l_s_kyf              OR 
     n_t_cmp     <> l_r_kyf->n_t_cmp. 
    r_is_equal = rs_c_false. 
    EXIT. 
  ENDIF. 
ENDMETHOD. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Public Method CL_RSD_KYF->CONSTRUCTOR 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_IOBJNM TYPE RSIOBJNM 
* | [--->] I_OBJVERS TYPE RSOBJVERS 
* | [--->] I_S_VIOBJ TYPE RSD_S_VIOBJ(optional) 
* | [--->] I_T_CMP TYPE RSDO_T_CMP(optional) 
* | [--->] I_R_VERS TYPE REF TO CL_RSD_IOBJ_VERS(optional) 
* | [--->] I_ALL_TEXTS_IF_NEW TYPE RS_BOOL (default =RS_C_FALSE) 
* | [EXC!] INPUT_INVALID 
* | [EXC!] NOT_FOUND 
* +-------------------------------------------------------------------------------------- 
METHOD constructor . 
  CALL METHOD super->constructor 
    EXPORTING 
      i_iobjnm           = i_iobjnm 
      i_objvers          = i_objvers 
      i_s_viobj          = i_s_viobj 
      i_r_vers           = i_r_vers 
      i_all_texts_if_new = i_all_texts_if_new 
    EXCEPTIONS 
      input_invalid      = 1 
      not_found          = 2. 
  IF sy-subrc = 1. 
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 
            RAISING  input_invalid. 
    EXIT. 
  ELSEIF sy-subrc = 2. 
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno 
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 
            RAISING  not_found. 
    EXIT. 
  ENDIF. 
* 3 different methods to initialize: 
  IF NOT i_s_viobj IS INITIAL. 
* 1. create with properties given by caller 
    MOVE-CORRESPONDING i_s_viobj TO n_s_kyf. 
    n_t_cmp     = i_t_cmp. 
  ELSEIF NOT i_r_vers IS INITIAL. 
* 2. create from object reference given by caller (copy) 
* cast from IOBJ_VERS to KYF 
    DATA: l_r_kyf   TYPE  REF TO cl_rsd_kyf. 
    l_r_kyf = cast_from_iobj_vers( i_r_vers ). 
    IF l_r_kyf IS INITIAL. 
      MESSAGE e058 WITH 'I_R_VERS IS INITIAL' ##MG_PAR_CNT . 
* Ungültige Eingabe &1 &2 &3 &4 
      EXIT. 
    ENDIF. 
    n_s_kyf     = l_r_kyf->n_s_kyf. 
    n_t_cmp     = l_r_kyf->n_t_cmp. 
  ELSE. 
* 3. read from DB 
    DATA: l_objvers_read  TYPE rsobjvers. 
    l_objvers_read = i_objvers. 
    IF l_objvers_read = rs_c_objvers-new. 
      l_objvers_read = rs_c_objvers-modified. 
    ENDIF. 
    DATA: l_t_iobj_cmp TYPE rsd_t_iobj_cmp. 
    DATA: l_s_viobj    TYPE rsd_s_viobj. 
    CALL FUNCTION 'RSD_IOBJ_GET'
      EXPORTING 
        i_iobjnm               = i_iobjnm 
        i_objvers              = l_objvers_read 
* I_IGNORE_BCTCOMP = RS_C_FALSE 
      IMPORTING 
        e_s_viobj              = l_s_viobj 
        e_t_iobj_cmp           = l_t_iobj_cmp. 
    MOVE-CORRESPONDING l_s_viobj TO n_s_kyf. 
    n_t_cmp     = cl_rsd_utilities=>cmp_rsd_to_rsdo( l_t_iobj_cmp ). 
  ENDIF. 
* set name / version 
  n_s_kyf-kyfnm   = i_iobjnm. 
  n_s_kyf-objvers = i_objvers. 
ENDMETHOD.                    "maintain_hier_charact 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->DEEP_COPY 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_TARGET TYPE REF TO CL_RSD_IOBJ_VERS 
* | [--->] I_TXTSH TYPE RSTXTSH(optional) 
* | [--->] I_TXTLG TYPE RSTXTLG(optional) 
* | [--->] I_THX_COPY TYPE RSO_THX_COPY 
* | [--->] I_POSIT TYPE RSPOSIT 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [!CX!] CX_RS_FAILED 
* +-------------------------------------------------------------------------------------- 
METHOD deep_copy . 
  CALL METHOD super->deep_copy 
    EXPORTING 
      i_r_target = i_r_target 
      i_txtsh    = i_txtsh 
      i_txtlg    = i_txtlg 
      i_thx_copy = i_thx_copy 
      i_posit    = i_posit 
      i_detlevel = i_detlevel. 
* cast from IOBJ_VERS to kyf 
  DATA: l_r_target   TYPE  REF TO cl_rsd_kyf. 
  l_r_target = cast_from_iobj_vers( i_r_target ). 
  IF l_r_target IS INITIAL. 
    RAISE EXCEPTION TYPE cx_rs_failed. 
  ENDIF. 
* 1. copy and adjust properties 
  l_r_target->n_s_kyf = n_s_kyf. 
  l_r_target->n_s_kyf-kyfnm   = n_s_iobj-iobjnm. 
  l_r_target->n_s_kyf-objvers = n_s_iobj-objvers. 
* aggregation charact. 
  l_r_target->n_s_kyf-aggrcha = cl_rso_copy=>get_new_name( 
        i_objnm    = l_r_target->n_s_kyf-aggrcha 
        i_tlogo    = rs_c_tlogo-infoobject 
        i_thx_copy = i_thx_copy 
        i_detlevel = i_detlevel 
        i_posit    = i_posit ). 
* unit InfoObject 
  l_r_target->n_s_kyf-uninm = cl_rso_copy=>get_new_name( 
        i_objnm    = l_r_target->n_s_kyf-uninm 
        i_tlogo    = rs_c_tlogo-infoobject 
        i_thx_copy = i_thx_copy 
        i_detlevel = i_detlevel 
        i_posit    = i_posit ). 
* 1a) Inter company exchange 
  FIELD-SYMBOLS:  TYPE rsd_s_ice. 
  LOOP AT l_r_target->n_s_kyf-t_ice ASSIGNING 
* inter company exchange may be navigation attribute 
    -iobjnm1 = cl_rso_copy=>get_new_atrnavnm( 
          i_atrnavnm = -iobjnm1 
          i_thx_copy = i_thx_copy 
          i_detlevel = i_detlevel 
          i_posit    = i_posit ). 
    -iobjnm2 = cl_rso_copy=>get_new_atrnavnm( 
          i_atrnavnm = -iobjnm2 
          i_thx_copy = i_thx_copy 
          i_detlevel = i_detlevel 
          i_posit    = i_posit ). 
  ENDLOOP. 
* 2. copy and adjust compound 
  l_r_target->n_t_cmp = n_t_cmp. 
  FIELD-SYMBOLS:  TYPE rsdo_s_cmp. 
  LOOP AT l_r_target->n_t_cmp ASSIGNING 
    -iobjcmp = cl_rso_copy=>get_new_name( 
        i_objnm    = -iobjcmp 
        i_tlogo    = rs_c_tlogo-infoobject 
        i_thx_copy = i_thx_copy 
        i_detlevel = i_detlevel 
        i_posit    = i_posit ). 
  ENDLOOP. 
ENDMETHOD.                    "DEEP_COPY 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->GET_DEPENDENT 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_OBJVERS TYPE RSOBJVERS (default =RS_C_OBJVERS-ACTIVE) 
* | [--->] I_APPENDNM TYPE RSAPPENDNM 
* | [<---] E_T_OBJ_EXISTENTIAL TYPE RSO_T_TLOGO_ASC 
* | [<---] E_T_OBJ_DEPENDENT TYPE RSO_T_TLOGO_ASC 
* +-------------------------------------------------------------------------------------- 
METHOD get_dependent. 
  DATA: l_s_asc TYPE rso_s_tlogo_asc, 
        l_s_ice TYPE rsd_s_ice. 
* super-implementation 
  CALL METHOD super->get_dependent 
    EXPORTING 
      i_objvers           = rs_c_objvers-active 
      i_appendnm          = i_appendnm 
    IMPORTING 
      e_t_obj_existential = e_t_obj_existential 
      e_t_obj_dependent   = e_t_obj_dependent. 
* dependent objects requested? 
  IF NOT e_t_obj_dependent IS REQUESTED. 
    RETURN. 
  ENDIF. 
  l_s_asc-tlogo = rs_c_tlogo-infoobject. 
* 1. elimination charact. 
  l_s_asc-asc_type = rsoc_c_asc_type-elimination_charact. 
  LOOP AT me->n_s_kyf-t_ice INTO l_s_ice. 
    CLEAR l_s_asc-objnm. 
    MOVE l_s_ice-iobjnm1 TO l_s_asc-objnm. 
    APPEND l_s_asc TO e_t_obj_dependent. 
    CLEAR l_s_asc-objnm. 
    MOVE l_s_ice-iobjnm2 TO l_s_asc-objnm. 
    APPEND l_s_asc TO e_t_obj_dependent. 
  ENDLOOP. 
* 2. Aggregation charact. 
  IF NOT me->n_s_kyf-aggrcha IS INITIAL. 
    CLEAR: l_s_asc-objnm, l_s_asc-asc_type. 
    l_s_asc-asc_type = rsoc_c_asc_type-aggregation_charact. 
    l_s_asc-objnm = me->n_s_kyf-aggrcha. 
    APPEND l_s_asc TO e_t_obj_dependent. 
  ENDIF. 
* 3. Unit 
  IF NOT me->n_s_kyf-uninm IS INITIAL. 
    CLEAR: l_s_asc-objnm, l_s_asc-asc_type. 
    l_s_asc-asc_type = rsoc_c_asc_type-unit. 
    l_s_asc-objnm = me->n_s_kyf-uninm. 
    APPEND l_s_asc TO e_t_obj_dependent. 
  ENDIF. 
ENDMETHOD. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->GET_INFO 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_WITH_APPENDS TYPE RS_BOOL (default =RS_C_TRUE) 
* | [<---] E_S_VIOBJ TYPE RSD_S_VIOBJ 
* | [<---] E_T_CMP TYPE RSDO_T_CMP 
* | [<---] E_T_ATR TYPE RSDO_T_ATR 
* | [<---] E_T_ATR_NAV TYPE RSDO_T_ATR_NAV 
* | [<---] E_T_IOBJT TYPE RSO_T_TXT 
* +-------------------------------------------------------------------------------------- 
METHOD get_info. 
  CALL METHOD super->get_info 
    IMPORTING 
      e_s_viobj   = e_s_viobj 
      e_t_cmp     = e_t_cmp 
      e_t_atr     = e_t_atr 
      e_t_atr_nav = e_t_atr_nav. 
  MOVE-CORRESPONDING n_s_kyf TO e_s_viobj. 
  e_t_cmp      = n_t_cmp. 
* set reference 
  data: l_S_cmp  type  rsdo_s_cmp. 
  READ TABLE n_t_cmp INTO l_s_cmp 
       WITH KEY cmptp = rsd_c_cmptp-ref_keyfigure. 
  IF sy-subrc = 0. 
    e_s_viobj-chabasnm = l_s_cmp-iobjcmp. 
    e_s_viobj-bchreffl = rs_c_true. 
  ENDIF. 
ENDMETHOD.                    "get_info 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->IS_TRFN_IMPACT_NECESSARY 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_R_VERS_A TYPE REF TO CL_RSD_IOBJ_VERS 
* | [<---] E_IMPACT TYPE RS_BOOL 
* | [<---] E_T_FIELD TYPE RSTRAN_T_FIELD 
* | [<---] E_ONLY_RELATED TYPE RS_BOOL 
* +-------------------------------------------------------------------------------------- 
method IS_TRFN_IMPACT_NECESSARY. 
  CALL METHOD super->is_trfn_impact_necessary 
    EXPORTING 
      i_r_vers_a        = i_r_vers_a 
    IMPORTING 
      e_impact          = e_impact. 
endmethod. 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->REPAIR 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_DETLEVEL TYPE BALLEVEL 
* | [<-->] C_SUBRC TYPE SYSUBRC 
* | [<-->] C_R_MSG TYPE REF TO CL_RSO_MSG 
* +-------------------------------------------------------------------------------------- 
METHOD repair . 
  CALL METHOD super->repair 
    EXPORTING 
      i_detlevel = i_detlevel 
    CHANGING 
      c_subrc    = c_subrc 
      c_r_msg    = c_r_msg. 
  READ TABLE n_t_cmp TRANSPORTING NO FIELDS 
       WITH KEY cmptp = rsd_c_cmptp-ref_keyfigure. 
  IF sy-subrc <> 0. 
* no reference-> remocve ICE definition 
    CLEAR: n_s_kyf-t_ice. 
  ELSE. 
* reference-> remocve empty ICE definitions 
    DELETE n_s_kyf-t_ice WHERE iobjnm1 IS initial 
                           AND iobjnm2 IS initial. 
    IF sy-subrc = 0. 
* renumber 
      FIELD-SYMBOLS   TYPE  rsd_s_ice. 
      LOOP AT n_s_kyf-t_ice ASSIGNING 
        -posit = sy-tabix. 
      ENDLOOP. 
    ENDIF. 
  ENDIF. 
ENDMETHOD.                    "REPAIR 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->SAVE 
* +-------------------------------------------------------------------------------------------------+ 
* | [--->] I_DETLEVEL TYPE BALLEVEL (default ='3') 
* | [<---] E_OBJVERS_DB TYPE RSOBJVERS 
* | [<---] E_ROUTINE_DELETED TYPE RS_BOOL 
* | [<-->] C_SUBRC TYPE SYSUBRC(optional) 
* +-------------------------------------------------------------------------------------- 
METHOD save . 
  CALL METHOD super->save 
    EXPORTING 
      i_detlevel        = i_detlevel 
    IMPORTING 
      e_routine_deleted = e_routine_deleted 
      e_objvers_db      = e_objvers_db 
    CHANGING 
      c_subrc           = c_subrc. 
  DATA: l_s_rsdkyf       TYPE rsdkyf. 
* 1. properties 
  MOVE-CORRESPONDING n_s_kyf TO l_s_rsdkyf. 
  l_s_rsdkyf-kyfnm   = n_s_iobj-iobjnm. 
  l_s_rsdkyf-objvers = e_objvers_db. 
  MODIFY rsdkyf FROM l_s_rsdkyf. 
  IF sy-subrc <> 0. 
    MESSAGE e542 WITH 'RSDKYF' INTO o_dummy_msg. 
    cl_rso_application_log=>add_message_level( 
                i_detlevel = i_detlevel ) . 
    c_subrc = 4. 
* Fehler beim Schreiben in die Datenbanktabelle &1 
  ENDIF. 
* 2. charat for inter company exchange 
  DATA: l_s_ice         TYPE rsd_s_ice. 
  DATA: l_s_rsdice      TYPE rsdice. 
  DELETE FROM rsdice WHERE kyfnm   = n_s_iobj-iobjnm   AND 
                           objvers = e_objvers_db. 
  l_s_rsdice-kyfnm    = n_s_iobj-iobjnm. 
  l_s_rsdice-objvers  = e_objvers_db. 
  LOOP AT n_s_kyf-t_ice INTO l_s_ice. 
    MOVE-CORRESPONDING l_s_ice TO l_s_rsdice. 
    INSERT INTO rsdice VALUES l_s_rsdice. 
    IF sy-subrc <> 0. 
      MESSAGE e542 WITH 'RSDICE' INTO o_dummy_msg. 
      cl_rso_application_log=>add_message_level( 
                  i_detlevel = i_detlevel ) . 
* Fehler beim Schreiben in die Datenbanktabelle &1 
      c_subrc = 4. 
    ENDIF. 
  ENDLOOP. 
ENDMETHOD.                    "maintain_hier_charact 
* ---------------------------------------------------------------------------------------+ 
* | Instance Protected Method CL_RSD_KYF->XPRA 
* +-------------------------------------------------------------------------------------------------+ 
* | [<---] E_MODIFIED TYPE RS_BOOL 
* | [<---] E_S_VIOBJ TYPE RSD_S_VIOBJ 
* | [<-->] C_T_CMP TYPE RSDO_T_CMP(optional) 
* +-------------------------------------------------------------------------------------- 
method XPRA . 
  CALL METHOD SUPER->XPRA 
    IMPORTING 
      E_MODIFIED = E_MODIFIED 
      E_S_VIOBJ  = E_S_VIOBJ 
    CHANGING 
      C_T_CMP    = n_T_CMP. 
  if e_modified = rs_c_true. 
    move-corresponding e_s_viobj to n_s_kyf. 
    CALL METHOD save. 
  endif. 
endmethod. 
ENDCLASS. 
Feedback