Showing posts with label SAP MDM Java API. Show all posts
Showing posts with label SAP MDM Java API. Show all posts

SRM-MDM Catalog version compatibility

Purpose

The main objective of this page is to explain the compatibility between SRM-MDM Catalog, Java API and MDM Server.

Overview

The application SRM-MDM Catalog is dependent on other two main applications or components, which are MDM Server and MDM Java API. The compatibility of these applications is informed in the SRM-MDM Release Notes available in SAP Service Marketplace (Software Download Center):

https://service.sap.com/swdc

This document will present how to check the versions of each of these applications and it will also explain how to correct the compatibility in case there is a version mismatch.

Identifying the versions of your applications

You can get this information by accessing the J2EE component info page (http://<J2EE_SERVER>:<PORT>/sap/monitoring/ComponentInfo).

The Component name of SRM-MDM is SRM_MDM_CAT and the Component name of MDM Java API is MDM_JAVA_API.

In order to get the information of your MDM Server, please follow the steps below:

1) Open the SRM MDM utilities:

http://<J2EE_SERVER>:<PORT>/webdynpro/dispatcher/sap.com/tc~mdm~srmcat~uiutil/Utilities

2) Choose "Connection Test"

3) Provide the host name or IP of your MDM server (MDM server)

4) Click on "Start Testing" button

Checking the compatibility of your applications

Find the latest release note according to your SRM-MDM Support Package (SP) and open this note.

You will find in the note the SRM-MDM Catalog SP and Patch as well as the MDM Server SP. The version of MDM Java API should be the same as MDM Server since they are distributed together, as part of the same release.

See the image below for more information:

If the version of these three components is not compatible then it is probable that you will face issues during the usage of SRM-MDM Catalog.

Example of compatible versions:

SAP Note 1505367 mention SRM-MDM Catalog 3.0 SP08 Patch 01 is compatible with MDM Server 7.1 SP05.

Your component versions:

SRM_MDM_CAT:3.0 SP8 (1000.3.0.8.123.123456789)

MDM_JAVA_API: 710 SP5 (1000.710.0.5.123.123456789)

MDM Server: MDM Server 7.1 SP5 (Check)

Example of incompatible versions:

SAP Note 1642907 mention SRM-MDM Catalog 3.0 SP11 Patch 01 is compatible with MDM Server 7.1 SP07.

Your component versions:

SRM_MDM_CAT:3.0 SP11 (1000.3.0.8.123.123456789)

MDM_JAVA_API: 710 SP4 (1000.710.0.4.123.123456789)

MDM Server: MDM Server 7.1 SP4 (Check)

Solving the incompatibility of your applications

In case you have a version mismatch you should update your applications according to the latest release note for SRM-MDM. In case you don’t want to update your MDM Server than use the latest release note according to your SRM-MDM SP. Note that some errors are corrected in higher releases so it is not guaranteed that your issue will be solved by updating to the latest release of your SP. 

In order to update your application components go to Software Download Center, click on "Support Packages and Patches" (top menu) and then click on "Search for Support Packages and Patches" (left menu). Search for "SAP MDM CATALOG" and click on oyr SRM-MDM version. For more information please check note 1476694.

Related Content

Related Documents

Related Notes

SAP Note: 1650896 - SRM-MDM “Login Failed” error

SAP Note: 1476694 - Change in SRM-MDM Catalog 3.0 components in SMP

SAP Note: 1663002 - SRM-MDM Catalog "Repository Locked"

Code to Get List of Validation in a Table

Following code snippet finds out the list of Validation from a Table.

package com.sap.infosys.mdm.validationcheck;

import com.sap.mdm.commands.AuthenticateUserSessionCommand;
import com.sap.mdm.commands.CommandException;
import com.sap.mdm.commands.CreateUserSessionCommand;
import com.sap.mdm.commands.DestroySessionCommand;
import com.sap.mdm.commands.GetRepositoryRegionListCommand;
import com.sap.mdm.data.RegionProperties;
import com.sap.mdm.ids.TableId;
import com.sap.mdm.net.ConnectionException;
import com.sap.mdm.net.ConnectionPool;
import com.sap.mdm.net.ConnectionPoolFactory;
import com.sap.mdm.server.DBMSType;
import com.sap.mdm.server.RepositoryIdentifier;
import com.sap.mdm.validation.ValidationProperties;
import com.sap.mdm.validation.ValidationPropertiesResult;
import com.sap.mdm.validation.commands.RetrieveValidationsCommand;


