Thursday, December 23, 2010

IBM MDM Server Certification (Test 000-420: IBM InfoSphere MDM Server v9.0)

I cleared the IBM MDM server certification exam.I wish to share my experience in preparing for the same. 
Here goes the test objectives.


Section 1 - Configure and Deploy InfoSphere MDM Server in a Development Workstation (9%)
Given a scenario, describe workstation RAD/RSA development environment setup
Demonstrate knowledge of deploying Custom Code
Demonstrate knowledge of configuring MDM Server features

Section 2 - MDM Server Architecture and Domain Model (12%)
Describe basic MDM Server architecture
Describe MDM Server business entities and their relationships

Section 3 - Extensions and Additions (through Workbench) (12%)
Given a scenario, demonstrate knowledge of differences between a data extension and an addition
Given a scenario, demonstrate knowledge of creating code tables
Demonstrate knowledge of how to create a behavior extension

Section 4 - Composite Transactions (8%)
Describe how to create composite transactions using Business Proxy
Describe the difference between composite XML transactions and Java business proxy composites

Section 5 - External Rules and Validation (9%)
Describe External Business Rules Framework
Describe how to create a new external rule
Describe external validation and when to use it

Section 6 - Search Strategy (5%)
Describe search strategy (high level)
Describe different implementations of seach strategy

Section 7 - Suspect Duplicate Processing (14%)
Describe party SDP work flow
Demonstrate knowledge of implementing customized SDP logic
Demonstrate knowledge of 'evergreening'

Section 8 - Features and Functionality (16%)
Describe simple/compound history
Describe the MDM Server components
Demonstrate knowledge of configurable inquiry levels

Section 9 - Security (6%)
Describe MDM Server data visibility and accessibility control
Demonstrate knowledge of Authentication versus Authorization

Section 10 - Troubleshooting (9%)
Given a scenario, demonstrate knowledge of configuring and analyzing MDM Server log files
Given a scenario, demonstrate knowledge of Error handling

There will be 63 questions and the time frame is 90 min and the passing score is 67% which means you have to clear alt least 43 questions.
Even if section percentage is given as above,for the actual exam there may be a few difference like
Section 1 -10% 6 questions out of 63
Section 2 -13% 8 questions out of 63
Section 3 -13% 8 questions out of 63
Section 4 - 7% 5 questions out of 63
Section 5 - 10% 6 questions out of 63
Section 6 - 5% 3 questions out of 63
Section 7 - 14% 9 questions out of 63
Section 8 - 15% 10 questions out of 63
Section 9 - 3% 2 questions out of 63
Section 10 - 10% 6 questions out of 63

 As I am working in an company which is an IBM business partner I was able to undergo the training from IBM.But the training itself wont assure you success as it cannot cover everything in a certification perspective.The point I wish to emphasize is that I had ready access to all the training materials and the pdf which are essential in clearing the exam. 

Materials you should refer are
  • MDM Transaction Reference Guide
  • MDM UI Developers Guide
  • MDM Understanding And Planning Guide
  • MDM Workbench User Guide
  • User Interface Generator Guide
  • MDM Common Data Dictionary
  • MDM Common Services Transaction Reference
  • MDM Data Dictionary
  • MDM Data Stewardship UI Users Guide
  • MDM Developers Guide
  • MDM Developers Samples
  • MDM Installation Guide
  • MDM Product UI User Guide
  • MDM Query Connect Guide
  • MDM Quick Start Guide
  • MDM Release Notes
  • MDM System Management Guide
  • MDM Transaction List
  • Redbook: Master Data Management: Rapid Deployment Package for MDM
  • Redbook: WebSphere Customer Center: Understanding Performance
  • MDM Server version Infocenter (for v 9.0)
Do you think I am joking by giving you a list of pdf each spanning across 100 to 600 pages and telling you clearing the exam is a cake walk?.
Out of these pdfs I recommend you to read MDM Developers Guide,MDM System Management Guide,TRG which you can use as reference .But still the developer guide is so huge for you to read right ?.So pick up the exam objectives read only those :).
How we have prepared for the exam ?.
Ours is a small team .We divided the topics among each .
We prepared a schedule for the entire objective list.By 1and a half week ie 5+3 working days we covered the entire objective.
Every one prepared their topic well by referring the materials mentioned above & glanced through other topic.
Each day around 2hrs we kept apart from the work schedule & discussions we held for the days topic.We kept a certification tracker internally & posted all the doubts which came across during the discussion.

