The Subtotal field is now present in the application. The field does not reflect changes when new order items are entered. We will add a business rule to the Orders controller and add a code expression for Subtotal. This code expression will use the rule to calculate the subtotal.
In the Project Explorer, switch to Controllers tab. Double-click on the Orders controller. In the Handler field, type:
OrdersBusinessRules
Press OK to save the controller, exit the Designer, and Generate the project. The business rule placeholder file will be created.
When generation is complete, click on the project name in the web application generator and press Develop. Microsoft Visual Studio or Visual Web Developer will open. In the Solution Explorer on the right side of the screen, double-click on App_Code /Rules / OrdersBusinessRules.cs(vb).
Paste in the following code:
C#:
using MyCompany.Data; using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace MyCompany.Rules { public partial class OrdersBusinessRules : MyCompany.Data.BusinessRules { public decimal CalculateOrderDetailsTotal(int? orderID) { using (SqlText calc = new SqlText(@"select sum(unitprice * quantity * (1 - discount)) from [Order Details] where OrderID= @OrderID")) { calc.AddParameter("@OrderID", orderID); object total = calc.ExecuteScalar(); if (DBNull.Value.Equals(total)) return 0; else return Convert.ToDecimal(total); } } } }
VB:
Imports MyCompany.Data Imports System Imports System.Collections.Generic Imports System.Data Imports System.Linq Namespace MyCompany.Rules Partial Public Class OrdersBusinessRules Inherits MyCompany.Data.BusinessRules Public Function CalculateOrderDetailsTotal( ByRef orderID As Nullable(Of Integer)) As Decimal Using calc As SqlText = New SqlText( "select sum(unitprice * quantity * (1 - discount)) " + "from [Order Details] where OrderID=@OrderID") calc.AddParameter("@OrderID", orderID) Dim total As Object = calc.ExecuteScalar() If DBNull.Value.Equals(total) Then Return 0 Else Return Convert.ToDecimal(total) End If End Using End Function End Class End Namespace
This function uses SqlText utility class to create an instance of a query connected to the project’s database.
This simple query selects a sum of UnitPrice multiplied by Quantity multiplied by one minus the
Discount.
Note that SqlText utility class is generated as a part of the code base of your application. It uses the
default database connection string and ADO.NET to execute the query.
Save the file, and switch back to the application generator. Select the project name, and press Design. In the Project Explorer, switch to Controllers. Double-click on Orders / Fields / Subtotal. Make the following changes:
Property | Text |
The value of this field is calculated by a business rule expression | True |
Code Formula |
CalculateOrderDetailsTotal(orderID) |
Context Fields | OrderDetails |
Press OK to save the field. The Subtotal field on the Order Form will now update to reflect any changes made to the order details.