public class GetListOfValidations {     public static void main(String[] args) {         // create connection pool to a MDM server         String serverName = " ";         ConnectionPool connections = null;         try {             connections = ConnectionPoolFactory.getInstance(serverName);         } catch (ConnectionException e) {             e.printStackTrace();             return;         }         // specify the repository to use         // alternatively, a repository identifier can be obtain from the GetMountedRepositoryListCommand         String repositoryName = "Vendor1";         String dbmsName = " ";         RepositoryIdentifier reposId =             new RepositoryIdentifier(repositoryName, dbmsName, DBMSType.MS_SQL);         // get list of available regions for the repository         GetRepositoryRegionListCommand regionListCommand =             new GetRepositoryRegionListCommand(connections);         regionListCommand.setRepositoryIdentifier(reposId);         try {             regionListCommand.execute();         } catch (CommandException e) {             e.printStackTrace();             return;         }         RegionProperties[] regions = regionListCommand.getRegions();         // create a user session         CreateUserSessionCommand sessionCommand =             new CreateUserSessionCommand(connections);         sessionCommand.setRepositoryIdentifier(reposId);         sessionCommand.setDataRegion(regions[0]); // use the first region         try {             sessionCommand.execute();         } catch (CommandException e) {             e.printStackTrace();             return;         }         String sessionId = sessionCommand.getUserSession();         // authenticate the user session         String userName = "Admin";         String userPassword = "mdm";         AuthenticateUserSessionCommand authCommand =             new AuthenticateUserSessionCommand(connections);         authCommand.setSession(sessionId);         authCommand.setUserName(userName);         authCommand.setUserPassword(userPassword);         try {             authCommand.execute();         } catch (CommandException e) {             e.printStackTrace();             return;         }         // the main table, hard-coded         TableId mainTableId = new TableId(1);         // Get the list of validations         RetrieveValidationsCommand objRtvVldCmd =             new RetrieveValidationsCommand(connections);         // set the user session         objRtvVldCmd.setSession(sessionId);         // get validation for the following tables.         objRtvVldCmd.setTableId(mainTableId);                 try {             objRtvVldCmd.execute();         } catch (CommandException e) {             e.printStackTrace();             return;         }         ValidationPropertiesResult objVldPropRslt =             objRtvVldCmd.getValidationPropertiesResult();         ValidationProperties[] validations = objVldPropRslt.getValidations();         //disply --> Validation ID | error/warning message | Validation Name         for (int i = 0; i < validations.length; i++) {             System.out.println(                 validations[i].getId()                     + " | "                     + validations[i].getMessage()                     + " | "                     + validations[i].getName());         }     }

CreateRecordCommand Vs CreateRecordsCommand

Given the shortcomings of Import Manager of rejecting a complete input excel spreadsheet, in case of even a single spurious record and lack of comprehensive error reporting to track reasons for file rejection or all errors. All these and more combined together, gave me a reason to develop a prototype, which overcomes shortcomings of using Import Manager to import data into MDM repository using Excel spreadsheets

In this blog I will discuss two important API classes, CreateRecordCommand and CreateRecordsCommand , and in following blogs will detail the complete design using which you can have your own customised Import Manager, capable of Importing data from excel spreadsheet into MDM repository with comprehensive error reporting.

Browsing through the MDM Java API documentation I found two classes for creating records in the repository:

  • CreateRecordCommand &
  • CreateRecordsCommand

While the first command is used to create individual records in the repository, the following CreateRecordsCommand is used for mass record creation.

It is a single Record Object which is a required parameter for CreateRecordCommand, we need to set an array of Record objects (records for mass creation) for CreateRecordsCommand.

Using CreateRecordCommand you can get 'recordId' of the newly created record but using CreateRecordsCommand the API provides us various methods to retrieve

