Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
sumeet_gehlot
Contributor

Defining and Creating a Genil Model :

You could define and implement dynamic models using IF_GENIL_APPL_MODEL Interface.

use GENIL_MODEL_EDITOR OR  GENIL_MODEL_BROWSER  to create static models ,

As Genil component class extends default implementation of IF_GENIL_APPLMODEL_PERSISTENCY namely CL_WCF_GENIL_ABSTR_COMPONENT.

Step 1 : Go to Transaction SE24 or SE80 ,Create a new abap Custom Genil Class

              ZCL_CUSTOMER_MODEL


As this class use statically defined model we inherit from CL_WCF_GENIL_ABSTR_COMPONENT.

     

Save and activate  the class.

Step 2Registering of Genil  component is done using Transaction SM34  ,


Enter View Cluster name as CRMVC_GIL_APPDEF or we can use maintaince view CRMV_GIL_COMP

Click maintain button.

    

Maintain the entries for Component Definition , Component Set Definition and Component Assignment.

    

       

      

Step 3: Create a new Master Table name as ZMAST_CUST using transaction SE11.

      

Creating a Genil Business Objects.

Key Structure of Customer Data.

     

Attribute structure of a Customer Data

       

Table Type of Attribute Structure.

     

     

Create a Lock object of master table ZMAST_CUST.

      

Step 4 :  Go to Transaction GENIL_MODEL_BROWSER,

Give component name as ZCUST .

  1. a.) Click on Change button and Right Click on Root Objects -> Give Object Name as Customer

      

Add Key Structure Name , Attribute structure name and Create structure name .

And check web service enabled.

Keep Attribute Structure Property -in Changeable mode , So that while creating a object you can see a list of fields in Change mode in Object Browser .

Step 5 :  Open a custom genil class ZCL_CUSTOMER_MODEL and redefine all this metohods as shown below.

Create a new custom class  name as ZCL_CUSTOMER_API which will  to hold the API methods to retrieve data from database.

Declare GT_CUSTOMER as a global attributes ZATTR_CUST_TAB ( Attribute Structure of Customer ) of ZCL_CUSTOMER_API

    

Here's the coding Starts to create a new root object

IF_GENIL_APPL_INTLAY~CREATE_OBJECTS

METHOD if_genil_appl_intlay~create_objects.

   TYPES : BEGIN OF ty_cust,
              custno TYPE zcustno,
              END OF ty_cust.

   DATA : lv_guid    TYPE crmt_object_guid.
   DATA : lv_key     TYPE zattr_cust_key.
   DATA : lv_success TYPE char1.
   DATA : lit_cust   TYPE TABLE OF ty_cust.
   DATA : wa         TYPE ty_cust.
   DATA : lv_count   TYPE i VALUE 0.

* Fill structure based on Name Value Pairs Table.

   fill_struct_from_nvp_tab( EXPORTING it_parameters = it_parameters
                             CHANGING  cs_parameter = lv_key ).

* Creating a Guid.
   CALL FUNCTION 'GUID_CREATE'
     IMPORTING
       ev_guid_16 = lv_guid.

* Custom Logic to create a New Customer Number.


   SELECT custno FROM zmast_cust INTO TABLE lit_cust.

   SORT lit_cust DESCENDING.

   IF lit_cust IS NOT INITIAL.
     LOOP AT lit_cust INTO wa.
       lv_count = wa-custno + 1.
       EXIT.
     ENDLOOP.
   ELSE.
     lv_count = 1.
   ENDIF.

   lv_key-guid   = lv_guid.
   lv_key-custno = lv_count.

* API Class fills the the global attribute.

   CALL METHOD zcl_customer_api=>create_customer
     EXPORTING
       is_cust_key = lv_key
     IMPORTING
       rv_success  = lv_success.

* Add the object to Data Container - Root Object List Interface

   IF lv_success IS NOT INITIAL.

     iv_root_list->add_object( iv_object_name = iv_object_name
                                is_object_key = lv_key ).
   ENDIF.

ENDMETHOD.

METHOD CREATE_CUSTOMER.

   DATA : lv_data like line OF gt_customer.

*  First step is to Lock a Customer.


   CALL FUNCTION 'ENQUEUE_EZMAST_CUST'
     EXPORTING
       mode_zmast_cust = 'E'
         EXCEPTIONS
       foreign_lock    = 1
       system_failure  = 2
       OTHERS          = 3.
   IF sy-subrc <> 0.
* Implement suitable error handling here
   ENDIF.

* Writing to Buffer values passed by parameters and setting Flag C.


   lv_data-guid = is_cust_key-guid.
   lv_data-custno = is_cust_key-custno.
   lv_data-new = 'C'.

append lv_data to gt_customer.

rv_success = 'X'.

ENDMETHOD.

IF_GENIL_APPL_INTLAY~GET_OBJECTS.


METHOD if_genil_appl_intlay~get_objects.

   DATA lv_root        TYPE REF TO if_genil_cont_root_object.
   DATA lv_key         TYPE zattr_cust_key.
   DATA lv_cust_att  TYPE zattr_cust.

* Get the first object of data container.

   lv_root = iv_root_list->get_first( ).

   lv_root->get_key( IMPORTING es_key = lv_key ).

* Check if attributes are read after Create

   IF lv_root->check_attr_requested( ) = abap_true.

* Custom API class to get the customer attributes.

     zcl_customer_api=>get_customer( EXPORTING is_cust_key = lv_key
                                                    IMPORTING es_cust_attr = lv_cust_att ).

* Return the objects only if it exists
     IF lv_cust_att IS NOT INITIAL.

* Set the attributes in container
       lv_root->set_attributes( lv_cust_att ).

* Get the next object of data container.

       lv_root = iv_root_list->get_next( ).

     ENDIF.
   ENDIF.


ENDMETHOD.

METHOD get_customer.

   FIELD-SYMBOLS <data> LIKE LINE OF gt_customer.
*
   IF is_cust_key IS NOT INITIAL.

* Try to read from Buffer.
     READ TABLE gt_customer WITH KEY
                guid = is_cust_key-guid
                custno = is_cust_key-custno
                ASSIGNING <data>.
   ELSE.
     READ TABLE gt_customer WITH KEY new = 'C' ASSIGNING <data>.

     IF sy-subrc <> 0.
       RETURN.
     ENDIF.
   ENDIF.

   IF sy-subrc = 0.
     IF <data>-new EQ 'C' OR <data>-new EQ 'M'.
       MOVE-CORRESPONDING <data> TO es_cust_attr.
       RETURN.
     ENDIF.
   ENDIF.

ENDMETHOD.

IF_GENIL_APPL_INTLAY~MODIFY_OBJECTS

METHOD if_genil_appl_intlay~modify_objects.

   DATA : lv_cust_attr TYPE zattr_cust,
          lv_root      TYPE REF TO if_genil_container_object,
          lv_changed_objects TYPE  crmt_genil_obj_instance,
          lv_props     TYPE REF TO if_genil_obj_attr_properties,
          lt_changed_attr TYPE  crmt_attr_name_tab,
          lv_cust_key  TYPE zattr_cust_key,
          lv_success   TYPE abap_bool.

   DATA : lv_change TYPE crmt_genil_attr_property.

   CHECK iv_root_list IS BOUND.

* Get the first object from Container.

   lv_root = iv_root_list->get_first( ).

   IF lv_root->get_delta_flag( ) IS NOT INITIAL.

* Get name of the object.

     CASE lv_root->get_name( ).

       WHEN 'Customer'.

* Returns an Property Object for Object Attributes.

         lv_props = lv_root->get_attr_props_obj( ).

* Returns a Table of All Names with Specified Property.

         CALL METHOD lv_props->get_name_tab_4_property
           EXPORTING
             iv_property = if_genil_obj_attr_properties=>modified
           IMPORTING
             et_names    = lt_changed_attr.


         lv_root->get_key( IMPORTING es_key = lv_cust_key ).
         lv_root->get_attributes( IMPORTING es_attributes = lv_cust_attr ).

         MOVE-CORRESPONDING lv_cust_key TO lv_cust_attr.


         CALL METHOD zcl_customer_api=>change_customer
           EXPORTING
             is_cust_attr = lv_cust_attr
             it_names     = lt_changed_attr
           IMPORTING
             rv_success   = lv_success.

         IF lv_success IS NOT INITIAL.

           lv_changed_objects-object_name = 'Customer'.
           lv_changed_objects-object_id = cl_crm_genil_container_tools=>build_object_id( lv_cust_key ).