I forgot to mention that I used the sample test available from the link for free:
http://www.testpassport.com/IBMcertificationsIII/000-420.asp
I can see a few questions from the pdf available in the site for the actual exam.
MDM server best practices are available in the following link.Read the SDP article as section 7 is 14% of the entire exam objective.
http://www.ibm.com/developerworks/data/bestpractices/mdm/

Also refer the chapter Configuring pluggable keys which is a small one but you will get a easy question on it.Read about SMART Inquiries,Summary Data Indicators also.Even if I didn't work on both they are easy to understand.
Also I had seen questions from the external validation section like the types of external validations,which all tables are involved in the field level ,group level validation.I had discussed a little about external validations in one of my previous blogs which seems to be sufficient in answering them.
There is a question which shows a diagram and asking us to identify the missing component in the picture.The answer was DWLRequestHandler.
Go through the triggers section.There was question like when SIMPLE(update) triggers are used and when COMPOUND (insert/update)trigger is used/triggered.
There are questions from the behaviour extension/service extension section like the levels ACTION (COMPONENT)events,TRANSACTION events(CONTROLLER). 

All these information shared across are the ones which I remember but the question may change as IBM may be having a good question bank and they may be picking up questions randomly from it.

Here goes the link where you get complete information about the test.


Wednesday, December 8, 2010

Beginners Guide for Creating an IBM MDM External Validation


External validation is the ability of MDM  to validate end user data before updating or adding transactions.IT determines the data being entered is a valid or invalid one. External validation are triggered at the pre of the controller.

There are 2 main categories of external validation 
1)Field Level(Element Level)
2)Cross Filed Level(Group Level)
I will elaborate more on field level validation here.The element level validation is generally used under the following circumstances.
         To check whether the field is optional or mandatory
         To specify minimum and maximum field lengths and values
         To specify allowable and prohibited values and patterns etc.

The tables involved are 
1)V_ELEMENT
2)V_ELEMENT_VAL
3)V_ELEMENT_PARAM
4)V_FUNCTION
The V_ELEMENT contains the attribute which needs to validated.
V_ELEMENT_VAL relates the attribute(element) with the validation function.
V_ELEMENT_PARAM can be used to specify the param type and the param value.The param type is used to retrieve the param value in the validation function we write.
V_FUNCTION contains the fully qualified class path to the validation function class.(Function name , Java class).






Saturday, November 27, 2010

Creating Customized Search Strategy in IBM MDM

Introduction:
The Infosphere MDM Server provides us with a number of transactions to retrive the information stored by it in order to come up with high value customer data for analytic's ,reports ,to device new marketing strategies. The OOTB solutions can be customized so as to suit the clients requirements across various domains/industries.

Business Scenario:
Consider a scenario  of  the customer care center where thousands of customer calls up for various services ranging from the registering comapliants,to know about the various offers & services ,for a critical data change like address phone number. The call center agent will do a search based on the information provided by the customer to  validate his identity by asking a set of questions like dob, lastname,phone number etc.
The customers generally don’t like to wait on the line for long time and hence the performance of the system / response time is a major criteria.

Implementation  Strategies:
1)End to End Customization
2)Extending the Search rule & utilizing the search framework.
The first approach is already discussed in one of my previous blogs.

There are a few OOTB transactions available for ready use in the MDM server. For e.g.: if your search criteria is  related to person details like given name one,lastname etc you can think of using the search Person .If the search criteria is from the contract region we can use the searchContract.Also if the criteria is a mix of person & contract details you can use the searchFSParty transaction. The OOTB solutions make use of the SearchParty external rule.

In the case of my client they provide a unique card called privilege card for all it customers. This card number is accommodated in the data model as an extension on the CONTRACT table.None of the OOTB solutions support for searching based on an  extended field I have to write sqls for search based on this extended field.



In general the approach you can follow is
1)Common Search Exclusion
When ever a search request comes in check whether the criteria can result in a potentially huge result set.
For eg: A search based on common lastnames like Philip,Thomas etc can result in a large result set.
You can leverage the external validations to configure the Disallowed Search list to prevent a search on these common attributes.This feature prevent poor quality searches from executed against the MDM database
2)Configuring maxResult
The next thing we can focus on is configuring the maximum results that needs to be returned.It is available as a simple configuration in the CONFIGELEMENT table .
/IBM/Party/Search/maxResults
The default value is 100.The normal approach followed is use the value in CONFIGELEMENT as the default one ,but if the value for maxresult(Available in the request object) is less than what is configured in the table we are happy to return the what is provided in the request object.
3)External Rule
The first 2 steps can be done from inside a custom bp & the search strategy can implemented inside a Rule class.A modification to the search rule is needed only when client specific customizations are needed.
For eg: Search based on an extended field.
So what should be done in the rule is check if the request has got any extended attributes.If yes you have to invoke client defined sqls(which can be pre written and stored in tables or stored in some sql helper classes).
else invoke the OOTB services.
4)Ranking and Sorting.
5)Return the result.

These are the basic steps in creating a customized search strategy.




Wednesday, July 28, 2010

Implementing Pagination in IBM MDM

Before you start implementing the pagination feature for your search functionality I recommend you to explore the pagination facility for one of the existing search service.
For eg: searchFSParty





Note that inside the <dwlcontrol>  I had placed a few things extra.
   <pagestartindex>1</pagestartindex>
   <pageendindex>3</pageendindex>
   <returnavailableresultcount>true </returnavailableresultcount>


Example 1
If the pageStartIndex is 1, the pageEndIndex is 10, and the total result count is 16, then 10 records will be returned in the first subset, and 6 records will be returned in the second subset.

Example 2
 If the pageStartIndex is 1, the pageEndIndex is 10, and the total result count is 8, then the pageEndIndex is considered to be equal to the total count, and 8 records will be returned in the set.

Now we are ready to implement the pagination in our custom search transactions.
(Please read about how to create a custom search in my previous post)


1. The user sends a request XML for searchCustomer(My custom search transaction) transactions including  the pagination parameters. 
Pagiantion Pramaters:

    <pagestartindex>1 </pagestartindex>
   <pageendindex>3</pageendindex> 
   <returnavailableresultcount>true </returnavailableresultcount>
(Will help you return the total number of records available on executing the query for your search.)

2. Inside the controller class for our searchCustomer/handlesearchCustomer we have to add response BObj class name in the DWLControl

 You will be having a method generated in you controller like the one below.
 public DWLResponse searchCustomer(xxxRequestBObj theBObj) throws DWLBaseException
 Add the following:
 Vector reponseBobsForTxn=new Vector(); reponseBobsForTxn.add("com.mycompany.xxxResponseBObj");
 theBObj.getControl().setResponseBObjsForTxn(reponseBobsForTxn);

Now come back to your component class:

3.Add the following just above your List list = bObjQuery.getResults();
boolean considerForPagination = PaginationUtils.considerForPagintion(xxxResponseBObj.class.getName(), theBObj.getControl());
theBObj.getControl().setConsiderForPagintionFlag(considerForPagination);
System.out.println("Start Index--"+theBObj.getControl().getPageStartIndex());
System.out.println("End Index---"+theBObj.getControl().getPageEndIndex());

Now you are done with the pagination implementation for you custom search.
To add to this if you want to restrict the size of the result set returned by a search transaction. Add the following line of code in your component class after you got the bObjQuery.
bObjQuery.setMaxResults(int);

What I had done to configure the max result count is add a 'maxresults' tag to my custom request object so that the user can configure the max results returned.





Thursday, June 24, 2010

Customizing MDM Retrieval Service

There are two approaches for customizing the MDM retrieval service.


·         Approach 1:----End to end customization.
                              Here we should have complete control over SQL and how we build object structure.
          Approach 2:----Extension of the inbuilt ones.
                              Extending MDM Search Framework.

In this post I wish to emphasize on the first approach.

Retrival service with complete control over SQL:
First of all create a new module project. & follow the below steps.


1. Create a new MDM entity(Right click ->New MDM Entity)   (request object)  and populate with search criteria

2. Create a new MDM entity (response object) and populate with attributes you wish to return



3. Create a new MDM Tx,  View type, multiple records returned  set the request and response(The entities we created in Step 1 & 2)