  • FailedRecordMessages
  • Succeeded Record recordIds
  • Failed and Succeeded Record Arrays, containing corresponding indexes in the records array initially passed into CreateRecordsCommand
  • Array of all records passed into CreateRecordsCommand

Please use the link of MDM Java API javadoc link http://help.sap.com/javadocs/MDM/SP06P2/index.html to find out specific methods for CreateRecordsCommand, which can be used to retrieve specific information in order to generate better reports with exception/error messages.

Signing off for now....... till my next page in this series.

Search In a MDM Repository

Following code snippet shows the step to search inside MDM repository. It searches the string inside field Vendors in the table Vendors under repository Vendor1 .

public class Connection {     private SimpleConnection simpleConnection;     private String serverName = " ";     private String repositoryName="Vendor1";     private String dbServerName = " ";     private DBMSType dbmsType = DBMSType.MS_SQL;     private RegionProperties dataRegion = new RegionProperties();     private String userSession;     private String repositorySession;     private String userName="Admin";     private String password="mdm";     private RepositorySchema schema;     private RepositoryIdentifier repositoryID;     public void getConnection() {         try {             if (simpleConnection == null) {                 simpleConnection =                     SimpleConnectionFactory.getInstance(serverName);             }         } catch (Exception e) {             //              }     }         public void closeConnection( )       {         //@@begin closeConnection()         try{             if(simpleConnection!=null){                 DestroySessionCommand destroySessionCommand=new DestroySessionCommand(simpleConnection);                 destroySessionCommand.setSession(userSession);                 destroySessionCommand.execute();                 userSession=null;                 simpleConnection.close();             }         }catch(Exception e){
//                    }         //@@end       }           public void getAuthenticatedUserSession( )       {         //@@begin getAuthenticatedUserSession()         /*             * Create and authenticate a new user session to an MDM repository             */            repositoryID=new RepositoryIdentifier(repositoryName,dbServerName,dbmsType);            CreateUserSessionCommand createUserSessionCommand=new CreateUserSessionCommand(simpleConnection);            createUserSessionCommand.setRepositoryIdentifier(repositoryID);            createUserSessionCommand.setDataRegion(dataRegion);            try {                createUserSessionCommand.execute();                    userSession=createUserSessionCommand.getUserSession();// Get the session identifier               /* Authenticate User Session */            TrustedUserSessionCommand trustedUserSessionCommand=new TrustedUserSessionCommand(simpleConnection);            trustedUserSessionCommand.setUserName(userName);                      trustedUserSessionCommand.setSession(userSession);            try {                trustedUserSessionCommand.execute();                userSession=trustedUserSessionCommand.getSession();            } catch (CommandException e1) {                /* Trusted Connection is not accepted */                AuthenticateUserSessionCommand authenticateUserSessionCommand=new AuthenticateUserSessionCommand(simpleConnection);                authenticateUserSessionCommand.setSession(userSession);                authenticateUserSessionCommand.setUserName(userName);                authenticateUserSessionCommand.setUserPassword(password);                authenticateUserSessionCommand.execute();                    }                   SetUnicodeNormalizationCommand unicodeNormalizationCommand=new SetUnicodeNormalizationCommand(simpleConnection);            unicodeNormalizationCommand.setSession(userSession);            unicodeNormalizationCommand.setNormalizationType(SetUnicodeNormalizationCommand.NORMALIZATION_COMPOSED);            unicodeNormalizationCommand.execute();            }catch (CommandException e2) {
//                         }       }           public void setRegionProperties( )       {         //@@begin setRegionProperties()         dataRegion.setRegionCode("engUSA");         // Set the locale on data region         dataRegion.setLocale(new Locale("en", "US"));         // Set the name of data region         dataRegion.setName("US");         //@@end       }     public void setRepositoryInfo( java.lang.String repositoryName, java.lang.String userID, java.lang.String password )      {        //@@begin setRepositoryInfo()        this.repositoryName=repositoryName;        this.userName=userID;        this.password=password;            //@@end      }           public void getAuthenticatedRepositorySession( )     {       //@@begin getAuthenticatedRepositorySession()           try{               CreateRepositorySessionCommand repositorySessionCommand=new CreateRepositorySessionCommand(simpleConnection);               repositorySessionCommand.setRepositoryIdentifier(repositoryID);               repositorySessionCommand.execute();               repositorySession=repositorySessionCommand.getRepositorySession();                       AuthenticateRepositorySessionCommand authenticatedRepositorySession=new AuthenticateRepositorySessionCommand(simpleConnection);               authenticatedRepositorySession.setSession(repositorySession);               authenticatedRepositorySession.setUserName(userName);               authenticatedRepositorySession.setUserPassword(password);               authenticatedRepositorySession.execute();                       GetRepositorySchemaCommand repositroySchemaCommand=new GetRepositorySchemaCommand(simpleConnection);               repositroySchemaCommand.setSession(repositorySession);               repositroySchemaCommand.execute();               schema=repositroySchemaCommand.getRepositorySchema();                           }catch(CommandException e){
//                        }catch(Exception e){
//                        }               //@@end     }         public com.sap.mdm.ids.FieldId getFieldID( java.lang.String tableName, java.lang.String fieldCode )       {         //@@begin getFieldID()             return schema.getField(tableName,fieldCode).getId();             //@@end       }           public com.sap.mdm.ids.TableId getTableID( java.lang.String tableName )       {         //@@begin getTableID()         return schema.getTable(tableName).getId();         //@@end       }           public void searchRepository() {             //@@begin searchRepository()             ResultDefinition resultDef =                 new ResultDefinition(schema.getTable("Vendors").getId());             resultDef.addSelectField(schema.getField("Vendors", "Name").getId());             //resultDef.addSelectField(new FieldId(15));             FieldSearchDimension searchDimension =                 new FieldSearchDimension(                     schema.getField("Vendors", "Name").getId());             TextSearchConstraint constraint =                 new TextSearchConstraint("ABC", TextSearchConstraint.CONTAINS);             Search search = new Search(schema.getTable("Vendors").getId());             //search.addSearchItem(searchDimension,constraint);             RetrieveLimitedRecordsCommand limitedRecordsCommand =                 new RetrieveLimitedRecordsCommand(simpleConnection);             limitedRecordsCommand.setSearch(search);             limitedRecordsCommand.setSession(userSession);             limitedRecordsCommand.setResultDefinition(resultDef);             try {                 limitedRecordsCommand.execute();             } catch (CommandException e) {                 //                          }             //return limitedRecordsCommand.getRecords();             RecordResultSet recordSet = limitedRecordsCommand.getRecords();             String recordAsString = null;             String fieldValue = null;             for (int i = 0; i < recordSet.getCount(); i++) {                 recordAsString = "";                 FieldId[] returnedFields = recordSet.getRecord(i).getFields();                 for (int j = 0; j < returnedFields.length; j++) {                     if (recordSet                         .getRecord(i)                         .getFieldValue(returnedFields[j])                         .isNull()) {                         fieldValue = " |";                     } else {                         fieldValue =                             recordSet.getRecord(i).getFieldValue(returnedFields[j])                                 + "|";                     }                                         recordAsString += fieldValue;                     System.out.println(recordAsString);                 }             }         }                 public static void main (String[] args)                 {             Connection test=new Connection();             test.getConnection();             test.setRegionProperties();             test.setRepositoryInfo("Vendor1","Admin","mdm");             test.getAuthenticatedUserSession();             test.getAuthenticatedRepositorySession();             test.searchRepository();             test.closeconnection();              }

}

FAQ about SAP NetWeaver MDM

Can I install and run several versions of the MDM Clients in parallel on my PC?

Yes, both the installation as well as the parallel usage of all MDM Clients (e.g. Console, Data Manager, and so on) is possible. To achieve this, you need to change the default path suggested by the MDM installer during the MDM Client installation. You can use any destination folder on your local PC.

Example

In SAP MDM Development we use a central folder SAP MDM Clients as root folder for our installations. Below this folder there is a specific one for each MDM build version we need to work with. The screenshot shows that it is even possible to install MDM 5.5 and MDM 7.1 Clients in parallel.

Where can I find Repositories with Data?

The predefined SAP Business Content contains a small set of sample data that can be used to demonstrate the MDM capabilities. The sample data is directly shipped with the content deliverables. Additionally there is a NetWeaver MDM Demo Package available for MDM 5.5

How can I connect MDM with BI?

The predefined SAP Business Content used a file based approach to send data to BI. Each repository contains a Syndication Map that sends relevant data to BI. Alternatively you can use the MDM ABAP API to set up a direct connection between the systems.

 

Where can I find more information?

The SAP MDM WIKI space contains several articles of various topics that contain additional information - but are to large for the FAQs. Use the links below to browse through the existing information.

SAP Business Content — FAQ, tipps and tricks related to the SAP predefined Business Content

Links — Links to additional information related to MDM outside the Wiki pages.

Multiple Main Tables and Import Manager — Some things to know about the import and multiple main tables.

Efficient Repository Designing in MDM — Useful tipps, tricks and recommendations for data modeling in MDM.

Getting started with SAP NetWeaver MDM — The Beginners Guide for MDM

REPOSITORY COPYING COMMANDS

CLIX cpyArchive MDMHostSpec RepositorySpec [-A filename]

[-S segSize] [-F] [-N] [-O] [-D] [-XS] [-XSOVT]

Saves an MDM repository to an .a2a archive file. Use –A to specify the

filename rather than accept the MDM Server generated filename. Use –

S to split the file into smaller segments; segment size is suffixed with ‘K’,

‘M’, or ‘G’ to specify kilo-, mega-, or gigabytes respectively. Use the –F

flag to force the overwriting of an existing .a2a archive file. Use the –XS

flag to create a schema-only archive. Use the –XOVT flag to exclude

originals (O), variants (V) and thumbnails (T) from the archive (any

combination of O, V, and T is permitted, such as –XV to exclude only

variants).

Normally CLIX will wait until the MDM Server completes the archive

operation; use the –N flag to return immediately, leaving the archive

activity to run in the background. If you do so, you can check the status

later with the mdsInfo command.

386
MDM Console

CLIX Commands

CLIX cpyDuplicate MDMHostSpec sourceRepositorySpec

targetRepositorySpec Credentials [-Pn] [-F] [-N] [-O]

[-D]

Duplicate a mounted MDM repository to a new repository. You can

overwrite an existing target repository by using the –F flag. Use the –N

flag to perform the operation asynchronously. Use the –P2 or –P4 flags

to specify 2 or 4 storage partitions rather than the default of 1.

CLIX cpyInfo MDMHostSpec [-D]

Whenever a cpyArchive command completes, the MDM Server

surveys and analyses every .a2a file in the MDM Server archive

directory. This command lists the contents of that report file.

CLIX cpyListArchives MDMHostSpec [-D]

Returns a list of the files in the MDM Server archive directory. You can

then choose one of these as the filename for the repUnarchive

command.

CLIX cpySlave MDMHostSpec sourceRepositorySpec

slaveRepositorySpec Credentials [-Pn] [-F] [-N] [-O]

[-D]

Duplicate a mounted MDM repository to a new repository and modify

the new repository to be a slave repository. You can overwrite an

existing target repository by using the –F flag. Use the –N flag to

perform the operation asynchronously. Use the –P2 or –P4 flags to

specify 2 or 4 storage partitions rather than the default of 1.

CLIX cpyUnarchive MDMHostSpec RepositorySpec filename [-Pn]

[-F] [-N] [-O] [-D]

Creates an MDM repository from an .a2a archive file specified by

filename. Use the –F flag to force the overwriting of an existing

repository by the same name on the same DBMS instance. Use the –N

flag if you wish to perform the processing in the background rather than

have CLIX wait until the operation finishes. Use the –P2 or –P4 flags to

specify 2 or 4 storage partitions rather than the default of 1.

How it Works: MDM ABAP API for SAP NetWeaver MDM 7.1

 

In this new SAP How it Works podcast, listen to Masato Inoue as he walks you through a brief introduction to MDM ABAP API for SAP NetWeaver Master Data Management 7.1 (SAP MDM 7.1).

He shows the deployment of the MDM ABAP API add-on to your ABAP system and configuration of the ABAP system and MDM system. Some sample programs are also introduced also.

What is Master Data Management ?

What is Master Data Management ? 

1.Master Data Management master data management (MDM) comprises a set of processes and tools that consistently defines and manages the non-transactional data entities of an organization (also called reference data). MDM has the objective of providing processes for collecting, aggregating, matching, consolidating, quality-assuring, persisting and distributing such data throughout an organization to ensure consistency and control in the ongoing maintenance and application use of this information.

Master Data Management(MDM)

Master Data Management