*    Add into Object Table with Object Type and ID.

           APPEND lv_changed_objects TO et_changed_objects.

         ENDIF.

       WHEN OTHERS.
     ENDCASE.
   ENDIF.


ENDMETHOD.

METHOD change_customer.

   FIELD-SYMBOLS : <line> TYPE zattr_cust,
                           <old>  TYPE simple,
                           <new>  TYPE simple,
                           <name> TYPE name_komp.

   READ TABLE gt_customer WITH KEY
              guid = is_cust_attr-guid
              custno = is_cust_attr-custno ASSIGNING <line> .

   CHECK sy-subrc IS INITIAL.

   LOOP AT it_names ASSIGNING <name>.
     ASSIGN COMPONENT <name> OF STRUCTURE <line> TO <old>.
     CHECK sy-subrc = 0.
     ASSIGN COMPONENT <name> OF STRUCTURE is_cust_attr TO <new>.

     CHECK sy-subrc = 0.
     <old> = <new>.
   ENDLOOP.
   <line>-new = 'M'.
   rv_success ='X'.

ENDMETHOD.


IF_GENIL_APPL_ALTERNATIVE_DSIL~SAVE_OBJECTS

METHOD if_genil_appl_alternative_dsil~save_objects.

   DATA lv_cust_key TYPE zattr_cust_key.


   FIELD-SYMBOLS <object> TYPE crmt_genil_obj_inst_line.

   LOOP AT ct_object_list ASSIGNING <object>.

* Check for Object Instance.

     CASE <object>-object_name.
       WHEN 'Customer'.
         TRY.
             CALL METHOD cl_crm_genil_container_tools=>get_key_from_object_id(
               EXPORTING
                 iv_object_name = <object>-object_name
                 iv_object_id   = <object>-object_id
               IMPORTING
                 es_key         = lv_cust_key ).
             .
           CATCH cx_crm_genil_general_error .
         ENDTRY.

* Custom API to Save the customer data.

         CALL METHOD zcl_customer_api=>save_customer
           CHANGING
             cs_key = lv_cust_key.
         IF lv_cust_key IS INITIAL.
           <object>-success = abap_true.
         ENDIF.
     ENDCASE.
   ENDLOOP.

ENDMETHOD.

Define CS_KEY TYPE ZATTR_CUST_KEY as parameter of Save Customer.

METHOD SAVE_CUSTOMER.

   DATA : wa_cust TYPE zmast_cust.
   DATA : lv_success TYPE abap_bool.

   FIELD-SYMBOLS: <customer_attr_n> LIKE LINE OF gt_customer.

   lv_success = 'X'.

   READ TABLE gt_customer ASSIGNING <customer_attr_n> WITH
              KEY guid = cs_key-guid
                  custno = cs_key-custno.

   CHECK sy-subrc = 0.

   CASE <customer_attr_n>-new.
     WHEN 'C' OR 'M'.
       MOVE-CORRESPONDING <customer_attr_n> TO wa_cust.
       MODIFY zmast_cust FROM wa_cust.

     WHEN OTHERS.
   ENDCASE.

   CALL FUNCTION 'DEQUEUE_EZMAST_CUST'
     EXPORTING
       mode_zmast_cust = 'E'
       guid            = cs_key-guid
       custno          = cs_key-custno.

   CLEAR cs_key.

ENDMETHOD.                    "SAVECUSTOMER

Coding Part is Done to create genil implementation class.

STEP 6 : go to transaction genil_bol_browser -> Click on Create a New Root Object

Select the root object as Customer double click it.

Enter the parameters value  Custno  -

you can add you own custom logic to default set the value of the attributes

Click on Create Object

    

Here Guid and Custno is in display mode , while remaining atrributes are in changeable mode - Enter the values of the Attributes.

Click on Save Button.

      

and Check the database table ZMAST_CUST.

    

In my next blog '  http://scn.sap.com/community/crm/webclient-ui-framework/blog/2012/09/25/implementation-of-a-custom-g... ' will use this Custom GenIL component set to create a New custom component with create and save the data

in database


Regards,

Sumeet Gehlot

SAP CRM Practice.



42 Comments
Labels in this area