Web Application Generator

Labels
AJAX(112) App Studio(9) 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(178) 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(184) 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(3) 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
Web Application Generator
Friday, June 15, 2012PrintSubscribe
Implicit Filters with Dynamic Access Control Rules

The property Context Fields can pass values from the current record to the lookup data view. The value is passed in the format LookupFieldName=FieldNameOfThisView as an external filter. Multiple value mappings can be specified.

If LookupFieldName matches a data field in the lookup view, then an automatic “equals” filter will be applied to the lookup. If the LookupFieldName does not match, then the application framework will not perform filtering. A developer can use the passed external filter field value to create a filter expression or business rule implementing custom filtering.

Let’s create a business rule for a lookup view that takes advantage of values passed in the Context Fields property.

Navigate to the Orders page, and select an order. Create a new order detail, and activate the lookup for ProductID. The Northwind database has 77 products. All products will be available for selection in the Products lookup.

Lookup list of all 77 products available for selection.

Let’s exclude products already associated with order details of the existing order from this view.

Start the Project Designer. In the Project Explorer, switch to the Controllers tab. Double-click on Products controller node.

Products controller selected in the Project Explorer.

Change the Handler property:

Property New Value
Handler ProductsBusinessRules

Press OK to save the controller. Double-click on OrderDetails / Fields / ProductID field node.

ProductID field of OrderDetails controller.

Change the Context Fields property:

Property New Value
Context Fields ExistingOrderID=OrderID

Press OK to save the field. On the toolbar, press Exit to close the Project Designer, and click Generate.

When complete, click on the project name, and select Develop to open Visual Studio.

In the Solution Explorer of Visual Studio, double-click on ~\App_Code\Rules\ProductsBusinessRules.cs(.vb) file.

ProductsBusinessRules file in the Code On Time web application.

Replace the existing code with the following business rule:

C#:

using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using MyCompany.Data;

namespace MyCompany.Rules
{
    public partial class ProductsBusinessRules : MyCompany.Data.BusinessRules
    {
        protected override void EnumerateDynamicAccessControlRules(string Products)
        {
            FieldValue orderId = SelectExternalFilterFieldValueObject(
                "ExistingOrderID");
            if (orderId != null && orderId.Value != null)
                RegisterAccessControlRule("ProductID",
                    "[ProductID] in (select ProductID from [Order Details] " +
                    "where OrderID = @OrderID)",
                    AccessPermission.Deny,
                    new SqlParam("@OrderID", orderId.Value));
        }
    }
}

Visual Basic:

Imports MyCompany.Data
Imports System
Imports System.Collections.Generic
Imports System.Data
Imports System.Linq

Namespace MyCompany.Rules

    Partial Public Class ProductsBusinessRules
        Inherits MyCompany.Data.BusinessRules
        Protected Overrides Sub EnumerateDynamicAccessControlRules(Products As String)
            Dim orderId As Object = SelectExternalFilterFieldValueObject(
                "ExistingOrderID")
            If (orderId IsNot Nothing AndAlso orderId.Value IsNot Nothing) Then
                RegisterAccessControlRule("ProductID",
                    "[ProductID] in (select ProductID from [Order Details] " +
                    "where OrderID = @OrderID)",
                    AccessPermission.Deny,
                    New SqlParam("@OrderID", orderId.Value))
            End If
        End Sub
    End Class
End Namespace

The business rule tries to locate the external filter field ExistingOrderID. If it is found, and the value is not null, then the business rule will register an access control rule. The access control rule will deny access to products that are matched to the “Order Details”.“ProductID” column if the column OrderID is equal to the value passed in ExistingOrderID filter field.

Save the file, and run the web application.

Navigate to the Orders page, and select an order. Note the number of order details belonging to the order.

Order Details child view displaying 3 records that belong to the selected order.

Create a new order detail. Click on (select) link in the Product Name lookup.

Product Name lookup on the New Order Details create form.

The Product lookup will open. There will be no products that are already ordered. In the example below, there are only 74 products displayed out of 77 products in the database.

Limited subset of 74 products displayed in the lookup.

Monday, June 11, 2012PrintSubscribe
Custom Date Format Strings

A date and time format string defines the text representation of a DateTime value that results from a formatting operation. It can also define the representation of a date and time value that is required in a parsing operation in order to successfully convert the string to a date and time. A custom format string consists of one or more custom date and time format specifiers. Any string that is not a standard date and time format string is interpreted as a custom date and time format string.

Let’s apply a custom format string to the OrderDate field of Orders controller.

Start the Project Designer. In the Project Explorer, double-click on Orders / Fields / OrderDate field node.

OrderDate field of Orders controller.

Change the Data Format String property:

Property Value
Data Format String 'The' d 'of' MMMM, yyyy.

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

Navigate to the Orders page. The Order Date values will be rendered in the custom date pattern.

Order Date with custom date format strings.

Below is a list of supported custom date format strings.

Format specifier

Description

Examples

"d"

The day of the month, from 1 through 31.

6/1/2009 1:45:30 PM –> 1
6/15/2009 1:45:30 PM -> 15

"dd"

The day of the month, from 01 through 31.

6/1/2009 1:45:30 PM –> 01
6/15/2009 1:45:30 PM -> 15

"ddd"

The abbreviated name of the day of the week.

6/15/2009 1:45:30 PM -> Mon (en-US)
6/15/2009 1:45:30 PM -> Пн (ru-RU)
6/15/2009 1:45:30 PM -> lun. (fr-FR)

"dddd"

The full name of the day of the week.

6/15/2009 1:45:30 PM -> Monday (en-US)
6/15/2009 1:45:30 PM -> понедельник (ru-RU)
6/15/2009 1:45:30 PM -> lundi (fr-FR)

"f"

The tenths of a second in a date and time value.

6/15/2009 13:45:30.617 –> 6
6/15/2009 13:45:30.050 -> 0

"ff"

The hundredths of a second in a date and time value.

6/15/2009 13:45:30.617 -> 61

6/15/2009 13:45:30.005 -> 00

"fff"

The milliseconds in a date and time value.

6/15/2009 13:45:30.617 –> 617
6/15/2009 13:45:30.0005 -> 000

"ffff"

The ten thousandths of a second in a date and time value.

6/15/2009 13:45:30.6175 –> 6175
6/15/2009 13:45:30.00005 -> 0000

"fffff"

The hundred thousandths of a second in a date and time value.

6/15/2009 13:45:30.61754 –> 61754
6/15/2009 13:45:30.000005 -> 00000

"ffffff"

The millionths of a second in a date and time value.

6/15/2009 13:45:30.617542 –> 617542
6/15/2009 13:45:30.0000005 -> 000000

"fffffff"

The ten millionths of a second in a date and time value.

6/15/2009 13:45:30.6175425 –> 6175425
6/15/2009 13:45:30.0001150 -> 0001150

"g", "gg"

The period or era.

6/15/2009 1:45:30 PM -> A.D.

"h"

The hour, using a 12-hour clock from 1 to 12.

6/15/2009 1:45:30 AM –> 1
6/15/2009 1:45:30 PM -> 1

"hh"

The hour, using a 12-hour clock from 01 to 12.

6/15/2009 1:45:30 AM –> 01
6/15/2009 1:45:30 PM -> 01

"H"

The hour, using a 24-hour clock from 0 to 23.

6/15/2009 1:45:30 AM –> 1
6/15/2009 1:45:30 PM -> 13

"HH"

The hour, using a 24-hour clock from 00 to 23.

6/15/2009 1:45:30 AM –> 01
6/15/2009 1:45:30 PM -> 13

"m"

The minute, from 0 through 59.

6/15/2009 1:09:30 AM –> 9
6/15/2009 1:09:30 PM -> 9

"mm"

The minute, from 00 through 59.

6/15/2009 1:09:30 AM –> 09
6/15/2009 1:09:30 PM -> 09

"M"

The month, from 1 through 12.

6/15/2009 1:45:30 PM -> 6

"MM"

The month, from 01 through 12.

6/15/2009 1:45:30 PM -> 06

"MMM"

The abbreviated name of the month.

6/15/2009 1:45:30 PM -> Jun (en-US)
6/15/2009 1:45:30 PM -> juin (fr-FR)
6/15/2009 1:45:30 PM -> Jun (zu-ZA)

"MMMM"

The full name of the month.

6/15/2009 1:45:30 PM -> June (en-US)
6/15/2009 1:45:30 PM -> juni (da-DK)
6/15/2009 1:45:30 PM -> uJuni (zu-ZA)

"s"

The second, from 0 through 59.

6/15/2009 1:45:09 PM -> 9

"ss"

The second, from 00 through 59.

6/15/2009 1:45:09 PM -> 09

"t"

The first character of the AM/PM designator.

6/15/2009 1:45:30 PM -> P (en-US)
6/15/2009 1:45:30 PM -> 午 (ja-JP)
6/15/2009 1:45:30 PM -> (fr-FR)

"tt"

The AM/PM designator.

6/15/2009 1:45:30 PM -> PM (en-US)
6/15/2009 1:45:30 PM -> 午後 (ja-JP)
6/15/2009 1:45:30 PM -> (fr-FR)

"y"

The year, from 0 to 99.

