Workflow

Labels
AJAX(112) App Studio(7) Apple(1) Application Builder(245) Application Factory(207) ASP.NET(95) ASP.NET 3.5(45) ASP.NET Code Generator(72) ASP.NET Membership(28) Azure(18) Barcode(2) Barcodes(3) BLOB(18) Business Rules(1) Business Rules/Logic(140) BYOD(13) Caching(2) Calendar(5) Charts(29) Cloud(14) Cloud On Time(2) Cloud On Time for Windows 7(2) Code Generator(54) Collaboration(11) command line(1) Conflict Detection(1) Content Management System(12) COT Tools for Excel(26) CRUD(1) Custom Actions(1) Data Aquarium Framework(122) Data Sheet(9) Data Sources(22) Database Lookups(50) Deployment(22) Designer(177) Device(1) DotNetNuke(12) EASE(20) Email(6) Features(101) Firebird(1) Form Builder(14) Globalization and Localization(6) How To(1) Hypermedia(2) Inline Editing(1) Installation(5) JavaScript(20) Kiosk(1) Low Code(3) Mac(1) Many-To-Many(4) Maps(6) Master/Detail(36) Microservices(4) Mobile(63) Mode Builder(3) Model Builder(3) MySQL(10) Native Apps(5) News(18) OAuth(9) OAuth Scopes(1) OAuth2(13) Offline(20) Offline Apps(4) Offline Sync(5) Oracle(11) PKCE(2) Postgre SQL(1) PostgreSQL(2) PWA(2) QR codes(2) Rapid Application Development(5) Reading Pane(2) Release Notes(183) Reports(48) REST(29) RESTful(29) RESTful Workshop(15) RFID tags(1) SaaS(7) Security(81) SharePoint(12) SPA(6) SQL Anywhere(3) SQL Server(26) SSO(1) Stored Procedure(4) Teamwork(15) Tips and Tricks(87) Tools for Excel(2) Touch UI(93) Transactions(5) Tutorials(183) Universal Windows Platform(3) User Interface(338) Video Tutorial(37) Web 2.0(100) Web App Generator(101) Web Application Generator(607) Web Form Builder(40) Web.Config(9) Workflow(28)
Archive
Blog
Workflow
Tuesday, July 17, 2012PrintSubscribe
Status Bars

The state of real world business objects modeled in the application database is frequently determined by the values of multiple object attributes.

For example, an order status may depend on the Order Date and Shipped Date. It would take some time for an end user to analyze the values to understand the status of an order. It would be beneficial for an application to provide a graphical representation of the order status.

Let’s implement a graphical representation of the internal object state using the Orders table of the Northwind sample. Most records have Shipped Date before Required Date. Some records do not have a value in the Shipped Date column. Other records have a Shipped Date past the Required Date.

List of orders in various states.

It would be reasonable to assume that records without a Shipped Date have not been shipped yet, records that have a Shipped Date past the Required Date have been shipped late, and that the order is on time when the Shipped Date is before Required Date.

Start the Project Designer. In the Project Explorer, switch to the Controllers tab. Right-click on Orders / Fields node, and select New Field option.

Create new field in the Orders controller.

Give this field the following settings:

Property Value
Name Status
Type String
Length 50
The value of this field is computed at run-time by SQL expression. True
SQL Formula
case
    when ShippedDate is null
        then 'Waiting To Ship'
    when ShippedDate < RequiredDate
        then 'Shipped'
    when ShippedDate > RequiredDate
        then 'Shipped Late'
end
Label Status
Values of this field cannot be edited True

Press OK to save the field. Right-click on Orders / Views / editForm1 / c1 – Orders node, and select New Data Field.

New Data Field in editForm1 view.

Give this data field the following settings:

Property Value
Field Name Status
The field is hidden True

Double-click on Orders controller node.

Orders controller node in the Project Explorer.

Change the Status Bar property:

Property New Value
Status Bar

Orders.editForm1.Status: Shipped
Order Placed > Preparing your shipment > Shipped > [You should receive your item soon] >

Orders.editForm1.Status: Waiting To Ship
Order Placed > [We are preparing the order for shipment] > Shipped >

Orders.editForm1.Status: Shipped Late
Order Placed > [Oops, your order has been delayed] > We are trying to obtain your items >

Press OK to save the controller. On the toolbar, press Browse.

Navigate to the Orders page. Select an order in which the Shipped Date is before the Required Date. A status bar above the form provides a quick status update on the status of the order.

Status bar for an order that has been shipped on time.

Select an order where Shipped Date is after Required Date. The status bar shows that the order has been delayed.

Status bar for an order that shipped late.

Finally, select an order without a value in Shipped Date field. The status bar will show that the order has not yet been shipped.

Status bar for an order that has not been shipped yet.

Status can be figured with complex calculations. For example, we configured the following SQL Formula for a new Status field in Products controller:

case
    when Discontinued = 1
        then 'Discontinued'
    when UnitsInStock + UnitsOnOrder < ReorderLevel
        then 'Low On Stock'
    when UnitsOnOrder > 0
        then 'On Order'
    when UnitsOnOrder = 0
        then 'In Stock'
end

The Status Bar configuration for Products controller looks like this:

Products.Status: Discontinued
Flagged for Review > [ The production of the product has been discontinued] >
 
Products.Status: Low On Stock
High Demand > [The product will be out of stock soon] > Place an order >
 
Products.Status: On Order
Product stock low > [An order has been placed] > Restocking >
 
Products.Status: In Stock
Recently restocked > [Plenty of stock] >

A product that has a large amount of Units In Stock will display the following status bar.

Status bar for a product that is fully stocked.

When there are a large amount of Units On Order, the status bar will notify that there is sufficient items ordered.

Status bar for a product that is being restocked.

Discontinued products will be displayed like the picture below.

Status bar for a product that has been discontinued.

When the stock is low, the status bar will warn the user.

Status bar for a product that is low on stock.

Friday, May 18, 2012PrintSubscribe
Assigning an Email Address in Business Rules

The examples of simple and conditional email business rules are explicitly defining the sender and recipient of notifications.

The sender is specified in the From parameter of the email business rule script. The recipients are specified in the To parameter.

From: "Sales Admin" <YOUR_EMAIL_ADDRESS@gmail.com>
To: RECEIPIENT@northwind.com
Subject: Price of "{ProductName}" has been changed
. . . . .

Most real-world web applications will use the same email address as the “From” parameter. This email address is also known as system administrator.

Multi-tenant web applications may require a different system administrator for each tenant.

There are also instances when an email is sent on behalf of a person associated with the data  that has changed. For example, a notification about a new customer may be sent from a regional sales manager to a subordinate sales representative.

It is not uncommon to have multiple recipients for a single notification.

Referencing “Sender” and “Recipient” Fields

If the sender and recipients of a notification are stored in the fields of the data controller, then the field names can be referenced directly in From and To parameters. The format of the reference is similar to the ProductName in the Subject of notification from the email business rule fragment presented above.

For example, the fragment of the notification can be changed as follows.

From: {SalesManagerEmail}
To: {SalesRepEmail}
Subject: Price of "{ProductName}" has been changed
. . . . .

The example makes an assumption that the data controller views include the data fields with the names SalesManagerEmail and SalesRepEmail.

The actual email addresses may be quite flexible.

The address in the From data field may be stored with or without a display name. The address in the To field follows the same specification. Multiple email addresses can be stored in this field as well. Email business rules will automatically parse and detect multiple addresses and optional display names.

For example, the following list can be stored in the database in the table column SalesRepEmail.

johndoe@acme.com, john.doe@acme.com,
John Doe <john.doe@acme.com>; "Doe, John" <johndoe@acme.com>

The application framework will parse the field value and will send the email to four recipients.