 (MDM) is the strategies, processes, technologies and people that create and maintain a single, complete view of all master data that enables a bounded business process scope. Master data management solutions are used to deliver complete, real-time views of vendors, customers, materials, equipment, and other master data that are dispersed across multiple application systems and databases.
  
Master Data Management Centralized facilities designed to hold master copies of shared entities, such as Customer and Product. All the information that defines and describes the structures, operations, and contents of a BI/DW system

 


Performing Free Form Searches with MDM Java API

Performing Free Form Searches via MDM Java API

SAP NetWeaver MDM comes along with a powerful Java API which covers almost any functionality offered through the client applications. Using a few examples, this blog explains how to perform free form searches via the Java API.

The examples are based on a very simple MDM Repository. The structure and contents are available at the end of the Blog.

The Java source is also available (exclusively for SDN users ;-)  ) as a SAP NetWeaver Developer Studio project here.

Free Form Search in MDM Data Manager

The examples simulate a free form search on the Products table. So let's briefly have a look on how this is done using the MDM Data Manager.

Besides the direct selection of values for searching, you can use the Expression field in the Free-Form Search pane.

Free Form Search in MDM Data Manager

A doubleclick on the highlighted area will bring up the Search Expression dialog. Here you can either directly type in the search expression or use the shortcut buttons to create an expression.

Search Expression

I included the equivalent search expression for each example in the source code.

Getting Started: Using one single field

This first example will emulate the search expression

FIND(Name,"Contractor")



on table Products.

The MDM Java API exposes the free form search capabilities via several types of free form search parameters. Each of them is implemented as a separate class and derived from the super class SearchParameter.


Search parameters are added to an instance of a Search object and they will be taken into consideration for the search as soon as it is executed.


So the first thing for us to do is to create a new Search object.




Search search = new Search("Products");





This search object contains a collection of several instances of search parameter classes. This collection is initially empty. We will now add a new search parameter class to this collection.




FreeFormTableParameter fftpNames =
search.GetParameters().NewFreeFormTableParameter("Products");




As you see we are using the class FreeFormTableParameter since we want to restrict our free form search based on fields of a given table (Products). To create a new instance of this search parameter, we use the method NewFreeFormTableParameter() of the SearchParameters collection. This method requires the table name from which we will later on use the fields and will also add this new parameter to the collection.

FreeFormParameterField ffpfName = fftpNames.GetFields().New("Name");



This line of code adds a new FreeFormParameterField based on the field Name of the Products table to the search parameter. This is the field we are using in our expression above.

ffpfName.GetFreeForm().NewString("Contractor", FreeFormParameter.SubstringSearchType);



Here we use the FreeFormParameterField to add the restriction for the value Contractor. We use NewString() because this is a string value and we specify a substring search.


As with any other search

A2iResultSet result = catalog.GetResultSet(search, rsd, "Name", true, 0);



will execute the search and return the result.


The complete source code is available at the end of the blog.

Single Field, More Values

The next thing is to search for multiple values, but still using one single field. Let's take the expression

FIND(Name, "Contractor") AND FIND(Name, "Blade") AND FIND(Name,
"Standard")

on table Products.


The code is exactly the same as above until the instanciation of the FreeFormParameterField:

FreeFormParameterField ffpfName = fftpNames.GetFields().New("Name",
FreeFormParameterField.SEARCH_OPERATOR_AND);



This line of code will combine the search with logical AND.


After that we can simply add each of the values, one after the other.

ffpfName.GetFreeForm().NewString("Contractor",
FreeFormParameter.SubstringSearchType);


ffpfName.GetFreeForm().NewString("Blade",
FreeFormParameter.SubstringSearchType);


ffpfName.GetFreeForm().NewString("Standard",
FreeFormParameter.SubstringSearchType);



Most probably you already guessed, that for the expression

FIND(Name, "Contractor") OR FIND(Name, "Blade") OR FIND(Name,
"Standard")

on table Products, we have to use the coding

FreeFormParameterField ffpfName = fftpNames.GetFields().New("Name",
FreeFormParameterField.SEARCH_OPERATOR_OR);


AND and OR together

The previous example covered expressions using either only OR combinations or AND combinations of the values. Now we want to go for

(FIND(Name, "Contractor") OR FIND(Name, "Blade")) AND FIND(Name,
"Standard")

on table Products.


A litte bit more complicated but still straight forward:


Start with the first sub-expression (the OR combination in brackets):

FreeFormParameterField ffpfName1 = fftpNames.GetFields().New("Name",
FreeFormParameterField.SEARCH_OPERATOR_OR);


ffpfName1.GetFreeForm().NewString("Contractor", FreeFormParameter.SubstringSearchType);


ffpfName1.GetFreeForm().NewString("Blade", FreeFormParameter.SubstringSearchType);



After that add a new FreeFormParameterField.

FreeFormParameterField ffpfName2 = fftpNames.GetFields().New("Name");


ffpfName2.GetFreeForm().NewString("Standard", FreeFormParameter.SubstringSearchType);



Several FreeFormParameterField instances will be AND combined automatically.

Two fields

The expression

FIND(Manufacturer, "Estwing") AND FIND(Name, "Polyurethane") 

on table Products uses two fields. But based on what you have already seen, the implementation is easy.


One FreeFormParameterField for the first field:

FreeFormParameterField ffpfManu = fftpProducts.GetFields().New("Manufacturer");


ffpfManu.GetFreeForm().NewString("Estwing", FreeFormParameter.SubstringSearchType);



And one FreeFormParameterField for the second field:

FreeFormParameterField ffpfName = fftpProducts.GetFields().New("Name");


ffpfName.GetFreeForm().NewString("Polyurethane", FreeFormParameter.SubstringSearchType);



Again, the search parameters are AND combined by default.

OR Combination of Search Parameters

In order to override the default AND operator between fields, which is necessary for the expression

FIND(Manufacturer, "Estwing") OR FIND(Name, "Polyurethane")

on table Products, we need to change the default behaviour of the Search object we are using.

search.SetSearchType(Search.GlobalOrSearchCombinationType);



This will have the effect, that all FreeFormParameterField will be OR combined instead of AND.


The rest of the code is exactly the same as above.

Complete Java Source Code


------------------------------------------------------------------



import a2i.core.*;

import a2i.common.*;


import a2i.search.*;


/**


* Examples for free form searches via the MDM Java API.


* * <br>To run these examples, create the following


Classpath Variable in your Developer Studio to link to your local MDM


API JAR:</p>


*Go to <em>Window -> Preferences -> Java


-> Classpath Variables</em> and create this


variable:<br>


*<em>SAP_MDM_MDM4J</em> - Path to the


folder containing MDM4J.jar<br>


*<br>


*Of course you need also an up-and-running MDM Server with a loaded


Repository.<br>


*The connection details are directly maintained in the source


code.<br>


*


*<br><br>


* *This code is copyrighted by SAP AG, Dietmar-Hopp-Allee 16, 69190


Walldorf, Germany.<br><br>


*It has been written to serve educational purposes only. You may reuse,


modify and


*redistribute it as long as the following rules are obeyed:


<br><br>


*<strong>


*SAP AG assumes no responsibility for errors or omissions in this


sample code.<br>


*It is provided "as is" without a warranty of any kind, either express


or implied,


*including, but not limited to, the implied warranties of


merchantability, fitness for a particular purpose,


*or non-infringement.<br>


*SAP AG shall not be liable for damages of any kind including without


limitation direct, special,


*indirect, or consequential damages that may result from the use of


this code.<br>


*SAP AG does not warrant the accuracy or completeness of information,


text, graphics, links or


*other items contained within these materials. SAP AG reserves the


right to modify, replace or


*supplement this documentation and coding without notice.


*</strong>


*


* @author Andreas Seifried (D035740), Copyright SAP AG, 200


*/


public class FreeFormSearchExamples {


CatalogData catalog;


public void login() {


catalog = new CatalogData();


catalog.Login("localhost", 2010, "Admin", "", "English [US]");


}


public void logout() {


try {


catalog.Logout();


} catch (StringException e) {


System.out.println("Logout Failed!");


e.printStackTrace();


}


}


/**


* Search on one single field for one single value


*/


public void searchSingleFieldSimple() {


//FIND(Name, "Contractor") on table Products


// case sensitive substring search in the field "Name"


System.out.println();


System.out.println("Performing searchSingleFieldSimple()");


System.out.println("FIND(Name, \"Contractor\") on table Products");


System.out.println("Expected Hits: 18");


System.out.println("=========================");


ResultSetDefinition rsd = new ResultSetDefinition("Products");


rsd.AddField("Name");


Search search = new Search("Products");


FreeFormTableParameter fftpNames =


search.GetParameters().NewFreeFormTableParameter("Products");


FreeFormParameterField ffpfName = fftpNames.GetFields().New("Name");


ffpfName.GetFreeForm().NewString("Contractor",


FreeFormParameter.SubstringSearchType);


A2iResultSet result;


try {


result = catalog.GetResultSet(search, rsd, "Name", true, 0);


System.out.println("Found " + result.GetRecordCount() + " records.");


// for(int n=0; n<result.GetRecordCount(); n++) {


// System.out.println(result.GetValueAt(n, "Name").GetStringValue());


// }


} catch (StringException e) {


System.out.println("Search Failed!");


e.printStackTrace();


}


}


/**


* Search on one single field for 3 values, AND combination


*/ public void searchSingleFieldAnd() {


//FIND(Name, "Contractor") AND FIND(Name, "Blade") AND FIND(Name,


"Standard") on table Products


System.out.println();


System.out.println("Performing searchSingleFieldAnd()");


System.out.println("FIND(Name, \"Contractor\") AND FIND(Name,


\"Blade\") AND FIND(Name, \"Standard\") on table Products");


System.out.println("Expected Hits: 5");


System.out.println("=========================");


ResultSetDefinition rsd = new ResultSetDefinition("Products");


rsd.AddField("Name");


Search search = new Search("Products");


FreeFormTableParameter fftpNames =


search.GetParameters().NewFreeFormTableParameter("Products");


FreeFormParameterField ffpfName = fftpNames.GetFields().New("Name",


FreeFormParameterField.SEARCH_OPERATOR_AND);


ffpfName.GetFreeForm().NewString("Contractor",


FreeFormParameter.SubstringSearchType);


ffpfName.GetFreeForm().NewString("Blade",


FreeFormParameter.SubstringSearchType);


ffpfName.GetFreeForm().NewString("Standard",


FreeFormParameter.SubstringSearchType);


A2iResultSet result;


try {


result = catalog.GetResultSet(search, rsd, "Name", true, 0);


System.out.println("Found " + result.GetRecordCount() + " records.");


// for(int n=0; n<result.GetRecordCount(); n++) {


// System.out.println(result.GetValueAt(n, "Name").GetStringValue());


// }


} catch (StringException e) {


System.out.println("Search Failed!");


e.printStackTrace();


}


}


/**


* Search on one single field for 3 values, OR combination


*/ public void searchSingleFieldOr() {


//FIND(Name, "Contractor") OR FIND(Name, "Blade") OR FIND(Name,


"Standard") on table Products


System.out.println();


System.out.println("Performing searchSingleFieldOr()");


System.out.println("FIND(Name, \"Contractor\") OR FIND(Name, \"Blade\")


OR FIND(Name, \"Standard\") on table Products");


System.out.println("Expected Hits: 48");


System.out.println("=========================");


ResultSetDefinition rsd = new ResultSetDefinition("Products");


rsd.AddField("Name");


Search search = new Search("Products");


FreeFormTableParameter fftpNames =


search.GetParameters().NewFreeFormTableParameter("Products");


FreeFormParameterField ffpfName = fftpNames.GetFields().New("Name",


FreeFormParameterField.SEARCH_OPERATOR_OR);


ffpfName.GetFreeForm().NewString("Contractor",


FreeFormParameter.SubstringSearchType);


ffpfName.GetFreeForm().NewString("Blade",


FreeFormParameter.SubstringSearchType);


ffpfName.GetFreeForm().NewString("Standard",


FreeFormParameter.SubstringSearchType);


A2iResultSet result;


try {


result = catalog.GetResultSet(search, rsd, "Name", true, 0);


System.out.println("Found " + result.GetRecordCount() + " records.");


// for(int n=0; n<result.GetRecordCount(); n++) {


// System.out.println(result.GetValueAt(n, "Name").GetStringValue());


// }


} catch (StringException e) {


System.out.println("Search Failed!");


e.printStackTrace();


}


}


/**


* Search on one single field for 3 values, nested OR / AND combination


*/ public void searchSingleFieldOrAnd() {


//(FIND(Name, "Contractor") OR FIND(Name, "Blade")) AND FIND(Name,


"Standard") on table Products


System.out.println();


System.out.println("Performing searchSingleFieldOrAnd()");


System.out.println("(FIND(Name, \"Contractor\") OR FIND(Name,


\"Blade\")) AND FIND(Name, \"Standard\") on table Products");


System.out.println("Expected Hits: 11");


System.out.println("=========================");


ResultSetDefinition rsd = new ResultSetDefinition("Products");


rsd.AddField("Name");


Search search = new Search("Products");


FreeFormTableParameter fftpNames =


search.GetParameters().NewFreeFormTableParameter("Products");


FreeFormParameterField ffpfName1 = fftpNames.GetFields().New("Name",


FreeFormParameterField.SEARCH_OPERATOR_OR);


ffpfName1.GetFreeForm().NewString("Contractor",


FreeFormParameter.SubstringSearchType);


ffpfName1.GetFreeForm().NewString("Blade",


FreeFormParameter.SubstringSearchType);


FreeFormParameterField ffpfName2 = fftpNames.GetFields().New("Name");


ffpfName2.GetFreeForm().NewString("Standard",


FreeFormParameter.SubstringSearchType);


A2iResultSet result;


try {


result = catalog.GetResultSet(search, rsd, "Name", true, 0);


System.out.println("Found " + result.GetRecordCount() + " records.");


// for(int n=0; n<result.GetRecordCount(); n++) {


// System.out.println(result.GetValueAt(n, "Name").GetStringValue());


// }


} catch (StringException e) {


System.out.println("Search Failed!");


e.printStackTrace();


}


}


/**


* Search on two fields for single values, AND combination


*/ public void searchTwoFieldsAnd() {


//FIND(Manufacturer, "Estwing") AND FIND(Name, "Polyurethane") on table


Products


System.out.println();


System.out.println("Performing searchTwoFieldsAnd()");


System.out.println("FIND(Manufacturer, \"Estwing\") AND FIND(Name,


\"Polyurethane\") on table Products");


System.out.println("Expected Hits: 3");


System.out.println("=========================");


ResultSetDefinition rsd = new ResultSetDefinition("Products");


rsd.AddField("Name");


rsd.AddField("Manufacturer");


Search search = new Search("Products");


FreeFormTableParameter fftpProducts =


search.GetParameters().NewFreeFormTableParameter("Products");


FreeFormParameterField ffpfManu =


fftpProducts.GetFields().New("Manufacturer");


ffpfManu.GetFreeForm().NewString("Estwing",


FreeFormParameter.SubstringSearchType);


FreeFormParameterField ffpfName = fftpProducts.GetFields().New("Name");


ffpfName.GetFreeForm().NewString("Polyurethane",


FreeFormParameter.SubstringSearchType);


A2iResultSet result;


try {


result = catalog.GetResultSet(search, rsd, "Name", true, 0);


System.out.println("Found " + result.GetRecordCount() + " records.");


// for(int n=0; n<result.GetRecordCount(); n++) {


// System.out.println(result.GetValueAt(n, "Name").GetStringValue() +


"\t\t" + result.GetValueAt(n, "Manufacturer").GetStringValue());


// }


} catch (StringException e) {


System.out.println("Search Failed!");


e.printStackTrace();


}


}


/**


* Search on two fields for single values, OR combination


*/ public void searchTwoFieldsOr() {


//FIND(Manufacturer, "Estwing") OR FIND(Name, "Polyurethane") on table


Products


System.out.println();


System.out.println("Performing searchTwoFieldsOr()");


System.out.println("FIND(Manufacturer, \"Estwing\") OR FIND(Name,


\"Polyurethane\") on table Products");


System.out.println("Expected Hits: 67");


System.out.println("=========================");


ResultSetDefinition rsd = new ResultSetDefinition("Products");


rsd.AddField("Name");


rsd.AddField("Manufacturer");


Search search = new Search("Products");


search.SetSearchType(Search.GlobalOrSearchCombinationType);


FreeFormTableParameter fftpProducts =


search.GetParameters().NewFreeFormTableParameter("Products");


FreeFormParameterField ffpfManu =


fftpProducts.GetFields().New("Manufacturer");


ffpfManu.GetFreeForm().NewString("Estwing",


FreeFormParameter.SubstringSearchType);


FreeFormParameterField ffpfName = fftpProducts.GetFields().New("Name");


ffpfName.GetFreeForm().NewString("Polyurethane",


FreeFormParameter.SubstringSearchType);


search.SetSearchType(Search.GlobalOrSearchCombinationType);


A2iResultSet result;


try {


result = catalog.GetResultSet(search, rsd, "Name", true, 0);


System.out.println("Found " + result.GetRecordCount() + " records.");


// for(int n=0; n<result.GetRecordCount(); n++) {


// System.out.println(result.GetValueAt(n, "Name").GetStringValue() +


"\t\t" + result.GetValueAt(n, "Manufacturer").GetStringValue());


// }


} catch (StringException e) {


System.out.println("Search Failed!");


e.printStackTrace();


}


}


public static void main(String[] args) {


FreeFormSearchExamples ffse = new FreeFormSearchExamples();


ffse.login();


ffse.searchSingleFieldSimple();


ffse.searchSingleFieldAnd();


ffse.searchSingleFieldOr();


ffse.searchSingleFieldOrAnd();


ffse.searchTwoFieldsAnd();


ffse.searchTwoFieldsOr(); ffse.logout();


}


}



 



------------------------------------------------------------------



Example Repository


Structure


These examples are using a very simple MDM Repository ApiSampleRepositry, which is based on a main table called Products and a flat lookup table Manufacturers. Here are the details:



Tables of the ApiSampleRepository



Products table:



Fields of the Products table



The Manufacturer field references the Manufacturers table.



Manufacturers table:



Fields of the Manufacturers table



Contents


The repository was loaded with this XML file:



------------------------------------------------------------------



<?xml

version="1.0" encoding="UTF-8"?>


<Products>


<Product>


<Name>Clear Safety Goggles</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Key-Ring Standard Tip


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Claw Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Rip Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Claw Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Rip Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wood Handle Builder's Series Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wood Handle Builder's Series Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Wooden Handle Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Sledge


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Sledge


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Slimline Polyurethane Deadblow


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Sledge


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Slimline Polyurethane Deadblow


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Slimline Polyurethane Deadblow


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Fast-Drying Polyurethane Paint</Name>