1/1/0001 12:00:00 AM –> 1
1/1/0900 12:00:00 AM –> 0
1/1/1900 12:00:00 AM –> 0
6/15/2009 1:45:30 PM -> 9

"yy"

The year, from 00 to 99.

1/1/0001 12:00:00 AM –> 01
1/1/0900 12:00:00 AM –> 00
1/1/1900 12:00:00 AM –> 00
6/15/2009 1:45:30 PM -> 09

"yyyy"

The year as a four-digit number.

1/1/0001 12:00:00 AM –> 0001
1/1/0900 12:00:00 AM –> 0900
1/1/1900 12:00:00 AM –> 1900
6/15/2009 1:45:30 PM -> 2009

"z"

Hours offset from UTC, with no leading zeros.

6/15/2009 1:45:30 PM -07:00 -> -7

"zz"

Hours offset from UTC, with a leading zero for a single-digit value.

6/15/2009 1:45:30 PM -07:00 -> -07

"zzz"

Hours and minutes offset from UTC.

6/15/2009 1:45:30 PM -07:00 -> -07:00

":"

The time separator.

6/15/2009 1:45:30 PM -> : (en-US)
6/15/2009 1:45:30 PM -> . (it-IT)
6/15/2009 1:45:30 PM -> : (ja-JP)

"/"

The date separator.

6/15/2009 1:45:30 PM -> / (en-US)
6/15/2009 1:45:30 PM -> - (ar-DZ)
6/15/2009 1:45:30 PM -> . (tr-TR)

'string'

Literal string delimiter.

6/15/2009 1:45:30 PM ('arr:' h:m t) -> arr: 1:45 P

%

Defines the following character as a custom format specifier.

6/15/2009 1:45:30 PM (%h) -> 1

Any other character

The character is copied to the result string unchanged.

6/15/2009 1:45:30 AM (arr hh:mm t) -> arr 01:45 A

Monday, June 11, 2012PrintSubscribe
Standard Date Format Strings

A standard date and time format string uses a single format specifier to define the text representation of a date and time value. Any date and time format string that contains more than one character, including white space, is interpreted as a custom date and time format string. A standard or custom format string can be used in two ways:

  • To define the string that results from a formatting operation.

  • To define the text representation of a date and time value that can be converted to a DateTime value by a parsing operation.

Let’s change the Order Date on the Orders controller to display the long date pattern.

Start the Project Designer. In the Project Explorer, double-click on Orders / Fields / OrderDate field node.

OrderDate field on the Orders controller.

Change the Data Format String property:

Property Value
Data Format String D

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

Navigate to the Orders page. The Order Date values will be rendered in the long date pattern.

Order Date field values rendered in the long date pattern.

Below is a list of supported date format strings. The format string can be specified either directly or in curly braces. The data format string in the above sample can be written “D” or “{0:D}”.

Format String

Description

Example (Value = 6/15/2009 1:45:30 PM)

"d"

Short date pattern.

6/15/2009 (en-US)
15/06/2009 (fr-FR)
2009/06/15 (ja-JP)

"D"

Long date pattern.

Monday, June 15, 2009 (en-US)
15 июня 2009 г. (ru-RU)
Montag, 15. Juni 2009 (de-DE)

"g" General date/time pattern (short time). 6/15/2009 1:45 PM (en-US)
15/06/2009 13:45 (es-ES)
2009/6/15 13:45 (zh-CN)
"G" General date/time pattern (long time). 6/15/2009 1:45:30 PM (en-US)
15/06/2009 13:45:30 (es-ES)
2009/6/15 13:45:30 (zh-CN)

"t"

Short time pattern.

1:45 PM (en-US)
13:45 (hr-HR)
01:45 م (ar-EG)

"T"

Long time pattern.

1:45:30 PM (en-US)
13:45:30 (hr-HR)
01:45:30 م (ar-EG)

"f"

Full date/time pattern (short time).

Monday, June 15, 2009 1:45 PM (en-US)
den 15 juni 2009 13:45 (sv-SE)
Δευτέρα, 15 Ιουνίου 2009 1:45 μμ (el-GR)

"F"

Full date/time pattern (long time).

Monday, June 15, 2009 1:45:30 PM (en-US)
den 15 juni 2009 13:45:30 (sv-SE)
Δευτέρα, 15 Ιουνίου 2009 1:45:30 μμ (el-GR)

"M", "m"

Month/day pattern.

June 15 (en-US)
15. juni (da-DK)
15 Juni (id-ID)

"s"

Sortable date/time pattern.

2009-06-15T13:45:30

"Y", "y"

Year month pattern.

June, 2009 (en-US)
juni 2009 (da-DK)
Juni 2009 (id-ID)

"U", "u" Universal sortable date/time pattern. 2009-06-15 20:45:30Z