Using SQL Business Rules to Determine Sender and Recipient

Consider the Northwind sample, a line-of-business app of a mail order company.

Suppose that there is a business requirement to notify the sales rep placing an order if this is a repeat purchase by customer.  A personal thank you note must be written to a repeat customer.

Another business requirement is to send a shipping reminder to an employee associated with an order when its shipping date has changed.

Let’s make an assumption that every employee has a user account composed of their first and last names separated with period. The user account andrew.fuller is shown in the screenshot of Membership Manager.

Several user accounts were created with user names composed of the first and last names of employees separated with 'period'

Sending a “Thank You” Note Reminder to Current User

If the data fields with sender and recipients are not available, then you can determine this information with a help of an SQL business rule that makes use of a current user identity.

Create a new SQL business rule in Orders data controller with the following properties.

Property Value
CommandName Insert|Update
Type SQL
Phase After
Script
set @BusinessRules_Whitelist = 'Empty'
if @Arguments_CommandName = 'Insert'
begin 
    -- count the number of orders
    declare @NumberOfOrders int
    select @NumberOfOrders = count(*)
    from Orders where CustomerID = @CustomerID
    -- update the Whitelist if this is the second order
    if @NumberOfOrders = 2 
    begin
        set @BusinessRules_Whitelist = 
            @BusinessRules_Whitelist + ',ThankYouReminder'
        -- find the company name of the "repeat" customer
        select @Session_RepeatCustomer = CompanyName
        from Customers where CustomerID = @CustomerID
        -- find the email address of the current user
        select @Session_EmailAddress = m.Email 
        from aspnet_Membership m 
          inner join aspnet_Users u on m.UserId = u.UserId
        where
            u.UserName = @BusinessRules_UserName
    end
end

The script determines if the current order is the second order placed for the customer by the sales rep.

The parameter named @BusinessRules_UserName is used to find the email address of the current user. The other highlighted parameters are used in the script of the email.

Proceed to create a new Email business rule in the same data controller

Property Value
Command Name Insert
Name ThankYouReminder
Type Email
Phase After
Script
Host: smtp.gmail.com
Port: 587
UserName: YOUR_EMAIL_ADDRESS@gmail.com
Password: PASSWORD
EnableSSL: true

From: "Sales Admin" <YOUR_EMAIL_ADDRESS@gmail.com>
To: {@Session_EmailAddress}
Subject: Customer "{@Session_RepeatCustomer}" placed the second order!

Please send a personal "Thank You" note to the customer.

Northwind,
Administrator

Make sure to change the highlighted STMP account parameters with your values.

The hierarchy of the data controller with two business rules is shown next.

Two business rules are configured to send a 'Thank You' note notification to the current user when the second order is placed for a customer

Generate the app, sign in as andrew.fuller and change the user email address in My Account settings to your own email. Create a new customer and place the first order - there will be no notification. Place a second order for the same customer and a notification will be waiting in your inbox.

'Thank You' note reminder in the Gmail inbox of the sales person

Standard UserEmail Parameter

The SQL business rule can be made shorter thanks to the property UserEmail available in BusinessRules class of the application framework. Remove the code that assigns a value to @Session_EmailAddress and change the email business rule as shown in the next fragment.

. . . . .
To: {@BusinessRules_UserEmail}
Subject: Customer "{@Session_RepeatCustomer}" placed the second order!
. . . . .

The property returns the email address of the current user. The parameter value will be equal to the value of the property.

Sending a Shipping Notification

The partial database schema of Northwind database shows Orders and Employees tables.

A relationship between Orders and Employees in Northwind database

We can easily determine the user name of an employee thanks to our assumption that the user name is composed of a period-separated first name and last name (andrew.fuller, steven.buchanan, etc.)

Let’s send another notification that will go out as soon as an order has a new shipping date. The email will be sent to an employee specified in Orders.EmployeeID field.

Change the SQL business rule script by adding the following condition at the end of the original.

