Skip to Content
Technical Articles
Author's profile photo Lakshminarasimhan Narasimhamurthy

Automated/Mass InfoObject creation via ABAP Program

Introduction

Create InfoObject using ABAP program.

 

Applies to

BW/4HANA, BW Powered by HANA, BW 7.x.

 

Summary

InfoObject’s are the basic building blocks in BW.

Even though we have the fields based modeling in BW Powered by HANA and also in BW/4HANA, the importance of infoobjects cannot be ignored.

In many cases/times when we need to have infoobjects either as attribute or as master data(when we need to have display of the data as both key and text or as Hierarchy).

Definitely the creation of infoobject is time consuming. we can simplify the creation of the infoobject using the ABAP program.

 

Author          : Lakshminarasimhan Narasimhamurthy

Created on   : 11/Jul/2021

 

Body

Requirement

We need to create a hundreds of info objects for a project requirement, maybe it’s a Greenfield implementation or a full fledged new development project or we need to copy all the SAP delivered infoobjects into custom infoobject’s. (Always the preferred approach is to copy the business content object and use them in the project, the reason is that during any upgrade the custom objects remain unaffected).

The process in going to be time consuming and error prone due to manual creation. So we will use the ABAP program to create the Infoobjects.

SAP has provided the BAPI’s(RFC function modules) for the infoobject creation and activation.

  1. BAPI_IOBJ_CREATE –> Infoobject creation
  2. BAPI_IOBJ_ACTIVATE_MULTIPLE –> Infoobject activation

 

The structure “BAPI6108” contains all the details required for the Infoobject creation. The structure must be filled with values. The internal table based on this structure must be populated with values.

Better approach is to fill all the details in the excel sheet(CSV format) with the same structure as BAPI6108. Then upload it to the internal table based on the structure BAPI6108 and this internal table must be passed to the BAPI “BAPI_IOBJ_CREATE”.

 

*&---------------------------------------------------------------------*
*& Report ZBW_IO_TEMP_TEST
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
report zbw_io_temp_test.

data:  begin of data_final occurs 0.
        include structure bapi6108.
data:  end of data_final.

data:  begin of ret_mess occurs 0.
        include structure bapiret2.
data:  end of ret_mess.

*data : la_conv_tab like line of lt_conv_tab.

data: begin of itab occurs 0,
         f1(10000) type c,
      end of itab.

data:  begin of data_iobj occurs 0.
        include structure bapi6108io.
data:  end of data_iobj.

data:  begin of io_err occurs 0.
        include structure bapi6108io.
data:  end of io_err.


parameters: lp_file type rlgrap-filename obligatory. " To get the file location
data : temp_ch type string,
       names   type c length 1000.
data : str3 type string, str4 type string, str5 type string, str6 type string,
       str7 type string,
       str8 type string, str9 type string, str10 type string, str11 type string, str12 type string,
       str13 type string,
       data_final_1 TYPE STANDARD TABLE OF bapi6108 WITH HEADER LINE.

*---------------------------------------------------------------------
* AT SELECTION SCREEN ON VALUE REQUEST
*---------------------------------------------------------------------
at selection-screen on value-request for lp_file.
  perform help_local_file using lp_file.

start-of-selection.

  temp_ch = lp_file.

  call function 'GUI_UPLOAD'
    exporting
      filename        = temp_ch
      filetype        = 'ASC'
*     HAS_FIELD_SEPARATOR           = ' '
      header_length   = 0
      read_by_line    = 'X'
*     DAT_MODE        = ' '
*     CODEPAGE        = ' '
*     IGNORE_CERR     = ABAP_TRUE
*     REPLACEMENT     = '#'
*     CHECK_BOM       = ' '
*     IMPORTING
*     FILELENGTH      =
*     HEADER          =
    tables
      data_tab        = itab
    exceptions
      file_open_error = 1
      file_read_error = 2