We are trying to make use of MDM Entity addition to generate the request & response objects,but we will never
execute the scripts for entity addition to db.We just need the project skelton.For implementing the retrival service
we created a new MDM Txn with the request & response objects as the entity we created earlier.

Now go and generate the code.


Within the generated code there are a few places that you need  to modify:
In the component class, populate the handleXXX( BObj ) method where XXX is the name of your transaction.


CustomSearchFrameworkComponent.java:

public DWLResponse handleSearchByClubCardNumber(SearchRequestBObj theBObj) throws Exception {
   
        DWLStatus status = new DWLStatus();
        status.setStatus(DWLStatus.SUCCESS);
        DWLResponse response = createDWLResponse();     
        BObjQuery bObjQuery = null;

        bObjQuery = getBObjQueryFactory().createSearchRequestBObjQuery(SearchRequestBObjQuery.SEARCH_REQUEST_QUERY,
                theBObj.getControl());
       
        bObjQuery.setParameter("BObj", theBObj);          
        List list = bObjQuery.getResults();

        Vector vector = new Vector();
        for (Iterator it = list.iterator(); it.hasNext();) {
           SearchResponseBObj o = (SearchResponseBObj) it.next();

            vector.add(o);

            if (o != null) {
                if (o.getStatus()==null) {
                    o.setStatus(status);
                }
                response.addStatus(o.getStatus());
            } else {
                response.addStatus(o.getStatus());
            }
        }

        response.setData(vector);

        return response;
       

    }

In the BObjQuery class for the request object populate the provideSqlStatement() to return your custom sql, and change the
provideResultSetProcessor() method.

provideSQLStatement() is not available by default in the BObjQuery class.
Right click inside the class ,Perform an Override /Implement ->Select  provideSQLStatement()
or simply copy paste the code below.



@Override
    protected String provideSQLStatement() throws BObjQueryException {
        SQLParam sqlParam = (SQLParam) this.namedParams.get("BObj");
        SearchRequestBObj csRequObj=(SearchRequestBObj)sqlParam.getValue();
        System.err.println("Search Attribute---"+csRequObj.getClubCardNumber()+"####");
        // TODO Create the SQL HERE !!!!!
        String clubCard="'"+csRequObj.getClubCardNumber().trim()+"'";
       
        //I am simply getting  LINE_OF_BUSINESS & setting it to person name.(doesn't sounds logical forgive me it
        //is just an example.
        String sql= "select LINE_OF_BUSINESS from CONTRACT where XClub_Card_Id ="+clubCard;
       
       
        return sql;
    }

   
   
Change the provideResultSetProcessor() method. 

By default in generated code the reult processor returned is  SearchRequestResultSetProcessor ,but I had written my code in
SearchResponseResultSetProcessor().So changing it.
   
 /**
     *
     *
     *
     * Provides the result set processor that is used to populate the business
     * object.
     *
     * @return
     * An instance of SearchRequestResultSetProcessor.
     *
     * @see com.dwl.bobj.query.AbstractBObjQuery#provideResultSetProcessor()
     * @see com.mycompany.mdm.search.component.SearchRequestResultSetProcessor
     *
     * @generated NOT
     */
    protected IGenericResultSetProcessor provideResultSetProcessor()
            throws BObjQueryException {

        //return new SearchRequestResultSetProcessor();
        return new  SearchResponseResultSetProcessor();
    }   
   
Both the methods are invoked when     List list = bObjQuery.getResults(); is executed from the handleSearchByClubCardNumber() in
CustomSearchFrameworkComponent class.

In the above code we cahnged the reult set processor to "return new  SearchResponseResultSetProcessor()",but we are yet to write code in SearchResponseResultSetProcessor


