Skip to Content
avatar image
Former Member

OData model for a simple Remote function module

Hello all,

          I want to create an application SAPUI5 which takes some inputs and gives output results. For that I have a function module with import and export parameters. I want to know the simplest way to create an OData model which uses this RFC (code below). For example- How many entities should I have? What CRUD functions do I have to define and things like that. Any kind of knowledge would be of great help as I am new to this.

FUNCTION zisu_ui5_change_objects.

*"----------------------------------------------------------------------

*"*"Local Interface:

*"  IMPORTING

*"     VALUE(OBJECT_TYPE) TYPE  TCDOB-OBJECT OPTIONAL

*"     VALUE(CHANGED_BY) TYPE  CDHDR-USERNAME OPTIONAL

*"     VALUE(DATE_FROM) TYPE  CDHDR-UDATE OPTIONAL

*"     VALUE(DATE_TO) TYPE  CDHDR-UDATE OPTIONAL

*"     VALUE(TIME_FROM) TYPE  CDHDR-UTIME OPTIONAL

*"     VALUE(TIME_TO) TYPE  CDHDR-UTIME OPTIONAL

*"  TABLES

*"      IT_CHANGE_OBJECTS TYPE  ZISU_T_UI5_CHNGOBJ OPTIONAL

*"----------------------------------------------------------------------

   DATA: it_chngobj TYPE STANDARD TABLE OF cdred,

         ls_chngobj TYPE cdred.

   DATA: lt_cdhdr      TYPE STANDARD TABLE OF cdhdr,

         ls_cdhdr      TYPE cdhdr,

         ls_name       TYPE bapiaddr3,

         lt_cdpos      TYPE STANDARD TABLE OF cdpos,

         ls_cdpos      TYPE cdpos,

         ls_out        TYPE zisu_ui5_chngobj,

         lt_tab        TYPE TABLE OF dfies,

         ls_tab        TYPE dfies,

         lt_username   TYPE RANGE OF cdusername,

         ls_username   LIKE LINE OF lt_username,             "#EC NEEDED

         lt_objectclas TYPE RANGE OF cdobjectcl,

         ls_objectclas LIKE LINE OF lt_objectclas,           "#EC NEEDED

         lt_objectid   TYPE RANGE OF cdobjectv,

         ls_objectid   LIKE LINE OF lt_objectid,             "#EC NEEDED

         lt_tabname    TYPE RANGE OF tabname,

         ls_tabname    LIKE LINE OF lt_tabname,              "#EC NEEDED

         lt_return     TYPE TABLE OF bapiret2.

   TRANSLATE object_type TO UPPER CASE .

*CALL FUNCTION 'CHANGEDOCUMENT_READ'

*    EXPORTING

**      changenumber      = nummer

*      date_of_change    = DATE_FROM

*      objectclass       = OBJECT_TYPE

**      objectid          = objektid

**      tablekey          = tabkey

**      tablename         = tabname

*      time_of_change    = TIME_FROM

*      username          = CHANGED_BY

**      local_time        = local_t

**      time_zone         = tzsource

*      date_until        = DATE_TO

*      time_until        = TIME_TO

**    IMPORTING

**      et_cdred_str      = lt_cdred_str[]

*    TABLES

*      editpos           = IT_CHNGOBJ

*    EXCEPTIONS

*      no_position_found = 1

*      OTHERS            = 2.

*

*move-corresponding it_chngobj[] to IT_CHANGE_OBJECTS[].

   CASE object_type.

     WHEN 'CO'.

       ls_tabname-low = 'ES56'.

       ls_tabname-option = 'EQ'.

       ls_tabname-sign   = 'I'.

       APPEND ls_tabname TO lt_tabname.

       ls_tabname-low = 'ES55'.

       ls_tabname-option = 'EQ'.

       ls_tabname-sign   = 'I'.

       APPEND ls_tabname TO lt_tabname.

     WHEN 'IN'.

       ls_tabname-low = 'ES320'.

       ls_tabname-option = 'EQ'.

       ls_tabname-sign   = 'I'.

       APPEND ls_tabname TO lt_tabname.

       ls_tabname-low = 'ES31'.

       ls_tabname-option = 'EQ'.

       ls_tabname-sign   = 'I'.

       APPEND ls_tabname TO lt_tabname.

     WHEN 'CT'.

       ls_tabname-low = 'ES22'.

       ls_tabname-option = 'EQ'.

       ls_tabname-sign   = 'I'.

       APPEND ls_tabname TO lt_tabname.

     WHEN 'PR'.

       ls_tabname-low = 'ES60'.

       ls_tabname-option = 'EQ'.

       ls_tabname-sign   = 'I'.

       APPEND ls_tabname TO lt_tabname.

       ls_tabname-low = 'ES61'.

       ls_tabname-option = 'EQ'.

       ls_tabname-sign   = 'I'.

       APPEND ls_tabname TO lt_tabname.

     WHEN OTHERS.

   ENDCASE.

   IF changed_by IS NOT INITIAL.

     ls_username-low = changed_by.

     ls_username-option = 'EQ'.

     ls_username-sign  = 'I'.

     APPEND ls_username TO lt_username.

   ENDIF.

   SELECT * FROM cdhdr APPENDING TABLE lt_cdhdr

            WHERE username   IN lt_username

            AND   tcode    IN lt_tabname

            and  udate between date_from and date_to

            and  utime between time_from and time_to .