*     NO_BATCH        = 3
*     GUI_REFUSE_FILETRANSFER       = 4
*     INVALID_TYPE    = 5
*     NO_AUTHORITY    = 6
*     UNKNOWN_ERROR   = 7
*     BAD_DATA_FORMAT = 8
*     HEADER_NOT_ALLOWED            = 9
*     SEPARATOR_NOT_ALLOWED         = 10
*     HEADER_TOO_LONG = 11
*     UNKNOWN_DP_ERROR   = 12
      access_denied   = 13
*     DP_OUT_OF_MEMORY              = 14
*     DISK_FULL       = 15
*     DP_TIMEOUT      = 16
*     OTHERS          = 17
    .
  if sy-subrc = 1.
    message 'FILE IS OPEN; PLEASE CHECK THE FILE.' type 'I'.
*WITH "FILE IS OPEN; PLEASE CHECK THE FILE.".
    exit.
  elseif sy-subrc = 2.
    message 'ERROR WHILE READING THE FILE' type 'I'.
    exit.
  elseif sy-subrc = 13.
    message 'ACCESS DENIED.' type 'I'.
    exit.
  endif.

   loop at itab from 2.

     names = itab-f1.
" if there are many columns to be split then make use of the FM 'ALSM_EXCEL_TO_INTERNAL_TABLE'
     split names at ',' into str3 str4 str5 str6 str7 str8 str9 str10 str11 str12 str13.

   IF str5 = 'CHA'.
    data_final-infoarea = str3.
    data_final-infoobject = str4.
    data_iobj-infoobject = str4.
    data_final-type = str5.
    data_final-textshort = str6.
    data_final-textlong = str7.
    data_final-datatp = str8.
    data_final-intlen = str9.
    data_final-outputlen = str10.
    data_final-convexit = str11.
    data_final-lowercase = str12.
    data_final-mastauthfl = ''.
    data_final-attribfl = ''.
    data_final-NOVALFL = 'X'.
   else.
    data_final-infoarea = str3.
    data_final-infoobject = str4.
    data_iobj-infoobject = str4.
    data_final-type = str5.
    data_final-textshort = str6.
    data_final-textlong = str7.
    data_final-KYFTP = str8.
    data_final-intlen = str9.
    data_final-outputlen = str10.
  endif.

    append data_final to data_final. " Default header area to Internal table

   endloop.

loop at data_final into data_final.

  CLEAR : data_final_1[], data_final_1.

  move-corresponding data_final to data_final_1.
  append data_final_1 to data_final_1[].

        call function 'BAPI_IOBJ_CREATE'
        exporting
          details              = data_final_1
        importing
*         infoobject           =
          return               = ret_mess
*        tables
*          compounds            = data_compound
*          attributes           = data_attributes
*          navigationattributes = data_navigation
*         atrnavinfoprovider   =
*         hierarchycharacteristics =
*         elimination          =
*         returntable          =
        .

  clear : data_iobj[].

  data_iobj-infoobject = data_final-infoobject.
  append data_iobj to data_iobj[].

       call function 'BAPI_IOBJ_ACTIVATE_MULTIPLE'
        tables
          infoobjects       = data_iobj[]
          infoobjects_error = io_err.

        if sy-subrc <> 0.
        endif.
endloop.

form help_local_file  using filename type dxfile-filename.

  data:  lt_file_table type filetable,
         la_file_table like line of lt_file_table,
         l_rc          type i,
         l_pcdsn       type cffile-filename.

  refresh lt_file_table.
  clear la_file_table.
  call method cl_gui_frontend_services=>file_open_dialog
    changing
      file_table = lt_file_table
      rc         = l_rc.

  read table lt_file_table into la_file_table index 1.
  l_pcdsn = la_file_table-filename.

  move l_pcdsn to filename.

endform.

 

I prepared a CSV file with just one InfoObject “YTEMP_1” and ran the program.

The CSV file prepared must be entered using F4 help.

in the debug mode, it is visible that the file is split into separate columns

if there are too many columns then we can use the FM ‘ALSM_EXCEL_TO_INTERNAL_TABLE’ to upload the data directly into the internal table.

Create the Infoobject via the BAPI.

Activate the Infoobject via the BAPI.

