Module 9: Automating Business Processes



Module 9: Automating Business ProcessesTime estimated: 120 minutesModule objective:In this module, you will learn:How to build an orchestration to automate a business processOverview XE "2933A.9.00.00.003.1" Orchestration is a flexible, powerful tool for representing your executable business processes. You can design the message flow, interpret and generate data, call custom code, and organize it all in an intuitive visual drawing. It is important for you to become familiar with the various shapes that Microsoft? BizTalk? Orchestration Designer provides to represent the logical flow of your orchestration. You should also know how to manipulate data and manage exceptions within an orchestration. XE "2933A.9.00.00.003.9" Lesson 1: Controlling the Flow of an OrchestrationLesson objective:Use orchestration flow control shapes and create modular orchestrations.Overview XE "2933A.9.01.01.004.1" Orchestration Designer provides a number of shapes that you can use to control the flow of your orchestration. In this lesson, you will learn how to use and configure the Group and Scope shapes to organize your orchestration and how to use different shapes to control parallel processes and conditionally control the flow of messages through the orchestration. XE "2933A.9.01.01.004.9" Scope and Group ShapesExplain how scope shapes and group shapes are used to organize actions in an orchestration.Scope Shape XE "2933A.9.01.02.005.1" A scope acts as a framework for organizing actions. You use it primarily for transactional execution and for exception handling. You also use a scope when you want to define variables, messages, and correlation sets that must remain local within the scope and when you need to use variables and classes that are non-serializable. XE "2933A.9.01.02.005.9" XE "2933A.9.01.02.006.1" A scope contains one or more blocks or other nested scopes. It has a body and can have appended to it any number of exception-handling blocks. It may also, depending on the nature of the scope, include an optional compensation block. For more information on compensation, see Module 10, “Creating Transactional Business Processes”. XE "2933A.9.01.02.006.9" XE "2933A.9.01.02.007.1" Some scopes exist solely for the purpose of exception handling, and these do not require compensation. In Microsoft .NET terms, a scope is a Try block that can have multiple catch (exception-handling) blocks. Other scopes are explicitly transactional. Transactional scopes always have a single compensation block and can include a time-out value. You can write your own or use the default compensation handler. XE "2933A.9.01.02.007.9" XE "2933A.9.01.02.008.1" The scope shape creates an additional context within the orchestration. The scope can have its own variables, messages, and correlation sets. The memory used for these will be freed up when all of the actions within the Scope shape complete. XE "2933A.9.01.02.008.9" Synchronized vs. Not Synchronized XE "2933A.9.01.02.009.1" You can specify that a scope be either synchronized or not synchronized. By synchronizing a scope, you ensure that parallel actions in your orchestration do not write to any shared data accessed by the orchestration and that no actions will write to the shared data while another action reads that same shared data. Atomic transaction scopes are always synchronized. XE "2933A.9.01.02.009.9" XE "2933A.9.01.02.010.1" All actions in a synchronized scope are considered synchronized, as are all actions in any of its exception handlers. Actions in the compensation handler for a transactional scope are not synchronized. XE "2933A.9.01.02.010.9" Group Shape XE "2933A.9.01.02.011.1" A Group shape is used to arrange actions in an intuitive and visually manageable way. You can use the Group shape as a placeholder for functionality yet to be added, or you can use it to make annotations about what actions take place within it. The name property on the Group shape can be up to 512 characters long. You can type annotations into the name property, and when the shape is collapsed, the entire name will be displayed. XE "2933A.9.01.02.011.9" XE "2933A.9.01.02.012.1" XE "2933A.9.01.02.012.9" Orchestration Flow Control ShapesConfigure orchestration shapes to enable decision logic and event timing within an orchestration.Orchestration Flow Control Shapes XE "2933A.9.01.03.013.1" The Orchestration Designer provides a number of shapes that you can use to control the flow of your orchestration. Most of these shapes are configured with one or more expressions that are defined using the BizTalk Expression Editor. XE "2933A.9.01.03.013.9" XE "2933A.9.01.03.014.1" Decide. Represents If/Else logic. The Decide shape always has at least two branches: a branch for the If statement and a branch for the Else statement. You can add branches for If/Else statements as needed. A rule (written as a Boolean expression) is defined for each branch of a Decide shape except the Else branch. Rules are evaluated left to right, and only the first matching rule branch will be executed. If none of the rule conditions is met, the Else branch will be executed. Each branch can contain additional orchestration shapes, including other Decide shapes (to create nested if statements). XE "2933A.9.01.03.014.9" XE "2933A.9.01.03.015.1" Delay. Controls the timing of the orchestration’s progress. You can set a time-out on the Delay shape so that your orchestration pauses before resuming execution. You can use a System.DateTime structure, which will cause your orchestration to pause until the specified date or time is reached, or you can use a System.TimeSpan structure, which will cause your orchestration to pause for the length of time specified. XE "2933A.9.01.03.015.9" XE "2933A.9.01.03.016.1" Listen. Requires an orchestration to wait for one or more events to occur before proceeding. The first shape in each branch of a Listen shape must be either a Delay shape or a Receive shape. The orchestration follows only the first branch that meets the condition (for example, a delay is reached or a message is received).You can add as many branches as you like. XE "2933A.9.01.03.016.9" Orchestration Flow Control Shapes (continued)Configure orchestration shapes to enable repeating actions and concurrent processing and to suspend or terminate an orchestration process.Orchestration Flow Control Shapes (continued) XE "2933A.9.01.04.017.1" You can use the following additional orchestration flow shapes in your orchestration design. XE "2933A.9.01.04.017.9" XE "2933A.9.01.04.018.1" Loop. Provides a mechanism for repeating actions—including actions in other shapes—provided that some condition is met. You set the condition in the form of a Boolean expression by using Expression Editor. XE "2933A.9.01.04.018.9" XE "2933A.9.01.04.019.1" Parallel Actions. Provides a mechanism to coordinate multiple receive shapes when messages might arrive in any order. The parallel action shape will wait for all of the receive shapes to complete before it executes the rest of the orchestration. The parallel action shape does not support concurrent execution, it executes only one branch at a time. If you are waiting to receive three messages and do not know or care about the order in which they arrive, you can place a Receive shape in each of the branches of a Parallel Actions shape. Whichever branch receives a message first can operate on it, and when the branch completes the orchestration will wait for the remaining branches to receive and process their messages. All branches merge at the end of the Parallel Actions shape, and processing does not continue from that point until all previous actions have been completed. XE "2933A.9.01.04.019.9" XE "2933A.9.01.04.020.1" Suspend. Pauses a running orchestration instance until an administrator explicitly intervenes. You configure the condition used to suspend an orchestration by using the Expression Editor. Typically, the purpose is to reflect an error condition that will require attention beyond the scope of the orchestration. When an orchestration instance is suspended, an error is generated. To help the administrator diagnose the situation, you can specify a message string to accompany the error. All state information for the orchestration instance is saved and is then reinstated if and when the administrator resumes the orchestration instance. XE "2933A.9.01.04.020.9" XE "2933A.9.01.04.021.1" Terminate. Terminates all activities of a running orchestration. You use a Terminate shape to end the orchestration immediately when an abnormal situation occurs. To help the administrator diagnose the situation, you can also specify a message string to accompany the error. XE "2933A.9.01.04.021.9" Expression and Exception ShapesConfigure expressions and throw exceptions.Expression Shape XE "2933A.9.01.05.022.1" The Expression shape allows you to enter complex expressions into your orchestration easily and quickly; however, you cannot use it to enter an arbitrary amount of code. For example, you can initialize and manipulate the values of your orchestration variables, assign values to dynamic ports, or make a .NET call to run an external program. You use the Expression Editor to define the expression. XE "2933A.9.01.05.022.9" Throw Exception Shape XE "2933A.9.01.05.023.1" You can explicitly throw exceptions in an orchestration by using the Throw Exception shape. When the throw is performed, the runtime engine will search for the nearest exception handler that can handle the type of exception being thrown. After a matching exception handler is found, control is transferred to the first statement of the exception handler. If the search for matching exception handlers fails, the orchestration halts. Transactions (which will be discussed in the next module) can help you minimize the impact of such an occurrence. XE "2933A.9.01.05.023.9" Nesting OrchestrationsConfigure an orchestration to call or start other orchestrations.Overview XE "2933A.9.01.06.024.1" Two shapes that can be used to make your business processes more understandable and easier to deploy and test are the Call and Start Orchestration shapes. These two shapes let you effectively nest orchestrations within other orchestrations whether they are transactional or not. XE "2933A.9.01.06.024.9" Call Orchestration Shape XE "2933A.9.01.06.025.1" The Call Orchestration shape is used to invoke another nested orchestration synchronously, which means that the enclosing orchestration waits for the nested orchestration to finish before continuing. XE "2933A.9.01.06.025.9" XE "2933A.9.01.06.026.1" You can specify parameters that will be passed to the nested orchestration. Parameters can be messages, variables, port references, role links, or correlation sets. Parameters can be defined as one way (in or out), or they can also be passed by reference as with a .NET method parameter. Passed-in port references, role links, and correlation sets all perform in a way similar to that of self-addressed envelopes, which means that they supply the nested orchestration information that it can use to send information back to the enclosing orchestration. XE "2933A.9.01.06.026.9" Start Orchestration Shape XE "2933A.9.01.06.027.1" Similar to the Call Orchestration shape, the Start Orchestration shape can be used to nest other orchestrations; however, this nesting is asynchronous, which means that the flow of control in the invoking orchestration proceeds beyond the invocation without waiting for the invoked orchestration to finish its work. XE "2933A.9.01.06.027.9" XE "2933A.9.01.06.028.1" As with the Call Orchestration shape, you can specify parameters that will be passed to the called orchestration. The Start Orchestration shape can only take in parameters; it cannot take out or reference parameters. XE "2933A.9.01.06.028.9" XE "2933A.9.01.06.029.1" XE "2933A.9.01.06.029.9" Lesson 2: Configuring OrchestrationsLesson objective:Configure orchestration expressions, message correlation, and exception handling.Overview XE "2933A.9.02.01.030.1" Before you build an orchestration, you may need to designate specific fields as being distinguished fields so that the data within a message can be referenced within an orchestration. When building an orchestration, you can create expressions to make decisions, set delays, make .NET calls, and test while loop conditions. You can also configure correlation so that incoming messages can be matched with an instance of a currently running orchestration. Finally, you can use exception handling to specify the actions that must take place when an error occurs. XE "2933A.9.02.01.030.9" Distinguished FieldsExplain the purpose of distinguished fields and the difference between distinguished fields and promoted properties.What Are Distinguished Fields? XE "2933A.9.02.02.031.1" Distinguished fields are message data of special interest. They are used to make decisions or to manipulate data in your orchestration. Examples of data manipulation that can be performed by distinguished fields are accessing and updating instance data. XE "2933A.9.02.02.031.9" Using Distinguished Fields XE "2933A.9.02.02.032.1" Within an orchestration, the XPath expression relating to any node can be used to read and/or write values within messages. Promoting a node as a Distinguished field in a schema provides an easily accessible alias for that node so that lengthy XPath expressions do not have to be typed repeatedly. Also, distinguished fields provide a performance improvement over using XPath expressions because the values are pre-fetched as the message is being fed into the orchestration. XE "2933A.9.02.02.032.9" XE "2933A.9.02.02.033.1" Distinguished fields are limited to unique non-repeating values, and the values are limited to no more than 255 characters. Once a node has been defined as a distinguished field, simple dotted notation syntax can be used to reference the node. For example, after promoting the CompanyName node as a Distinguished field in the PurchaseOrder schema, this node can be accessed using syntax such as the following to access the value from a message variable named msgPurchaseOrder: XE "2933A.9.02.02.033.9" XE "2933A.9.02.02.036.1" panyNamePromoting a XE "2933A.9.02.02.034.1" Distinguish field is done in the BizTalk Editor in Microsoft Visual Studio? 2010 by right-clicking the node, pointing to Promote, and then clicking Show Promotions. The resulting dialog box displays the Schema tree in the left pane and has Distinguished Fields and Property Fields tabs. On the Distinguished Fields tab, select the node in the schema tree, and then click Add. The node is added to the Property list with its corresponding XPath listed. XE "2933A.9.02.02.034.9" Distinguished Fields vs. Promoted Properties XE "2933A.9.02.02.035.1" We have previously discussed promoted properties, which are used by the messaging engine in routing and tracking processes. Promoted properties are also used for a special kind of routing, called correlation, which will be discussed later in this module. Promoted properties are primarily used for routing purposes but can also be accessed in orchestrations by using a simplified syntax, such as: XE "2933A.9.02.02.035.9" XE "2933A.9.02.02.036.1" msgSalesOrder(AdvWorks.Messaging.PropertySchema.OrderTotal) XE "2933A.9.02.02.036.9" XE "2933A.9.02.02.037.1" In this example, msgSalesOrder is the name of a message variable defined in this orchestration for a message based on the SalesOrder type in the AdvWorks.Messaging project. The OrderTotal node has been promoted to the default property schema in that project. XE "2933A.9.02.02.037.9" XE "2933A.9.02.02.038.1" As you can see, the distinguished field syntax provides more direct access to a message node. The overuse of property promotion can have a negative performance effect, whereas distinguished properties do not incur additional overhead. For optimal performance, promote only those properties that are required for routing purposes, and distinguish the node if the data is required within an orchestration. XE "2933A.9.02.02.038.9" Demonstration: Configuring Orchestration FlowLearn how to promote distinguished fields and then use a distinguished field in a decide shape. XE "2933A.9.02.03.040.1" The following demonstration is not dependent upon completion of the previous demonstrations. This solution provides artifacts and file paths that differ from those used in the previous demonstrations. XE "2933A.9.02.03.040.9" Promote Distinguished Fields XE "2933A.9.02.03.039.1" In Microsoft Windows Explorer, navigate to C:\AllFiles\DemoCode\Module9\AdvWorks, and then double-click the AdvWorks.sln file. XE "2933A.9.02.03.039.9" XE "2933A.9.02.03.041.1" In Solution Explorer, in the Messaging project, double-click SalesOrder.xsd to open the schema. XE "2933A.9.02.03.041.9" XE "2933A.9.02.03.042.1" In the SalesOrder schema, right-click <Schema>, and then click Expand Schema Node. XE "2933A.9.02.03.042.9" XE "2933A.9.02.03.043.1" Right-click <Schema>, point to Promote, and then click Show Promotions. XE "2933A.9.02.03.043.9" XE "2933A.9.02.03.044.1" In the Promote Properties dialog box, click the Property Fields tab, and notice that OrderType and CustomerName have already been promoted as Property Fields. XE "2933A.9.02.03.044.1" Click the Distinguished Fields tab, and then in the schema tree view, click Comment, and then click Add. XE "2933A.9.02.03.044.9" XE "2933A.9.02.03.045.1" Repeat step 6 for OrderTotal and then OrderNumber (under the Detail node), and then click OK. XE "2933A.9.02.03.045.9" XE "2933A.9.02.03.046.1" In Solution Explorer, right-click the AdvWorks solution, and then click Build Solution. XE "2933A.9.02.03.047.1" Examine a Group Shape XE "2933A.9.02.03.047.9" XE "2933A.9.02.03.048.1" In Solution Explorer, in the Processes project, double-click ProcessOrder_Cash.odx. XE "2933A.9.02.03.048.9" Click the existing Group shape to collapse it, and then click it again to expand it.Use the Expression EditorInside the Construct msgSOComplete shape, double-click the Build Complete SO shape.In the BizTalk Expression Editor window, beneath the existing line of code, enter the following line of code, and then click OK.msgSalesOrder_ment = “Processing of this order is now complete.”; XE "2933A.9.02.03.047.1" Configure a Decision Shape XE "2933A.9.02.03.047.9" XE "2933A.9.02.03.050.1" Right-click the area below the Rcv Sales Order receive shape, point to Insert Shape, and then click Decide. XE "2933A.9.02.03.050.9" XE "2933A.9.02.03.051.1" In the Properties window, in the Name box, type Order Size? XE "2933A.9.02.03.051.9" XE "2933A.9.02.03.052.1" In the ProcessOrder_Cash orchestration, click the Rule_1 shape, and then in the Properties window, in the Name box, type Large. XE "2933A.9.02.03.052.9" XE "2933A.9.02.03.053.1" In the Properties window, click Expression, and then click the ellipsis (…) button. XE "2933A.9.02.03.053.9" XE "2933A.9.02.03.054.1" In the BizTalk Expression Editor, type the following line of code, and then click OK. msgSalesOrder.OrderTotal > 2000 XE "2933A.9.02.03.054.9" XE "2933A.9.02.03.055.1" Right-click the placeholder below the Large branch, point to Insert Shape, and then click Send.Name the Send shape Snd Approval Request, and in the Message list, click msgSalesOrder.Configure a Listen Shape XE "2933A.9.02.03.055.9" XE "2933A.9.02.03.056.1" Right-click the area below the Snd Approval Request shape, point to Insert Shape, and then click Listen.Name the Listen shape Listen for Response. XE "2933A.9.02.03.055.1" Right-click the first placeholder in the left branch of the Listen shape, point to Insert Shape, and then click Receive.Name the Receive shape Rcv Order Approval, and in the Message list, click msgApproved. XE "2933A.9.02.03.055.9" XE "2933A.9.02.03.055.1" Right-click the first placeholder in the right branch of the Listen shape, point to Insert Shape, and then click Delay.Name the Delay shape Wait for Approval, then click the Delay property, and then click the ellipsis (…) buttonIn the BizTalk Expression Editor window, enter the following line of code, and then click OK.new System.TimeSpan(0, 0, 30)This will cause the orchestration to wait 30 seconds for an approval message. XE "2933A.9.02.03.055.1" Right-click the placeholder beneath the Delay shape, point to Insert Shape, and then click Suspend.In the Properties window, name the Suspend shape Timed Out, then click the Error Message property, and then click the ellipsis (…) button, and enter the following line of code, and then click OK.System.String.Format( “Order# {0} did not receive an approval to proceed.”, msgSalesOrder.Detail.OrderNumber); XE "2933A.8.02.06.112.1" Create a Logical Send Port XE "2933A.8.02.06.112.9" XE "2933A.8.02.06.113.1" Right-click the left Port Surface, and then click New Configured Port. XE "2933A.8.02.06.113.9" XE "2933A.8.02.06.114.1" On the Welcome to the Port Configuration Wizard page of the Port Configuration Wizard, click Next. XE "2933A.8.02.06.114.9" XE "2933A.8.02.06.115.1" On the Port Properties page, in the Name box, type RequestApproval, and then click Next. XE "2933A.8.02.06.115.9" XE "2933A.8.02.06.116.1" On the Select a Port Type page, click Use an existing Port Type, then select AdvWorks.Processes.SalesOrderType, and then click Next. XE "2933A.8.02.06.116.9" XE "2933A.8.02.06.117.1" In the Port direction of communication list, click I’ll always be sending messages on this port, and then click Next.Click Finish. XE "2933A.8.02.06.117.9" XE "2933A.8.02.06.121.9" XE "2933A.8.02.06.122.1" Drag the green arrow from the Snd Approval Request Send shape to the RequestApproval send port. XE "2933A.8.02.06.112.1" Create a Logical Receive Port XE "2933A.8.02.06.112.9" XE "2933A.8.02.06.113.1" Right-click the left Port Surface, and then click New Configured Port. XE "2933A.8.02.06.113.9" XE "2933A.8.02.06.114.1" On the Welcome to the Port Configuration Wizard page of the Port Configuration Wizard, click Next. XE "2933A.8.02.06.114.9" XE "2933A.8.02.06.115.1" On the Port Properties page, in the Name box, type ReceiveApproval, and then click Next. XE "2933A.8.02.06.115.9" XE "2933A.8.02.06.116.1" On the Select a Port Type page, click Create a new Port Type, and name it ApprovalType, and then click Next. XE "2933A.8.02.06.116.9" XE "2933A.8.02.06.117.1" In the Port direction of communication list, click I’ll always be receiving messages on this port, and then click Next.Click Finish. XE "2933A.8.02.06.117.9" XE "2933A.8.02.06.121.9" XE "2933A.8.02.06.122.1" Drag the green arrow from the ReceiveApproval receive port to the Rcv Order Approval receive shape. Close the ProcessOrder_Cash.odx orchestration, saving your changes.Pause the bt10d-demos virtual machine. XE "2933A.7.02.04.050.9" XE "2933A.9.02.03.057.1" XE "2933A.9.02.03.057.9" Creating ExpressionsConfigure expressions by using the Expression Editor.Using Expressions XE "2933A.9.02.04.058.1" The Expression shape enables you to create expressions within an orchestration. Expressions can be used to add logic and to manipulate and test values. For example, you can initialize and manipulate the values of your orchestration variables, assign values to dynamic ports and message context, and make a .NET call to run an external program. XE "2933A.9.02.04.058.9" XE "2933A.9.02.04.059.1" Expressions should not be used to perform high-level orchestration logic, which preferably would be visible in the orchestration drawing itself. In general, it is easier to understand and maintain your orchestrations if your Expression shapes contain simple and modular expressions. XE "2933A.9.02.04.059.9" Expression Editor XE "2933A.9.02.04.060.1" The BizTalk Expression Editor enables you to create expressions to define the capabilities of various orchestration shapes. Expressions created within the Expression editor are written using C# syntax. An expression can span multiple lines, but it must end with single semicolon (;). You can create expressions to make decisions, set delays, and test while loop conditions. For more information, see “Shapes that Take Expressions” in BizTalk Help. XE "2933A.9.02.04.060.9" XE "2933A.9.02.04.061.1" Only expressions created for the Expression shape can end in a semicolon; no other expression can. This is because the expression for other shapes is a single Boolean test (the equivalent of the contents of a set of parentheses in C#). In addition to the standard .NET operators, you can also use the exists operator to determine if a value is present in a message instance. XE "2933A.9.02.04.061.9" XE "2933A.9.02.04.062.1" Using Expression Editor, you can assign values to messages or message parts in the Message Assignment shape. You can also use Expression Editor to construct complex Boolean expressions in the Loop and Decide shapes and set the delay in the Delay shape. XE "2933A.9.02.04.062.9" IntelliSense XE "2933A.9.02.04.063.1" The BizTalk Expression Editor is a standard Visual Studio text editor, which means that it offers IntelliSense?. The IntelliSense feature will help guide you in creating expressions—for example, it can display a list of class members for you when you type in a .NET class name followed by a period (.). XE "2933A.9.02.04.063.9" Correlating MessagesExplain how correlation works and configure correlation sets.What Is Correlation? XE "2933A.9.02.05.064.1" Correlation is a special variation on message routing that matches an incoming message to the appropriate instance of an orchestration. Often, there may be many instances of a given orchestration running, and although each of the instances will perform the same actions, they will do so on different data contained in messages. For example, if your orchestration is designed to issue a purchase order, receive an invoice, and then send a payment, you must ensure that the invoice message is received by the orchestration instance from which the corresponding purchase order was sent. (Imagine ordering a single item and receiving an invoice for 1,000 items, or vice versa, and you can understand the importance of correlation.) Likewise, if two related messages are meant to be kept together and sent consecutively, you can use correlation to ensure that they are received in the proper order by the same instance. XE "2933A.9.02.05.064.9" Correlation Sets XE "2933A.9.02.05.065.1" Each correlation set is based on a correlation type, which is simply a list of properties. These properties might be data (found in the message itself) or context properties that describe system-defined details or transport properties for the message that have no relation to the data actually being conveyed in the message. In order to use message data for a correlation type, the nodes must be promoted to make the values accessible to the messaging engine. XE "2933A.9.02.05.065.9" XE "2933A.9.02.05.066.1" You can use a single correlation type in more than one correlation set. If you need to correlate based on different values for the properties in a correlation type, you must create a new correlation set, because each correlation set can be initialized only once. XE "2933A.9.02.05.066.9" Demonstration: Correlating MessagesLearn how to configure correlation for an orchestration.Create a Property Field for CorrelationResume the bt10d-demos virtual machine. XE "2933A.7.02.04.050.9" Open the PropertySchema.xsd schema.Right-click <Schema>, point to Insert Schema Node, and then click Child Field Element.Name the element OrderID.Promote the OrderNumber in the SalesOrder SchemaOpen the SalesOrder.xsd schema. XE "2933A.9.02.03.043.1" Right-click <Schema>, point to Promote, and then click Show Promotions. XE "2933A.9.02.03.043.9" XE "2933A.9.02.03.044.1" In the Promote Properties dialog box, click the Property Fields tab.In the schema tree view, click OrderNumber, and then click Add. XE "2933A.9.02.03.044.9" In the Property column, in the drop-down list, click OrderID, then click OK.Promote the ReferenceNumber in the OrderApproval SchemaOpen the OrderApproval.xsd schema. XE "2933A.9.02.03.043.1" Right-click <Schema>, point to Promote, and then click Show Promotions. XE "2933A.9.02.03.043.9" XE "2933A.9.02.03.044.1" In the Promote Properties dialog box, click the Property Fields tab.In the schema tree view, click ReferenceNumber, and then click Add. XE "2933A.9.02.03.044.9" In the Property column, in the drop-down list, click OrderID, then click OK.Right-click the Messaging project, then click Build.Create a Correlation Type XE "2933A.9.02.06.067.1" In Orchestration View, for the ProcessOrder_Cash.odx orchestration, expand Types, right-click Correlation Types, and then click New Correlation Type. XE "2933A.9.02.06.067.9" XE "2933A.9.02.06.068.1" In the Correlation Properties window, in the left pane, expand AdvWorks.Messaging.PropertySchema, click OrderID, click Add, and then click OK. XE "2933A.9.02.06.068.9" XE "2933A.9.02.06.069.1" In the Correlation Type Properties window, change the Identifier to ManualApprovalCorrType. XE "2933A.9.02.06.069.9" XE "2933A.9.02.06.070.1" Create a Correlation Set XE "2933A.9.02.06.070.9" XE "2933A.9.02.06.071.1" In Orchestration View, right-click Correlation Sets, and then click New Correlation Set. XE "2933A.9.02.06.071.9" XE "2933A.9.02.06.072.1" In the Properties window, in the Identifier box, type ManualApprovalCorrSet, and then in the Correlation Type list, click AdvWorks.Processes.ManualApprovalCorrType. XE "2933A.9.02.06.072.9" XE "2933A.9.02.06.073.1" Configure Correlation for the Orchestration XE "2933A.9.02.06.073.9" XE "2933A.9.02.06.074.1" Click the Snd Approval Request shape, and then in the Properties window, in the Initializing Correlation Sets list, click ManualApprovalCorrSet. XE "2933A.9.02.06.074.9" XE "2933A.9.02.06.075.1" Click the Rcv Order Approval shape, and then in the Properties window, in the Following Correlation Sets list, click ManualApprovalCorrSet. XE "2933A.9.02.06.075.9" XE "2933A.9.02.06.076.1" Close all open windows, and shut down the virtual machine. XE "2933A.9.02.06.076.9" Handling ExceptionsExplain how exceptions are generated and how the BizTalk Exception Handler works.Exceptions XE "2933A.9.02.07.077.1" Exceptions are raised by the orchestration engine when an error occurs in the orchestration. Microsoft BizTalk Server provides various mechanisms for throwing and handling exceptions. XE "2933A.9.02.07.077.9" How Exceptions Are Generated XE "2933A.9.02.07.078.1" Exceptions can be generated in an orchestration in any of the following ways: XE "2933A.9.02.07.078.9" XE "2933A.9.02.07.079.1" When the Throw Exception shape is explicitly used. XE "2933A.9.02.07.079.9" XE "2933A.9.02.07.080.1" When a time-out in an atomic or long-running transaction occurs. XE "2933A.9.02.07.080.9" XE "2933A.9.02.07.081.1" When some other transaction failure occurs. (The run-time engine throws a system-defined message for these exceptions.) XE "2933A.9.02.07.081.9" XE "2933A.9.02.07.082.1" When calls to external assemblies are made and result in an exception. (Common language runtime classes that are called can throw exceptions.) XE "2933A.9.02.07.082.9" XE "2933A.9.02.07.083.1" When a system exception (such as a persistence failure, another. NET or system exception, or a data-conversion error) is raised. XE "2933A.9.02.07.083.9" XE "2933A.9.02.07.084.1" When a sibling branch in a surrounding scope halts execution. (A predefined system exception is thrown.) XE "2933A.9.02.07.084.9" XE "2933A.9.02.07.085.1" When the receipt of an external message indicates a fault. XE "2933A.9.02.07.085.9" XE "2933A.9.02.07.086.1" XE "2933A.9.02.07.086.9" Exception Handler XE "2933A.9.02.07.087.1" When an exception occurs in a scope, each logical thread of execution in that scope stops. The run-time engine attempts to locate an exception handler for the appropriate exception type. If it succeeds in locating an exception handler that matches either the specific exception type or one of its base types, control passes to that handler, and the exception code runs. XE "2933A.9.02.07.087.9" XE "2933A.9.02.07.088.1" Each scope shape within an orchestration may have one or more exception handler blocks appended to it. The relative cost of catching and handling an exception is high, so as with .NET exception handling, you should reduce the likelihood of exceptions occurring whenever possible. Don’t use exception handlers to catch common conditions; use a decide shape instead. For example, it’s always easier to determine if you are going to divide by zero than to catch a divide-by-zero exception. XE "2933A.9.02.07.088.9" XE "2933A.9.02.07.089.1" Each exception block can contain zero or more orchestration shapes, which act exactly as they do in an orchestration. As a result, anything that can be done in an orchestration can be undone with an exception handler. In some situations, you may want to catch an exception and not do anything as a result. This will prevent the exception from being passed up to the next scope looking for an exception handler. XE "2933A.9.02.07.089.9" XE "2933A.9.02.07.090.1" The arrangement of exception handlers is important in situations in which multiple exceptions blocks exist. The first block that can catch the exception will catch it and execute without evaluating other handlers. Place the most specific exceptions first working toward more general exceptions, the most general of which is the General Exception. XE "2933A.9.02.07.090.9" XE "2933A.9.02.07.091.1" Note: The process of adding and configuring exception handing for an orchestration is covered in detail in the Module 10 Lab. XE "2933A.9.02.07.091.9" Lab: Automating Business ProcessesTime estimated: 60 minutesScenario XE "2933A.9.03.01.092.1" BizTalk orchestrations can be used to automate business decisions and other processes. In this lab, you will create a new BizTalk orchestration that will process credit sales orders. XE "2933A.9.03.01.092.9" Start the Virtual MachineProcedure ListIf the Server Manager window is not already open, click on the Server Manager icon located in the task bar next to the Start button.Expand Roles, Hyper-V, Hyper-V Manager. The last node to appear displays the machine name. Click on it to see the list of virtual machines available. XE "2933A.1.04.01.208.1" Double-click the virtual machine bt10d-09 to open a Virtual Machine Connection window.Click on the Action menu in the Virtual Machine Connection window and choose Start. XE "2933A.1.04.01.209.1" Once the virtual machine starts, press CTRL+ALT+END. XE "2933A.1.04.01.209.9" XE "2933A.1.04.01.210.1" Log on using the user name Administrator and the password pass@word1.At the Windows Activation prompt, click Ask Me Later, then click OK.Ensure that the BizTalk Services are startedProcedure List XE "2933A.1.04.03.248.1" In Windows Explorer, navigate to C:\AllFiles. XE "2933A.1.04.03.249.1" Double click on startBtServices.cmd.When prompted, press any key to close the command-line window.Exercise 1: Examine an Existing ProjectOverviewIn upcoming labs, you will add functionality to the LoanApproval project that will evaluate and approve loans. Initially, this project contains several artifacts that are required for this lab. In this exercise, you will examine the FinalLoanDocument schema and the SalesOrder_To_FinalLoanDocument map to familiarize yourself with their design.Examine the LoanApproval ProjectProcedure List XE "2933A.9.03.02.097.1" In Windows Explorer, navigate to C:\AllFiles\LabFiles\Lab9\AdvWorks and then double-click AdvWorks.sln. XE "2933A.9.03.02.097.9" XE "2933A.9.03.02.098.1" In Solution Explorer, double-click FinalLoanDocument.xsd. XE "2933A.9.03.02.098.9" XE "2933A.9.03.02.099.1" In the FinalLoanDocument schema, right-click <Schema>, and then click Expand Schema Node. XE "2933A.9.03.02.099.9" XE "2933A.9.03.02.100.1" Right-click <Schema>, point to Promote, and then click Show Promotions. XE "2933A.9.03.02.100.9" XE "2933A.9.03.02.101.1" Notice the Distinguished Fields of the FinalLoanDocument schema. XE "2933A.9.03.02.101.9" XE "2933A.9.03.02.102.1" Click the Property Fields tab. XE "2933A.9.03.02.102.9" XE "2933A.9.03.02.103.1" Notice the Promoted Properties of the FinalLoanDocument schema. XE "2933A.9.03.02.103.9" XE "2933A.9.03.02.104.1" Click OK to close the Promote Properties dialog box. XE "2933A.9.03.02.104.9" XE "2933A.9.03.02.105.1" Close the FinalLoanDocument schema, and then click Yes to save changes. XE "2933A.9.03.02.105.9" XE "2933A.9.03.02.106.1" In Solution Explorer, double-click SalesOrder_To_FinalLoan.btm. XE "2933A.9.03.02.106.9" XE "2933A.9.03.02.107.1" Examine the SalesOrder_To_FinalLoan map. XE "2933A.9.03.02.107.9" XE "2933A.9.03.02.108.1" Close the SalesOrder_To_FinalLoan map. XE "2933A.9.03.02.108.9" Exercise 2: Promote Distinguished FieldsOverviewSpecifying a field in a schema as distinguished enables you to easily access the field from within an orchestration for decision-making and data-manipulation purposes. In this exercise, you will distinguish several fields that will be used in the orchestration.Promote Three Distinguished FieldsProcedure List XE "2933A.9.03.03.109.1" In Solution Explorer, in the Messaging project, double-click SalesOrder.xsd. XE "2933A.9.03.03.109.9" XE "2933A.9.03.03.110.1" In the SalesOrder schema, right-click <Schema>, and then click Expand Schema Node. XE "2933A.9.03.03.110.9" XE "2933A.9.03.03.111.1" Right-click <Schema>, point to Promote, and then click Show Promotions. XE "2933A.9.03.03.111.9" XE "2933A.9.03.03.112.1" In the Promote Properties dialog box, click Comment, and then click Add. XE "2933A.9.03.03.112.9" XE "2933A.9.03.03.113.1" Repeat step 4 for OrderTotal and OrderType, and then click OK. XE "2933A.9.03.03.113.9" XE "2933A.9.03.03.114.1" On the File menu, click Save All, and then close the SalesOrder schema. XE "2933A.9.03.03.114.9" Exercise 3: Create a New OrchestrationOverviewAdventure Works offers two types of financing in their stores. Loans for more than $1,000 are sent to Woodgrove Bank, while loans of $1,000 or less are managed by the Adventure Works finance department. In this exercise, you will create an orchestration that will process the credit sales orders and determine the loan type.Create the ProcessOrder_Credit OrchestrationProcedure List XE "2933A.9.03.04.115.1" In Solution Explorer, expand Processes, right-click ProcessOrder_Cash.odx, and then click Copy. XE "2933A.9.03.04.115.9" XE "2933A.9.03.04.116.1" Right-click Processes, and then click Paste. XE "2933A.9.03.04.116.9" XE "2933A.9.03.04.117.1" Click Copy of ProcessOrder_Cash.odx. In the Properties window, in the File Name box, type ProcessOrder_Credit.odx, and then press ENTER. XE "2933A.9.03.04.117.9" XE "2933A.9.03.04.118.1" In Solution Explorer, double-click ProcessOrder_Credit.odx. XE "2933A.9.03.04.118.9" XE "2933A.9.03.04.119.1" In the Properties window, in the Typename box, type ProcessOrder_Credit. XE "2933A.9.03.04.119.9" XE "2933A.9.03.04.120.1" In Orchestration View, right-click Messages, and then click New Message. XE "2933A.9.03.04.120.9" XE "2933A.9.03.04.121.1" In the Message_1 Properties window, in the Identifier box, type msgFinalLoan. XE "2933A.9.03.04.121.9" XE "2933A.9.03.04.122.1" In the Message Type list, under Schemas, click <Select from referenced assembly>. XE "2933A.9.03.04.122.9" XE "2933A.9.03.04.123.1" In the Select Artifact Type dialog box, in the left pane, click AdvWorks.LoanApproval, in the right pane, click FinalLoanDocument, and then click OK. XE "2933A.9.03.04.123.9" XE "2933A.9.03.04.124.1" In the ProcessOrder_Credit orchestration, right-click the arrow immediately below the Sales Order receive shape, point to Insert Shape, and then click Transform. XE "2933A.9.03.04.124.9" XE "2933A.9.03.04.125.1" Click the ConstructMessage_1 shape, and then in the Properties window, in the Name box, type Construct msgFinalLoan. XE "2933A.9.03.04.125.9" XE "2933A.9.03.04.126.1" In the Messages Constructed list, click msgFinalLoan. XE "2933A.9.03.04.126.9" XE "2933A.9.03.04.127.1" Click the Transform_1 shape, and then in the Properties window, in the Name box, type Map to Final Loan. XE "2933A.9.03.04.127.9" XE "2933A.9.03.04.128.1" In the Properties window, click Map Name, and then click the ellipsis (…) button. XE "2933A.9.03.04.128.9" XE "2933A.9.03.04.129.1" In the Transform Configuration dialog box, click Existing Map, and then in the Fully Qualified Map Name list, click <Select from referenced assembly>. XE "2933A.9.03.04.129.9" XE "2933A.9.03.04.130.1" In the Select Artifact Type dialog box, in the left pane, click AdvWorks.LoanApproval, in the right pane, click SalesOrder_to_FinalLoan, and then click OK. XE "2933A.9.03.04.130.9" XE "2933A.9.03.04.131.1" In the Transform Configuration window, click Source, and then in the Variable Name list, click msgSalesOrder. XE "2933A.9.03.04.131.9" XE "2933A.9.03.04.132.1" Click Destination. In the Variable Name list, click msgFinalLoan, and then click OK. XE "2933A.9.03.04.132.9" XE "2933A.9.03.04.135.1" Right-click the arrow below the Construct msgFinalLoan shape, point to Insert Shape, and then click Decide. XE "2933A.9.03.04.135.9" XE "2933A.9.03.04.136.1" In the Properties window, in the Name box, type Determine Lender. XE "2933A.9.03.04.136.9" XE "2933A.9.03.04.137.1" In the ProcessOrder_Credit orchestration, click the Rule_1 shape, and then in the Properties window, in the Name box, type Large. XE "2933A.9.03.04.137.9" XE "2933A.9.03.04.138.1" In the Properties window, click Expression, and then click the ellipsis (…) button. XE "2933A.9.03.04.138.9" XE "2933A.9.03.04.139.1" In the BizTalk Expression Editor, in the text box, type msgFinalLoan.Loan.Amount>1000, and then click OK. XE "2933A.9.03.04.139.9" XE "2933A.9.03.04.140.1" Right-click the placeholder below the Large branch, point to Insert Shape, and then click Send. XE "2933A.9.03.04.140.9" XE "2933A.9.03.04.141.1" Configure Send_1 with the properties shown in the following table. XE "2933A.9.03.04.141.9" XE "2933A.9.03.04.142.1" PropertySetting XE "2933A.9.03.04.143.1" NameNotify Bank XE "2933A.9.03.04.144.1" MessagemsgFinalLoan XE "2933A.9.03.04.145.1" You will make the necessary changes to the Else branch in a later lab. XE "2933A.9.03.04.145.9" Exercise 4: Create Orchestration PortsOverviewThe ports in this orchestration ports are configured as late bound (Specify Later), so they must be bound to a physical port after the assembly is deployed. Using late binding separates the design of an orchestration and its implementation. In this exercise, you will add a new late bound orchestration port and reconfigure the existing ports to use late binding. XE "2933A.9.03.05.146.1" Reconfigure Port Types XE "2933A.9.03.05.146.9" Procedure List XE "2933A.9.03.05.147.1" In Orchestration View, expand Types, Port Types, right-click SalesOrderType, and then click Delete. XE "2933A.9.03.05.147.9" XE "2933A.9.03.05.148.1" Right-click RestockType, and then click Delete. XE "2933A.9.03.05.148.9" XE "2933A.9.03.05.149.1" Since these port types are defined in the ProcessOrder_Cash orchestration, they cannot be defined in this orchestration, too. You must delete the port types from this list and then reconfigure the ports to use the existing port types from the ProcessOrder_Cash orchestration. XE "2933A.9.03.05.149.9" XE "2933A.9.03.05.150.1" On the left Port Surface, right-click the SalesOrder port, and then click Configure Port. XE "2933A.9.03.05.150.9" XE "2933A.9.03.05.151.1" On the Welcome to the Port Configuration Wizard page, click Next. XE "2933A.9.03.05.151.9" XE "2933A.9.03.05.152.1" On the Port Properties page, click Next. XE "2933A.9.03.05.152.9" XE "2933A.9.03.05.153.1" On the Select a Port Type page, click Use an existing Port Type, click AdvWorks.Processes.SalesOrderType, and then click Next. XE "2933A.9.03.05.153.9" XE "2933A.9.03.05.154.1" On the Port Binding page, click Next, and then click Finish. XE "2933A.9.03.05.154.9" XE "2933A.9.03.05.155.1" Repeat steps 3–7 for the SO_Complete port. XE "2933A.9.03.05.155.9" XE "2933A.9.03.05.156.1" Right-click the Restock port, and then click Configure Port. XE "2933A.9.03.05.156.9" XE "2933A.9.03.05.157.1" On the Welcome to the Port Configuration Wizard page, click Next. XE "2933A.9.03.05.157.9" XE "2933A.9.03.05.158.1" On the Port Properties page, click Next. XE "2933A.9.03.05.158.9" XE "2933A.9.03.05.159.1" On the Select a Port Type page, click Use an existing Port Type, click AdvWorks.Processes.RestockType, and then click Next. XE "2933A.9.03.05.159.9" XE "2933A.9.03.05.160.1" On the Port Binding page, click Next, and then click Finish. XE "2933A.9.03.05.160.9" Create a Send PortProcedure List XE "2933A.9.03.05.161.1" Right-click the right Port Surface, and then click New Configured Port. XE "2933A.9.03.05.161.9" XE "2933A.9.03.05.162.1" On the Welcome to the Port Configuration Wizard page of the Port Configuration Wizard, click Next. XE "2933A.9.03.05.162.9" XE "2933A.9.03.05.163.1" On the Port Properties page, in the Name box, type BankNotification, and then click Next. XE "2933A.9.03.05.163.9" XE "2933A.9.03.05.164.1" On the Select a Port Type page, in the Port Type Name box, type BankNotifyType, and then click Next. XE "2933A.9.03.05.164.9" XE "2933A.9.03.05.165.1" In the Port direction of communication list, click I’ll always be sending messages on this port, and then click Next. XE "2933A.9.03.05.165.9" XE "2933A.9.03.05.166.1" On the Completing the Port Wizard page, click Finish. XE "2933A.9.03.05.166.9" XE "2933A.9.03.05.167.1" Drag the green arrow from Notify Bank send shape to the BankNotification send port. XE "2933A.9.03.05.167.9" XE "2933A.9.03.05.168.1" In the BankNotification send port, click Operation_1, and then in the Identifier box of the Properties window, type NotifyLender. XE "2933A.9.03.05.168.9" XE "2933A.9.03.05.169.1" In the BankNotification send port, click Request, and then in the Name box of the Properties window, type msgFinalLoan. XE "2933A.9.03.05.169.9" Create Filter Expressions for OrchestrationsProcedure List XE "2933A.9.03.05.170.1" In Solution Explorer, double-click ProcessOrder_Cash.odx. XE "2933A.9.03.05.170.9" XE "2933A.9.03.05.171.1" In the ProcessOrder_Cash orchestration, click the Sales Order receive shape, in the Properties window, click Filter Expression, and then click the ellipsis (…) button. XE "2933A.9.03.05.171.9" XE "2933A.9.03.05.172.1" In the Property list, click AdvWorks.Messaging.PropertySchema.OrderType, in the Value box, type “CASH” (include the quotation marks), and then click OK. XE "2933A.9.03.05.172.9" XE "2933A.9.03.05.173.1" On the File menu, click Save All, and then close the ProcessOrder_Cash orchestration. XE "2933A.9.03.05.173.9" XE "2933A.9.03.05.174.1" In the ProcessOrder_Credit orchestration, click the Sales Order receive shape, in the Properties window, click Filter Expression, and then click the ellipsis (…) button. XE "2933A.9.03.05.174.9" XE "2933A.9.03.05.175.1" In the Property list, click AdvWorks.Messaging.PropertySchema.OrderType, in the Value box, type “CRED” (include the quotation marks), and then click OK. XE "2933A.9.03.05.175.9" XE "2933A.9.03.05.176.1" On the File menu, click Save All, and then close the ProcessOrder_Credit orchestration. XE "2933A.9.03.05.176.9" Exercise 5: Build, Deploy, and Test the BizTalk ApplicationOverviewWhen you test the application, you will submit both cash and credit orders. The cash orders will be processed by the ProcessOrders_Cash orchestration, and the credit orders will be processed by the ProcessOrders_Credit orchestration. Credit sales orders over $1,000 will result in a bank notification message that is sent to Woodgrove Bank. In this exercise, you will deploy and test the application.Test the ApplicationProcedure List XE "2933A.9.03.06.177.1" In Solution Explorer, right-click Messaging, and then click Build. XE "2933A.9.03.06.177.9" XE "2933A.9.03.06.178.1" Right-click Solution ‘AdvWorks’, and then click Project Build Order. XE "2933A.9.03.06.178.9" XE "2933A.9.03.06.179.1" Notice the order in which the projects must be built. The Project Dependencies dialog box can be used to reorder these builds. If you try to build or deploy the Processes project, the Messaging and LoanApproval projects will automatically build and/or deploy. XE "2933A.9.03.06.179.9" XE "2933A.9.03.06.180.1" Click OK to close the Project Dependencies dialog box. XE "2933A.9.03.06.180.9" XE "2933A.9.03.06.181.1" In Solution Explorer, right-click Processes, and then click Deploy. XE "2933A.9.03.06.181.9" XE "2933A.9.03.06.182.1" In the Output window, notice that all three projects were built and deployed. XE "2933A.9.03.06.182.9" XE "2933A.9.03.06.183.1" On the Start menu, point to All Programs, then point to Microsoft BizTalk Server 2010, and then click BizTalk Server Administration. XE "2933A.9.03.06.183.9" XE "2933A.9.03.06.184.1" In BizTalk Server Administration Console, expand BizTalk Server Administration, BizTalk Group, Applications, AdventureWorks. XE "2933A.9.03.06.184.9" XE "2933A.9.03.06.185.1" Right-click AdventureWorks, and then click Configure. XE "2933A.9.03.06.185.9" XE "2933A.9.03.06.186.1" In the Configure Application dialog box, click ProcessOrder_Cash, and then configure the settings using the information in the following table. XE "2933A.9.03.06.186.9" XE "2933A.9.03.06.187.1" PropertySettings XE "2933A.9.03.06.188.1" HostBizTalkServerApplication XE "2933A.9.03.06.189.1" SalesOrderSalesOrder XE "2933A.9.03.06.190.1" RestockRestockFILE XE "2933A.9.03.06.191.1" SO_CompleteCompleteFILE XE "2933A.9.03.06.192.1" In the previous lab, this orchestration was configured with “early binding,” meaning that the physical ports were automatically created and bound to the logical ports when the assembly was deployed. In this lab, you are using late binding, so the logical ports must be bound to the physical ports manually. XE "2933A.9.03.06.192.9" XE "2933A.9.03.06.193.1" In the Configure Application dialog box, click ProcessOrder_Credit, configure the settings using the information in the following table, and then click OK. XE "2933A.9.03.06.193.9" XE "2933A.9.03.06.194.1" PropertySetting XE "2933A.9.03.06.195.1" HostBizTalkServerApplication XE "2933A.9.03.06.196.1" SalesOrderSalesOrder XE "2933A.9.03.06.197.1" RestockRestockFILE XE "2933A.9.03.06.198.1" SO_CompleteCompleteFILE XE "2933A.9.03.06.199.1" BankNotificationBankNotifyFILE XE "2933A.9.03.06.200.1" Both orchestrations use the SalesOrder receive port. The filter expressions you configured on the receive shapes in each orchestration will prevent an orchestration from getting any message it shouldn’t. XE "2933A.9.03.06.200.9" XE "2933A.9.03.06.201.1" In the BizTalk Server Administration Console, right-click AdventureWorks, click Start, and then in the Start ‘AdventureWorks’ Application dialog box, click Start. XE "2933A.9.03.06.201.9" XE "2933A.9.03.06.202.1" In Windows Explorer, navigate to C:\AllFiles\LabFiles\Lab9, and then copy all four XML files to the SalesOrderIN folder. XE "2933A.9.03.06.202.9" XE "2933A.9.03.06.203.1" It may take a moment for the messages to be processed and moved from the SalesOrderIN folder. XE "2933A.9.03.06.203.9" XE "2933A.9.03.06.204.1" Open the OUT folder, and then examine each of the messages. XE "2933A.9.03.06.204.9" XE "2933A.9.03.06.205.1" Notice that the Cash and Restock orders have been processed and that the Credit order over $1000 has a BankNotify message. XE "2933A.9.03.06.205.9" XE "2933A.9.03.06.206.1" Close all open windows. XE "2933A.9.03.06.206.9" ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download