In  SearchResponseResultSetProcessor class for the response object, populate the getObjectFromResultSet() method:


  /**
     *
     *
     *
     * Creates business objects from the supplied result set.
     *
     * @generated NOT
     */
    public Vector getObjectFromResultSet(ResultSet rs) throws Exception {
        Vector boVector = new Vector();
       
        // loop through the result set and get the column data
        while ( rs.next() ) {
            boVector.add( getBObjFromRS( rs ) );
        }
       
        return boVector;
    }

    /**
     *
     *
     *
     * Creates one business object from the supplied result set.
     *
     * @generated NOT
     */
    private SearchResponseBObj getBObjFromRS( ResultSet rs ) {
        SearchResponseBObj bobj = new SearchResponseBObj();
       
        try {
            // *** These MUST match the parameters requested in the SQL.
            /*bobj.setName( rs.getString(1) );
            bobj.setDOB( rs.getString(2) );
            bobj.setAddressLine1( rs.getString(3) );
            bobj.setAddressLine2( rs.getString(4) );
            bobj.setCity( rs.getString(5) );
            bobj.setPostCode( rs.getString(6) );
             */
            bobj.setPersonName(rs.getString(1));
            //bobj.setLineofBusiness(rs.getString(2));
           
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
       
        return bobj;
    }

Now  lets move on to our dtd,xsd,properties file & db changes.


It is a must that we put the  SearchRequestBObj?, SearchResponseBObj? in TCRMExtension.
Please see the liks to dtds & xsd at the bottom of the post.

Now you are done with merging.

DB Insert Statements:Only the METADATA file  you need to execute & only the following statements you need to execute.

-- Notes
-- MDM TODO statements are placed in the generated SQL file when user changes are required.
-- 1. Edit the following SQL files following any instructions given by MDM TODO statements.
-- 2. Connect to the database.
-- 3. Run each SQL file as shown below and in the same order.
--             db2 -tvf CustomSearchFramework_SETUP_DB2.sql
--             db2 -v -td@ -f CustomSearchFramework_TRIGGERS_DB2.sql
--             db2 -tvf CustomSearchFramework_CONSTRAINTS_DB2.sql
--             db2 -tvf CustomSearchFramework_MetaData_DB2.sql


----------------------------------------------
-- Component type
----------------------------------------------

INSERT INTO DB2ADMIN.COMPONENTTYPE (COMPONENT_TYPE_ID, DWL_PROD_TP_CD, COMPON_TYPE_VALUE, COMPON_LONG_DESC, LAST_UPDATE_DT)
   VALUES ( 1000032, 1, 'CustomSearchFrameworkFinderImpl', null, CURRENT TIMESTAMP);
INSERT INTO DB2ADMIN.COMPONENTTYPE (COMPONENT_TYPE_ID, DWL_PROD_TP_CD, COMPON_TYPE_VALUE, COMPON_LONG_DESC, LAST_UPDATE_DT)
   VALUES ( 1000030, 1, 'SearchRequestBObj', null, CURRENT TIMESTAMP);
INSERT INTO DB2ADMIN.COMPONENTTYPE (COMPONENT_TYPE_ID, DWL_PROD_TP_CD, COMPON_TYPE_VALUE, COMPON_LONG_DESC, LAST_UPDATE_DT)
   VALUES ( 1000034, 1, 'CustomSearchFrameworkComponent', null, CURRENT TIMESTAMP);
INSERT INTO DB2ADMIN.COMPONENTTYPE (COMPONENT_TYPE_ID, DWL_PROD_TP_CD, COMPON_TYPE_VALUE, COMPON_LONG_DESC, LAST_UPDATE_DT)
   VALUES ( 1000043, 1, 'SearchResponseBObj', null, CURRENT TIMESTAMP);

----------------------------------------------
-- Add SearchRequest object to V_GROUP table
----------------------------------------------

INSERT INTO DB2ADMIN.V_GROUP (GROUP_NAME, APPLICATION, OBJECT_NAME, LAST_UPDATE_DT, SORTBY)
  VALUES ('SearchRequestBObj', 'TCRM', 'com.mycompany.mdm.search.component.SearchRequestBObj', CURRENT TIMESTAMP, 'LAST_UPDATE_DT');


----------------------------------------------
-- Add SearchResponse object to V_GROUP table
----------------------------------------------

INSERT INTO DB2ADMIN.V_GROUP (GROUP_NAME, APPLICATION, OBJECT_NAME, LAST_UPDATE_DT, SORTBY)
  VALUES ('SearchResponseBObj', 'TCRM', 'com.mycompany.mdm.search.component.SearchResponseBObj', CURRENT TIMESTAMP, 'LAST_UPDATE_DT');


----------------------------------------------
-- Transactions
----------------------------------------------

INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, LAST_UPDATE_DT, TX_LOG_IND, TX_OBJECT_TP, DEPRECATED_SINCE, DWL_PROD_TP_CD)
   VALUES (1000006, 'addSearchRequest',  null, null, CURRENT TIMESTAMP, 'Y', 'P', null, 1);
  
INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000108, 1000006, 'TCRM', 'SearchRequestBObj', 'I', null, null, 1, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000109, 1000006, 'TCRM', 'SearchRequestBObj', 'O', null, null, null, 'cusadmin', CURRENT TIMESTAMP, 'Y');
       
INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, LAST_UPDATE_DT, TX_LOG_IND, TX_OBJECT_TP, DEPRECATED_SINCE, DWL_PROD_TP_CD)
   VALUES (1000009, 'updateSearchRequest',  null, null, CURRENT TIMESTAMP, 'Y', 'P', null, 1);
  
INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000110, 1000009, 'TCRM', 'SearchRequestBObj', 'I', null, null, 1, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000111, 1000009, 'TCRM', 'SearchRequestBObj', 'O', null, null, null, 'cusadmin', CURRENT TIMESTAMP, 'Y');
       
INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, LAST_UPDATE_DT, TX_LOG_IND, TX_OBJECT_TP, DEPRECATED_SINCE, DWL_PROD_TP_CD)
   VALUES (1000011, 'getSearchRequest', null, null, CURRENT TIMESTAMP, 'Y', 'I', null, 1);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000112, 1000011, null, null, 'I', 1, 'pkId', 1, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000113, 1000011, null, null, 'I', 5, 'aDWLControl', 2, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000114, 1000011, 'TCRM', 'SearchRequestBObj', 'O', null, null, null, 'cusadmin', CURRENT TIMESTAMP, 'Y');

INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, LAST_UPDATE_DT, TX_LOG_IND, TX_OBJECT_TP, DEPRECATED_SINCE, DWL_PROD_TP_CD)
   VALUES (1000019, 'addSearchResponse',  null, null, CURRENT TIMESTAMP, 'Y', 'P', null, 1);
  
INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000115, 1000019, 'TCRM', 'SearchResponseBObj', 'I', null, null, 1, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000116, 1000019, 'TCRM', 'SearchResponseBObj', 'O', null, null, null, 'cusadmin', CURRENT TIMESTAMP, 'Y');
       
INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, LAST_UPDATE_DT, TX_LOG_IND, TX_OBJECT_TP, DEPRECATED_SINCE, DWL_PROD_TP_CD)
   VALUES (1000022, 'updateSearchResponse',  null, null, CURRENT TIMESTAMP, 'Y', 'P', null, 1);
  
INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000117, 1000022, 'TCRM', 'SearchResponseBObj', 'I', null, null, 1, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000118, 1000022, 'TCRM', 'SearchResponseBObj', 'O', null, null, null, 'cusadmin', CURRENT TIMESTAMP, 'Y');
       
INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, LAST_UPDATE_DT, TX_LOG_IND, TX_OBJECT_TP, DEPRECATED_SINCE, DWL_PROD_TP_CD)
   VALUES (1000024, 'getSearchResponse', null, null, CURRENT TIMESTAMP, 'Y', 'I', null, 1);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000119, 1000024, null, null, 'I', 1, 'pkId', 1, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000120, 1000024, null, null, 'I', 5, 'aDWLControl', 2, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000121, 1000024, 'TCRM', 'SearchResponseBObj', 'O', null, null, null, 'cusadmin', CURRENT TIMESTAMP, 'Y');

INSERT INTO DB2ADMIN.CDBUSINESSTXTP (BUSINESS_TX_TP_CD, NAME, DESCRIPTION, EXPIRY_DT, LAST_UPDATE_DT, TX_LOG_IND, TX_OBJECT_TP, DEPRECATED_SINCE, DWL_PROD_TP_CD)
   VALUES (1000028, 'searchByClubCardNumber',  null, null, CURRENT TIMESTAMP, 'Y', 'P', null, 1);
  
INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000122, 1000028, 'TCRM', 'SearchRequestBObj', 'I', null, null, 1, 'cusadmin', CURRENT TIMESTAMP, null);