*           AND ( ( udate =  date_from AND utime >= time_from  ) OR udate >  date_from )

*           AND ( ( udate =  date_to AND utime <= time_to ) OR udate <  date_to ).

   IF sy-subrc = 0.

     SELECT * FROM cdpos INTO TABLE lt_cdpos

                         FOR ALL ENTRIES IN lt_cdhdr

                         WHERE changenr = lt_cdhdr-changenr .

     IF sy-subrc = 0.

       LOOP AT lt_cdhdr INTO ls_cdhdr .

         LOOP AT lt_cdpos INTO ls_cdpos WHERE changenr = ls_cdhdr-changenr .

           CALL FUNCTION 'DDIF_FIELDINFO_GET'

             EXPORTING

               tabname        = ls_cdpos-tabname

               fieldname      = ls_cdpos-fname

*             LANGU          = SY-LANGU

             TABLES

               dfies_tab      = lt_tab

*             FIXED_VALUES   =

             EXCEPTIONS

               not_found      = 1

               internal_error = 2

               OTHERS         = 3.

           IF sy-subrc = 0.

             READ TABLE lt_tab INTO ls_tab INDEX 1.

             ls_out-ftext        = ls_tab-fieldtext.

           ENDIF.

         CALL FUNCTION 'BAPI_USER_GET_DETAIL'

           EXPORTING

             username             = ls_cdhdr-username

          IMPORTING

            address              =  ls_name

          TABLES

          return    = lt_return.

IF sy-subrc = 0.

   ls_out-firstname = ls_name-firstname.

   ls_out-lastname  = ls_name-lastname.

ENDIF.

           ls_out-object_type  = object_type.

           ls_out-objectid     = ls_cdhdr-objectid .

           ls_out-changenr     = ls_cdhdr-changenr .

           ls_out-username     = ls_cdhdr-username.

           ls_out-udate        = ls_cdhdr-udate.

           ls_out-utime        = ls_cdhdr-utime.

           ls_out-tcode        = ls_cdhdr-tcode.

           ls_out-tabname      = ls_cdpos-tabname.

           ls_out-chngind      = ls_cdpos-chngind.

           ls_out-fname        = ls_cdpos-fname.

           ls_out-f_old        = ls_cdpos-value_old.

           ls_out-f_new        = ls_cdpos-value_new.

           APPEND ls_out TO it_change_objects.

           CLEAR: ls_cdpos , ls_out, ls_tab, ls_name .

           REFRESH lt_tab.

         ENDLOOP.

         CLEAR ls_cdhdr.

       ENDLOOP.

     ENDIF.

   ENDIF.

SORT it_change_objects BY changenr.

ENDFUNCTION.

Add comment
10|10000 characters needed characters exceeded

  • Get RSS Feed

2 Answers

  • Best Answer
    Sep 30, 2015 at 06:13 AM

    You can try using one entity here.

    In your entity keep all distinct fields from importing and table.

    Check these documents, these will help you understanding creation of Odata service based on RFC.

    Importing a Data Source (RFC/BOR Interface) - SAP NetWeaver Gateway - SAP Library

    Step-by-step guide to build an OData Service based on RFCs – Part 1

    Step-by-step guide to build an OData Service based on RFCs – Part 2

    Add comment
    10|10000 characters needed characters exceeded

  • avatar image
    Former Member
    Sep 30, 2015 at 04:29 AM

    This depends on your  understanding of the functionality supported by the FM and Entity Data Model.

    There is no absolute solution for your problem.People may model differently based on the understanding. Also it may not be possible to do a 1:1 mapping of  a function module to the edm model  

    Add comment
    10|10000 characters needed characters exceeded