<Manufacturer>Minwax Company</Manufacturer>


</Product>


<Product>


<Name>Fast-Drying Polyurethane Paint</Name>


<Manufacturer>Minwax Company</Manufacturer>


</Product>


<Product>


<Name>Fast-Drying Polyurethane Paint</Name>


<Manufacturer>Minwax Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Mallet</Name>


<Manufacturer>Vaughan & Bushnell Mfg.


Co.</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Phillips® Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Phillips® Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Light-Blade/Cabinet Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Standard-Blade/Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Light-Blade/Cabinet Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Standard-Blade/Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>2-pc Standard Fluted Screwdriver


Set</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>BexT Standard Gloves</Name>


<Manufacturer>Best Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>BexT Standard Gloves</Name>


<Manufacturer>Best Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>BexT Standard Gloves</Name>


<Manufacturer>Best Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>BexT Standard Gloves</Name>


<Manufacturer>Best Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Pozidriv® Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Pozidriv® Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Pozidriv® Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Pozidriv® Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Phillips® Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT Square-Head


Style Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Light Blade/Cabinet Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Fluted Light Blade/Cabinet Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Phillips® Standard Fluted Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Phillips® Standard Fluted Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Handyman® Standard Stubby


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Phillips® Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Phillips® Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Phillips® Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Square-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Square-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Cushion-Grip Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Cushion-Grip Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Cushion-Grip Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Cushion-Grip Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Stubby/Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Square-Blade/Standard


Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Square-Blade/Standard


Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Square-Blade/Standard


Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Light-Blade/Cabinet


Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Light-Blade/Cabinet


Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl-Grip Light-Blade/Cabinet


Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT Pocket


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT Pocket


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT Pocket


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Extra-Light-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Extra-Light-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Extra-Light-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Extra-Light-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Extra-Light-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Extra-Light-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Standard-Blade/Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Square-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Square-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Square-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Square-Blade/Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Square-Blade/Standard Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>100 Plus® Contractor GradeT