INSERT INTO DB2ADMIN.BUSINESSTXREQRESP (BUSTX_REQRESP_ID, BUSINESS_TX_TP_CD, APPLICATION, GROUP_NAME, REQ_RESP_IND, TX_PARAM_TP_CD, PARAM_NAME, PARAM_ORDER, LAST_UPDATE_USER, LAST_UPDATE_DT, COLLECTION_IND)
values (1000123, 1000028, 'TCRM', 'SearchResponseBObj', 'O', null, null, null, 'cusadmin', CURRENT TIMESTAMP, 'N');
       

For transactions:

In CDBUSINESSTXTP &  BUSINESSTXREQRESP you can insert the statemets for searchByClubCardNumber alone,but I added for
add,update& get also.No specific reasons just for safety.


In tcrm_extension.properties


#-------------Added for CustomSearchFramework

#-----------------------------------------------------------------------
# ADDITION: SearchRequest CONTROLLER METHODS
#
addSearchRequest = com.mycompany.mdm.search.controller.CustomSearchFrameworkTxnBean
updateSearchRequest = com.mycompany.mdm.search.controller.CustomSearchFrameworkTxnBean
getSearchRequest = com.mycompany.mdm.search.controller.CustomSearchFrameworkFinderImpl

#-----------------------------------------------------------------------
# ADDITION: SearchRequestBObj BUSINESS OBJECT
#
SearchRequestBObj = com.mycompany.mdm.search.component

#-----------------------------------------------------------------------
# ADDITION: SearchRequestBObj WEB SERVICES
services.endpoints.message.converter.com.mycompany.mdm.search.component.SearchRequestBObj=com.mycompany.mdm.search.customsearchframework.service.to.convert.SearchRequestBObjConverter
services.endpoints.message.converter.com.mycompany.mdm.search.customsearchframework.service.to.SearchRequest=com.mycompany.mdm.search.customsearchframework.service.to.convert.SearchRequestBObjConverter

#-----------------------------------------------------------------------
# ADDITION: SearchResponse CONTROLLER METHODS
#
addSearchResponse = com.mycompany.mdm.search.controller.CustomSearchFrameworkTxnBean
updateSearchResponse = com.mycompany.mdm.search.controller.CustomSearchFrameworkTxnBean
getSearchResponse = com.mycompany.mdm.search.controller.CustomSearchFrameworkFinderImpl

#-----------------------------------------------------------------------
# ADDITION: SearchResponseBObj BUSINESS OBJECT
#
SearchResponseBObj = com.mycompany.mdm.search.component

#-----------------------------------------------------------------------
# ADDITION: SearchResponseBObj WEB SERVICES
services.endpoints.message.converter.com.mycompany.mdm.search.component.SearchResponseBObj=com.mycompany.mdm.search.customsearchframework.service.to.convert.SearchResponseBObjConverter
services.endpoints.message.converter.com.mycompany.mdm.search.customsearchframework.service.to.SearchResponse=com.mycompany.mdm.search.customsearchframework.service.to.convert.SearchResponseBObjConverter

CustomSearchFramework.BObjQueryFactory=com.mycompany.mdm.search.bobj.query.CustomSearchFrameworkModuleBObjQueryFactoryImpl
customsearchframework_component = com.mycompany.mdm.search.component.CustomSearchFrameworkComponent
   
searchByClubCardNumber = com.mycompany.mdm.search.controller.CustomSearchFrameworkFinderImpl

In DWLCommon_extension.properties

#-------------Added for CustomSearchFramework


###################################################
# Webservices addition
###################################################

Parser.tcrm.CustomSearchFrameworkService=com.mycompany.mdm.search.customsearchframework.service.to.convert.CustomSearchFrameworkServiceRequestParser
Constructor.tcrm.CustomSearchFrameworkService=com.mycompany.mdm.search.customsearchframework.service.to.convert.CustomSearchFrameworkServiceResponseConstructor

Now you are ready!!.


Here is your request xml.

              RequestXML



Response:
             Response of Search





Links to dtd & xsds:


http://docs.google.com/leaf?id=0B3obvedGI1lvZTg3MjVkZmMtZmVhNS00MDU1LWJlNTUtM2VlOTNkOTNkMTRm&sort=name&layout=list&num=50