Anda di halaman 1dari 18

Creating a Custom Genil/Bol object Model

Posted by Sumeet Gehlot in SAP CRM: Webclient UI - Framework on Aug 6, 2012 11:10:32
AM
inShare

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 2: Registering of Genil component is done using Transaction SM34 ,

Enter View Cluster name as CRMVC_GIL_APPDEF or we can use maintaince


viewCRMV_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 .
a.

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

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
DATA
DATA
DATA
DATA
DATA

:
:
:
:
:
:

lv_guid TYPE crmt_object_guid.


lv_key
TYPE zattr_cust_key.
lv_success TYPE char1.
lit_cust TYPE TABLE OF ty_cust.
wa
TYPE ty_cust.
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_objectsobject_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-genil-model-in-web-ui ' will


use this Custom GenIL component set to create a New custom component with create and
save the data
in database

Anda mungkin juga menyukai