Standard-Blade/Cabinet Tip Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT 6-pc Combination Screwdriver


Set</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT 8-pc Combination Screwdriver


Set</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Contractor GradeT Vinyl Coated Blade


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>FatmaxT Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>FatmaxT Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>FatmaxT Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>FatmaxT Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>FatmaxT Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>FatmaxT Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Standard Lock Ring Pliers</Name>


<Manufacturer>The Armstrong Tool


Comp.</Manufacturer>


</Product>


<Product>


<Name>Fluted Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Fluted Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Fluted Stubby/Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Fluted Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Fluted Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Fluted Standard Tip


Screwdriver</Name>


<Manufacturer>Stanley®</Manufacturer>


</Product>


<Product>


<Name>Specialty Polyurethane Coating</Name>


<Manufacturer>Rust-Oleum


Corporation</Manufacturer>


</Product>


<Product>


<Name>Specialty Polyurethane Coating</Name>


<Manufacturer>Rust-Oleum


Corporation</Manufacturer>


</Product>


<Product>


<Name>Specialty Polyurethane Coating</Name>


<Manufacturer>Rust-Oleum


Corporation</Manufacturer>


</Product>


<Product>


<Name>Stubby Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Round-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>ProtoblackT Standard Tip Round-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Round-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>ProtoblackT Standard Tip Round-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Round-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Round-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>ProtoblackT Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>ProtoblackT Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>ProtoblackT Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>ProtoblackT Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Square-Shank