-- send an order shipping notification to the sales rep
if @ShippedDate_Modified = 1 and @ShippedDate_NewValue is not null
begin
    -- find the user name of the sales rep
    declare @SalesRepUserName nvarchar(50)
    select @SalesRepUserName = lower(FirstName) + '.' + lower(LastName)
    from Employees where EmployeeID = @EmployeeID
    -- find the email address of the sales rep
    select @Session_SalesRepEmailAddress = m.Email 
    from aspnet_Membership m 
      inner join aspnet_Users u on m.UserId = u.UserId
    where
        u.UserName = @SalesRepUserName
    -- update the Whitelist to allow notification
    if @Session_SalesRepEmailAddress is not null
    begin
       set @BusinessRules_Whitelist = 
            @BusinessRules_Whitelist + ',ShippingNotification'
       -- prepare a session variable used in the notification
       select @Session_ShipCustomer = CompanyName
       from Customers where CustomerID = @CustomerID
    end
end

The highlighted parameter from SQL script will be referenced in the To parameter of the email notification.

Add another Email business rule with these properties.

Property Value
Command Name Insert|Update
Name ShippingNotification
Type Email
Phase After
Script
Host: smtp.gmail.com
Port: 587
UserName: YOUR_EMAIL_ADDRESS@gmail.com
Password: PASSWORD
EnableSSL: true

From: "Sales Admin" <YOUR_EMAIL_ADDRESS@gmail.com>
To: {@Session_SalesRepEmailAddress}
Subject: Order placed by "{@Session_ShipCustomer}" has shipped

Order placed on {OrderDate,d} by {@Session_ShipCustomer} has shipped on {ShippedDate,dddd, m/d/yyyy}.
The amount of freight is {Freight,c}.

Northwind,
Administrator

Notice the custom data format strings in the field OrderDate, ShippedDate, and Freight.

This is the new hierarchy of Orders data controller.

Data controller 'Orders' with one SQL business rule and two 'named' Email business rules

This is how the shipping notification will look in the Gmail inbox of the sales representative.

The shipping notification in the Gmail inbox of the sales representative.

Carbon Copy and Blind Carbon Copy

If you need to copy additional recipients when sending a notification, then specify parameters Cc and Bcc in the scrip of the email business rules.

Both parameters follow the same format as To parameter.

Thursday, May 17, 2012PrintSubscribe
Limiting Access to Data Views With Roles

The visibility of a data view on a page can be controlled with Visible When expression written in JavaScript. For example, the child data view in a master-detail configuration may or may not be visible if a master field has a certain value.

Both, master and detail data views may have additional visibility requirements that have nothing to do with the data. The user identity may be a contributing factor. For example, only administrative users can see certain data views on the pages that are available to other user roles as well.

Property Roles allows introducing additional level of identity control to complement Visible When expression.

Start Project Designer for Northwind sample and select Customers page in the Project Explorer hierarchy.

Change Customers / container1 / view1 (Customers, grid) data view node.

Property New Value
Activator Tab
Text Customers

Add two data views to the Customers / container1 node with the following properties.

Data View #1

Property Value
Controller Employees
Activator Tab
Text Employees
Roles Administrators

Data View #2

Property Value
Controller Products
Activator Tab
Text Products
Roles Administrators

Change Customers / Container2 / view2 (Orders, grid1) data view node.

Property New Value
Roles Administrators

Change Customers / Container2 / view3 (CustomerCustomerDemo, grid1) data view node.

Property New Value
Roles Administrators

This is the hierarchy of the modified Customers page.

Modified 'Customers' page from Northwind sample created with Code On Time web application generator

Click Browse on the designer toolbar to generate the app. Sign in with the standard user account user/user123%.

This is the view of Customers page as seen by non-administrative user account.

This is the view of Customers page as seen by non-administrative user account.

Logout and sign in as admin/admin123%. This user belongs to the role Administrators.

This is how administrator sees the same page.

This is how administrator sees the same page.