The InfoObject is now created in the system

In the similar fashion we can create all the Infoobjects present in the excel sheet.

 

Note – Once the program is run, we can directly see the active version of the Infoobject existing in the RSDIOBJ table.

Please see the additional below infoobjects table for your reference,

RSDCHA – Characteristic Infoobjects ( with referencing Infoobject)

RSDCHABAS – Characteristic Infoobjects details

RSDIOBJCMP – Compounded Infoobjects

RSDBCHATR – Attributes of characteristics(Display and Navigational)

RSDATRNAVT – Navigation Attributes Text

RSDIOBJ – List of all Infoobjects in all versions(D or M or A)

RSDKYF – Keyfigure table

I had different requirement to create a bunch of existing infoobjects with new naming convention hence I had used the above list of tables to populate the BAPI structure “BAPI6108”.

 

 

 

Assigned Tags

      15 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Sebastian Gesiarz
      Sebastian Gesiarz

      Hello Lakshminarasimhan, Thank you for sharing!
      It works like a charm for characteristics 🙂
      Could you please tell me if you were also able to use it for Key Figures?
      It seems like some of the fields/tables are not filled by the BAPI. Therefore, the activation fails with type errors.
      The sample I tried on BW/4HANA 2.0:

      IA,Infoobject,Type,ST(20),LT(60),DT,LE,OL,CE,LC
      ZINFOAREA,ZIOKF1,KYF,Desc Short1,Desc Long1,DEC,,,,
      ZINFOAREA,ZIOKF1,KYF,Desc Short2,Desc Long1,CURR,,,,
      

      Errors:

      Key Figure * of Invalid type and others

       

      I am not filling length, and there also seems to be no place for KYFTP - AMO/NUM like in some old SCN reference:

           DATA_FINAL-INFOOBJECT =  INFOOBJECT.
           DATA_FINAL-TYPE       =  TYPE.
           DATA_FINAL-TEXTSHORT  =  TEXTSHORT.
           DATA_FINAL-TEXTLONG   =  TEXTLONG.
           DATA_FINAL-DATATP     =  DATATP.
           DATA_FINAL-KYFTP      =  KYFTP.
           DATA_FINAL-APPLNM     =  APPLNM.
      
           DATA_FINAL-INTLEN     =  INTLEN.
           DATA_FINAL-FIXCUKY    =  FIXCUKY.
           DATA_FINAL-FIXUNIT    =  FIXUNIT.
           DATA_FINAL-UNINM      =  UNINM.
           DATA_FINAL-KYFDECIM   =  DECIMAL.    "FOR SETTING DECIMAL PLACES
           DATA_FINAL-LOWERCASE  = 'X'.
           DATA_FINAL-CHAPRSNT   = '2'. 

      Source: https://archive.sap.com/documents/docs/DOC-12249

       

      Author's profile photo Lakshminarasimhan Narasimhamurthy
      Lakshminarasimhan Narasimhamurthy
      Blog Post Author

      Hi Sebastian,

      Will work for the Keyfigures too now, i have updated the code,

      Author's profile photo Kiran Patel
      Kiran Patel

      Hi Lakshminarasimhan

       

      The link is not accessible. Could you please update the latest ABAP code change in this blog ?

      Thanks for your efforts. Its very useful utility program.

       

      Many Thanks

      Kiran

      Author's profile photo Lakshminarasimhan Narasimhamurthy
      Lakshminarasimhan Narasimhamurthy
      Blog Post Author

      Dear Sebastian Gesiarz,

       

      For keyfigures you need to fill the structure data_final (BAPI6108), all of the keyfigure properties can be taken/derived/referenced from RSDKYF table.

      TYPE = 'KYF' mean data_final-TYPE = 'KYF' and for

      KYFTP = 'AMO/QUA/FLO/INT etc' can be filled from data_final-KYFTP.

      Author's profile photo Sebastian Gesiarz
      Sebastian Gesiarz

      Thanks for response.

      Were you able to use it for Key Figures? If so, could you please pass a sample?

      I tried multiple combinations of input for BAPI6108 and it does not work.

      Author's profile photo Sebastian Gesiarz
      Sebastian Gesiarz

      The structure was wrong e.g. for the KYFTP,

      I ended up modifying the code from: https://archive.sap.com/documents/docs/DOC-12249

      It works well. It also activates the objects and shows the log.

       

      Sample file:

      INFOOBJECT,TYPE,TEXTSHORT,TEXTLONG,DATATP,INTLEN,COMPOUND,ATTRIBUTE,NAVIGATION,KYFTP,FIXCUKY,FIXUNIT,UNINM,DECIMAL
      ZDEMOKF1,KYF,Cash #1 Discount,Cash #1 Discount,CURR,,,,,AMO,,,0CURRENCY,
      ZDEMOKF15,KYF,Day,Day,DEC,,,,,NUM,,,,5
      

       

      Code modifications:

      LOOP AT ITAB FROM 2. " 11.08.2021 GESXX Add header row
      
      ELSE.
          DATA_FINAL-NOVALFL = 'X'  .   "ATTRIBUTE PROPERTIES
          DATA_FINAL-INFOAREA   =  INFOAREA.  " 11.08.2021 GESXXX
      ENDIF.
      
      " Here only a comment:
      DATA_FINAL-DATATP     =  DATATP.           " CURR/FLTP(AMO) FLTP/DEC(NUM) 11.08.2021 GEXXX
      DATA_FINAL-KYFTP      =  KYFTP.            " AMO/QUA/NUM/INT/DAT/TIM      11.08.2021 GEXXX

       

      Author's profile photo Lakshminarasimhan Narasimhamurthy
      Lakshminarasimhan Narasimhamurthy
      Blog Post Author

      yes, i have update the code as well data_final-novalfl = 'X'.

      Author's profile photo Viral Naik
      Viral Naik

      This program is by default creating master data info-object. Which flag do we need to pass in BAPI 6108 import structure to uncheck the "Master Data" check box? I tried to find the flag field in BAPI6108 structure but I did not get it.

      Author's profile photo Ashish Dhama
      Ashish Dhama

      Dear Viral,

      To uncheck the 'Master Data', you can pass "NOVALFL" flag = 'X' from BAPI6108 import structure in this program. It won't enable master data properties by default.

      Author's profile photo Logavan A
      Logavan A

      Just Insert this one line code

      DATA_FINAL-NOVALFL = 'X' .

       

      After this ITAB

      data_final-infoarea = str3.
          data_final-infoobject = str4.
          data_iobj-infoobject = str4.
          data_final-type = str5.
          data_final-textshort = str6.
          data_final-textlong = str7.
          data_final-datatp = str8.
          data_final-intlen = str9.
          data_final-outputlen = str10.
          data_final-convexit = str11.
          data_final-lowercase = str12.
          data_final-mastauthfl = ''.
          data_final-attribfl = ''.
      Author's profile photo Lakshminarasimhan Narasimhamurthy
      Lakshminarasimhan Narasimhamurthy
      Blog Post Author

      yes like Ashish and Logavan mentioned, this piece of code will resolve the issue

      " data_final-novalfl = 'X'." i have updated in the code now.

      Author's profile photo Gervy V Garcia
      Gervy V Garcia

      Thanks for this. Is there a way to automatically capture the IOs to a transport? The infoobjects created have blank package. I have to add package for each IO and then capture to a transport one by one.

      Author's profile photo Lakshminarasimhan Narasimhamurthy
      Lakshminarasimhan Narasimhamurthy
      Blog Post Author

      will check that out, but you can collect all io's in oneshot suing RSA1-->Transport connection-->Infoobjects

      Author's profile photo Gervy V Garcia
      Gervy V Garcia

      Yeah, I also did it by 2x clicking the catalog then transport. I was able to capture all IOs. Thanks a lot!!!!!

      Author's profile photo Kiran Kodre
      Kiran Kodre

      Looks like the the IOBJ FM for create does not allow IOBJs for Key Figures. So this type of program may not be used for creating Key Figures