Screwdriver</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>6-pc Standard Screwdriver Set</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>4-pc Standard Screwdriver Set</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>6-pc Standard Screwdriver Set</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>6-pc ProtoblackT Standard Screwdriver


Set</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Polyurethane Deadblow Sledge


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Screw Starter</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Screw Starter</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Standard Tip Screw Starter</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Phillips/Standard Tip Screw


Starter</Name>


<Manufacturer>Proto®</Manufacturer>


</Product>


<Product>


<Name>Slimline Polyurethane Deadblow


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Asian Pattern Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Asian Pattern Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Asian Pattern Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Asian Pattern Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Crack/Drilling


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Crack/Drilling


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Crack/Drilling


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Long-Handle Crack/Drilling


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>BexT Standard Gloves</Name>


<Manufacturer>Best Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>BexT Standard Gloves</Name>


<Manufacturer>Best Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Deadhead® Black Rubber


Mallet</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Deadhead® Gray Rubber


Mallet</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Deadhead® Black Rubber


Mallet</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Deadhead® Gray Rubber


Mallet</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Claw Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Rip Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Light-Weight Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Light-Weight Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Claw Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Rip Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Claw Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Rip Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip German Pattern


Latthammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip German Pattern


Latthammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip German Pattern


Latthammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip German Pattern


Latthammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip English Pattern Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip English Pattern Rip


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip English Pattern Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip English Pattern Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Drywall Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Bricklayer/Mason's


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Ball Peen


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Claw Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Chisel Edge Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Ripping Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Light-Weight Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Light-Weight Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Pointed Tip Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Bricklayer/Mason's


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Ball Peen


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Claw Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Ripping Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Drywall Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Bricklayer/Mason's


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Bricklayer/Mason's


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Claw Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Chisel Edge Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Ripping Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Pointed Tip Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Latthammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Latthammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Latthammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Latthammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Long-Handle Pointed-Tip Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Bricklayer/Mason's


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Bricklayer/Mason's


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Ball Peen


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Chisel Edge Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Builder's Series Large-Face


Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Builder's Series Large-Face


Framing Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip English Pattern Claw


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Carpenter's Hatchet</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Framing


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Ball Peen


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Engineer's


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern Berliner Bricklayer


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern Berliner Bricklayer


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Ball Peen


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Shingler's Hammer w/Replaceable Blade &


Gauge</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Shingler's Hammer w/Replaceable


Gauge</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Welding Chipping


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip Pointed Tip Rock Pick


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Leather Grip German Pattern


Schlosserhammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip HammertoothT


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip HammertoothT


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Cross Peen Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip HammertoothT


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip HammertoothT


Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Cross Peen Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Cross Peen Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Cross Peen Hammer</Name>


<Manufacturer>Estwing Manufacturing


Company</Manufacturer>


</Product>


<Product>


<Name>Nylon-Vinyl Grip Engineer's


Hammer</Name>


<Manufactu</img></img></img></img></img></p>



 



------------------------------------------------------------------

SAP Developer Network Latest Updates