Thursday, July 31, 2014

BizTalk Server - Cross Reference Functoids with Example

While using BizTalk server for Integration of Applications, we may face a situation where a Value – for Eg: A status of “Pending” – in Application1 needs to be mapped to an equivalent and different value in Application2. You may receive a message in which Status is “Pending” and assume that you may have to map this to a status call “On Hold” to an outgoing message.
How can we achieve this?
There are many possible ways:
1. Write an inline script / xslt in a Scripting Functoid
2. Use an External dll that takes an input and returns an equivalent output
3. Use of BizTalk Server Cross Reference Functoids.
4. Custom Functoids and Lots of more options….
This article will describe the use of BizTalk Server Cross Reference.
Problem Statement:
Assume that you input message status has to be mapped to an output message status in the following way.
Input Status (Application1 Message) –> Output Status (Applicaiton2 Message)–> Common Value which we use to Represent both of them
1. Approved –> Accepted –> Accept
2. Pending –> On Hold –> Hold
3. Denied –> Stopped –> Deny
Approach:
The idea behind the Cross Reference is Simple.
a) You create XML Files that represent the Cross Reference Data.
b) These XML files (data) are imported to a set of Tables inside BizTalk Management Database using a Cross Reference Utility
There are 2 types of Cross Reference – ID Cross Reference and Value Cross Reference
The purpose of both of them will be same and the way they operate internally will be different.
c) From the input message, if you receive the status as “Approved”  use this status “Approved” and the Application Source as “Application1″ and find the Common Value “Accept”
(This is done using Get Common Value / Get Common Id Functoids)
d) Use the Common Value as “Accept” and use the Application Name as “Application2″ and find the key word “Accepted” which is mapped to Application2
(This is done using Get Application Value / Get Application Id Functoids)
Solution:
Hope this gives an Idea. So let’s start working on the above 4 points.
Using ID Cross Referencing.
a) Create XML Files that represent the Cross Reference Data.
Below are the XML Files Required for ID Cross Referencing:
SetUp-Files Document- Download the Sample here
listOfAppType Document- Download the Sample here
listOfAppInstance Document- Download the Sample here
listOfIDXRef Document – Download the Sample here
listOfIDXRefData Document – Download the Sample here
Purpose of the above XML Files:
SetUp-Files – This will have the path to all other files
listOfAppType – This will have the list of applications. In our case it is “Application1″ and “Application2″
listOfAppInstance – For each Application created, an instance should be created
listOfIDXRef – This XML file will hold the IDs for which we create Data. In our case it is the “Status”
listOfIDXRefData –  This file will hold the data for Common value, “Application1″ data and “Application2″ Data
b) Modify the above XML files.
SetUp-Files - Create a folder named IDXref in C Drive and copy all the XML files to that location. The name of the XML files that you mention in the Setup file should match the physical name of the XML Files.
Update the Setup-File like below.
<?xml version=”1.0 encoding=”UTF-8 ?>
<Setup-Files>
<App_Type_file>c:\IDXref\ListOfAppType.xml</App_Type_file>
<App_Instance_file>c:\IDXref\ListOfAppInstance.xml</App_Instance_file>
<IDXRef_file>c:\IDXref\ListOfIDXRef.xml</IDXRef_file>
<IDXRef_Data_file>c:\IDXref\ListOfIDXRefData.xml</IDXRef_Data_file>
</Setup-Files>
listOfAppType – Here we have 2 applications “Application1″ & “Application2″
<?xml version=”1.0 encoding=”UTF-8 ?>
<listOfAppType>
<appType>
<name>Application1</name>
</appType>
<appType>
<name>Application2</name>
</appType>
</listOfAppType>
listOfAppInstance – Here create an Instance for each of the 2 applications.
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<listOfAppInstance>
<appInstance>
<instance>Application1Instance</instance>
<type>Application1</type>
</appInstance>
<appInstance>
<instance>Application2Instance</instance>
<type>Application2</type>
</appInstance>
</listOfAppInstance>
listOfIDXRef – Here we create IDs for each of the cross referencing we do.
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<listOfIDXRef>
<idXRef>
<name>Status</name>
</idXRef>
</listOfIDXRef>
listOfIDXRefData - Here we define the data for both “Application1″ & “Application2″
<listOfIDXRefData>
<idXRef name=”Status“>
<appInstance name=”Application1Instance“>
<appID commonID=”Accept“>Approved</appID>
<appID commonID=”Hold“>Pending</appID>
<appID commonID=”Deny“>Denied</appID>
</appInstance>
<appInstance name=”Application2Instance“>
<appID commonID=”Accept“>Accepted</appID>
<appID commonID=”Hold“>On Hold</appID>
<appID commonID=”Deny“>Stopped</appID>
</appInstance>
</idXRef>
</listOfIDXRefData>
c) Now you have all the data that you need for your ID cross Reference. Now deploy these data to the BizTalk Management Database.
Give the following Command in your command prompt c:\IDXref\.
btsxrefimport  –file=setupfile
Note: Your current prompt should be pointing to the path c:\IDXref\. The name of the setup file should besetupfile.xml
Now log into the BizTalk Management Database, check the below tables:
xref_AppType, xref_AppInstance, xref_IDXRef, xref_IDXRefData
These tables would have been updated with the data that you imported.
d) Using the Cross Reference in your MAP.
From the Tool box drop the Get Common ID Functoid and connect the Status field from your source schema to it.
Double Click the Get Common ID Functoid and add 2 more inputs as shown below
First Input – ID which you added in listOfIDXRef XML file.
Second Input – Application Instance from which the input is coming.
Third Input – Actual value which should be converted.
The output of this Functoid will be our common values. Eg: Accept, Deny, Hold based on the input.
Now drop the Get Application ID Functoid and connect the output of Get Common ID Functoid to this one.
Configure the Get Application ID Functoid Inputs as shown below.
First Input – ID which you added in listOfIDXRef XML file.
Second Input – Application Instance to which the input is to be converted.
Third Input – Common value from the Get Common ID Functoid.
The Output of this Functoid will be the equivalent Application2 value for the Application1 Input.
Using Value Cross Referencing:
Value cross Reference is used in the same way as ID Cross Reference. The only change is the Input to the Get Common Value and Get Application Value Functoids.
However there is a difference in which these two operate internally.
a) Create XML Files that represent the Cross Reference Data.
Below are the XML files required for Value Cross Referencing:
SetUp-Files Document- Download the Sample here
listOfAppType Document- Download the Sample here
listOfAppInstance Document- Download the Sample here
listOfValueXRef Document – Download the Sample here
listOfValueXRefData Document – Download the Sample here
Purpose of the above XML Files:
SetUp-Files – This will have the path to all other files
listOfAppType – This will have the list of applications. In our case it is “Application1″ and “Application2″
listOfAppInstance – For each Application created, an instance should be created
listOfValueXRef – This XML file will hold the IDs for which we create Data. In our case it is the “Status”
listOfValueXRefData –  This file will hold the data for Common value, “Application1″ data and “Application2″ Data
b) Modify the above XML files.
SetUp-Files - Create a folder named ValueXref in C Drive and copy all the XML files to that location. The name of the XML files that you mention in the Setup file should match the physical name of the XML Files.
Update the Setup-File like below.
<?xml version=”1.0 encoding=”UTF-8 ?>
<Setup-Files>
<App_Type_file>c:\ValueXref\ListOfAppType.xml</App_Type_file>
<App_Instance_file>c:\ValueXref\ListOfAppInstance.xml</App_Instance_file>
<ValueXref_file>c:\ValueXref\ListOfValueXref.xml</ValueXref_file>
<ValueXref_Data_file>c:\ValueXref\ListOfValueXrefData.xml</ValueXref_Data_file>
</Setup-Files>
listOfAppType – Here we have 2 applications “Application1″ & “Application2″
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<listOfAppType>
<appType>
<name>Application1</name>
</appType>
<appType>
<name>Application2</name>
</appType>
</listOfAppType>
listOfAppInstance – Here create an Instance for each of the 2 applications.
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<listOfAppInstance>
<appInstance>
<instance>Application1Instance</instance>
<type>Application1</type>
</appInstance>
<appInstance>
<instance>Application2Instance</instance>
<type>Application2</type>
</appInstance>
</listOfAppInstance>
listOfValueXref – Here we create IDs for each of the cross referencing we do.
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<listOfValueXRef>
<valueXRef>
<name>Status</name>
</valueXRef>
</listOfValueXRef>
listOfValueXrefData – Here we define the data for both “Application1″ & “Application2″
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<listOfValueXRefData>
<valueXRef name=”Status“>
<appType name=”Application1“>
<appValue commonValue=”Accept“>Approved</appValue>
<appValue commonValue=”Hold“>Pending</appValue>
<appValue commonValue=”Deny“>Denied</appValue>
</appType>
<appType name=”Application2“>
<appValue commonValue=”Accept“>Accepted</appValue>
<appValue commonValue=”Hold“>On Hold</appValue>
<appValue commonValue=”Deny“>Stopped</appValue>
</appType>
</valueXRef>
</listOfValueXRefData>
Note: While defining this XML, Application name is used. Whereas in IDXref Application Instance is used.
c) Now you have all the data that you need for your ID cross Reference. Now deploy these data to the BizTalk Management Database.
Give the following Command in your command prompt c:\ValueXref\.
btsxrefimport  –file=setupfile
Note: Your current prompt should be pointing to the path c:\ValueXref\. The name of the setup file should besetupfile.xml
Now log into the BizTalk Management Database, check the below tables:
xref_AppType, xref_AppInstance, xref_ValueXref, xref_ValueXrefData
These tables would have been updated with the data that you imported.
d) Using the Cross Reference in your MAP.
From the Tool box drop the Get Common Value Functoid and connect the Status field from your source schema to it.
Double Click the Get Common Value Functoid and add 2 more inputs as shown below
First Input – ID which you added in listOfValueXRef XML file.
Second Input – Application Name (not Instance) from which the input is coming.
Third Input – Actual value which should be converted.
The output of this Functoid will be our common values. Eg: Accept, Deny, Hold based on the input.
Now drop the Get Application Value Functoid and connect the output of Get Common Value Functoid to this one.
Configure the Get Application Value Functoid Inputs as shown below.
First Input – ID which you added in listOfValueXRef XML file.
Second Input – Application Name (Not Instance name) to which the input is to be converted.
Third Input – Common value from the Get Common Value Functoid.
The Output of this Functoid will be the equivalent Application2 value for the Application1 Input.

To get the differences between these two concepts in detail, refer my previous blog - Difference between Value & ID Cross References



No comments: