Documente Academic
Documente Profesional
Documente Cultură
| SCN
Getting Started
Newsletters
Store
Welcome, Guest
Login
Register
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 namly 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
Filter Blog
By author: ----By date:
-----
By tag:
abap bol component
Recent Posts
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 view CRMV_GIL_COMP Click maintain button.
Searching and Implementing BADI in CRM Web UI Access Component Controller or Custom Controller in a context node class-2 Pass variables to Long Text Accessing IBase Hierarchy Pop some tags and Pay it Forward V2.0 Tips and Tricks - Troubleshooting CRM (IC) Accessing Component Controller or Custom Controller in a context node class How to: Adding new row / element to context node collection in SAP CRM using ABAP Tree view change and save Function Profiles
Incoming Links
Re: EDIT option not available in Tr. "genil_model_browser" Re: EDIT option not available in Tr. "genil_model_browser"
Maintain the entries for Component Definition , Component Set Definition and Component
Assignment.
Re: Concepts to be prepared in CRM Technical WEB UI Re: GENIL_MODEL_EDITOR in SAP CRM 7.0 EhP1 Re: Why my custom Simple Object BOL entity can not be locked? Custom development of stand alone Web UI screen
Step 3 : Create a new Master Table name as ZMAST_CUST using transaction SE11.
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 METHOD if_genil_appl_intlay~create_objects. DATA : lv_guid TYPE crmt_object_guid. DATA: lv_key TYPE zattr_cust_key. DATA : lv_success TYPE char1. fill_struct_from_nvp_tab( EXPORTING it_parameters = it_parameters CHANGING cs_parameter = lv_key ). CALL FUNCTION 'GUID_CREATE' IMPORTING ev_guid_16 = lv_guid. DATA : lv_count TYPE i VALUE 0. TYPES : BEGIN OF ty_cust, custno TYPE zcustno, END OF ty_cust. DATA :lit_cust TYPE TABLE OF ty_cust, wa TYPE ty_cust. 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. CALL METHOD zcl_customer_api=>create_customer EXPORTING is_cust_key = lv_key IMPORTING rv_success = lv_success. IF lv_success IS NOT INITIAL. iv_root_list->add_object( iv_object_name = iv_object_name is_object_key = lv_key ). ENDIF. ENDMETHOD.
IF_GENIL_APPL_INTLAY~CREATE_OBJECTS
METHOD CREATE_CUSTOMER. DATA : lv_data like line OF gt_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. lv_data-guid = is_cust_key-guid. lv_data-custno = is_cust_key-custno. 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. "DATA lv_temp_att TYPE zbol_bp_master_attr. lv_root = iv_root_list->get_first( ). lv_root->get_key( IMPORTING es_key = lv_key ). IF lv_root->check_attr_requested( ) = abap_true. zcl_customer_api=>get_customer( EXPORTING is_cust_key = lv_key IMPORTING es_cust_attr = lv_cust_att ). IF lv_cust_att IS NOT INITIAL. lv_root->set_attributes( lv_cust_att ). lv_root = iv_root_list->get_next( ). ENDIF. ENDIF.
METHOD GET_CUSTOMER. FIELD-SYMBOLS <data> LIKE LINE OF gt_customer. * IF is_cust_key IS NOT INITIAL. READ TABLE gt_customer WITH KEY guid = is_cust_key-guid custno = is_cust_key-custno ASSIGNING <data>. ELSE. IF sy-subrc <> 0. RETURN. ENDIF. READ TABLE gt_customer WITH KEY new = 'C' ASSIGNING <data>. ENDIF. * * IF sy-subrc = 0. ** IF <line>-new EQ 'C' OR <line>-new EQ 'M'. MOVE-CORRESPONDING <data> TO es_cust_attr. RETURN. ENDIF. ENDMETHOD.
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. lv_root = iv_root_list->get_first( ). IF lv_root->get_delta_flag( ) IS NOT INITIAL. CASE lv_root->get_name( ). WHEN 'Customer'. lv_props = lv_root->get_attr_props_obj( ). 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 ). 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~LOCK_OBJECTS METHOD if_genil_appl_alternative_dsil~lock_objects. DATA : lv_key TYPE zattr_cust_key. FIELD-SYMBOLS <object> LIKE LINE OF ct_object_list. IF iv_lock_mode = if_genil_appl_intlay=>lock_mode_exclusive. LOOP AT ct_object_list ASSIGNING <object>. IF <object>-object_name = '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_key ). . CATCH cx_crm_genil_general_error . ENDTRY. CALL METHOD zcl_customer_api=>buffer_customer CHANGING cs_attr = lv_key. IF lv_key IS INITIAL. <object>-success = 'X'. ENDIF. ENDIF. ENDLOOP. ENDIF. ENDMETHOD.
METHOD buffer_customer. DATA : ls_customer LIKE LINE OF gt_customer. CALL FUNCTION 'ENQUEUE_EZMAST_CUST' EXPORTING mode_zmast_cust = 'E' guid = cs_attr-guid custno = cs_attr-custno EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3. IF sy-subrc = 0.
SELECT * FROM zmast_cust INTO CORRESPONDING FIELDS OF TABLE gt_customer WHERE guid = cs_attr-guid AND custno = cs_attr-custno. IF sy-subrc IS NOT INITIAL. " Key Do not exist in database ls_customer-guid = cs_attr-guid. ls_customer-custno = cs_attr-custno. ls_customer-new = 'C'. APPEND ls_customer TO gt_customer. ENDIF. CLEAR cs_attr. ELSE.
ENDIF. 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>. 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. 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(changing parameter) ZATTR_CUST_KEY.
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 'D'. DELETE gt_customer WHERE guid = cs_key-guid AND custno = cs_key-custno. 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
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.
In my next blog ' http://scn.sap.com/community/crm/webclient-uiframework/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
Share
Like
24 Comments
Hi Sumeet, Excellent blog. Can you please update the screen shot of " Component Definition", I would like to know which implementation class you have mentioned there. Thanks Imran
Like (2)
Hi Imran , Thanks , I have attached a screen shot to register a genil component Regards, Sumeet
Like (0)
Quite a few of the images do not show for me... The very first image in the blog is one with a probelm -
SAP CRM: Webclient UI - Framework: Creating a C... | SCN can you please look into this.
Like (0)
Sumeet Gehlot Aug 13, 2012 2:30 PM (in response to Jason Scott)
Jason Scott Aug 14, 2012 2:36 AM (in response to Sumeet Gehlot)
Unfortunately the company I work for only allows IE! What kind of image or html have you used that won't work with IE? It would be excluding allot of users I think... (I wish we could run a different browser.)
Like (0)
Can you please show the structure of ZATTR_CUST_TAB. As its not visible if you are already sharing it. The structure of the table doesnt have field like 'NEW'. So do we specifically add 'New' field in struct ZATTR_CUST_TAB.
Like (1)
@Pooja : I have attached a screen shot of a ZATTR_CUST, Hope it works... Regards, Sumeet Gehlot
Like (0)
@Jason : I dont know why images are not visible in IE , hope we can run in different browser. Regards, Sumeet Gehlot
Like (0)
Hi Sumeet, can u share the parameter screen shot of Method SAVE_CUSTOMER ? cheers, Das
Like (1)
Hi Savaridassan, Create a Parameter as CHANGING type CS_KEY Changing Type ZATTR_CUST_KEY Customer Key Attribute Regards,
Hi Sumeet, Thanks a lot. i worked on this and got the output..sure wil trace and learn a lot. Thanks again expect more resource from u like this...very Good one cheers Savaridassan P
Like (2)
Nice Blog
Like (0)
Hi Sumeet..! I am new to CRM webui, found the most of the functionality in your article... I tried to impelmented the same thing on my pc and got below errors....
1) In IF_GENIL_APPL_ALTERNATIVE_DSIL~LOCK_OBJECTS
lv_lovk_mode is unknown. it is not contaied in one of the specified table... 2)In class ZCL_CUSTOMER_API.. SAVE_CUSTOMER.. ABAP_BOOL is unknown... when I added the type-POOLs on the top the error is gone.. also in .. GENIL_MODEL_BROWSER when i enter the component as zcust, it never allowed me to create the object when i right click on the root objects it shows collapse Lower-level node and To Higher-level Node.... also in your sample it shows 4 symbols on the top left corner to edit, transport (lorry), refresh and check but it is not showing me on my CRM 7.0 thing..
In my editor it is always a browser... not editor but in your screen shot it is saying as editor.. like GenIL Model Editor: change component... etc I tried with t-code.. GENIL_MODEL_EDITOR it says it is not found.. When comming to the GENIL_BOL_BROWSER, I eneter the component name it shows empty model browser root objects... I believe this is because I could not create a root object in genil model browser....
Again thnaks for your time in writing such a nice article but i do appreciate it if you clarify my problems.. otherwise it would become an incomplete for me.. Thanks...
Like (0)
Greetings Bala, anyway Sumeet would be explaining you all in detail...to add with his point.. i too tried this document and got results.. thanks to Sumeet the second point u said its ok, i too faced it. and the document prepared using CRM 7.0 EHP 1 i think so. in CRM 7.0, you dont have Genil_Model_Editor transcation.
Thaks for your info.. atleast I came to know that I am using a different version otherwise I'd have been sitting on it and scratching my head like crazy ..
Like (0)
Hi Sumeet Gehlot, Excellent Blog. I am new to webclient-ui-framework. I am bit confused of using GUID in tables. Please consider the the simple scenario Company , Department and Employee and try to reply to the thread http://scn.sap.com/thread/3272179 . Thanks and Regards, Sumeet S
Like (0)
HI Sumeet, Excellent blog with complete details. Just one issue m facing is ... when m trying to create a new root object in Genil_bol_browser with Custno value being 1 ... its giving a dump stating " An exception occurred which is explained in detail below. The exception, which is assigned to class 'CX_CRM_CIC_PARAMETER_ERROR', was not caught and therefore caused a runtime error. The reason for the exception is: Entry parameter ES_KEY of method CL_CRM_GENIL_CONTAINER_OBJECT->GET_KEY contains value , which is not allowed " can u plzz guide. Rgds, Vishal
Like (0)
Hi Sumeet, Great Blog and Nice contribution. I am facing problem, when I tried to create a new root object in genil_bol_browser, program generating in short dump with the message A mandatory parameter was not populated when dyn. calling a method. Error analysis An exception occurred that is explained in detail below. The exception, which is assigned to class 'CX_SY_DYN_CALL_PARAM_MISSING', was not caught in procedure "CREATE_HANDLER" "(METHOD)", nor was it propagated by a RAISING clause. Since the caller of the procedure could not have anticipated that the exception would occur, the current program is terminated. The reason for the exception is: The mandatory parameter "IV_MODE" of the method "CONSTRUCTOR" of the class "ZCL_CUSTOMER_MODEL" was not populated during dynamic method call. I am using CRM 7.0. I don't understand how to pass "IV_MODE" value. Can any please help me on this?
Like (0)
SAP CRM: Webclient UI - Framework: Creating a C... | SCN I could not see the root object in "ZCUST" component or "ZCSET_CUST" component set. No root objects are displaying when I tried to open them. Instead they are displaying in SO2 component/component set.
Like (0)
Thanks,
Like (0)
Sumeet Gehlot May 22, 2013 12:27 PM (in response to Reshma Reddy)
Hello Reshma, No Class have been inherited for API class. Thanks,
Like (0)
Nice Blog.
Like (0)
Copyright
Follow SCN