﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Latest Forum Discussions</title>
    <description>Recent discussions</description>
    <link>http://support.surroundtech.com</link>
    <item>
      <title>Linking in Property Codes Drop Down</title>
      <description>&lt;ul&gt;&#xD;
&lt;li&gt;&#xD;
&lt;p&gt;Make sure the WPF project you are adding the Property Codes Drop Down has a reference&amp;nbsp;to the&amp;nbsp;WPF.PropCodeValue assembly. If doesn't, then add the following to your .csproj file:&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;lt;Reference Include="WPF.PropCodeValue, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;HintPath&amp;gt;$(A4DNMaintenanceHintPath)WPF.PropCodeValue.dll&amp;lt;/HintPath&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;lt;/Reference&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&#xD;
&lt;p&gt;In the WPF XAML, you need to add the namespace for the&amp;nbsp;WPF.PropCodeValue assembly&lt;/p&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;xmlns:propCodeValue="clr-namespace:WPF.PropCodeValue;assembly=WPF.PropCodeValue"&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;In the WPF XAML, Add the Property Codes Drop Down XAML. There are 3 different types of Drop Downs to choose from:&amp;nbsp;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;PropCodeValueDropDown - Value is the display member; You can Bind to Value&lt;/li&gt;&#xD;
&lt;li&gt;PropCodeValueDropDown02 - Code&amp;nbsp;is the display member; You can Bind to Code&lt;/li&gt;&#xD;
&lt;li&gt;PropCodeValueDropDown03 - Value&amp;nbsp;is the display member, You can Bind to Code&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Example using PropCodeValueDropDown03 replacing the IndexerName property with the Property Codes Table STDMIndexerNames:&lt;/p&gt;&#xD;
&lt;p&gt;&amp;nbsp; &lt;strong&gt;&amp;lt;propCodeValue:PropCodeValueDropDown03 ap_PropertyMetaData="{x:Static entity:DM_IndexerFormatFieldsEntity.IndexerNameProperty}" Code="{Binding Path=IndexerName, Mode=TwoWay}" DefaultPropertyCodeTable="STDMIndexerNames" ap_BtnNewDetailVisibility="Collapsed" ap_BtnOpenDetailVisibility="Collapsed" ap_BtnSearchAndSelectVisibility="Collapsed" Margin="0,0,2,5" ap_LabelPosition="Left" DockPanel.Dock="Top" HorizontalAlignment="Left" Width="550" /&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2017-07-14T19:30:45.6130000</pubDate>
      <link>http://support.surroundtech.com/thread/linking-in-property-codes-drop-down/</link>
    </item>
    <item>
      <title>How to Add the Remarks tab to a module</title>
      <description>&lt;p&gt;To add the Remarks tab to a module, you must first identity the Reference IDs for both the Content Explorer window and the Detail window. Typically these will be {ModuleName}ExpContent and {ModuleName}Detail. In older systems with WPF check the module's WPF source code; the detail's xaml code-behind sets ap_SubBrowserLoad with the detail's Reference ID, and the ExpContent xaml code-behind filenames may have an _ and the content window ReferenceID appended to them. Note that there may be more than one Reference ID for each window type.&lt;/p&gt;&#xD;
&lt;p&gt;Start up the Maintenance system. If Remarks is not already in your system, go to System, select your system, open the Applications tab, and use the Quick Add to add the Remarks application to your system.&lt;/p&gt;&#xD;
&lt;p&gt;Go to Maintenance &amp;gt; SB Interfaces. For each Reference ID, add a new SB Interface:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Reference ID is set to the reference ID you're adding&lt;/li&gt;&#xD;
&lt;li&gt;Display Sequence = 999 (last tab, before Audit Stamps)&lt;/li&gt;&#xD;
&lt;li&gt;Module Name: Choose Remarks from the dropdown&lt;/li&gt;&#xD;
&lt;li&gt;Name: change to &amp;amp;Remarks for menu shortcut key&lt;/li&gt;&#xD;
&lt;li&gt;Description: leave as Remarks or modify if you wish&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Next, go to Maintence &amp;gt; Modules, and use the filter to find the Remarks module. Select the Remarks module and in the preview area open the View References tab. For each Reference ID add a new view reference:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;View Name: select FWRKV01 from the dropdown&lt;/li&gt;&#xD;
&lt;li&gt;Select Use as Default View and Auto Load Content Window&lt;/li&gt;&#xD;
&lt;li&gt;Choose Sub Module&lt;/li&gt;&#xD;
&lt;li&gt;Set Parent Component to the Reference ID&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;NOTE: If you use "Save and New" for the view references, make sure to re-enter RFWRKEBS1 as the Explorer Bar Component. This is set automatically for you if you use "Save and Close" and then click on the New command in the View References sub-browser tab.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2017-06-08T19:09:57.2370000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-add-the-remarks-tab-to-a-module/</link>
    </item>
    <item>
      <title>Surround Training Courses</title>
      <description>&lt;p&gt;Surround offers several training courses to help get you started developing with the .NET technology stack. &amp;nbsp;These courses are not Accelerator training courses, but the topics discussed in these training courses is recommended before going through any Accelerator training courses. &amp;nbsp;These courses are instructor lead with Powerpoint slides to discuss concepts and hands on training to reinforce the concept. &amp;nbsp;Visual Studio is required to be installed for these training courses.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&#xD;
&lt;h2&gt;&lt;strong&gt;Visual C# Programming (4 - 5 Day Course)&lt;/strong&gt;&lt;/h2&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Chapter 1 - Overview of OOP, .NET and C#&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;What is OOP?&lt;/li&gt;&#xD;
&lt;li&gt;What is a Class? an Object?&amp;nbsp;&lt;/li&gt;&#xD;
&lt;li&gt;What is a Method? a Property? An Event?&lt;/li&gt;&#xD;
&lt;li&gt;What is an Interface? an Abstract Class?&lt;/li&gt;&#xD;
&lt;li&gt;What is Abstraction? &amp;nbsp;Inheritance? &amp;nbsp;Polymorphism? &amp;nbsp;Encapsulation?&lt;/li&gt;&#xD;
&lt;li&gt;What are Access Modifiers?&amp;nbsp;&lt;/li&gt;&#xD;
&lt;li&gt;What are Keywords?&lt;/li&gt;&#xD;
&lt;li&gt;Evolution of C#&lt;/li&gt;&#xD;
&lt;li&gt;Overview of the .NET Framework&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 2 - C# Program Structure&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Program Layout&lt;/li&gt;&#xD;
&lt;li&gt;Namespaces&lt;/li&gt;&#xD;
&lt;li&gt;Keywords and Identifiers&lt;/li&gt;&#xD;
&lt;li&gt;A class&lt;/li&gt;&#xD;
&lt;li&gt;Class methods&lt;/li&gt;&#xD;
&lt;li&gt;Comments&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 3 - C# Data Types&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Value and Reference Variables&lt;/li&gt;&#xD;
&lt;li&gt;Stack vs. Heap Memory&lt;/li&gt;&#xD;
&lt;li&gt;Built-in Data Types&lt;/li&gt;&#xD;
&lt;li&gt;User Defined Types&lt;/li&gt;&#xD;
&lt;li&gt;Literals and Constants&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 4 - C# Operators and Type Conversion&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Operators&lt;/li&gt;&#xD;
&lt;li&gt;Assignment Operators&lt;/li&gt;&#xD;
&lt;li&gt;Equality Operators&lt;/li&gt;&#xD;
&lt;li&gt;Mix-Type Conversion&lt;/li&gt;&#xD;
&lt;li&gt;Casting&lt;/li&gt;&#xD;
&lt;li&gt;String Operators&lt;/li&gt;&#xD;
&lt;li&gt;Named Operations&lt;/li&gt;&#xD;
&lt;li&gt;Data Conversion&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 5 - C# Parameter Passing&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Pass by Value&lt;/li&gt;&#xD;
&lt;li&gt;Pass by Reference&lt;/li&gt;&#xD;
&lt;li&gt;Parameter Arrays&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 6 - C# Conditions and Loops&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Conditional Statements&lt;/li&gt;&#xD;
&lt;li&gt;Loop Statements&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 7 &amp;ndash; Exception Handling&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;What is an Exception?&lt;/li&gt;&#xD;
&lt;li&gt;Exception Keywords&lt;/li&gt;&#xD;
&lt;li&gt;Exception Classes&lt;/li&gt;&#xD;
&lt;li&gt;Exception Example&lt;/li&gt;&#xD;
&lt;li&gt;Exception Flow&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 8 &amp;ndash; Defining Your Own Data Types&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Instance Data&lt;/li&gt;&#xD;
&lt;li&gt;Data Scope&lt;/li&gt;&#xD;
&lt;li&gt;Constructors/Destructors&lt;/li&gt;&#xD;
&lt;li&gt;Properties&lt;/li&gt;&#xD;
&lt;li&gt;Enumerations&lt;/li&gt;&#xD;
&lt;li&gt;Operators and Indexers&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 9 &amp;ndash; Collections (LINQ and Lambda Expressions)&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Types of Collections&lt;/li&gt;&#xD;
&lt;li&gt;Accessing Collection Data&lt;/li&gt;&#xD;
&lt;li&gt;LINQ&lt;/li&gt;&#xD;
&lt;li&gt;Lambda Expressions&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 10 &amp;ndash; Inheritance and Polymorphism&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;What is Inheritance?&lt;/li&gt;&#xD;
&lt;li&gt;Virtual/override keyword&lt;/li&gt;&#xD;
&lt;li&gt;Polymorphism&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 11 &amp;ndash; Delegates and Events&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;What is a Delegate?&lt;/li&gt;&#xD;
&lt;li&gt;Delegate Declaration&lt;/li&gt;&#xD;
&lt;li&gt;Delegate Example&lt;/li&gt;&#xD;
&lt;li&gt;Event Declaration&lt;/li&gt;&#xD;
&lt;li&gt;Event Example&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 12 &amp;ndash; Reflection and Attributes&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;.NET Assembly Hierarchy&lt;/li&gt;&#xD;
&lt;li&gt;What is Reflection?&lt;/li&gt;&#xD;
&lt;li&gt;Reflection Example&lt;/li&gt;&#xD;
&lt;li&gt;C# Attributes&lt;/li&gt;&#xD;
&lt;li&gt;Predefined Attributes&lt;/li&gt;&#xD;
&lt;li&gt;Creating Custom Attributes&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&#xD;
&lt;h2&gt;&lt;strong&gt;Windows Presentation Foundation (WPF)&amp;nbsp;(2 - 3 Day Course)&lt;/strong&gt;&lt;/h2&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Chapter 1 &amp;ndash; Introduction to WPF&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;WPF Overview&lt;/li&gt;&#xD;
&lt;li&gt;XAML Overview&lt;/li&gt;&#xD;
&lt;li&gt;WPF Architecture&lt;/li&gt;&#xD;
&lt;li&gt;WPF Class Hierarchy&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 2 &amp;ndash; XAML Syntax&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;XAML Basics&lt;/li&gt;&#xD;
&lt;li&gt;Object Element Syntax&lt;/li&gt;&#xD;
&lt;li&gt;Properties of Object Elements&lt;/li&gt;&#xD;
&lt;li&gt;Processing Attribute Values&lt;/li&gt;&#xD;
&lt;li&gt;Collection Syntax&lt;/li&gt;&#xD;
&lt;li&gt;XAML Namespaces&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 3 &amp;ndash; Layouts and Controls&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Sizing Options&lt;/li&gt;&#xD;
&lt;li&gt;Alignment&lt;/li&gt;&#xD;
&lt;li&gt;Visibility&lt;/li&gt;&#xD;
&lt;li&gt;Padding and Margins&lt;/li&gt;&#xD;
&lt;li&gt;Layout Controls&lt;/li&gt;&#xD;
&lt;li&gt;Built-in Controls&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 4 &amp;ndash; Data Binding&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;What is Data Binding?&lt;/li&gt;&#xD;
&lt;li&gt;Data Context&lt;/li&gt;&#xD;
&lt;li&gt;Value Converters&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 5 &amp;ndash; Dependency Properties&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Dependency Property purpose and advantage&lt;/li&gt;&#xD;
&lt;li&gt;Value Resolution&lt;/li&gt;&#xD;
&lt;li&gt;How to create a Dependency Property&lt;/li&gt;&#xD;
&lt;li&gt;Dependency Property Example&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 6 &amp;ndash; Resources&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Types of Resources&lt;/li&gt;&#xD;
&lt;li&gt;Resource Lookup&lt;/li&gt;&#xD;
&lt;li&gt;Static vs. Dynamic Resources&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 7 &amp;ndash; Styles and Triggers&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Styles&lt;/li&gt;&#xD;
&lt;li&gt;Triggers&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 8 &amp;ndash; Templates&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Control Templates&lt;/li&gt;&#xD;
&lt;li&gt;Data Templates&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 9 &amp;ndash; Animations&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Story Boards&lt;/li&gt;&#xD;
&lt;li&gt;Timelines&lt;/li&gt;&#xD;
&lt;li&gt;Transform&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Chapter 10 &amp;ndash; Architecture Patterns&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;What is MVVM?&lt;/li&gt;&#xD;
&lt;li&gt;Benefits of MVVM&lt;/li&gt;&#xD;
&lt;li&gt;How the Accelerator uses MVVM&lt;/li&gt;&#xD;
&lt;li&gt;Attribute Based Validations&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2017-05-19T15:01:21.6800000</pubDate>
      <link>http://support.surroundtech.com/thread/surround-training-courses/</link>
    </item>
    <item>
      <title>Changing the WPF Tab Background Color</title>
      <description>&lt;p&gt;You can access the TabItems in the WPF Content Window and Detail code behind to set the properties based on business rules.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Here is sample code that sets the background color of a tab to yellow for a specific module number.&lt;/p&gt;&#xD;
&lt;p&gt;Here is what the code looks like in the Content Window code behind if you want to set the color for a sub module&amp;nbsp;tab that shows in the preview pane.&lt;/p&gt;&#xD;
&lt;p&gt;Note: This code assumes you are using the Docking Tabs (Dragablz) and therefore uses the &lt;strong&gt;AB_DockingSubBrowserTabItem&lt;/strong&gt; class. &amp;nbsp;If you are not using Docking Tabs, then this class should be changed to &lt;strong&gt;AB_SubBrowserTabItem&lt;/strong&gt;.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_SubBrowsersCreated(ObservableCollection&amp;lt;AB_ITabItem&amp;gt; subBrowserTabs)&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_SubBrowsersCreated(subBrowserTabs);&#xD;
&#xD;
    &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; tabItem &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; subBrowserTabs)&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (tabItem &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; AB_DockingSubBrowserTabItem subBrowserTabItem)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (subBrowserTabItem.ap_SubBrowserModule.ModuleNumber == 6)&#xD;
            {&#xD;
                subBrowserTabItem.Background = System.Windows.Media.Brushes.Yellow;&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Here is what the code looks like in the Detail code behind&amp;nbsp;if you want to set the color for a sub module&amp;nbsp;tab.&lt;/p&gt;&#xD;
&lt;p&gt;Note: This code assumes you are using the Docking Tabs (Dragablz) and therefore uses the&amp;nbsp;&lt;strong&gt;AB_DockingSubBrowserTabItem&lt;/strong&gt;&amp;nbsp;class. &amp;nbsp;If you are not using Docking Tabs, then this class should be changed to&amp;nbsp;&lt;strong&gt;AB_SubBrowserTabItem&lt;/strong&gt;.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_OnDataLoaded()&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_OnDataLoaded();&#xD;
&#xD;
    &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; tabItem &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; ap_MainTabControl.ap_TabItems)&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (tabItem &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; AB_DockingSubBrowserTabItem subBrowserTabItem)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (subBrowserTabItem.ap_SubBrowserModule.ModuleNumber == 6)&#xD;
            {&#xD;
                subBrowserTabItem.Background = System.Windows.Media.Brushes.Yellow;&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: #008000;"&gt;// Current Loaded Data Entity&lt;/span&gt;&#xD;
    &lt;span style="color: #008000;"&gt;//CustomersEntity currentEntity = ap_CurrentEntity as CustomersEntity;&lt;/span&gt;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;If you are changing the sub module tab properties in both the Content Window and Detail, then I would suggest to create a method in the ViewModule that receives the SubBrowserTabItem from these code behind methods to set the properties in order to eliminate the duplication of business logic code.&lt;/p&gt;</description>
      <pubDate>2017-05-03T14:37:12.4570000</pubDate>
      <link>http://support.surroundtech.com/thread/changing-the-wpf-tab-background-color/</link>
    </item>
    <item>
      <title>Overriding Columns in XAML</title>
      <description>&lt;p&gt;You can override the display template&amp;nbsp;and edit template of any WPF column in the datagrid within the content window XAML.&lt;/p&gt;&#xD;
&lt;p&gt;The following list explains the various elements and properties that can be used in the XAML.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;AB_DataGridColumnOverrideContainer -&lt;/strong&gt;&amp;nbsp;this notes what column should be overridden and when.&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Properties:&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;ap_PropertyMetaData: Specifies the property this custom column should be used for.&lt;/li&gt;&#xD;
&lt;li&gt;ap_ColumnOverrideUse: When this override should be applied. The values can be Editable, ReadOnly, or Always.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;AB_DataGridTemplateColumn -&lt;/strong&gt;&amp;nbsp;The custom column. You&amp;nbsp;can specify anything that inherits from DataGridColumn instead in order to support showing a Hyperlink, image, or something else.&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Properties/Events:&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;SortMemberPath: Specifies the path of the property that should be used when the user clicks the header of this column. If none is provided, the user will not be able to sort with this column.&lt;/li&gt;&#xD;
&lt;li&gt;CopyingCellClipboardContent: Specifies a custom event handler that can be used to provide the content of what should be copied to the clipboard.&lt;/li&gt;&#xD;
&lt;li&gt;ae_PastingCellClipboardContent: Specifies a custom event handler that can be used to override the behavior when pasting to a particular cell in the datagrid. There is also a PastingCellClipboardContent event that gets signaled, however, the event args for this do not allow for the canceling of the default paste behavior.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;AB_DataGridTemplateColumn.CellTemplate -&lt;/strong&gt;&amp;nbsp;The content of this is a DataTemplate that will be applied when a cell is not currently being edited.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;AB_DataGridReadOnlyCellContent -&lt;/strong&gt;&amp;nbsp;This class supports showing errors and error messages that are generated as a result of validating an entity. It also supports binding to a property that determines the background color of a cell.&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Properties/Events:&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;ap_ContentBinding: The binding which is used to display the content of a cell when it&amp;rsquo;s not in edit mode.&lt;/li&gt;&#xD;
&lt;li&gt;ap_VisualizationType: Specifies how the cell should display data. The values can be Text, Checkbox, Date, or Time. A TextBlock is used to display all visualization types except for Checkbox.&lt;/li&gt;&#xD;
&lt;li&gt;ap_BackgroundColorBinding: Used to specify what property to bind to in order to set the background color when not in edit mode.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;AB_DataGridTemplateColumn.CellEditingTemplate -&lt;/strong&gt;&amp;nbsp;The content of this property is a DataTemplate that will be applied when a cell enters Edit mode.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2017-05-02T22:17:09.9800000</pubDate>
      <link>http://support.surroundtech.com/thread/overriding-columns-in-xaml/</link>
    </item>
    <item>
      <title>Modifying the RowHeaders in the Datagrid</title>
      <description>&lt;p&gt;By default, row headers will show an image that is specified by the A4DN_EntityImage property of an entity. By default this is set to the module image. The getter of this property can be modified in the entity to return different values based on business rules. For example, a different image can be used to represent that an&amp;nbsp;order&amp;nbsp;is finalized.&lt;/p&gt;&#xD;
&lt;p&gt;Here is example&amp;nbsp;code taken from a Purchase Order Entity:&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; A4DN_EntityImage&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; IsOrderFinalized == &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt; ? &lt;span style="color: #a31515;"&gt;"ok"&lt;/span&gt; : &lt;span style="color: #a31515;"&gt;"check-mark-gray"&lt;/span&gt;;&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;If the property IsOrderFInalized is true, the image will use the png name "ok" otherwise it will be "check-mark-gray". &amp;nbsp;You can supply any condition you need as long as you return an image name. &amp;nbsp;The image name can exist in the Acclerator images folder or your own WPF&amp;nbsp;shared images folder. &amp;nbsp;Also, if you defined the key "System.16PixelImageSuffix" in your app.config, then the Acclerator runtime will look for the image name you return with the 16 Pixel Image Suffix before it looks for just the returned image name. In the example above, it will look for check-mark-gray_16_16_32.png before it looks for check-mark-gray.png. &amp;nbsp;It will also hunt your WPF&amp;nbsp;shared images folder before looking in the Acclerator images folder.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/8dbd1c11-3533-4374-b863-a76701666395_2017-05-02-17-40-56.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2017-05-02T21:44:56.9200000</pubDate>
      <link>http://support.surroundtech.com/thread/modifying-the-rowheaders-in-the-datagrid/</link>
    </item>
    <item>
      <title>Switching between tab controls</title>
      <description>&lt;p&gt;The Accelerator supports 2 different types of tab item controls in WPF: &lt;strong&gt;AB_TabItem&lt;/strong&gt; and &lt;strong&gt;AB_DockingTabItem&lt;/strong&gt;.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;AB_TabItem is a wrapper around the standard WPF TabItem control that does not support dragging or undocking.&lt;/li&gt;&#xD;
&lt;li&gt;AB_DockingTabItem is a wrapper around a 3rd party control called Dragablz. Dragablz is an open source Chrome style draggable &amp;amp; tearable tab for WPF. &amp;nbsp;Dragablz also makes user friendly docking and tool windows achievable very quickly.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;The is what Dragablz (AB_DockingTabItem) looks like in the Accelerator:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/805c4b24-6755-4406-9555-a761014e8e24_2017-04-26-15-47-00.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;You can undock and flot tabs with Dragablz.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/8d4d9974-ad56-469e-9f37-a761014edf75_2017-04-26-16-09-15.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The is what the standard WPF Control (AB_TabItem) looks like in the Accelerator:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e1bc7f29-61ff-47e6-b797-a761014ed41b_2017-04-26-15-47-00.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The benefit of using the Dragablz's docking tab is that you can rearrange the tabs as well as undock them. Currently the arrangement of tabs is not remembered after you log out. &amp;nbsp;In a future version we are looking to give the user the ability to remember the tab position and whether it is docked or not. The Docking tab currently only supports the overflow with one line and left/right arrows. &amp;nbsp;If you want to have the multiline tabs and don't care about the docking feature, then you can convert your code back to use the standard WPF tab controls.&lt;/p&gt;&#xD;
&lt;p&gt;If you want to use the standard WPF tabs, you simply need to do an edit/replace for 2 controls throughout all your projects:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Do the following to go from Docking tabs to WPF tabs:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;replace AB_DockingTabControl with AB_TabControl&lt;/li&gt;&#xD;
&lt;li&gt;replace AB_DockingTabItem with AB_TabItem&lt;/li&gt;&#xD;
&lt;li&gt;Verify that your WPF app.confing has the following entry&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;lt;add key="Module.TabControl.ClassName" value="A4DN.Core.WPF.Base.AB_TabControl" /&amp;gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Optional - Remove references to the Dragablz.dll from your WPF projects&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Do the following to go from WPF tabs to Docking tabs:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;replace AB_TabControl with AB_DockingTabControl&lt;/li&gt;&#xD;
&lt;li&gt;replace AB_TabItem with AB_DockingTabItem&lt;/li&gt;&#xD;
&lt;li&gt;Verify that your WPF app.confing has the following entry&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;lt;add key="Module.TabControl.ClassName" value="A4DN.Core.WPF.Base.AB_DockingTabControl" /&amp;gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Add references to the Dragablz.dll in your WPF projects (C:\Program Files\Accelerator for .NET\vx_x\Core\DotNet\Dragablz.dll)&lt;/li&gt;&#xD;
&lt;/ul&gt;</description>
      <pubDate>2017-04-26T20:20:24.1230000</pubDate>
      <link>http://support.surroundtech.com/thread/switching-between-tab-controls/</link>
    </item>
    <item>
      <title>Multilingual Support</title>
      <description>&lt;p&gt;Accelerator has full support for multiple cultures&amp;nbsp;and well defined&amp;nbsp;best practices that are included in the runtime core components, helper classes, wrappers and development tools including the code generation engine.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;What we did for you in the Accelerator:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;There are 3 different areas that needed to be translated within the Accelerator Product itself. These areas include the:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Accelerator Core Description and Message Resourse Files (.resx)&lt;/li&gt;&#xD;
&lt;li&gt;Accelerator Maintenance Description and Message Resourse Files&amp;nbsp;(.resx)&lt;/li&gt;&#xD;
&lt;li&gt;Accelerator Database MetaData Names and Descriptions&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;The Accelerator has language packs for several languages&amp;nbsp;which were&amp;nbsp;translated using Google translate and meant for demonstration purposes only. The following languages are Spanish (Spain), French (France), Japanese (Japan), Portuguese (Brazil) and Chinese (Simplified). The Description and Message resources for all these languages is included with the Accelerator Install for both the Accelerator Core and the Accelerator&amp;nbsp;Maintenance. &amp;nbsp;The Language packs for the Accelerator Database Metadata needs to be downloaded and run&amp;nbsp;separately. &amp;nbsp;You can download the SQL &lt;a href="http://services.surroundtech.com/Downloads/products/A4DN/AcceleratorLanguagePack.zip" target="_blank"&gt;script here&lt;/a&gt;. All you need to do is unzip and change the "USE" statement at the top and run the script. This will insert data into the AC_MultilingualExt file in your Accelerator Database. Please contact us if you want to use a language in production or need to support additional&amp;nbsp;languages. We will be happy to assist.&lt;/p&gt;&#xD;
&lt;p&gt;Your generated system has 2 different areas that need to be translated. These areas include the:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;BOS System Shared Message and Description Resources (.resx)&lt;/li&gt;&#xD;
&lt;li&gt;Accelerator Database MetaData Names and Descriptions&amp;nbsp;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Here is what you need to do to support a new Language:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1)&lt;/strong&gt; Add a Message Resource and a Description Resource for each language to the BOS System Shared Project and within the Properties folder. You will notice that you already have a MessageResource.resx and a DescriptionResource.resx. That was created when you initially generated the system and contains your default culture&amp;nbsp;text. You can download the following &lt;a href="http://services.surroundtech.com/Downloads/products/A4DN/SampleResources.zip" target="_blank"&gt;sample resources&lt;/a&gt; and add them to the Properties folder. Just make sure to include them in your project. Or you can create the additional &lt;a href="https://msdn.microsoft.com/en-us/library/aa992030(v=vs.100).aspx" target="_blank"&gt;resourses (.resx)&lt;/a&gt;&amp;nbsp;in Visual Studio. When you add the new Message Resource and Description Resource, you need to add the Culture Name for the language you want to support using this format: MessageResource.&amp;lt;CultureName&amp;gt;.resx and DescriptionResource.&amp;lt;CultureName&amp;gt;.resx. Refer to this link for a &lt;a href="https://msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx" target="_blank"&gt;list of cultures&lt;/a&gt;. Here is an example with several resources added.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/65d75945-7900-4f22-9a3c-a71d0159b442_2017-02-17-15-58-10.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2)&amp;nbsp;&lt;/strong&gt;Translate the Message Resource and the Description Resource.&amp;nbsp;There are several different resx managers out there. I recommend &lt;a href="https://www.zeta-resource-editor.com/index.html" target="_blank"&gt;Zeta Resource Editor&lt;/a&gt;. All of them allow you to do side by side translation. I like Zeta Resource Editor because you can create Projects that contain a collection of resources and it has the ability to auto translate via Bing or Google Translate. You will need to open all your description resources as a group and translate them and then open all your message resources as a group and translate them. &amp;nbsp;When you open them as a group, you will see that the manager puts your default resource first (That is the .resx without the Culture&amp;nbsp;Name) and then the others follow it. Go ahead and translate and then save it when you are done. Remember you can use Bing or Google Translate.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/4945b3cb-1c7a-4d93-bbb6-a71d015df555_2017-02-17-16-13-54.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3)&lt;/strong&gt; Translate your System&amp;nbsp;MetaData Names and Descriptions that are in the Accelerator Database. You can do this by running the Framework Data Multilingual Translation Tool located within the Tools menu of the Accelerator LuanchPad.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/db1a411f-b0e3-4621-b786-a71d015f0357_2017-02-17-16-16-33.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;This will open the following window that allows you to 1) Select a table to translate,&amp;nbsp;2) Select a Language that you want to translate to, 3) Translate by clicking the "Auto Translate Missing" Button or by manually translating the Name and Description in the Grid and 4) Save the Translation. &amp;nbsp;You will need to do this for each Table that is in the drop down from step 1 and for each culture&amp;nbsp;you want to translate to in step 2.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/745dc71c-b372-4417-bc4e-a71d0160c51a_2017-02-17-16-20-06.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;</description>
      <pubDate>2017-02-17T21:05:58.9000000</pubDate>
      <link>http://support.surroundtech.com/thread/multilingual-support/</link>
    </item>
    <item>
      <title>Selecting Data using SQL Functions</title>
      <description>&lt;p&gt;SQL has many built-in functions for performing calculations on data.&lt;/p&gt;&#xD;
&lt;p&gt;Useful aggregate functions:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;AVG() - Returns the average value&lt;/li&gt;&#xD;
&lt;li&gt;COUNT() - Returns the number of rows&lt;/li&gt;&#xD;
&lt;li&gt;FIRST() - Returns the first value&lt;/li&gt;&#xD;
&lt;li&gt;LAST() - Returns the last value&lt;/li&gt;&#xD;
&lt;li&gt;MAX() - Returns the largest value&lt;/li&gt;&#xD;
&lt;li&gt;MIN() - Returns the smallest value&lt;/li&gt;&#xD;
&lt;li&gt;SUM() - Returns the sum&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;The Accelerator supports this by defining the function expression on the&amp;nbsp;AB_DataSourcePropertyReference class within the DataMaps&amp;nbsp;am_LoadFieldMaps method.&lt;/p&gt;&#xD;
&lt;p&gt;For Example, I have an Order Item file that has a Product ID (YD1I1PID) field and a Unit Price (YD1IPRUN) field. For demonstration purposes, I want to sum the Unit Price for each unique Product ID. &amp;nbsp;To do this I need to Group_by Product ID and use the SUM function on the Unit Price.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;We first need to add a property to the Order Item Entity that will hold the Total Price value which will contain the SUM&amp;nbsp;of the Unit Price.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;[Display(Name = "TOTALPRICE", ResourceType = typeof(DescriptionResource))]&#xD;
[AB_Length(8)]&#xD;
[DataMember]&#xD;
&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;decimal?&lt;/span&gt; TotalPrice &lt;span style="color: #008000;"&gt;//Map Field: YD1IPRUN&lt;/span&gt;&#xD;
  {&#xD;
      &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; am_GetPropertyValue(TotalPriceProperty); }&#xD;
      &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt; { am_SetPropertyValue(TotalPriceProperty, &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;); }&#xD;
  }&#xD;
&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; AB_PropertyMetadata&amp;lt;&lt;span style="color: #2b91af;"&gt;decimal?&lt;/span&gt;&amp;gt; TotalPriceProperty = am_CreatePropertyMetaData&amp;lt;&lt;span style="color: #2b91af;"&gt;decimal?&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515;"&gt;"TotalPrice"&lt;/span&gt;, DescriptionResource.TOTALPRICE, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Next, we need to add a data map which will contain the SQL function and map the result into the TotalPrice property. Add a map as you normally would, but receive the result into a variable. In this case I am receiving the Type&amp;nbsp;AB_DataSourcePropertyReference into the variable "sum". &amp;nbsp;Then you can set the property ap_FunctionExpression with &amp;nbsp;the SQL function you want to use. Notice that I also added a data category&amp;nbsp;"YD1I_TotalsByProduct". I only want to select this field and do the sum when using this data catagory.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; sum = maps.am_AddDataMap(&lt;span style="color: #a31515;"&gt;"TotalPrice"&lt;/span&gt;, OrderItemEntity.TotalPriceProperty, dataCategories: &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: #2b91af;"&gt;string&lt;/span&gt;&amp;gt; { &lt;span style="color: #a31515;"&gt;"YD1I_TotalsByProduct"&lt;/span&gt; });&#xD;
sum.ap_FunctionExpression = &lt;span style="color: #a31515;"&gt;"SUM(YD1IPRUN) as \"TotalPrice\""&lt;/span&gt;;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;The data category "YD1I_TotalsByProduct" was also added to the Product Internal ID which is the field I want to group by. You will notice that I also have the data category "*ALL" which means&amp;nbsp;this field will always be selected if no category is applied.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;maps.am_AddDataMap(&lt;span style="color: #a31515;"&gt;"YD1I1PID"&lt;/span&gt;, OrderItemEntity.ProductInternalIDProperty, dataCategories: &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: #2b91af;"&gt;string&lt;/span&gt;&amp;gt; { &lt;span style="color: #a31515;"&gt;"*ALL"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"YD1I_TotalsByProduct"&lt;/span&gt; });&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;The last step is to add the Group_By and Category. &amp;nbsp;The Group By will return a single record per Product ID and the Category allows me to select only certain fields (In this case Product Internal ID and Total Price). We can do this on the ap_Query object which is passed with the AB_SelectInputArgs. &amp;nbsp;I generally like to add the Group By and Category in the am_Select of the Business Process class and condition it based on an Accelerator view. You will also notice that I am setting the ap_RecordsPerRequest and the ap_MaxCount to a max value. When running this query we need to return all records as Next Previous is not supported with this&amp;nbsp;Group_BY.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; AB_SelectReturnArgs am_Select(AB_SelectInputArgs inputArgs)&#xD;
{&#xD;
 	&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (inputArgs.ap_View == &lt;span style="color: #a31515;"&gt;"YD1I_TotalsByProduct"&lt;/span&gt;)&#xD;
            {&#xD;
                inputArgs.ap_Query.am_AddGroupBy(OrderItemDataEntity.OrderItemEntity.ProductInternalIDProperty);&#xD;
                inputArgs.ap_Category = inputArgs.ap_View;&#xD;
                inputArgs.ap_RecordsPerRequest  = &lt;span style="color: #2b91af;"&gt;int&lt;/span&gt;.MaxValue;&#xD;
                inputArgs.ap_MaxCount = &lt;span style="color: #2b91af;"&gt;int&lt;/span&gt;.MaxValue;&#xD;
            }&#xD;
&#xD;
        &lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; retArgs = &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_Select(inputArgs);&#xD;
        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; retArgs;&#xD;
}&#xD;
&lt;/pre&gt;</description>
      <pubDate>2017-02-15T15:49:50.3300000</pubDate>
      <link>http://support.surroundtech.com/thread/selecting-data-using-sql-functions/</link>
    </item>
    <item>
      <title>How to Regenerate Service References</title>
      <description>&lt;p&gt;Sometimes you need to regenerate all your service References. &amp;nbsp;This can be done manullay in Visual Studio, or you can use our tool to regenerate all service references for the View Model and/or the Business Process.&lt;/p&gt;&#xD;
&lt;p&gt;To regenerate the service references, Click on the "Code Generator" located under the tools area in the Accelerator Launch Pad.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/a939f96e-686c-4393-a392-a701013e5b13_2017-01-20-14-11-06.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Then, 1) Click on the ellipse and navigate to your System Generation Configuration File.&lt;/p&gt;&#xD;
&lt;p&gt;Then, 2) Click the "Regenerate service reference" button.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/545638cd-df0b-487f-9c2a-a701013eec8d_2017-01-20-14-11-49.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;It will step through each module and regenerate the service references.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/1e69fa93-3f17-458d-ad22-a701013f59b4_2017-01-20-14-22-02.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2017-01-20T19:22:50.2630000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-regenerate-service-references/</link>
    </item>
    <item>
      <title>&amp;quot;Files corrupt in deployment&amp;quot; message while installing or updating a ClickOnce application</title>
      <description>&lt;p&gt;This is a generic error that occurs whenever the ClickOnce installer isn't able to download all of the files; it just assumes that one of the files is corrupted.&lt;/p&gt;&#xD;
&lt;p&gt;To investigate the issue, install and run Fiddler so you can monitor the files that are being downloaded, and watch for the failure. Most of the HTTP requests will return an application/octet response type (a binary file) but the last one will not.&lt;/p&gt;&#xD;
&lt;p&gt;A likely issue is that antivirus software, either on the webserver filtering outgoing traffic, on your PC filtering incomming traffic, or in the middle filtering traffic passing through, is getting a false-positive match against one of the dlls. In Fiddler, you'll see that an html page was returned instead of the file. You can see the html in Fiddler, and you can also copy the url to your browser to try to download the file yourself and see the error message. This is also handy for reproducing the error without having to go through the entire install process, and for verifying that it's been fixed.&lt;/p&gt;</description>
      <pubDate>2017-01-05T22:09:47.1000000</pubDate>
      <link>http://support.surroundtech.com/thread/files-corrupt-in-deployment-message-while-installing-or-updating-a-clickonce-application/</link>
    </item>
    <item>
      <title>Use AB_SocialMetaModel in CMS website to generate all social media meta/link/script markup</title>
      <description>&lt;p&gt;This is a helper class that wraps around the code used for:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="/thread/add-ios-home-page-icons-and-startup-images-to-mvc-app-for-safari-and-mobile-safari/"&gt;Add iOS home page icons and startup images to MVC app for Safari and Mobile Safari&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="/thread/using-ab_pagemetainfomodel-to-generate-markup-for-meta-elements/"&gt;Using AB_PageMetaInfoModel to generate markup for meta elements&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="/thread/using-ab_pagelinkinfomodel-to-generate-markup-for-link-elements/"&gt;Using AB_PageLinkInfoModel to generate markup for link elements&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="/thread/using-ab_pagescriptinfomodel-and-a4dn-core-mvc-cms-models-googlejsonld-to-render-json-ld-markup/"&gt;Using AB_PageScriptInfoModel and A4DN.Core.MVC.CMS.Models.GoogleJsonLD to render JSON-LD markup&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Typical usage is to create a shared partial template, often named _META_Elements.cshtml, which gets included in layout templates using RenderPartial(). The contents of the template instantiates an AB_SocialMetaModel object and then renders is using Html.DisplayFor(), which makes use of ~/Views/Shared/DisplayTemplates/AB_SocialMetaModel.cshtml and a few other&amp;nbsp; templates to render out the meta, link, and script tags the model describes.&lt;/p&gt;&#xD;
&lt;p&gt;Several rarely-modified values are defined in overloadable properties, so they can be changed by defining a subclass of AB_SocialMetaModel and using that in _META_Elements.cshtml instead. A subclass's constructor can also be used to add additional tags, or remove some that aren't wanted, though this can also be done in _META_Elements.cshtml.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;For meta tags, add new AB_PageMetaEntity objects to ap_PageMetaInfoModel&lt;/li&gt;&#xD;
&lt;li&gt;For link tags, add new AB_PageLinkEntity objects to ap_PageLinkInfoModel&lt;/li&gt;&#xD;
&lt;li&gt;For json-ld script tags, add new AB_PageScriptEntity objects to ap_PageScriptInfoModel&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Several of the tags draw their values from the HttpContext.Items[] collection; these are typically set in page-specific controllers or views to provide page-specific tags.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;"Meta.Title"&lt;/li&gt;&#xD;
&lt;li&gt;"Meta.Description"&lt;/li&gt;&#xD;
&lt;li&gt;"Meta.Keywords"&lt;/li&gt;&#xD;
&lt;li&gt;"Meta.ModuleImageURL"&lt;/li&gt;&#xD;
&lt;li&gt;"Meta.OGType"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Facebook Open Graph Type&lt;/li&gt;&#xD;
&lt;li&gt;"Meta.ScriptModels"&amp;nbsp;&amp;nbsp; - A List of AB_PageScriptInfoModel object for page-specific Google json-ld&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;For CMS pages and AB_Listing detail entities, these values are set through the Maintenance application's detail displays.&lt;/p&gt;</description>
      <pubDate>2016-12-15T14:23:01.5300000</pubDate>
      <link>http://support.surroundtech.com/thread/use-ab_socialmetamodel-in-cms-website-to-generate-all-social-media-meta-link-script-markup/</link>
    </item>
    <item>
      <title>Excel Export- Adding additional columns to excel export from entity</title>
      <description>&lt;p&gt;It is possible to add additional columns to the excel export if they are currently not defined as columns in the datagrid. &amp;nbsp;To do this, you need to override the method am_OnDataPresenterCreated in the content window code behind:&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_OnDataPresenterCreated()&#xD;
{&#xD;
     &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_OnDataPresenterCreated();&#xD;
&#xD;
     &lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; typedDataPresenter = ap_DataPresenter &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AB_DataPresenterBase;&#xD;
     typedDataPresenter.ap_ExcelColumnSelector =&#xD;
     (datagrid) =&amp;gt;&#xD;
         {&#xD;
            &lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; columns = typedDataPresenter.am_BuildColumnDictionary(datagrid);&#xD;
           &lt;strong&gt; columns.Add(CustomerEntity.EmailProperty.ap_PropertyName, CustomerEntity.EmailProperty.ap_Description);&lt;/strong&gt;&#xD;
            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; columns;&#xD;
         };&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Use the &lt;strong&gt;columns.Add&lt;/strong&gt; method to add each column. The key should be the entity property name and the value should be the&amp;nbsp;entity property&amp;nbsp;description.&lt;/p&gt;</description>
      <pubDate>2016-12-13T16:26:26.6270000</pubDate>
      <link>http://support.surroundtech.com/thread/excel-export-adding-additional-columns-to-excel-export-from-entity/</link>
    </item>
    <item>
      <title>Memory Management Best Practices in WPF</title>
      <description>&lt;p&gt;When a Detail window (or any XAML control) is closed, or otherwise goes out of scope, it must be cleaned up before the memory taken up by it can be released. In most cases this happens automatically, but it is possible to get yourself into a situation where stale references to your object prevent it from being cleaned up. In this situation the object remains in memory for much longer than intended and, if the problem is severe enough, has the potential to make the program unstable/unusable over time.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Memory Leaks like the one described above should be a constant concern for developers. Systems with poor memory managment will appear to degrade with use, which leaves a bad taste in the mouths of Users who often rely on these systems to do their jobs. Because the goal should be to have a system that is predictable and stable, Memory Leaks should be identified and fixed as soon in the development process as possible.&lt;/p&gt;&#xD;
&lt;p&gt;Below are several best practices for managing memory when coding with C#, including some WPF and XAML-specific tips.&lt;/p&gt;</description>
      <pubDate>2016-11-30T23:10:38.2270000</pubDate>
      <link>http://support.surroundtech.com/thread/memory-management-best-practices-in-wpf/</link>
    </item>
    <item>
      <title>Ports for IBM i Access</title>
      <description>&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;The necessary&amp;nbsp;ports to run the IBM i .NET Data Provider are:&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt 0.5in; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000; text-indent: -0.25in;"&gt;&lt;span style="color: #1f497d;"&gt;1)&lt;span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #1f497d;"&gt;449 &amp;ndash; Port Mapper. This is non-SSL, but no data is transferred on it. It is just a request to see what port to use. Client Access can be configured to not need this.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt 0.5in; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000; text-indent: -0.25in;"&gt;&lt;span style="color: #1f497d;"&gt;2)&lt;span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #1f497d;"&gt;8476 (9476 for SSL) &amp;ndash; Signon Verification&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt 0.5in; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000; text-indent: -0.25in;"&gt;&lt;span style="color: #1f497d;"&gt;3)&lt;span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #1f497d;"&gt;8471 (9471 for SSL) &amp;ndash; Database Access&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;&lt;span style="color: #1f497d;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;For info on all of the Client Access Ports look at&amp;nbsp;&lt;a href="http://www-01.ibm.com/support/docview.wss?uid=nas8N1019667" style="color: #954f72;"&gt;http://www-01.ibm.com/support/docview.wss?uid=nas8N1019667&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;The best article I found to explain these is&amp;nbsp;&lt;a href="http://www.mcpressonline.com/security/ibm-i-os400-i5os/iseries-access-through-a-firewall.html" style="color: #954f72;"&gt;http://www.mcpressonline.com/security/ibm-i-os400-i5os/iseries-access-through-a-firewall.html&lt;/a&gt;. &amp;nbsp;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;This Article explains how the Ports&amp;nbsp;&lt;u&gt;can&lt;/u&gt;&amp;nbsp;be changed if you still felt it important to do that.&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal" style="margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Calibri, sans-serif; color: #000000;"&gt;From this Article I set up Client Access to use the &amp;ldquo;Standard&amp;rdquo; ports so that you do not need to also open up port 449 for the Port Mapper. This is non-SSL, but no data is transferred on it. It is just a request to see what port to use.&lt;/p&gt;</description>
      <pubDate>2016-11-11T20:34:52.6700000</pubDate>
      <link>http://support.surroundtech.com/thread/ports-for-ibm-i-access/</link>
    </item>
    <item>
      <title>Add iOS home page icons and startup images to MVC app for Safari and Mobile Safari</title>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; See "Use AB_SocialMetaModel in CMS website to generate all social media meta/link/script markup" for simplifying wrapper class.&lt;/p&gt;&#xD;
&lt;p&gt;iOS devices can make use of custom icons when a web page is saved as a home page bookmark, and they can also display a custom splash image when loading the initial web page when the home page icon is clicked. If no custom icons/images are specified, iOS will use a screenshot of the website. Android devices, Chromebooks, and the Windows 8+ home page, all have similar behavior.&lt;/p&gt;&#xD;
&lt;p&gt;See &lt;a href="https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html" target="_blank"&gt;Configuring Web Applications&lt;/a&gt; for all of the details. Also see &lt;a href="http://realfavicongenerator.net/" target="_blank"&gt;Real Favicon Generator&lt;/a&gt; for an online service that can produce most of the images and associated markup for &lt;em&gt;all&lt;/em&gt; platforms. (It doesn't produce startup splash images for iOS.) If the markup generated by Real Favicon Generator is used, remember to start the urls with ~/ instead of / in _Layout.cshtml so that they will work even if your web application is not deployed at your website root.&lt;/p&gt;&#xD;
&lt;p&gt;Seven images are needed, with specific dimensions:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;touch-icon-iphone.png: 60x60&lt;/li&gt;&#xD;
&lt;li&gt;touch-icon-ipad.png: 76x76&lt;/li&gt;&#xD;
&lt;li&gt;touch-icon-iphone-retina.png: 120x120&lt;/li&gt;&#xD;
&lt;li&gt;touch-icon-ipad-retina.png: 152x152&lt;/li&gt;&#xD;
&lt;li&gt;apple-touch-startup-image.png: 320x480&lt;/li&gt;&#xD;
&lt;li&gt;apple-touch-startup-ipad-landscape.png: 1024x784&lt;/li&gt;&#xD;
&lt;li&gt;apple-touch-startup-ipad-portrait.png: 784x1024&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;These images should be placed in the root of the MVC project, so that they get deployed to the root of the web application. Next add the following tags to _Layout.cshtml inside the &amp;lt;head&amp;gt; element:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;    &amp;lt;link rel=&lt;span style="color: #a31515;"&gt;"apple-touch-icon"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"~/touch-icon-iphone.png"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;link rel=&lt;span style="color: #a31515;"&gt;"apple-touch-icon"&lt;/span&gt; sizes=&lt;span style="color: #a31515;"&gt;"76x76"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"~/touch-icon-ipad.png"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;link rel=&lt;span style="color: #a31515;"&gt;"apple-touch-icon"&lt;/span&gt; sizes=&lt;span style="color: #a31515;"&gt;"120x120"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"~/touch-icon-iphone-retina.png"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;link rel=&lt;span style="color: #a31515;"&gt;"apple-touch-icon"&lt;/span&gt; sizes=&lt;span style="color: #a31515;"&gt;"152x152"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"~/touch-icon-ipad-retina.png"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;meta name=&lt;span style="color: #a31515;"&gt;"apple-mobile-web-app-capable"&lt;/span&gt; content=&lt;span style="color: #a31515;"&gt;"yes"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;meta name=&lt;span style="color: #a31515;"&gt;"apple-mobile-web-app-status-bar-style"&lt;/span&gt; content=&lt;span style="color: #a31515;"&gt;"black"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;link rel=&lt;span style="color: #a31515;"&gt;"apple-touch-startup-image"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"~/apple-touch-startup-ipad-landscape.png"&lt;/span&gt; media=&lt;span style="color: #a31515;"&gt;"screen and (min-device-width: 481px) and (max-device-width: 1024px) and (orientation:landscape)"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;link rel=&lt;span style="color: #a31515;"&gt;"apple-touch-startup-image"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"~/apple-touch-startup-ipad-portrait.png"&lt;/span&gt; media=&lt;span style="color: #a31515;"&gt;"screen and (min-device-width: 481px) and (max-device-width: 1024px) and (orientation:portrait)"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;link rel=&lt;span style="color: #a31515;"&gt;"apple-touch-startup-image"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"~/apple-touch-startup-image.png"&lt;/span&gt; media=&lt;span style="color: #a31515;"&gt;"screen and (max-device-width: 320px)"&lt;/span&gt;&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-10-19T16:59:41.8970000</pubDate>
      <link>http://support.surroundtech.com/thread/add-ios-home-page-icons-and-startup-images-to-mvc-app-for-safari-and-mobile-safari/</link>
    </item>
    <item>
      <title>Setting the Visual Studio Tools Version</title>
      <description>&lt;p&gt;If you upgrade Visual Studio, you will need to make sure the Accelerator is aware of the current tools version to use. The Tools version is used by the Accelerator in the following ways:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1) During Generation, the Accelerator puts the tools version in any project file that is generated by the Acelerator.&lt;/p&gt;&#xD;
&lt;p&gt;2) The Build Script uses the tools version to determine the correct MS build programs to use.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The Tools version used by the Accelerator is in you&amp;nbsp;standard configuration file. &amp;nbsp;You can access this by runing the Accelerator Luanch Pad and navigating to the Configuration Tab. &amp;nbsp;Click the "Edit" button to open the configuration editor. Change the Visual Studio Tools version to the version you have installed. If you have multiple configuration files, you will &amp;nbsp;need to make this change in each one.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/34c3d004-7e52-4419-bf80-a69d00e1acbd_2016-10-12-09-33-39.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;After changeing this setting, you will need to regenerate&amp;nbsp;your build scripts. Go to this post to learn how to regenerate the build scripts:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/build-scripts/?order=all#comment-5b2d7044-cf56-4fdf-a821-a5bd0160151a" style="color: #954f72; font-family: Calibri, sans-serif;"&gt;http://support.surroundtech.com/thread/build-scripts/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-10-12T13:45:57.4470000</pubDate>
      <link>http://support.surroundtech.com/thread/setting-the-visual-studio-tools-version/</link>
    </item>
    <item>
      <title>Set initial focused control in a detailer</title>
      <description>&lt;p&gt;The detailer has a property ap_ControlToSetFocusToInitially which will set the focus to that control on loading of the detailer when the detailer is not in display mode.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The recommended place to set this property is in the am_SetParentProperties override method.&lt;/p&gt;</description>
      <pubDate>2016-09-07T20:12:05.6170000</pubDate>
      <link>http://support.surroundtech.com/thread/set-initial-focused-control-in-a-detailer/</link>
    </item>
    <item>
      <title>Using AB_PageScriptInfoModel and A4DN.Core.MVC.CMS.Models.GoogleJsonLD to render JSON-LD markup</title>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; See "Use AB_SocialMetaModel in CMS website to generate all social media meta/link/script markup" for simplifying wrapper class.&lt;/p&gt;&#xD;
&lt;p&gt;CMS Websites may want to take advantage of Google's &lt;a href="https://developers.google.com/search/docs/guides/enhance-site" target="_blank"&gt;support for JSON-LD semantic markup&lt;/a&gt;. To do so, it is necessary to output JSON data structure markup into script tags in the head element of your page. Accelerator 6.4.1 provides a number of helper classes to make this easier.&lt;/p&gt;&#xD;
&lt;p&gt;See also: &lt;a href="/thread/using-ab_pagemetainfomodel-to-generate-markup-for-meta-elements/"&gt;AB_PageMetaInfoModel for meta tag markup&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;See also: &lt;a href="/thread/using-ab_pagelinkinfomodel-to-generate-markup-for-link-elements/"&gt;AB_PageLinkInfoModel for link elements&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The AB_PageScriptInfoModel object represents a list of AB_PageScriptEntity objects, each of which will be rendered as a script tag. You can use these for any type of script tag; all standard attributes are supported. For example, to render a link to a javascript file, all you need to provide is a Src property containing the url to load, optionally with Async or Defer properties set. Inline javascript can be included by using Content instead of Src; the value of the Content property is rendered as-is (without HTML escaping) as the content of the script tag.&lt;/p&gt;&#xD;
&lt;p&gt;For Json-LD, you must specify Type = "application/ld+json" and provide the Content by instantiating an object from the GoogleJsonLD namespace, populating its properties, and then calling ToString() on it to serialize it to Json markup.&lt;/p&gt;&#xD;
&lt;p&gt;Json-LD is a complex family of schemas, of which Google supports a subset, and Accelerator supports a subset of Google's subset which is focused on the common types of websites created with the Accelerator CMS system. The supported semantic types are:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;AB_SiteName: https://developers.google.com/search/docs/data-types/sitename&lt;/li&gt;&#xD;
&lt;li&gt;AB_SiteLogo: https://developers.google.com/search/docs/data-types/logo&lt;/li&gt;&#xD;
&lt;li&gt;AB_SocialProfileLinks: https://developers.google.com/search/docs/data-types/social-profile-links&lt;/li&gt;&#xD;
&lt;li&gt;AB_CorporateContacts: https://developers.google.com/search/docs/data-types/corporate-contacts&lt;/li&gt;&#xD;
&lt;li&gt;AB_BreadcrumbList: https://developers.google.com/search/docs/data-types/breadcrumbs&lt;/li&gt;&#xD;
&lt;li&gt;AB_ItemList: https://developers.google.com/search/docs/guides/mark-up-listings (Note: Google's documentation is incomplete, has some errors, and it is unclear what the correct markup / usage of lists are. This type is experimental.)&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;@using A4DN.Core.MVC.CMS.Models&#xD;
@using A4DN.Core.MVC.CMS.Models.GoogleJsonLD&#xD;
&lt;span style="border: 1px solid #FF0000;"&gt;@&lt;/span&gt;{&#xD;
    &lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; scriptModel = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageScriptInfoModel();&#xD;
&#xD;
    scriptModel.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageScriptEntity&#xD;
    {&#xD;
        Type = &lt;span style="color: #a31515;"&gt;"application/ld+json"&lt;/span&gt;,&#xD;
        Content = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_SiteName&#xD;
        {&#xD;
            Name = &lt;span style="color: #a31515;"&gt;"Surround Technologies"&lt;/span&gt;,&#xD;
            Url = &lt;span style="color: #a31515;"&gt;"http://www.surroundtech.com"&lt;/span&gt;&#xD;
        }.ToString()&#xD;
    });&#xD;
&#xD;
    scriptModel.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageScriptEntity&#xD;
    {&#xD;
        Type = &lt;span style="color: #a31515;"&gt;"application/ld+json"&lt;/span&gt;,&#xD;
        Content = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_SiteLogo&#xD;
        {&#xD;
            Url = &lt;span style="color: #a31515;"&gt;"http://www.surroundtech.com"&lt;/span&gt;,&#xD;
            Logo = Request.Url.GetLeftPart(UriPartial.Authority) + Url.am_MediaFile(&lt;span style="color: #a31515;"&gt;"surroundlogo-withtag.png"&lt;/span&gt;)&#xD;
        }.ToString()&#xD;
    });&#xD;
&#xD;
    scriptModel.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageScriptEntity&#xD;
    {&#xD;
        Type = &lt;span style="color: #a31515;"&gt;"application/ld+json"&lt;/span&gt;,&#xD;
        Content = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_SocialProfileLinks&#xD;
        {&#xD;
            Name = &lt;span style="color: #a31515;"&gt;"Surround Technologies"&lt;/span&gt;,&#xD;
            Url = &lt;span style="color: #a31515;"&gt;"http://www.surroundtech.com"&lt;/span&gt;,&#xD;
            SameAs = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="color: #2b91af;"&gt;string&lt;/span&gt;&amp;gt;&#xD;
            {&#xD;
                &lt;span style="color: #a31515;"&gt;"http://twitter.com/#!/surroundtech"&lt;/span&gt;,&#xD;
                &lt;span style="color: #a31515;"&gt;"http://www.facebook.com/SurroundTech"&lt;/span&gt;,&#xD;
                &lt;span style="color: #a31515;"&gt;"http://www.linkedin.com/company/surround-technologies"&lt;/span&gt;,&#xD;
                &lt;span style="color: #a31515;"&gt;"http://www.youtube.com/surroundtechnologies"&lt;/span&gt;&#xD;
            }&#xD;
        }.ToString()&#xD;
    });&#xD;
&#xD;
    scriptModel.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageScriptEntity&#xD;
    {&#xD;
        Type = &lt;span style="color: #a31515;"&gt;"application/ld+json"&lt;/span&gt;,&#xD;
        Content = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_CorporateContacts&#xD;
        {&#xD;
            Url = &lt;span style="color: #a31515;"&gt;"http://www.surroundtech.com"&lt;/span&gt;,&#xD;
            Logo = Request.Url.GetLeftPart(UriPartial.Authority) + Url.am_MediaFile(&lt;span style="color: #a31515;"&gt;"surroundlogo-withtag.png"&lt;/span&gt;),&#xD;
            Contacts = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;AB_ContactPoint&amp;gt;&#xD;
            {&#xD;
                &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_ContactPoint&#xD;
                {&#xD;
                    ContactType = &lt;span style="color: #a31515;"&gt;"sales"&lt;/span&gt;,&#xD;
                    Telephone = &lt;span style="color: #a31515;"&gt;"+1-239-405-8427"&lt;/span&gt;&#xD;
                }&#xD;
            }&#xD;
        }.ToString()&#xD;
    });&#xD;
&#xD;
}&#xD;
@Html.DisplayFor(m =&amp;gt; scriptModel)&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-08-22T21:14:19.0070000</pubDate>
      <link>http://support.surroundtech.com/thread/using-ab_pagescriptinfomodel-and-a4dn-core-mvc-cms-models-googlejsonld-to-render-json-ld-markup/</link>
    </item>
    <item>
      <title>Using AB_PageLinkInfoModel to generate markup for link elements</title>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; See "Use AB_SocialMetaModel in CMS website to generate all social media meta/link/script markup" for simplifying wrapper class.&lt;/p&gt;&#xD;
&lt;p&gt;Most MVC websites need to output some link tags on each page, usually in ~/Views/Shared/_Layout.cshtml or a partial template. Accelerator 6.4.1 introduces some helper classes to create strongly-typed model objects that represent these tags, and to render them consistently.&lt;/p&gt;&#xD;
&lt;p&gt;See also: &lt;a href="/thread/using-ab_pagemetainfomodel-to-generate-markup-for-meta-elements/"&gt;AB_PageMetaInfoModel for meta tag markup&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;See also: &lt;a href="/topic/editposttopic/eeeeeb15-ba38-4766-bda3-a66a0157ec27/AB_PageScriptInfoModel for script tag markup and Json-LD"&gt;AB_PageScriptInfoModel for script tag markup and Json-LD&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;AB_PageLinkEntity supports all of the standard HTML5 attributes for link elements. Only Href is required; if it is empty the link element will not be rendered.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;@using A4DN.Core.MVC.CMS.Models&#xD;
&lt;span style="border: 1px solid #FF0000;"&gt;@&lt;/span&gt;{&#xD;
    &lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; linkModel = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageLinkInfoModel();&#xD;
&#xD;
    linkModel.AddRange(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;AB_PageLinkEntity&amp;gt;&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageLinkEntity { Rel = &lt;span style="color: #a31515;"&gt;"canonical"&lt;/span&gt;, Href = Request.Url.AbsoluteUri },&#xD;
        &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageLinkEntity { Rel = &lt;span style="color: #a31515;"&gt;"icon"&lt;/span&gt;, Sizes = &lt;span style="color: #a31515;"&gt;"32x32"&lt;/span&gt;, Type = &lt;span style="color: #a31515;"&gt;"image/png"&lt;/span&gt;, Href = Url.Content(&lt;span style="color: #a31515;"&gt;"~/favicon.png"&lt;/span&gt;) },&#xD;
        &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageLinkEntity { Rel = &lt;span style="color: #a31515;"&gt;"shortcut icon"&lt;/span&gt;, Type = &lt;span style="color: #a31515;"&gt;"image/x-icon"&lt;/span&gt;, Href = Url.Content(&lt;span style="color: #a31515;"&gt;"~/favicon.ico"&lt;/span&gt;) },&#xD;
        &lt;span style="color: #008000;"&gt;// new AB_PageLinkEntity { Rel = "apple-touch-startup-image", Href = Url.am_MediaFile("apple-touch-startup.png") },&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageLinkEntity { Rel = &lt;span style="color: #a31515;"&gt;"apple-touch-icon"&lt;/span&gt;, Href = Url.Content(&lt;span style="color: #a31515;"&gt;"~/apple-touch-icon-iphone.png"&lt;/span&gt;) },&#xD;
        &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageLinkEntity { Rel = &lt;span style="color: #a31515;"&gt;"apple-touch-icon"&lt;/span&gt;, Sizes = &lt;span style="color: #a31515;"&gt;"76x76"&lt;/span&gt;, Href = Url.Content(&lt;span style="color: #a31515;"&gt;"~/apple-touch-icon-ipad.png"&lt;/span&gt;) },&#xD;
        &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageLinkEntity { Rel = &lt;span style="color: #a31515;"&gt;"apple-touch-icon"&lt;/span&gt;, Sizes = &lt;span style="color: #a31515;"&gt;"120x120"&lt;/span&gt;, Href = Url.Content(&lt;span style="color: #a31515;"&gt;"~/apple-touch-icon-iphone-retina.png"&lt;/span&gt;) },&#xD;
        &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_PageLinkEntity { Rel = &lt;span style="color: #a31515;"&gt;"apple-touch-icon"&lt;/span&gt;, Sizes = &lt;span style="color: #a31515;"&gt;"152x152"&lt;/span&gt;, Href = Url.Content(&lt;span style="color: #a31515;"&gt;"~/apple-touch-icon-ipad-retina.png"&lt;/span&gt;) },&#xD;
    });&#xD;
}&#xD;
@Html.DisplayFor(m =&amp;gt; linkModel)&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;To render the model, ~/Views/Shared/DisplayTemplates/AB_PageLinkInfoModel.cshtml is required:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;@model A4DN.Core.MVC.CMS.Models.AB_PageLinkInfoModel&#xD;
@foreach (&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; entity &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Model.Where(m =&amp;gt; !String.IsNullOrWhiteSpace(m.Href)))&#xD;
{&#xD;
&amp;lt;link rel=&lt;span style="color: #a31515;"&gt;"@entity.Rel"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"@entity.Href"&lt;/span&gt; crossorigin=&lt;span style="color: #a31515;"&gt;"@entity.CrossOrigin"&lt;/span&gt; hreflang=&lt;span style="color: #a31515;"&gt;"@entity.HrefLang"&lt;/span&gt; media=&lt;span style="color: #a31515;"&gt;"@entity.Media"&lt;/span&gt; sizes=&lt;span style="color: #a31515;"&gt;"@entity.Sizes"&lt;/span&gt; title=&lt;span style="color: #a31515;"&gt;"@entity.Title"&lt;/span&gt; type=&lt;span style="color: #a31515;"&gt;"@entity.Type"&lt;/span&gt;&amp;gt;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-08-22T20:52:11.0070000</pubDate>
      <link>http://support.surroundtech.com/thread/using-ab_pagelinkinfomodel-to-generate-markup-for-link-elements/</link>
    </item>
    <item>
      <title>Using AB_PageMetaInfoModel to generate markup for meta elements</title>
      <description>&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; See "Use AB_SocialMetaModel in CMS website to generate all social media meta/link/script markup" for simplifying wrapper class.&lt;/p&gt;&#xD;
&lt;p&gt;Most MVC websites need to output some meta tags on each page, usually in ~/Views/Shared/_Layout.cshtml or a partial template. Accelerator 6.4.1 introduces some helper classes to create strongly-typed model objects that represent these tags, and to render them consistently.&lt;/p&gt;&#xD;
&lt;p&gt;See also: &lt;a href="/thread/using-ab_pagelinkinfomodel-to-generate-markup-for-link-elements/"&gt;AB_PageLinkInfoModel for link elements&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;See also: &lt;a href="/topic/editposttopic/eeeeeb15-ba38-4766-bda3-a66a0157ec27/AB_PageScriptInfoModel for script tag markup and Json-LD"&gt;AB_PageScriptInfoModel for script tag markup and Json-LD&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In the following example, the HttpContext.Current.Items collection is used to pass data up from the page-specific view template to ~/Views/Shared/_META_Elements.cshtml, which _Layout.cshtml renders. This information is used to populate an AB_PageMetaInfoModel object, which is a list of AB_PageMetaEntity objects.&lt;/p&gt;&#xD;
&lt;p&gt;When rendered, only the AB_PageMetaEntity objects that have non-null, non-whitespace Content values will be output. There's no need to condition adding objects to the collection based on whether or not they have a content value.&lt;/p&gt;&#xD;
&lt;p&gt;Each AB_PageMetaEntity must specifiy either Name or Property. Property is only used for Facebook OpenGraph metadata, and for the HTML5 markup to be valid the head element requires a prefix attribute: prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#"&lt;/p&gt;</description>
      <pubDate>2016-08-22T20:43:44.5070000</pubDate>
      <link>http://support.surroundtech.com/thread/using-ab_pagemetainfomodel-to-generate-markup-for-meta-elements/</link>
    </item>
    <item>
      <title>Server-side HTML parsing and jQuery-like searching</title>
      <description>&lt;p&gt;It is occasionally useful for server-side code, either inside View templates, Ajax request handlers, or Model classes, to search html markup, extract information from it, or even modify it. On the client this can be done using jQuery, and now on the server it's possible to perform these operations using &lt;a href="https://anglesharp.github.io/" target="_blank"&gt;AngleSharp &lt;/a&gt;and some utility methods in A4DN.Core.MVC.CMS.Infrastructure.Helpers.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #008000;"&gt;// In controller or model:&lt;/span&gt;&#xD;
&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; document = HtmlHelpers.am_GetParsedDocument(content);&#xD;
&#xD;
&lt;span style="color: #008000;"&gt;// In view:&lt;/span&gt;&#xD;
&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; document = Html.am_GetParsedDocument(content);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;These methods return an AngleSharp IHtmlDocument, which has many methods for querying and/or modifying the content. By default the parsed document will be cached for 10 seconds so that repeated calls using the same content string will not re-parse the content. An optional second argument can be passed to alter the cache idle timeout. The first method uses HttpContext.Current.Cache as the cache, while the second uses Html.ViewContext.HttpContext.Cache. In most scenarios these are equivalent.&lt;/p&gt;&#xD;
&lt;p&gt;The rest of the methods will be shown using the Html.am_* syntax that's used inside views, but they can all be called using the HtmlHelpers.am_* syntax from controllers and models as well.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; elements = Html.am_GetElements(content, selector);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;This is similar to jQuery's $("...") function, and takes the same kind of selector (except for jQuery's additions to the standard CSS-like selector syntax.) The return value is an IHtmlCollection&amp;lt;IElement&amp;gt;, which supports foreach and LINQ methods.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt; = Html.am_GetDataAttributeValue(content, elementSelector, dataAttributeName);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;This method finds the first element in the content that matches elementSelector, and returns the value of that element's data-{dataAttributeName} attribute. Looking up data attributes is a common use case for server-side parsing.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; content = Html.am_RenderDocument(document);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;If you use AngleSharp to make modifications to the DOM inside of document, am_RenderDocument() can be used to get an updated content string.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-08-18T17:34:21.8370000</pubDate>
      <link>http://support.surroundtech.com/thread/server-side-html-parsing-and-jquery-like-searching/</link>
    </item>
    <item>
      <title>Using data-replacewith attributes to relocate DOM elements after page load</title>
      <description>&lt;p&gt;Using jQuery, it is possible to move elements around in the DOM after the page has been loaded. But that requires writing Javascript code, and sometimes it can be useful to declare what to move and where to move it, rather than writing procedural code to execute the move. For example, static content in a CMS webpage module can include a declarative placeholder element which indicates where to insert dynamically-generated content.&lt;/p&gt;&#xD;
&lt;p&gt;The a4dn.replacewith.js plugin can be found in Accelerator MVC's DistributableContent project. In generated MVC projects, you'll find the plugin in the Scripts/ folder of your project. When this plugin is loaded, it extends jQuery with a function named $.a4dn_process_replacewith().&lt;/p&gt;&#xD;
&lt;p&gt;This function is used to process elements that have data-replacewith attributes. It takes the value of the attribute as a jQuery selector or an element id, finds the matching element within the page, and moves it to the location of the element that has the data-replacewith attribute.&lt;br&gt;&lt;br&gt;This is typically used for CMS static web content pages that have dynamically-inserted content, to indicate where the dynamic content should be located within the static content.&lt;br&gt;&lt;br&gt;The flag data-replacewith-mode="inner" can be used when you only want to move the children of the specified element, instead of the entire element. This is for situations where the markup structure won't allow an extra wrapper element to be inserted.&lt;br&gt;&lt;br&gt;Either way, after the function is run the div with data-replacewith will be gone from the DOM, and if inner mode is used the container element will also be gone from the DOM.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Usage - Markup:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;div data-replacewith=&lt;span style="color: #a31515;"&gt;"#dynamic"&lt;/span&gt;&amp;gt;Placeholder content; this entire div will be replaced with #dynamic.&amp;lt;/div&amp;gt;&#xD;
&#xD;
&amp;lt;div data-replacewith=&lt;span style="color: #a31515;"&gt;"#dynamic"&lt;/span&gt; data-replacewith-mode=&lt;span style="color: #a31515;"&gt;"inner"&lt;/span&gt;&amp;gt;This div will be replaced with #dynamic's children.&amp;lt;/div&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Usage - Process all attributes at page ready:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;$(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;() {&#xD;
    $.a4dn_process_replacewith();&#xD;
});&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;With no argument, a4dn_process_replacewith() searches the entire page.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Usage - Process specific container after page load (eg: when inserting content from an ajax request):&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;onSuccess: &lt;span style="color: #0000ff;"&gt;function&lt;/span&gt; (data) {&#xD;
    $(&lt;span style="color: #a31515;"&gt;"#container"&lt;/span&gt;).html($(data.markup));&#xD;
    $.a4dn_process_replacewith(&lt;span style="color: #a31515;"&gt;"#container"&lt;/span&gt;);&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;The #container argument restricts the search to just the newly added elements. &lt;/p&gt;</description>
      <pubDate>2016-08-18T17:03:23.9630000</pubDate>
      <link>http://support.surroundtech.com/thread/using-data-replacewith-attributes-to-relocate-dom-elements-after-page-load/</link>
    </item>
    <item>
      <title>Use ThemePunch's Revolution Slider control on CMS web pages</title>
      <description>&lt;p&gt;ThemePunch's &lt;a href="https://www.themepunch.com/revsliderjquery-doc/slider-revolution-jquery-5-x-documentation/" target="_blank"&gt;Revolution Slider&lt;/a&gt; is included in many Bootstrap themes, and is also available as a standalone plugin. Accelerator CMS static web pages can include slider markup directly, but we also offer support for managing the list of slides as modules in the CMS Webpages tree.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;Accelerator does not include a license for ThemePunch Revolution. It must be purchased through a theme or directly from &lt;a href="https://codecanyon.net/item/slider-revolution-responsive-jquery-plugin/2580848" target="_blank"&gt;ThemePunch&lt;/a&gt;, and the javascript and css files provided by ThemePunch must be deployed with your website.&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Markup on the CMS page that includes the slider:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;div class=&lt;span style="color: #a31515;"&gt;"container-fluid"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;div class=&lt;span style="color: #a31515;"&gt;"row"&lt;/span&gt;&amp;gt;&#xD;
        &amp;lt;div class=&lt;span style="color: #a31515;"&gt;"col-xs-12"&lt;/span&gt;&amp;gt;&#xD;
            &amp;lt;a4dn-revolutionslider id=&lt;span style="color: #a31515;"&gt;"slider1"&lt;/span&gt;&#xD;
                data-treeroot=&lt;span style="color: #a31515;"&gt;"Navigation/Sliders/HomePage"&lt;/span&gt; &#xD;
                data-container-class=&lt;span style="color: #a31515;"&gt;"rev_slider_wrapper"&lt;/span&gt; &#xD;
                data-slider-class=&lt;span style="color: #a31515;"&gt;"rev_slider"&lt;/span&gt;&#xD;
                data-slide-content-field=&lt;span style="color: #a31515;"&gt;"Banner Carousel"&lt;/span&gt;&amp;gt;&#xD;
            &amp;lt;/a4dn-revolutionslider&amp;gt;&#xD;
        &amp;lt;/div&amp;gt;&#xD;
    &amp;lt;/div&amp;gt;&#xD;
&amp;lt;/div&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;The Bootstrap container, row, and col are used to provide the slider with size constraints; any container that provides a block would do.&lt;/p&gt;&#xD;
&lt;p&gt;The a4dn-revolutionslider element will be replaced with appropriate markup for a Revolution Slider control, along with a javascript initizliation call that passes the data attributes to the plugin. Most of the data attribute names correspond closely to options for Revolution v5 sliders.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;id: must be a unique identifier on the page. Used to uniquely identify the initialization with the specific slider element.&lt;/li&gt;&#xD;
&lt;li&gt;data-treeroot: identifies the Webpages tree element that is the parent of the list of modules to use as slides. "Navigator" is typically the application name used in the CMS Website's System, and is also specified when creating the Webpages module for the website. "/Sliders/HomePage" is the tree branch that you create within the Webpages module to hold the slides. You can use any naming convention that suits your site; this example assumes that all sliders will be defined under /Sliders, and that different sliders might be used on different pages.&lt;/li&gt;&#xD;
&lt;li&gt;data-container-class: Must be "rev_slider_wrapper" in order to set options and to auto-generate the initialization call. Bootstrap Themes will typically define a different container class for presets the theme provides.&lt;/li&gt;&#xD;
&lt;li&gt;data-slider-class: For auto-generation of the initialization, any class can be used here, to hook into custom CSS you provide. Bootstrap Themes will typically define several slider classes to use for the different presets they offer.&lt;/li&gt;&#xD;
&lt;li&gt;data-slide-content-field: Specifies which field the slide content should be pulled from; generally "Banner Carousel" or "Slider Carousel". (Dev note: can also be a property name on module entity or module extension attributes object.)&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Markup for individual slides&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In the Website Content Managment application for your website, all modules that you add to the Webpages tree have "Banner Carousel" and "Slider Carousel" tabs you can edit in the module's Detail window. When you add a module to the slide list (eg: under /Sliders/HomePage), you have to edit the content in one of these tabs to provide the HTML markup for the slide. The data-slide-content-field specifies which field to use.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;NOTE: You can add new modules just for use within the slider, using the "Custom Explorer" module type, or you can add an existing module to make it available in the slider as well as wherever it already exists in the webpages tree. Each module has a single pair of markup tabs, so if you want to use a module in multiple sliders you need to use the same markup for each or use both tabs, except all modules for a slider need to use the same tab. If that's not desired, you must create a new module.&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;See &lt;a href="https://www.themepunch.com/revsliderjquery-doc/slides/" target="_blank"&gt;https://www.themepunch.com/revsliderjquery-doc/slides/&lt;/a&gt; for documentation on the slide markup. You must include the entire &amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt; element.&lt;a href="https://www.themepunch.com/revsliderjquery-doc/slides/" target="_blank"&gt; &lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Within the markup, you can use special syntax for urls:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;src="~/..." or href="~/..."&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The ~/ will be replaced with the deployment root url for the website. This can be used for links to named CMS pages, the home page "~/", the media url "~/media/...", etc&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;src="a4dn:..." or href="a4dn:..."&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The ... is typically a filename in the Media Library for the website. The attribute value will be replaced with the full url for the media file, based on the deployment and configuration settings.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;</description>
      <pubDate>2016-08-16T21:59:31.5700000</pubDate>
      <link>http://support.surroundtech.com/thread/use-themepunch-s-revolution-slider-control-on-cms-web-pages/</link>
    </item>
    <item>
      <title>Use AB_ConfiguredCacheCollection to create one or more AB_Caches that are config-driven</title>
      <description>&lt;p&gt;In &lt;a href="/thread/use-ab_cache-to-store-state-information-objects-for-a-short-time/"&gt;Use AB_Cache to store state information objects for a short time &lt;/a&gt;the low-level interface for creating and using AB_Cache is documented. To use the low-level interface, caching properties must be hardcoded or otherwise provided.&lt;/p&gt;&#xD;
&lt;p&gt;AB_ConfiguredCacheCollection allows a set of caching properties to be defined in a configuration file, and then one or more AB_Caches can be instantiated using those properties.&lt;/p&gt;&#xD;
&lt;h3&gt;Usage - Set up Cache:&lt;/h3&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #008000;"&gt;// Set up static service-side cache for holding custom field definitions&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; AB_ConfiguredCacheCollection ap_WorkflowCaches = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_ConfiguredCacheCollection { };&#xD;
&#xD;
&lt;span style="color: #008000;"&gt;// Get the custom fields cache; if the cache is disabled this will return null&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; AB_Cache ap_CustomFieldsCache { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; ap_WorkflowCaches[&lt;span style="color: #a31515;"&gt;"CustomFieldsCache"&lt;/span&gt;]; } }&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;The string used as an index on ap_WorkflowCaches is used to find the configuration entries. For this pool we're setting a 10 minute sliding expiration policy.&lt;/p&gt;&#xD;
&lt;h3&gt;Configuration:&lt;/h3&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.CustomFieldsCache.IsDisabled"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"False"&lt;/span&gt;/&amp;gt;&#xD;
&amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.CustomFieldsCache.CacheMemoryLimitMegabytes"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"0"&lt;/span&gt;/&amp;gt;&#xD;
&amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.CustomFieldsCache.PhysicalMemoryLimitPercentage"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"0"&lt;/span&gt;/&amp;gt;&#xD;
&amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.CustomFieldsCache.PollingInterval"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"00:02:00"&lt;/span&gt;/&amp;gt;&#xD;
&amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.CustomFieldsCache.SlidingExpiration"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"00:10:00"&lt;/span&gt;/&amp;gt;&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-08-10T16:15:54.7100000</pubDate>
      <link>http://support.surroundtech.com/thread/use-ab_configuredcachecollection-to-create-one-or-more-ab_caches-that-are-config-driven/</link>
    </item>
    <item>
      <title>How to specify IS NULL and IS NOT NULL where clauses in am_Select</title>
      <description>&lt;p&gt;Typically Accelerator uses Search-by-Example, where an entity is created with properties populated with the values to search for. Any unpopulated values (set to null) are not searched. Using this approach, it is not possible to explicitly search for records where fields are NULL or not NULL.&lt;/p&gt;&#xD;
&lt;p&gt;To perform an explicit NULL search, create an InputArgs object as usual, initialize its ap_Query property, and then add a WHERE clause:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;var inArgs = new AB_SelectInputArgs&amp;lt;ItemMasterEntity&amp;gt;(&#xD;
    new ItemMasterEntity &#xD;
    { &#xD;
        ItemGrade = grade &#xD;
    }&#xD;
);&#xD;
&#xD;
inArgs.ap_Query = inArgs.ap_InputEntity.am_BuildDefaultQuery();&#xD;
&#xD;
inArgs.ap_Query.am_AddWhereClause(&#xD;
    ItemMasterEntity.ClassGenericShapeProperty.ap_PropertyName, &#xD;
    "IS NOT", &#xD;
    null, &#xD;
    true&#xD;
);&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;am_BuildDefaultQuery() is called to create the initial set of WHERE clauses based on the search entity passed to the AB_SelectInputArgs constructor.&lt;/p&gt;&#xD;
&lt;p&gt;am_AddWhereClause() takes four arguments for the overload we need:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The string name of the property for the field we want to test&lt;/li&gt;&#xD;
&lt;li&gt;"IS" or "IS NOT" for the kind of test we want to do&lt;/li&gt;&#xD;
&lt;li&gt;null, for the property value to compare against&lt;/li&gt;&#xD;
&lt;li&gt;true, to validate the WHERE clause. (this argument is only set to false when you want to avoid data type conversions)&lt;/li&gt;&#xD;
&lt;/ul&gt;</description>
      <pubDate>2016-08-09T17:22:56.4430000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-specify-is-null-and-is-not-null-where-clauses-in-am_select/</link>
    </item>
    <item>
      <title>Passing logged in credentials when calling ViewModel methods</title>
      <description>&lt;p&gt;The Data Access Layer needs to supply a User Name and Password&amp;nbsp;in the connection string in order to connect to the data store. This User Name/Password can be hardcoded in the connectionParms.config, but normally a developer turns this off by removing the hard coded values and requires each service call to supply the logged in credentials. The Accelerator core automatically passes these credentials in many cases, but there are situations with custom components where you will be responsible for passing these parameters. &amp;nbsp;The logged in credentials are available in the AB_DataPropertyController class and can be accessed like this:&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; result = SBInterfaceVm.am_Select(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_SelectInputArgs&amp;lt;AB_StandardBaseInterfaceEntity&amp;gt;(sbQuery, AB_DataPropertyController.ap_UserIdentityStore.ap_UserName, AB_DataPropertyController.ap_UserIdentityStore.ap_Password, AB_DataPropertyController.ap_Token));&#xD;
&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (result.ap_IsSuccess)&#xD;
{ &#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;Note: It is recommended to pass the UserName, Password and Token. &amp;nbsp;The token is a variable that will be used in a future enhancement where the Accelerator Database Authentication will support tokenized security.&lt;/p&gt;</description>
      <pubDate>2016-08-09T13:11:17.5370000</pubDate>
      <link>http://support.surroundtech.com/thread/passing-logged-in-credentials-when-calling-viewmodel-methods/</link>
    </item>
    <item>
      <title>Delay load of Explorer Bar until Dropdown auto complete has finished</title>
      <description>&lt;p&gt;You can add the following code to your Search Explorer Bar code behind to make it wait until the dropdown has finished auto completing to load records.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;NOTE: This requires Accelerator 6.4 or greater.&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-08-08T18:47:35.3070000</pubDate>
      <link>http://support.surroundtech.com/thread/delay-load-of-explorer-bar-until-dropdown-auto-complete-has-finished/</link>
    </item>
    <item>
      <title>Certificate Expiration in ClickOnce Deployment</title>
      <description>&lt;p&gt;Here is information from MSDN on WPF ClickOnce Certificate Expiration...&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://msdn.microsoft.com/en-us/library/ff369721.aspx" style="color: purple; font-family: Calibri, sans-serif;" title="Certificate Expiration in ClickOnce Deployment" target="_blank"&gt;Certificate Expiration in ClickOnce Deployment&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://msdn.microsoft.com/windows/uwp/packaging/create-certificate-package-signing" target="_blank"&gt;Additional Certificate Information&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://may.be/renewcert/" target="_blank"&gt;Renewcert&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-08-07T13:48:34.3570000</pubDate>
      <link>http://support.surroundtech.com/thread/certificate-expiration-in-clickonce-deployment/</link>
    </item>
    <item>
      <title>Accelerator BP Service Host Performance Improvements in v6.4.0.0</title>
      <description>&lt;p&gt;In v6.4.0.0, Accelerator BP Service Host has been updated to vastly improve the rate it is able to look up per-module Framework Data, which makes both WPF and MVC applications start up more quickly. This improvement was made by consolidating database queries and briefly caching query results across framework service calls. In earlier versions, it could take up to 12 seconds (on a slow network) to retrieve all of the Framework data for a single module, with many database queries per second during the entire period. That's been reduced to less than 100 milliseconds and just a few database queries after the first couple of modules.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;For WPF, the per-module Framework data is retrieved when the application is started after downloading a new version or when using the Clear Cache option.&lt;/li&gt;&#xD;
&lt;li&gt;For MVC, the per-module Framework data is retrieved when the website (Line of Business, CMS, or custom) is restarted on IIS, and intermittently after that.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;The Accelerator BP Service Host's WebAppSettings.config adds eight new configuration settings that control the cross-request caching. If the caching is suspected to be causing a problem (eg: metadata not being updated, or user-specific metadata leaking across users) the IsDisabled settings can be used to turn the caching off. Some performance improvements will still be present; each module will take about 1 second to update. &lt;/p&gt;&#xD;
&lt;p&gt;The memory limit settings can be used to control the cache's size in memory, and PollingInterval controls how often the memory size is checked. If the cache grows too large, older values will be dropped out.&lt;/p&gt;&#xD;
&lt;p&gt;The SlidingExpiration settings control how quickly a cached value will be dropped after its last access. These can be quite short during framework data updating because the service calls are fired very rapidly. Making these periods longer can improve performance during application usage, but could cause delays in recognizing security/authorization changes or user-initiated changes to view columns.&lt;/p&gt;&#xD;
&lt;p&gt;These settings only need to be added to your Accelerator BP Service Host deployment if you wish to change them; the settings shown below use the default values the code will use if the settings are missing.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.FrameworkAuthCache.IsDisabled"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"False"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.FrameworkAuthCache.CacheMemoryLimitMegabytes"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"0"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.FrameworkAuthCache.PhysicalMemoryLimitPercentage"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"0"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.FrameworkAuthCache.PollingInterval"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"00:02:00"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.FrameworkAuthCache.SlidingExpiration"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"00:01:00"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.ViewColumnCache.IsDisabled"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"False"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.ViewColumnCache.CacheMemoryLimitMegabytes"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"0"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.ViewColumnCache.PhysicalMemoryLimitPercentage"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"0"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.ViewColumnCache.PollingInterval"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"00:02:00"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"Feature.ViewColumnCache.SlidingExpiration"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;"00:00:20"&lt;/span&gt;/&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-07-27T21:35:39.3130000</pubDate>
      <link>http://support.surroundtech.com/thread/accelerator-bp-service-host-performance-improvements-in-v6-4-0-0/</link>
    </item>
    <item>
      <title>Use AB_Cache to store state information objects for a short time</title>
      <description>&lt;p&gt;As a general rule, BP Service calls should depend only upon their input args, static information set during startup, and configuration settings. This helps them to function correctly when handling many concurrent requests from different users, because state values from one user's request won't leak into another user's state.&lt;/p&gt;&#xD;
&lt;p&gt;However, sometimes this rule leads to performance issues because the BP Service has to repeat the same operation, with the same results, on every request. For example, if every request has to query the database to look up some information about the current user, and that information rarely changes, then it's unnecessary load on the database server.&lt;/p&gt;&#xD;
&lt;p&gt;The AB_Cache class can be used to hold a value in memory for a short time, even across BP Service calls, and it will drop the value if it is not used within a configurable time period. The class is a wrapper around &lt;a href="https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.110).aspx" target="_blank"&gt;System.Runtime.Caching.MemoryCache&lt;/a&gt;, with added support for Regions.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; ObjectCache _MyCache = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_Cache();&#xD;
&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; ObjectCache MyCache { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _MyCache; } }&#xD;
&#xD;
&#xD;
MyCache.Set(&lt;span style="color: #a31515;"&gt;"mykey"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"a value"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; CacheItemPolicy { SlidingExpiration = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TimeSpan(0, 2, 0) }, &lt;span style="color: #a31515;"&gt;"Region_A"&lt;/span&gt;);&#xD;
&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; val = MyCache.Get(&lt;span style="color: #a31515;"&gt;"mykey"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Region_A"&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt;;&#xD;
 &#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;This example sets up a cache with default options for memory limits and expiration time. The AB_Cache() constructor accepts MemoryCache's arguments for &lt;a target="_blank" href="https://msdn.microsoft.com/en-us/library/system.runtime.caching.configuration.memorycacheelement.cachememorylimitmegabytes(v=vs.110).aspx"&gt;CacheMemoryLimitMegabytes&lt;/a&gt;, &lt;a href="https://msdn.microsoft.com/en-us/library/system.runtime.caching.configuration.memorycacheelement.physicalmemorylimitpercentage(v=vs.110).aspx" target="_blank"&gt;PhysicalMemoryLimitPercentage&lt;/a&gt;, and &lt;a href="https://msdn.microsoft.com/en-us/library/system.runtime.caching.configuration.memorycacheelement.pollinginterval(v=vs.110).aspx" target="_blank"&gt;PollingInterval&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;In the Set() call, a CacheItemPolicy is passed which sets a two minute expiration, and the Region argument provides a namespace for the key arguments. A typical use in a BP Service would be to use InputArgs.ap_UserID as the region, so that each user has their own namespace within the cache.&lt;/p&gt;&#xD;
&lt;p&gt;A service application may contain multiple cache objects, which should all be static fields so that they're retained for the life of the service process. Each cache object has its own memory use limits, and provides a separate storage for its own regions and keys.&lt;/p&gt;</description>
      <pubDate>2016-07-27T20:47:04.0430000</pubDate>
      <link>http://support.surroundtech.com/thread/use-ab_cache-to-store-state-information-objects-for-a-short-time/</link>
    </item>
    <item>
      <title>Adding Arbitrary Data to Connection Strings</title>
      <description>&lt;p&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; mso-fareast-font-family: 'MS Mincho'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; color: #1f497d; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA;"&gt;The Accelerator uses the information in the ConnectionParams files to generate a connection string used to contact your database. If required, you have the ability to add your own custom text to the end of the generated connection string.&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; mso-fareast-font-family: 'MS Mincho'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; color: #1f497d; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA;"&gt;Below is an example using a demo&amp;nbsp;system&amp;rsquo;s connection parameters file that shows how to add arbitrary text to the end of your connection string. &lt;b&gt;Note: &lt;/b&gt;You will need to add any required semi-colons yourself.&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;hr&gt;&#xD;
&lt;pre&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; mso-fareast-font-family: 'MS Mincho'; mso-fareast-theme-font: minor-fareast; mso-bidi-font-family: 'Times New Roman'; color: #1f497d; mso-ansi-language: EN-US; mso-fareast-language: JA; mso-bidi-language: AR-SA;"&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;Original Connection Parms&lt;br&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;lt;server id="Development"&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="ServerType" value="Mainframe" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;add key="DataSource" value="10.10.1.2" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="Database" value="TestDB" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="UserID" value="Username" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="Password" value="xxxxxx" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="Collection" value="DATA" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;lt;/server&amp;gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;Original Connection String&lt;br&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d; word-break: break-all;"&gt;"Server=10.10.1.2;Database=TestDB;UserId=Username;Password=xxxxxx;CurrentSchema=DATA;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;pre class="MsoNormal"&gt;&lt;b&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;With CustomConfiguration&lt;br&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;lt;server id="Development"&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="ServerType" value="Mainframe" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="DataSource" value="10.10.1.2" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="Database" value="TestDB" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="UserID" value="Username" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="Password" value="xxxxxx" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add key="Collection" value="DATA" /&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="background: yellow; mso-highlight: yellow;"&gt;&amp;lt;add&amp;nbsp;key="CustomConfiguration"&amp;nbsp;value="APPID=TestApp;"&amp;nbsp;/&amp;gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;&amp;lt;/server&amp;gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;b&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;New Connection String&lt;br&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style="font-size: 11.0pt; font-family: 'Calibri',sans-serif; color: #1f497d;"&gt;"Server=10.10.1.2;Database=TestDB;UserId=Username;Password=xxxxxx;CurrentSchema=DATA;&lt;span style="background: yellow; mso-highlight: yellow;"&gt;APPID=TestApp;&lt;/span&gt;"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/pre&gt;</description>
      <pubDate>2016-07-27T16:36:55.5370000</pubDate>
      <link>http://support.surroundtech.com/thread/adding-arbitrary-data-to-connection-strings/</link>
    </item>
    <item>
      <title>How to use Framework Authentication with Active Directory</title>
      <description>&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Allows Framework authentication to operate against ActiveDirectory server instead of comparing against an encrypted password stored in the Accelerator database.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Requires one config setting to activate, and three settings to configure.&lt;/li&gt;&#xD;
&lt;li&gt;Can use explicit values for the config settings, or can use the account running the DAL framework.&lt;/li&gt;&#xD;
&lt;li&gt;Framework authorization data is still in Accelerator Database.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The following settings are added to the Accelerator web.config file.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #007700;"&gt;&amp;lt;appSettings&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #007700;"&gt;&amp;lt;add&lt;/span&gt; &lt;span style="color: #0000cc;"&gt;key=&lt;/span&gt;&lt;span style="background-color: #fff0f0;"&gt;"UseActiveDirectoryAuthenticationForFramework"&lt;/span&gt; &lt;span style="color: #0000cc;"&gt;value=&lt;/span&gt;&lt;span style="background-color: #fff0f0;"&gt;"True"&lt;/span&gt; &lt;span style="color: #007700;"&gt;/&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #007700;"&gt;&amp;lt;add&lt;/span&gt; &lt;span style="color: #0000cc;"&gt;key=&lt;/span&gt;&lt;span style="background-color: #fff0f0;"&gt;"ActiveDirectoryQueryUsername"&lt;/span&gt; &lt;span style="color: #0000cc;"&gt;value=&lt;/span&gt;&lt;span style="background-color: #fff0f0;"&gt;""&lt;/span&gt; &lt;span style="color: #007700;"&gt;/&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #007700;"&gt;&amp;lt;add&lt;/span&gt; &lt;span style="color: #0000cc;"&gt;key=&lt;/span&gt;&lt;span style="background-color: #fff0f0;"&gt;"ActiveDirectoryQueryPassword"&lt;/span&gt; &lt;span style="color: #0000cc;"&gt;value=&lt;/span&gt;&lt;span style="background-color: #fff0f0;"&gt;""&lt;/span&gt; &lt;span style="color: #007700;"&gt;/&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #007700;"&gt;&amp;lt;add&lt;/span&gt; &lt;span style="color: #0000cc;"&gt;key=&lt;/span&gt;&lt;span style="background-color: #fff0f0;"&gt;"ActiveDirectoryConnectionPath"&lt;/span&gt; &lt;span style="color: #0000cc;"&gt;value=&lt;/span&gt;&lt;span style="background-color: #fff0f0;"&gt;"LDAP://xxx.xxx.xx.xx"&lt;/span&gt; &lt;span style="color: #007700;"&gt;/&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #007700;"&gt;&amp;lt;/appSettings&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;The first one turns AD authentication on if the value is True (not case sensitive) and off otherwise. The next two settings specify an Active Directory account which has permission to talk to the Active Directory server. Any AD account can generally work here. The final setting specifies the URL for the Active Directory server.&lt;/p&gt;&#xD;
&lt;p&gt;If the last three settings are not set but authorization is turned on, then the account running the process will be used.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Even though the Authentication is performed via Active Directory, the User must exist in the Accelerator User File with a valid User Group that will give them access to the system. &amp;nbsp;All security access to the system, applications, modules, commands etc. is driven by the User Groups assigned to the User.&lt;/p&gt;</description>
      <pubDate>2016-07-18T13:08:29.1500000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-use-framework-authentication-with-active-directory/</link>
    </item>
    <item>
      <title>Caching data between requests in ASP.NET MVC</title>
      <description>&lt;p&gt;MVC's HttpContext object contains three collections that can hold onto data from one request to the next: Temp[], Session[], and Cache[]. They all use strings for their keys, and can store arbitrary objects (sometimes with limitations.)&lt;/p&gt;&#xD;
&lt;p&gt;Temp[] is used to hold a value for one-time use. Once the value is retrieved it is removed from the collection. A typical use would be to store a model object in a POST handler, redirect to a GET handler, and retrieve the model object from Temp[] to render it. (AB_BaseController provides am_StoreModelStateErrors and am_RestoreModelStateErrors to assist in this scenario by passing the ModelState object through Temp[] too, so that the GET handler can render validation errors that were discovered in the POST handler.)&lt;/p&gt;&#xD;
&lt;p&gt;Session[] is used to hold values for the duration of the user's session, or until they are explicitly removed. Storing a lot of data in Session[] can cause excess memory consumption on the server, limiting the number of concurrent sessions it can handle. To address this problem the session mode can be configured to store data in a standalone SessionServer system service or in MSSQL. If either of these modes are used, only [Serializable] objects can be stored in Session[]. (Typically Accelerator-based MVC applications that use user login will store the UserEntity and other user-related objects in Session[], but not all of that data is serializable, so only the In Process mode can be used.)&lt;/p&gt;&#xD;
&lt;p&gt;Cache[] is like Session[], except data can be set to expire and be removed automatically. Its Add() method lets you specify either an absolute expiration time or a sliding expiration timer (eg: time since last access.) It is also possible to specify a method which will be called when the item is removed from the cache.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; UNREAD_CACHE_KEY = &lt;span style="color: #a31515;"&gt;"__MSG_Unread_Messages__"&lt;/span&gt;;&#xD;
&#xD;
&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; List&amp;lt;MSG_MessageEntity&amp;gt; UnreadMessages&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&#xD;
    {&#xD;
        &lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; msgs = HttpContext.Current.Cache[UNREAD_CACHE_KEY] &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; List&amp;lt;MSG_MessageEntity&amp;gt;;&#xD;
        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (msgs == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&#xD;
        {&#xD;
            &lt;span style="color: #008000;"&gt;// Real World: perform expensive database lookup here&lt;/span&gt;&#xD;
            msgs = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;MSG_MessageEntity&amp;gt;();&#xD;
&#xD;
            TimeSpan expirationTime;&#xD;
            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!TimeSpan.TryParse(ConfigurationManager.AppSettings[&lt;span style="color: #a31515;"&gt;"Features.Messages.LookupFrequency"&lt;/span&gt;], &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; expirationTime))&#xD;
            {&#xD;
                expirationTime = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TimeSpan(0, 1, 0);&#xD;
            }&#xD;
            HttpContext.Current.Cache.Add(UNREAD_CACHE_KEY, msgs, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, DateTime.Now.Add(expirationTime), Cache.NoSlidingExpiration, CacheItemPriority.Default, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; msgs;&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;See also:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx"&gt;Cache.Add Method (MSDN)&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="/thread/improve-mvc-performance-by-managing-session-and-output-cache/"&gt;Improve MVC Performance by managing session and output cache&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;</description>
      <pubDate>2016-07-12T15:07:09.7700000</pubDate>
      <link>http://support.surroundtech.com/thread/caching-data-between-requests-in-asp-net-mvc/</link>
    </item>
    <item>
      <title>How to Remove the remarks tab from a module</title>
      <description>&lt;p&gt;Remarks is an Accelerator Module that can be added to any module. &amp;nbsp;Remarks are added and removed via the Accelerator Maintenance.&lt;/p&gt;&#xD;
&lt;p&gt;In the Accelerator Maintenance, click on the SB Interface Module. &amp;nbsp;Remarks can be added to either the Detail or the Explorer Content. &amp;nbsp;You can choose to remove it from 1 or both. &amp;nbsp;All you need to do is delete the SB Interface record.&lt;/p&gt;&#xD;
&lt;p&gt;In this example, I can delete remarks from the Customer Module Detail and Explorer Content by deleting these 2 records.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/cfbbee38-eff9-4a89-9830-a63c017dd34d_2016-07-07-19-07-03.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;After you restart the system, you will no longer see the Remarks tabs.&lt;/p&gt;</description>
      <pubDate>2016-07-07T23:10:47.8530000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-remove-the-remarks-tab-from-a-module/</link>
    </item>
    <item>
      <title>Accelerator Commands and Command Bars</title>
      <description>&lt;p&gt;The Accelerator allows you to define command bars, which contain commands, at several different locations:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;System&lt;/li&gt;&#xD;
&lt;li&gt;Module&lt;/li&gt;&#xD;
&lt;li&gt;Sub-Module&lt;/li&gt;&#xD;
&lt;li&gt;Detail&lt;/li&gt;&#xD;
&lt;li&gt;System_Search_Select&lt;/li&gt;&#xD;
&lt;li&gt;Module_Search_Select&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;There are also 3 different command bar types:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Menubar&lt;/li&gt;&#xD;
&lt;li&gt;Toolbar&lt;/li&gt;&#xD;
&lt;li&gt;Popup&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Not all locations support a particular command bar type. &amp;nbsp;Here are the command bar locations with the supported command bar types:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;System&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Menubar&lt;/li&gt;&#xD;
&lt;li&gt;Toolbar&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Module&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Toolbar&lt;/li&gt;&#xD;
&lt;li&gt;Popup&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Sub-Module&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Toolbar&lt;/li&gt;&#xD;
&lt;li&gt;Popup&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Detail&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Menubar&lt;/li&gt;&#xD;
&lt;li&gt;Toolbar&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;System_Search_Select&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Menubar&lt;/li&gt;&#xD;
&lt;li&gt;Toolbar&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Module_Search_Select&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Toolbar&amp;nbsp;&lt;/li&gt;&#xD;
&lt;li&gt;Popup&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Here is a look at all the command bar locations and types:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/4bcc1091-a1de-4ad4-ae13-a63a00daee54_2016-07-05-09-09-39.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/405e3450-e703-4dae-8922-a63a00dddafa_2016-07-05-09-20-38.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/6633724e-6151-4b8d-855d-a63a00df70fe_2016-07-05-09-30-00.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Command Bars can be defined at the System, Application and Module level. &amp;nbsp;By default, the Accelerator generates all command bars at the system level. &amp;nbsp;You can use the Accelerator Maintenance to change the system level command bars and commands, or add application and module command bars that replace the the higher level command bars. &amp;nbsp;For example, the module level command bars will replace the application and system level command bars. &amp;nbsp;You will notice that the command bars tab shows as a sub module on the system, application and module modules within the Accelerator Maintenance.&lt;/p&gt;&#xD;
&lt;p&gt;System Level Command Bars:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/07384949-7bef-4048-bbb6-a63a00e25ebd_2016-07-05-09-44-13.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Application Level Command Bars:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e0ed285a-d707-473e-8f3f-a63a00e31115_2016-07-05-09-46-46.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Module Level Command Bars:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/62b82d3d-c8cf-4a49-a671-a63a00e3511d_2016-07-05-09-47-48.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;</description>
      <pubDate>2016-07-05T13:33:42.8070000</pubDate>
      <link>http://support.surroundtech.com/thread/accelerator-commands-and-command-bars/</link>
    </item>
    <item>
      <title>Data type conversion in Datamaps</title>
      <description>&lt;p&gt;It is a best practice to use the appropriate data type in your .net entities and not be restrained to the type defined in the database schema. &amp;nbsp;For example, in many legacy systems, the date field was defined with decimal or numeric 8 and stored in the format CCYYMMDD. &amp;nbsp;In .net, all dates should use the DateTime data type.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;The Accelerator allows you to convert you data between the data type defined in the entities and the data type defined in your schema. &amp;nbsp;By default, the datamaps assume that the database type is the same as the entity type. &amp;nbsp;If they are not, you need to specify the database type. &amp;nbsp;The accelerator has some builtin data type conversions which should cover most of your database conversion needs. &amp;nbsp;We also have the ability fo you to develop your own custom conversion programs.&lt;/p&gt;&#xD;
&lt;p&gt;In this example, our database has a datatype of DATE and NUMERIC(8) which both store dates. &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/55810e54-b3fb-458a-b01d-a63400e7fa83_2016-06-29-09-55-18.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In the .net Entity, all 3 fields are defined using the DateTime? data type. (ex:)&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/0345aecd-58a3-4241-a62f-a63400e89347_2016-06-29-10-06-27.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In order to map these 3 fields to and from the entity, I need to specify on the map the "dataBaseFieldType".&lt;/p&gt;&#xD;
&lt;p&gt;You can specify it like this:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/54c043dd-3930-40b9-b0e2-a63400e9556c_2016-06-29-10-08-53.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In you have custom conversion needs, you can specify your own convert to and convert from methods.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/4e09b3af-6a44-4323-9d4c-a63400ea0b07_2016-06-29-10-10-27.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-06-29T14:12:25.8770000</pubDate>
      <link>http://support.surroundtech.com/thread/data-type-conversion-in-datamaps/</link>
    </item>
    <item>
      <title>Configuring Services to access different Accelerator databases (ex: Dev, Test, Prod)</title>
      <description>&lt;p&gt;The Accelerator product comes with services to access the Accelerator Database. These services are installed in a folder within the Accelerator install directory. &amp;nbsp;If the default install location is used, these services can be found here:&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;C:\Program Files\Accelerator for .NET\v#_#\A4DNServices.&lt;/p&gt;&#xD;
&lt;p&gt;These services need to be hosted in IIS in order to access them. &amp;nbsp;You will need to copy the A4DNServices folder to your IIS Web server and convert the folder to an application in IIS. After you copy the services to your web server website folder, you will need to configure 2 configurations:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;A4DNServices\WebAppSettings_Template.config&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;A4DNServices\bin\ConnectionParms_Template.config&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;You will need to copy these configs and remove the "_Template" from the name. The "_Template" is added so that you can copy the Accelerator Services folder after each Accelerator upgrade without clobbering your settings.&lt;/p&gt;&#xD;
&lt;p&gt;The WebAppSettings.config contains all the&amp;nbsp;appSettings for your web.config. &amp;nbsp;You will notice that your web.config references the WebAppSettings.config. &amp;nbsp;The WebAppSettings.config is yours to change as needed and will not be clobbered by future accelerator upgrades.&lt;/p&gt;&#xD;
&lt;p&gt;The ConnectionParms.config contains the information on how to access the Accelerator Database. This config is also yours to change as needed and will not be clobbered by future accelerator upgrades.&lt;/p&gt;&#xD;
&lt;p&gt;The ConnectionParms.config allows you to define multiple connections. This is where you define where the Accelerator database exists and how to access it. This needs to be configured before the services will work.&lt;/p&gt;&#xD;
&lt;p&gt;The "serverSelect" element defines the default connection that will be used. You need to specify one of the server ids defined in the config. The default template has 2 server IDs defined: DB2_CONNECTION &amp;nbsp;and MSSQL_CONNECTION. &amp;nbsp;The template is configured to use the MSSQL_CONNECTION. &amp;nbsp;You can define additional Sever IDs as needed. &amp;nbsp;For example, you can define the server information (ServerType, DataSource, UserID, Password and Collection(or Library Name)) to connect to your Accelerator DEV, TST, and PRD databases by defining the Server ID Connection information for each and then Setting the ServerSelect idref to use the appropriate server ID for the service. &lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;If you do define connection information for multiple acceleartor databases, then it is important that you always pay attention to the "serverSelect idref" as that is the connection that the service will use.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/eb6d9d97-adb5-4c9c-a188-a63400d961f3_2016-06-29-09-09-54.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Refer to this post for setting up multiple connections.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/is-it-possible-to-setup-multiple-database-connections/?order=all#comment-f33947ff-09c6-4576-bd70-a5720167f6bc"&gt;is-it-possible-to-setup-multiple-database-connections&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The last step before the services will work is to convert the folder to an application.&lt;/p&gt;&#xD;
&lt;p&gt;In IISManager, Right click on the folder and click "Convert to Application".&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/2f8777c1-c811-4b21-b8bf-a63400d3d818_2016-06-29-08-50-04.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;You have the option to select an&amp;nbsp;application pool.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/fdc91c7d-3939-48fc-bfcb-a63400d46243_2016-06-29-08-52-28.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Make sure the Application Pool you choose has these settings:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/33554e04-3e20-4d3c-b083-a63400d52c8f_2016-06-29-08-55-06.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;To test that the service is running, you can right click on the same folder and click Manage Applictaion --&amp;gt; Browse. &amp;nbsp;You can then add the service AB_FrameworkBP.svc to the end of the URL:&lt;/p&gt;&#xD;
&lt;p&gt;ex:&amp;nbsp;http://localhost/EasyBuyCyclesDEM/A4DNServices/&lt;strong&gt;AB_FrameworkBP.svc&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;You should get this html if the service is configured correctly in IIS:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/57e1f942-286b-4871-85ea-a63400df8ff2_2016-06-29-09-33-42.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-06-29T13:22:51.4870000</pubDate>
      <link>http://support.surroundtech.com/thread/configuring-services-to-access-different-accelerator-databases-ex-dev-test-prod/</link>
    </item>
    <item>
      <title>Use AB_GeneralForm to implement forms on CMS website pages</title>
      <description>&lt;p&gt;Accelerator 6.4.0 introduces a new CMS feature: &lt;u&gt;AB_GeneralForm&lt;/u&gt;. This feature allows simple forms to be added to CMS website pages with a div tag and data attributes, similar to the way Bootstrap Javascript plugins work. Some form types are available in Accelerator and others can be added by the website project; the form type defines a set of available fields and their validation rules using standard &lt;code&gt;DataAnnotations&lt;/code&gt; property attributes. The CMS page markup decares which fields to use, their order, and whether or not they are required. It also declares actions to take when the form is submitted: send an email to the user, send an internal email, create a workflow instance, redirect to a different CMS page, unhide an element on the page and insert a message into it.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;In the CMS page:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;div data-a4dn-general-form=&lt;span style="color: #a31515;"&gt;"contact-info"&lt;/span&gt;&#xD;
    data-a4dn-fields=&lt;span style="color: #a31515;"&gt;"*FirstName,*LastName,*Email,Company,Title,Phone,Address,*Message"&lt;/span&gt;&#xD;
    data-a4dn-display-template=&lt;span style="color: #a31515;"&gt;"bs-form-icons"&lt;/span&gt;&#xD;
    data-a4dn-requestor-mandrill-template=&lt;span style="color: #a31515;"&gt;"..."&lt;/span&gt;&#xD;
    data-a4dn-internal-mandrill-template=&lt;span style="color: #a31515;"&gt;"..."&lt;/span&gt;&#xD;
    data-a4dn-workflow-namespace=&lt;span style="color: #a31515;"&gt;"..."&lt;/span&gt;&#xD;
    data-a4dn-confirmation-modulenumber=&lt;span style="color: #a31515;"&gt;"..."&lt;/span&gt;&#xD;
    data-a4dn-show-on-success=&lt;span style="color: #a31515;"&gt;"..."&lt;/span&gt;&#xD;
    data-a4dn-show-on-error=&lt;span style="color: #a31515;"&gt;"..."&lt;/span&gt;&#xD;
    data-a4dn-submit-label=&lt;span style="color: #a31515;"&gt;"..."&lt;/span&gt;&#xD;
&amp;gt;&amp;lt;/div&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;This element's content will be populated with the "contact-info" form, rendered using &lt;code&gt;~/Views/AB_GeneralForm/bs-form-icons.cshtml&lt;/code&gt;, and only showing the fields listed in &lt;code&gt;data-a4dn-fields&lt;/code&gt;. Any field names prefixed with &lt;code&gt;*&lt;/code&gt; will be required. If &lt;code&gt;submit-label&lt;/code&gt; is provided, it will override the label on the Submit button.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Currently, a CMS page can only contain one element like this at a time. Support for multiple forms on a page is planned for a later release.&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-general-form&lt;/strong&gt;: The value "contact-info" gets mapped to the C# model class that has properties for all of the available fields for this form type. Website projects can define their own types and add them to the mapping list.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-fields&lt;/strong&gt;: A comma-separated list of the fields to show, prefixed by * if they are requried. The field names match the C# property names, Mandrill merge tag names, and Workflow custom field namespaces.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-display-template&lt;/strong&gt;: The name of the Razor template used to render the model. This allows different form styles to be used with the same model / form type. Website projects can provide their own templates.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-requestor-mandrill-template&lt;/strong&gt;: &lt;em&gt;Optional&lt;/em&gt;. If provided the form data will be emailed to the user using the specified Mandrill template. The model class must specify which form field to use for the user's email address and name; therefore not all form types support emailing the user.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-internal-mandrill-template&lt;/strong&gt;: &lt;em&gt;Optional&lt;/em&gt;. If provided the form data will be emailed to a configured email address using the specified Mandrill template. The website project's web.config file must contain an AB_GeneralForm.InternalEmail setting.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-workflow-namespace&lt;/strong&gt;: &lt;em&gt;Optional&lt;/em&gt;. If specified a new Workflow Instance will be created for the given workflow. The model class can populate the instance name with any of the form fields.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-confirmation-modulenumber&lt;/strong&gt;: &lt;em&gt;Optional&lt;/em&gt;. If specified a successful form submission will cause the browser to load the CMS page for the given module number.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-show-on-success&lt;/strong&gt;: &lt;em&gt;Optional&lt;/em&gt;. If specified the value should be a selector expression for a hidden element to show after successfully submitting the form. If the element contains an element with class a4dn-js-message, it's content will be set to the success message returned by the server.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-show-on-error&lt;/strong&gt;: &lt;em&gt;Optional&lt;/em&gt;. If specified this works like show-on-success, except for non-validation error messages when the form submission fails. (Eg: failure to send an email.)&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-submit-label&lt;/strong&gt;: &lt;em&gt;Optional&lt;/em&gt;. The label for the submit button; defaults to Submit (or whatever the display template chooses to use.)&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-{fieldname}&lt;/strong&gt;: &lt;em&gt;Optional&lt;/em&gt;. To override the label and placeholder text for a field, add a data attribute named a4dn- and the fieldname in lowercase. (Don't include the * for required fields.) The value of the attribute should be the label, a | character, and the placeholder text.&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;a4dn-{fieldname}-options:&lt;/strong&gt; &lt;em&gt;Optional&lt;/em&gt;. Specifies allowed values for the field, which will be rendered as a dropdown select control. The attribute value can be either a comma-separated list or the id or name of a Property Code table.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;confirmation-modulenumber cannot be used with show-on-success; use one or the other.&lt;/p&gt;&#xD;
&lt;p&gt;If show-on-error is not specified, or if it is specified but the element selector does not locate an element, then errors will be displayed in a Javascript Alert popup dialog.&lt;/p&gt;&#xD;
&lt;p&gt;If confirmation-modulenumber is not specified, and show-on-success is either not specified or the selector doesn't locate an element, then the success message returned&amp;nbsp; by the server will be shown in a Javascript Alert popup dialog.&lt;/p&gt;</description>
      <pubDate>2016-06-28T20:26:28.0600000</pubDate>
      <link>http://support.surroundtech.com/thread/use-ab_generalform-to-implement-forms-on-cms-website-pages/</link>
    </item>
    <item>
      <title>Fix &amp;quot;This collection already contains an address with scheme http&amp;quot; error in BP Service deployments</title>
      <description>&lt;p&gt;If a BP Service is deployed in an IIS Application that's bound to multiple domain names or ports, The service may respond with an error. When custom errors are turned off the full error mesage is shown:&lt;/p&gt;&#xD;
&lt;blockquote&gt;&#xD;
&lt;p&gt;This collection already contains an address with scheme http.&amp;nbsp; There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'.&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;This occurs because WCF can't tell which of the bindings it should respond to. To fix the problem, find the &amp;lt;serviceHostingEnvironment&amp;gt; element in the service's web.config file, and add the bindings WCF should use.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;serviceHostingEnvironment aspNetCompatibilityEnabled=&lt;span style="color: #a31515;"&gt;"true"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;baseAddressPrefixFilters&amp;gt;&#xD;
         &amp;lt;add prefix=&lt;span style="color: #a31515;"&gt;"http://hostname.com/BPServices"&lt;/span&gt;/&amp;gt;&#xD;
    &amp;lt;/baseAddressPrefixFilters&amp;gt;&#xD;
&amp;lt;/serviceHostingEnvironment&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;At least one prefix must be specified, but you can list more than one if needed.&lt;/p&gt;</description>
      <pubDate>2016-06-28T16:58:24.8100000</pubDate>
      <link>http://support.surroundtech.com/thread/fix-this-collection-already-contains-an-address-with-scheme-http-error-in-bp-service-deployments/</link>
    </item>
    <item>
      <title>Authentication fallback options for Accelerator</title>
      <description>&lt;p&gt;Accelerator's authentication method, AB_FrameworkViewModel.am_ValidateUserAndGetSysEntity(), uses WebAppSettings.config settings in the Accelerator BP Service to determine which authentication service to use: Accelerator's FWUS user table, IBMi user authentication, or Active Directory. This has been a problem when different user interfaces, for example an internal WPF application and an external website, want to use different authentication services. In the past we've needed to deploy the Accelerator BP Service Host twice, with different config settings, talking to the same A4DN database.&lt;/p&gt;&#xD;
&lt;p&gt;Starting in Accelerator 6.3.1.0 the am_ValidateUserAndGetSysEntity() method takes a new optional argument TryAuthTypes. This is a set of Flags that indicate which authentication services to use. &lt;/p&gt;&#xD;
&lt;p&gt;In this code example, an MVC application authenticates using either Active Directory or Accelerator:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; fh = HttpContext.Current.ApplicationInstance.ap_FrameworkHelper();&#xD;
&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; retArgs = fh.ap_ViewModel.am_ValidateUserAndGetSysEntity(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_ValidateUserInputArgs(&#xD;
    Int32.Parse(ConfigurationManager.AppSettings[&lt;span style="color: #a31515;"&gt;"SystemNumber"&lt;/span&gt;]), username, password)&#xD;
{&#xD;
    TryAuthTypes = AB_ValidateUserInputArgs.AuthTypes.ActiveDirectory | AB_ValidateUserInputArgs.AuthTypes.Accelerator&#xD;
});&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;The values for TryAuthTypes are Configured, Accelerator, IBMi, and ActiveDirectory. The default is Configured, which implements the pre-6.3.1.0 behavior. Any other value(s) override the behavior so that each authentication service is tried in turn. The order is fixed: Active Directory, IBMi, then Accelerator. The first one that passes will cause the authentication to succeed.&lt;/p&gt;&#xD;
&lt;p&gt;When using multiple types, the configuration settings which tell the BP service which authentication to use are ignored, but the other settings which enable authentication (eg: Active Directory server url and credentials) are still used.&lt;/p&gt;&#xD;
&lt;p&gt;These changes &lt;em&gt;only&lt;/em&gt; impact authentication: determining if the username is an active account and that the password is correct. The rest of the user security system has not been changed in any way.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-06-21T18:16:59.1700000</pubDate>
      <link>http://support.surroundtech.com/thread/authentication-fallback-options-for-accelerator/</link>
    </item>
    <item>
      <title>Finding circular references in Views</title>
      <description>&lt;p&gt;You can run the following&amp;nbsp;query to find any direct circular references in the views tables (FWVW).&lt;/p&gt;&#xD;
&lt;pre&gt;SELECT *&lt;br&gt;FROM FWVW a&lt;br&gt;INNER JOIN FWVW b ON a.FWVWIVNM = b.FWVWNM &lt;br&gt;WHERE a.FWVWNM = b.FWVWIVNM&lt;/pre&gt;</description>
      <pubDate>2016-06-09T20:47:31.6430000</pubDate>
      <link>http://support.surroundtech.com/thread/finding-circle-references-in-views/</link>
    </item>
    <item>
      <title>Displaying a Custom Popup Toolbar with Commands</title>
      <description>&lt;p class="MsoNormal"&gt;&lt;span style="color: #1f497d; mso-fareast-language: JA;"&gt;&lt;span style="font-size: 11pt; font-family: Calibri, sans-serif;"&gt;The Accelerator allows you to override the default &amp;ldquo;POPUP&amp;rdquo; toolbar within a DataGrid by specifying your own custom CommandBar to appear in its place.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;hr&gt;&#xD;
&lt;p class="MsoNormal"&gt;&lt;span style="color: #1f497d;"&gt;&lt;span style="font-size: 11pt; font-family: Calibri, sans-serif;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #1f497d; mso-fareast-language: JA;"&gt;&lt;span style="font-size: 11pt; font-family: Calibri, sans-serif;"&gt;The command bars (I.E. Commands groupings that show up: When expanding the menus for File/Tools/Navigator/etc; When you right-click a record; In the header of a DataGrid, etc) are each defined in the &amp;ldquo;Command Bars&amp;rdquo; module in our maintenance:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal"&gt;&lt;span style="color: #1f497d;"&gt;&lt;span style="font-size: 11pt; font-family: Calibri, sans-serif;"&gt;&lt;img src="/content/uploads/ec719553-d9f3-4786-af00-a57201746f61/0e1f691f-eea7-4c3b-8de9-a62000e62aab_pic1.jpg?width=690&amp;amp;upscale=false" alt="Command Bars in Maintenance"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p class="MsoNormal"&gt;&lt;span style="color: #1f497d;"&gt;&lt;span style="font-size: 11pt; font-family: Calibri, sans-serif;"&gt;All command bars are assigned a type:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;TOOLBAR &amp;ndash; Meant to be displayed as a list, visible at all times. An example of this is the Commands in the header of a DataGrid.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;MENUBAR &amp;ndash; Meant to be displayed as a dropdown, visible when the menu button is clicked. An example of this is the &amp;ldquo;File&amp;rdquo; menu at the top of the system window.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li class="MsoNormal"&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;POPUP &amp;ndash; Meant to be displayed as a list, visible when right-clicking on a single record. An example of this is the context menu displayed when right-clicking inside of a DataGrid.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;Since Command Bars are just a group of commands, you&amp;rsquo;ll first need&amp;nbsp;to create a new Command Bar specifically for the right-click menu in the grid. Name the Command Bar whatever you want, but ensure that the &amp;ldquo;Type&amp;rdquo; is &amp;ldquo;POPUP&amp;rdquo;. We will link this to the module shortly, though this must be done from the Modules window.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;Next, add the Commands to the Command Bar. Each Command Bar record has a &amp;ldquo;Command Elements&amp;rdquo; tab that contains the list of commands in the command bar. A full list of Commands is available in the &amp;ldquo;Commands&amp;rdquo; module (also visible in maintenance). Note that you can always add a new command to the system if you need to define&amp;nbsp;a new user operation.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;&lt;img src="/content/uploads/ec719553-d9f3-4786-af00-a57201746f61/837aec1e-df52-4793-9444-a62000e73b34_pic2.jpg?width=690&amp;amp;upscale=false" alt="Command Bar's Command Elements"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;Now that we&amp;rsquo;ve created the command grouping and populated it with commands, we need to tell the system where and when to display it. To accomplish this, we need to navigate to the &amp;ldquo;Modules&amp;rdquo; window and link the command back to the right-click menu. In the &amp;ldquo;Modules&amp;rdquo; window, find the relevant module and go to the &amp;ldquo;Command Bars&amp;rdquo; tab. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;Here, you can use the QuickAdd to add your new Command Bar to the module. Use a command bar location of &amp;ldquo;Module&amp;rdquo; (this is a module-level command that applies to all grids for this module), then choose your command bar from the &amp;ldquo;Command Bar&amp;rdquo; field. Lastly, select &amp;ldquo;Replace Higher Level Toolbars&amp;rdquo;, as we want your new command bar to be the only one providing commands to this menu.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;&lt;img src="/content/uploads/ec719553-d9f3-4786-af00-a57201746f61/c8062bc5-8816-4ef8-b18f-a62000e79af3_pic3.jpg?width=690&amp;amp;upscale=false" alt="Quick Add Command Bar"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span color="#1f497d" face="Calibri, sans-serif" style="color: #1f497d; font-family: Calibri, sans-serif;"&gt;&lt;span style="font-size: 14.6667px;"&gt;Once everything has been entered, hit &amp;ldquo;Add&amp;rdquo; to link the Command Bar to the module. Because you specified &amp;ldquo;POPUP&amp;rdquo; during command bar creation, the command will automatically be added as a POPUP command bar. When right-clicking, only your new list of commands should appear.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <pubDate>2016-06-09T14:15:02.4100000</pubDate>
      <link>http://support.surroundtech.com/thread/displaying-a-custom-popup-toolbar-with-commands/</link>
    </item>
    <item>
      <title>How to Call a DB2 Stored Procedure</title>
      <description>&lt;p&gt;The current recommended method for calling DB2 stored procedures is to create a helper class to be reused in all instances where stored procedures are necessary. The recommended location for this class is in your BOS.Shared assembly.&lt;/p&gt;&#xD;
&lt;hr&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Create a Shared Helper Class&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Since you will be calling the DB2 database directly, you need to add the following reference to your helper class's project:&amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre&gt;using &lt;strong&gt;IBM.Data.DB2.iSeries&lt;/strong&gt;;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;Create a class 'StoredProcedureHelper.cs' in the BOS.Shared project, which should already exist in your 'System' solution folder. This new StoredProcedureHelper class is defined below.&lt;/p&gt;&#xD;
&lt;pre&gt;using System;&lt;br&gt;using System.Collections.Generic;&lt;br&gt;using System.Linq;&lt;br&gt;using System.Text;&lt;br&gt;using System.Data;&lt;br&gt;using A4DN.Core.BOS.DALBaseForSQL;&lt;br&gt;using IBM.Data.DB2.iSeries;&lt;br&gt;&lt;br&gt;namespace BOS.NewProductManagerShared&lt;br&gt;{&lt;br&gt;    public static class StoredProcedureHelper&lt;br&gt;    {&lt;br&gt;        public static object[] CallStoredProcedure(string SPName, StoredProcParam[] spParams, IAB_Interpreter ap_SQLHandler)&lt;br&gt;        {&lt;br&gt;            if (SPName == null)&lt;br&gt;                throw new ArgumentException(BOS.NewProductManagerShared.Properties.MessageResource.StoredProcNameError);&lt;br&gt;            &lt;br&gt;            object[] rtnvals = null;&lt;br&gt;            try&lt;br&gt;            {&lt;br&gt;                using (iDB2Command cmd = new iDB2Command())&lt;br&gt;                {&lt;br&gt;                    cmd.CommandText = ap_SQLHandler.ap_ConnectionParms.Collection + "." + SPName.ToUpper();&lt;br&gt;                    cmd.CommandType = CommandType.StoredProcedure;&lt;br&gt;                    cmd.Connection = ap_SQLHandler.ap_Connection as iDB2Connection;&lt;br&gt;&lt;br&gt;                    if (ap_SQLHandler.ap_Connection.State != ConnectionState.Open) {&lt;br&gt;                        ap_SQLHandler.ap_Connection.Open();&lt;br&gt;                    }&lt;br&gt;&lt;br&gt;                    IList&amp;lt;iDB2Parameter&amp;gt; _outs = new List&amp;lt;iDB2Parameter&amp;gt;();&lt;br&gt;                    foreach (StoredProcParam param in spParams)&lt;br&gt;                    {&lt;br&gt;                        var _db2param = new iDB2Parameter(param.Name, param.Type, param.Size)&lt;br&gt;                        {&lt;br&gt;                            Direction = param.Dir&lt;br&gt;                        };&lt;br&gt;&lt;br&gt;                        if (param.Type == iDB2DbType.iDB2Decimal)&lt;br&gt;                            _db2param.Precision = (byte)param.Precision;&lt;br&gt;                        if (_db2param.Direction == ParameterDirection.Input)&lt;br&gt;                            _db2param.Value = param.Value;&lt;br&gt;                        else&lt;br&gt;                            _outs.Add(_db2param);&lt;br&gt;&lt;br&gt;                        cmd.Parameters.Add(_db2param);&lt;br&gt;                    }&lt;br&gt;&lt;br&gt;                    cmd.ExecuteReader();&lt;br&gt;&lt;br&gt;                    rtnvals = new object[_outs.Count];&lt;br&gt;                    for (int i = 0; i &amp;amp;lt; _outs.Count; i++)&lt;br&gt;                        rtnvals[i] = _outs[i].Value;&lt;br&gt;                }&lt;br&gt;            }&lt;br&gt;            catch&lt;br&gt;            {&lt;br&gt;                throw;&lt;br&gt;            }&lt;br&gt;&lt;br&gt;            return rtnvals;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    public class StoredProcParam&lt;br&gt;    {&lt;br&gt;        public string Name;&lt;br&gt;        public ParameterDirection Dir;&lt;br&gt;        public object Value;&lt;br&gt;        public iDB2DbType Type;&lt;br&gt;        public int Size;&lt;br&gt;        public int Precision;&lt;br&gt;&lt;br&gt;        public StoredProcParam()&lt;br&gt;        {&lt;br&gt;        }&lt;br&gt;&lt;br&gt;        public StoredProcParam(string _Name, ParameterDirection _Dir, object _Value, iDB2DbType _Type, int _Size, int _Precision)&lt;br&gt;        {&lt;br&gt;            this.Name = _Name;&lt;br&gt;            this.Dir = _Dir;&lt;br&gt;            this.Value = _Value;&lt;br&gt;            this.Type = _Type;&lt;br&gt;            this.Size = _Size;&lt;br&gt;            this.Precision = _Precision;&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;/pre&gt;</description>
      <pubDate>2016-06-03T19:25:35.2100000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-call-a-db2-stored-procedure/</link>
    </item>
    <item>
      <title>Add a Webpage Module</title>
      <description>&lt;p&gt;The AB_WebPageExplorer explorer component allows the addition of a module that requires zero coding and displays a web page using the WebBrowser Control. &amp;nbsp;Launch the Accelerator Maintenance and Click on the "System" Module.&lt;/p&gt;&#xD;
&lt;p&gt;Step 1: Select the System that you want this&amp;nbsp;new web page module to be added.&lt;/p&gt;&#xD;
&lt;p&gt;Step 2: Click the "Modules" tab in the Preview Area.&lt;/p&gt;&#xD;
&lt;p&gt;Step 3: Click the "Quick Add" button to show the quick add.&lt;/p&gt;&#xD;
&lt;p&gt;Step 4: Either select an existing Application or you have the option to create a new application by clicking on the "New" button next to the drop down.&lt;/p&gt;&#xD;
&lt;p&gt;Step 5: Create a new Module by clicking the "New" Button. &amp;nbsp;If you already created the module, then select the module you want to add.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/6e04252e-aa41-4a37-8862-a61801817cbc_2016-06-01-19-16-02.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Step 6: On the New Module Detail, specify the Module Name, Description and Image. &amp;nbsp;The Image must be an image that either exists in the Accelerator Core images folder or in your own image folder located in your WPF System Core Project.&lt;/p&gt;&#xD;
&lt;p&gt;Step 7: Change the Module Type to "Web Explorer".&lt;/p&gt;&#xD;
&lt;p&gt;Step 8: Specify the Web Page URL.&lt;/p&gt;&#xD;
&lt;p&gt;Step 9: Save and Close the Module Detail.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/c6e94031-0ef0-4de6-9d03-a61801832141_2016-06-01-19-25-49.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Step 10: Back at the Quick Add; Click the Add Button to add the new module to your&amp;nbsp;application.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/b921c462-5043-4ea0-b115-a6180183a6b8_2016-06-01-19-30-28.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Step 11: &amp;nbsp;Run you system and click on the new Module. &amp;nbsp;The website you sepcified should be loaded.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/af0439e4-ce1f-46c4-bbb5-a61801851bab_2016-06-01-19-36-25.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Step 12: You will notice that the system command bars are being used. &amp;nbsp;You can add module level command bars to your new module that replace the higher level command bars so that you only have the commands you want available.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-06-01T23:38:00.1700000</pubDate>
      <link>http://support.surroundtech.com/thread/add-a-webpage-module/</link>
    </item>
    <item>
      <title>Tracking down Binding Issues</title>
      <description>&lt;p&gt;Here is a great article detailing multiple ways to track down any binding issues you might be having. &amp;nbsp;&lt;a href="https://blogs.msdn.microsoft.com/wpfsldesigner/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application/"&gt;Binding Issues Article&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>2016-05-31T18:19:15.4030000</pubDate>
      <link>http://support.surroundtech.com/thread/tracking-down-binding-issues/</link>
    </item>
    <item>
      <title>Create a new Workflow Instance</title>
      <description>&lt;p&gt;You can create new Workflow Instances from MVC or WPF apps, or from a BP service host. Start by adding to your project a reference to the Workflow Client Integration assembly, which is in the A4DN Maintenance path:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;Reference Include=&lt;span style="color: #a31515;"&gt;"A4DN.WF.BOS.ClientIntegration"&lt;/span&gt;&amp;gt;&#xD;
  &amp;lt;SpecificVersion&amp;gt;False&amp;lt;/SpecificVersion&amp;gt;&#xD;
  &amp;lt;HintPath&amp;gt;$(A4DNMaintenanceHintPath)A4DN.WF.BOS.ClientIntegration.dll&amp;lt;/HintPath&amp;gt;&#xD;
&amp;lt;/Reference&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;This assembly provides two attributes, an interface, and a utility method that will be used to create a new Workflow Instance.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;[WF_WorkflowInstance("MyWorkflow")] is added to a class that contains properties which correspond to the workflow's custom fields. "MyWorkflow" is the namespace of the Workflow.&lt;/li&gt;&#xD;
&lt;li&gt;[WF_WorkflowField] is added to each property. The property name should match the custom field name, but if it doesn't the field name can be specified in the attribute.&lt;/li&gt;&#xD;
&lt;li&gt;WF_IWorkflowInstanceData is an interface that the class must implement. There are no properties or methods to add; this is used as a hook for extension methods.&lt;/li&gt;&#xD;
&lt;li&gt;this.am_AddToWorkQueue() is an extension method that you call to create the new Workflow Instance.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Here's a simple example of a utility class that's only used for workflow:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;[WF_WorkflowInstance("TrialConfirmation")]&#xD;
&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;DemoConfirmation&lt;/span&gt; : WF_IWorkflowInstanceData&#xD;
{&#xD;
    [WF_WorkflowField]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; Token { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&#xD;
&#xD;
    [WF_WorkflowField]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; Email { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&#xD;
&#xD;
    [WF_WorkflowField]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; IPAddress { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&#xD;
&#xD;
    [WF_WorkflowField]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; UserAgent { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&#xD;
&#xD;
    [WF_WorkflowField]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; Referer { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Another class can use this to create a new instance for the TrialConfirmation workflow:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DemoConfirmation&#xD;
{&#xD;
    Token = token,&#xD;
    Email = email,&#xD;
    IPAddress = HttpContext.Current.Request.UserHostAddress,&#xD;
    UserAgent = HttpContext.Current.Request.UserAgent,&#xD;
    Referer = HttpContext.Current.Request.UrlReferrer == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; ? &lt;span style="color: #a31515;"&gt;""&lt;/span&gt; : HttpContext.Current.Request.UrlReferrer.OriginalString&#xD;
}.am_AddToWorkQueue(instanceName: &lt;span style="color: #a31515;"&gt;"Trial Registration Confirmation for "&lt;/span&gt; + email);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;The DemoConfirmation object is being created, its am_AddToWorkQueue() method is called, and then the object is destroyed. When used this way, there's no need to hold onto the object that's being passed to Workflow. The instanceName argument is used to set the text that will be displayed in the Workflow Instance search results grid; it can be set per-instance, or it can be set as a default in the [WF_WorkflowInstance] attribute.&lt;/p&gt;&#xD;
&lt;p&gt;Another typical approach is to add the workflow attributes and interface to an existing data model class, such as a data entity. That will give the model an am_AddToWorkQueue() method which can be called to add itself to a workflow. The attributes are designed so that they can be added to any class without interfering with the class or forcing any particular naming convention on the properties.&lt;/p&gt;</description>
      <pubDate>2016-05-25T16:51:36.3670000</pubDate>
      <link>http://support.surroundtech.com/thread/create-a-new-workflow-instance/</link>
    </item>
    <item>
      <title>Throttle requests to MVC Website</title>
      <description>&lt;p&gt;When you have forms on your website (login forms, search forms, registration forms, etc) or any request that needs to do a lot of work, it's usually a good idea to throttle those requests to prevent automated scripts from using the form and overloading your server.&lt;/p&gt;&#xD;
&lt;p&gt;Add this statement to your Controller class:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; A4DN.Core.MVC.Base.Infrastructure.Attributes.Action;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;Then add the [AB_RequestThrottle] to the request handlers you want to throttle:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;[HttpPost]&#xD;
[AB_RequestThrottle]&#xD;
&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult SubmitRegistration(DemoRegistrationModel model)&#xD;
{&#xD;
    ...&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;Each time this method is used, an entry is created/updated in HttpContext.Cache using the key "AB_RequestThrottle.SubmitRegistration.{IP Address}.Count. The initial value of the entry is 0 and it gets incremented for each use. The attribute will then delay processing the request by 200ms per access. So, the first time an IP address uses the method, the delay is 0ms, then 200ms, then 400ms, etc. If there are no requests for 5 minutes, the cache entry will be deleted and the counter is reset.&lt;/p&gt;&#xD;
&lt;p&gt;The timing can be adjusted by using optional arguments:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;[AB_RequestThrottle(CooldownMinutes = 5, PerRequestSleepMS = 200)]&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-05-25T15:40:26.1270000</pubDate>
      <link>http://support.surroundtech.com/thread/throttle-requests-to-mvc-website/</link>
    </item>
    <item>
      <title>Styling full-width banner images in CMS web pages</title>
      <description>&lt;p&gt;Many modern website designs make use of a graphic banner at the top of the page which spans the full page width, scales automatically with changes in the browser window width, and which has content (like titles) overlaid on top of it. A CSS background image can be used to achieve these effects.&lt;/p&gt;&#xD;
&lt;p&gt;The HTML markup is simple: an overall "banner" container, within that is a "banner-image" element whose background will be the image, and inside that is a "banner-content" element that holds the overlaid content.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;div class=&lt;span style="color: #a31515;"&gt;"banner"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;div class=&lt;span style="color: #a31515;"&gt;"banner-image"&lt;/span&gt;&amp;gt;&#xD;
        &amp;lt;div class=&lt;span style="color: #a31515;"&gt;"banner-content"&lt;/span&gt;&amp;gt;&#xD;
        &amp;lt;/div&amp;gt;&#xD;
    &amp;lt;/div&amp;gt;&#xD;
&amp;lt;/div&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;The CSS for styling the image set the banner height, the image url, the positioning of the image relative to the banner-image element, and rules for scaling.&lt;/p&gt;&#xD;
&lt;p&gt;background-size: cover will scale the image so that it covers the full width and height of the element without distorting the image. If the element's dimensions aren't the same ratio as the images, the image will be cropped on either the top and bottom or left and right sides.&lt;/p&gt;&#xD;
&lt;p&gt;background-position controls how the image gets cropped. In this example, a point that is 50% of the images width from the left edge, and 30% from the image's top, will be fixed to a point that is 50% from the left and 30% from the top of the banner-image element.&lt;/p&gt;&#xD;
&lt;p&gt;These two styles are the ones you'll need to adjust based on the image you're working with.&lt;/p&gt;&#xD;
&lt;p&gt;For background-container, the example creates a box that is 1170px wide, positioned 20px down from the top of the background image, and centered horizontally. (auto margins for left and right will center the element.)&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;style&amp;gt;&#xD;
&lt;span style="color: #2b91af;"&gt;.banner-image&lt;/span&gt; {&#xD;
    &lt;span style="color: #0000ff;"&gt;background-image&lt;/span&gt;: &lt;span style="color: #a31515;"&gt;url("/media/architecture.jpg")&lt;/span&gt;;&#xD;
    &lt;span style="color: #0000ff;"&gt;background-position&lt;/span&gt;: &lt;span style="color: #0000ff;"&gt;left&lt;/span&gt; 50% &lt;span style="color: #0000ff;"&gt;top&lt;/span&gt; 30%;&#xD;
    &lt;span style="color: #0000ff;"&gt;background-repeat&lt;/span&gt;: &lt;span style="color: #0000ff;"&gt;no-repeat&lt;/span&gt;;&#xD;
    &lt;span style="color: #0000ff;"&gt;background&lt;/span&gt;-&lt;span style="color: #0000ff;"&gt;size&lt;/span&gt;: cover;&#xD;
    &lt;span style="color: #0000ff;"&gt;height&lt;/span&gt;: 300px;&#xD;
}&#xD;
&#xD;
&lt;span style="color: #2b91af;"&gt;.banner-content&lt;/span&gt; {&#xD;
    &lt;span style="color: #0000ff;"&gt;width&lt;/span&gt;: 1170px;&#xD;
    &lt;span style="color: #0000ff;"&gt;margin&lt;/span&gt;: 20px &lt;span style="color: #0000ff;"&gt;auto&lt;/span&gt;;&#xD;
}&#xD;
&#xD;
&lt;span style="color: #0000ff;"&gt;@media&lt;/span&gt; (max-width: 767px) {&#xD;
    &lt;span style="color: #2b91af;"&gt;.banner-image&lt;/span&gt; {&#xD;
        &lt;span style="color: #0000ff;"&gt;background-position&lt;/span&gt;: &lt;span style="color: #0000ff;"&gt;center&lt;/span&gt;; &#xD;
    }&#xD;
    &lt;span style="color: #2b91af;"&gt;.banner-content&lt;/span&gt; {&#xD;
        &lt;span style="color: #0000ff;"&gt;width&lt;/span&gt;: 100%;&#xD;
    }&#xD;
}&#xD;
&amp;lt;/style&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;The @media rule at the end adjust the styles for small devices, using 767px or narrower as the breakpoint for changing the style. The image's position is changed to be centered, and the content is changed to be full width instead of fixed at 1170px. Typically, several media rules would be used for different breakpoints to adjust the size and position of the banner content.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-05-19T19:04:13.3470000</pubDate>
      <link>http://support.surroundtech.com/thread/styling-full-width-banner-images-in-cms-web-pages/</link>
    </item>
    <item>
      <title>Utilizing the Resource Monitor</title>
      <description>&lt;p&gt;You can use Window's built-in Resource Monitor to help debug your live Applications.&lt;/p&gt;&#xD;
&lt;p&gt;Whereas the Processes tab of the Task Manager will give you a simplified list of the processes running on your machine, the resource monitor will provide a detailed account of the resources your processes are consuming. This includes a memory footprint and list of referenced DLLs/files, which can be useful if you are trying to resolve dependency issues in a live environment.&lt;/p&gt;&#xD;
&lt;p&gt;When used alongside other development tools, the Resource Monitor can be a useful tool for diagnosing issues with a process.&lt;/p&gt;&#xD;
&lt;hr&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The Resource Monitor contains CPU, Memory, Disk and Network tabs that will display all used resources that fall into those categories. Processes that have not performed I/O recently will not appear in the Disk or Network tabs.&lt;/p&gt;&#xD;
&lt;p&gt;You can drill down to a particular process (or processes) by selecting one via the checkbox to the left of the Process, in the "Processes" section. Alternatively, selecting the checkbox in the section's header will select all Processes in the list.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/ec719553-d9f3-4786-af00-a57201746f61/df73ecf4-b5b6-465b-bfa4-a60b012279a1_resourcemonitor-2.jpg?width=690&amp;amp;upscale=false" alt="Resource Monitor"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The monitor will remember the last 60 seconds of activity since the window was opened. If you are trying to get more detailed information about a small moment in time, you can pause the monitor. Pausing the Resource Monitor will prevent new information from being collected and old information from being discarded.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;hr&gt;&#xD;
&lt;p&gt;To access the Resource Monitor (resmon.exe), open up the Run window and enter &lt;strong&gt;resmon&lt;/strong&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/ec719553-d9f3-4786-af00-a57201746f61/44e3e9ce-f03d-4d93-8e63-a60b0121d203_resourcemonitor-1.jpg?width=690&amp;amp;upscale=false" alt="Open resmon.exe"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Alternatively, there is a "Resource Monitor' button in the "Performance" tab of the Task Manager.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/ec719553-d9f3-4786-af00-a57201746f61/8b89260d-27a6-4e3b-a773-a60b01260e54_resourcemonitor-3.jpg?width=690&amp;amp;upscale=false" alt="Resource Monitor button"&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;em&gt;The Resource Monitor is available on all machines running Windows 7 or greater.&amp;nbsp;&lt;/em&gt;&lt;/p&gt;</description>
      <pubDate>2016-05-19T17:38:25.5800000</pubDate>
      <link>http://support.surroundtech.com/thread/utilizing-the-resource-monitor/</link>
    </item>
    <item>
      <title>In an MVC application, get the website's absolute url</title>
      <description>&lt;p&gt;In an MVC project, the URL for any given handler depends upon where the web application is deployed. While running out of Visual Studio, a handler like MyController.Index() will have a url like http://localhost:5555/MyController/Index. If the web application is deployed to its own IIS website the url will be http://hostname.com/MyController/Index, but if it is deployed as a virtual application in a shared IIS website the url would be http://hostname.com/virtappname/MyController/Index. Finally, UrlHelper methods like Url.Action("Index", "MyController") will return a url path that's relative to the deployment path: /MyController/Index.&lt;/p&gt;&#xD;
&lt;p&gt;To get the absolute URL for the root of the web application, use this:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; homeUrl = VirtualPathUtility.ToAbsolute(Url.Content(&lt;span style="color: #a31515;"&gt;"~/"&lt;/span&gt;));&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;Url.Content() will parse the ~/ at the start of a url string and expand it based on the application's deployment root; either / or /virtappname/ in the examples above. Url is the current UrlHelper object, which is available inside controllers and views. In other classes you can create a helper:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; urlHelper = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; UrlHelper(HttpContext.Current.Request.RequestContext);&#xD;
&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; homeUrl = VirtualPathUtility.ToAbsolute(urlHelper.Content(&lt;span style="color: #a31515;"&gt;"~/"&lt;/span&gt;));&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;You can use any of the UrlHelper methods here, such as Url.Action().&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; homeUrl = VirtualPathUtility.ToAbsolute(Url.&#xD;
Action(&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"MyController"&lt;/span&gt;));&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;However, when using Action() there is a shortcut: the fourth parameter, which is optional, can be used to specify the HTTP scheme to use (http or https). When that is specifed, Action() will return an absolute url instead of a url path that's relative to the deployment root.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; homeUrl = Url.&#xD;
Action(&lt;span style="color: #a31515;"&gt;"Index"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"MyController"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, Request.Url.Scheme);&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;Request is also made available in controllers and views. In other classes use HttpContext.Current.Request.Url.Scheme.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-05-12T18:32:48.0670000</pubDate>
      <link>http://support.surroundtech.com/thread/in-an-mvc-application-get-the-website-s-absolute-url/</link>
    </item>
    <item>
      <title>Add DataAnnotations validation attributes to entity classes you can't modify</title>
      <description>&lt;p&gt;When using a data entity / model class that is defined by a Web Service Reference, you cannot add DataAnnotations attributes to it directly. (The code is in a generated References.cs file that gets overwritten when you update the service reference.) The generated web service entity class uses &lt;em&gt;partial&lt;/em&gt;, which allows you to specify a separate class for the attributes.&lt;/p&gt;&#xD;
&lt;p&gt;In this example, ContactsEntity is a generated class from the ContactsService service reference. We add [MetadataType] to specify where the attributes can be found. Nothing else needs to be modified (though, if you need to, you can add additional properties here for use in your views and controllers.)&lt;/p&gt;&#xD;
&lt;p&gt;Note that this class must be in the same namespace as the generated class.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; MVC.SurroundTechWebsite.ContactsService&#xD;
{&#xD;
    [MetadataType(typeof(ContactsEntityMetadata))]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ContactsEntity&lt;/span&gt;&#xD;
    {&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;To add attributes, implement the metadata class with fields whose names and types match the entity class' properties, and then add attributes to those fields. This class can be in the same namespace, but that's not required.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;ContactsEntityMetadata&lt;/span&gt;&#xD;
{&#xD;
    [Required(AllowEmptyStrings = false, ErrorMessage = "Required")]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; FirstName;&#xD;
        &#xD;
    [Required(AllowEmptyStrings = false, ErrorMessage = "Required")]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; LastName;&#xD;
        &#xD;
    [Required(AllowEmptyStrings = false, ErrorMessage = "Required")]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; CompanyName;&#xD;
        &#xD;
    [Required(AllowEmptyStrings = false, ErrorMessage = "Required")]&#xD;
    [DataType(DataType.PhoneNumber)]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; PhoneNumber;&#xD;
        &#xD;
    [Required(AllowEmptyStrings = false, ErrorMessage = "Required")]&#xD;
    [DataType(DataType.EmailAddress)]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; Email;&#xD;
        &#xD;
    [DataType(DataType.Url)]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; Website;&#xD;
&#xD;
    [DataType(DataType.MultilineText)]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; AdditionalComments;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-05-12T15:01:43.3300000</pubDate>
      <link>http://support.surroundtech.com/thread/add-dataannotations-validation-attributes-to-entity-classes-you-can-t-modify/</link>
    </item>
    <item>
      <title>How to parse entity key fields out of a unique key string</title>
      <description>&lt;p&gt;Sometimes all you know about a data entity record is its unique key string. This can be from a reference to a&amp;nbsp; parent record, passed as miscellaneous input to a BOS method, or in MVC applications it can be passed through a url query parameter or post body.&lt;/p&gt;&#xD;
&lt;p&gt;The unique key string is a concatenation of the entity's [AB_Key] properties. To access those individual properties, use the am_ParseUniqueKeyIntoProperties() method:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; customerPartEntity = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; OECustomerPartEntity { ap_UniqueKey = InputArgs.ap_MiscellaneousInput };&#xD;
customerPartEntity.am_ParseUniqueKeyIntoProperties();&#xD;
ode.CUSTOMERPARTNUMBER = customerPartEntity.PartNumber;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;In this example the key was passed in ap_MiscellaneousInput. It could have originally come from either the ap_UniqueKey or the ap_CompactUniqueKey property on the entity. A new entity is created an ap_UniqueKey is set to the key string, and then am_ParseUniqueKeyIntoProperties() is called. This will set all of the [AB_Key] properties, which can then be accessed individually. &lt;/p&gt;&#xD;
&lt;p&gt;To get other fields, the entity can be used as input to either am_Fetch or am_Select once its [AB_Key] fields are set. Though, in this case the call to am_ParseUniqueKeyIntoProperies() isn't necessary if am_Fetch() is used, because am_Fetch() will call it automatically.&lt;/p&gt;</description>
      <pubDate>2016-05-11T16:18:48.4470000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-parse-entity-key-fields-out-of-a-unique-key-string/</link>
    </item>
    <item>
      <title>Datamaps - Join to the same table twice - Part 2</title>
      <description>&lt;p style="box-sizing: border-box; margin: 0px 0px 10px; font-size: 15px; overflow-x: hidden; font-family: 'Open Sans', Arial, Helvetica, sans-serif;"&gt;This is a continuation from the following discussion:&lt;/p&gt;&#xD;
&lt;p style="box-sizing: border-box; margin: 0px 0px 10px; font-size: 15px; overflow-x: hidden; font-family: 'Open Sans', Arial, Helvetica, sans-serif;"&gt;&lt;a href="/thread/datamaps-join-to-the-same-table-twice/"&gt;Datamaps - Join to the same table twice - Part 1&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Add Join Relationships&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Now we need to add 2 join relationships in the am_LoadRelationshipMaps method. &amp;nbsp;Both of these joins will be similar but they will use different joinTableAlias. &amp;nbsp;Also, the fields that you are joining on should be different.&lt;/p&gt;&#xD;
&lt;pre style="font-family: Consolas; font-size: 13; color: black; background: white;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: gray;"&gt;summary&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Loads&amp;nbsp;maps&amp;nbsp;to&amp;nbsp;join&amp;nbsp;two&amp;nbsp;database&amp;nbsp;files.&lt;/span&gt;&#xD;
&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: gray;"&gt;summary&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AB_RelationshipMap&lt;/span&gt;&amp;gt;&amp;nbsp;am_LoadRelationshipMaps()&#xD;
{&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;relationshipMap&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AB_RelationshipMapsDictionary&lt;/span&gt;(ap_PrimaryTable);&#xD;
 &#xD;
 &#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;relationshipMap.am_AddRelationshipMap(JoinTableName,&amp;nbsp;useDistinctJoins:&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;,&amp;nbsp;joinTableAlias:&amp;nbsp;JoinTableAlias1)&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.am_JoinWhere(primaryTableField:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"PrimaryFieldJoinKey1"&lt;/span&gt;,&amp;nbsp;joinTableField:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"JoinKey"&lt;/span&gt;);&#xD;
 &#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;relationshipMap.am_AddRelationshipMap(JoinTableName,&amp;nbsp;useDistinctJoins:&amp;nbsp;&lt;span style="color: blue;"&gt;false&lt;/span&gt;,&amp;nbsp;joinTableAlias:&amp;nbsp;JoinTableAlias2)&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.am_JoinWhere(primaryTableField:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"PrimaryFieldJoinKey2"&lt;/span&gt;,&amp;nbsp;joinTableField:&amp;nbsp;&lt;span style="color: #a31515;"&gt;"JoinKey"&lt;/span&gt;);&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;return&lt;/span&gt;&amp;nbsp;relationshipMap;&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Add datamaps for Join Fields&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Once the relationship maps are added we can now setup the datamaps for the join fields. &amp;nbsp;They are the same as normal join field datamaps with the exception that for the targetTable: instead of specifing the Join Table Name we need to use the Join Table Alias.&lt;/p&gt;&#xD;
&lt;pre style="font-family: Consolas; font-size: 13; color: black; background: white;"&gt;&lt;span style="color: green;"&gt;//Join&amp;nbsp;Alias&amp;nbsp;1&amp;nbsp;fields&lt;/span&gt;&#xD;
maps.am_AddDataMap(&lt;span style="color: #a31515;"&gt;"JoinField1"&lt;/span&gt;,&amp;nbsp;ExampleEntity.JoinTableAlias1JoinField1Property,&amp;nbsp;targetTable:&amp;nbsp;JoinTableAlias1);&#xD;
maps.am_AddDataMap(&lt;span style="color: #a31515;"&gt;"JoinField2"&lt;/span&gt;,&amp;nbsp;ExampleEntity.JoinTableAlias1JoinField2Property,&amp;nbsp;targetTable:&amp;nbsp;JoinTableAlias1);&#xD;
 &#xD;
&lt;span style="color: green;"&gt;//Join&amp;nbsp;Alias&amp;nbsp;2&amp;nbsp;fields&lt;/span&gt;&#xD;
maps.am_AddDataMap(&lt;span style="color: #a31515;"&gt;"JoinField1"&lt;/span&gt;,&amp;nbsp;ExampleEntity.JoinTableAlias2JoinField1Property,&amp;nbsp;targetTable:&amp;nbsp;JoinTableAlias2);&#xD;
maps.am_AddDataMap(&lt;span style="color: #a31515;"&gt;"JoinField2"&lt;/span&gt;,&amp;nbsp;ExampleEntity.JoinTableAlias2JoinField2Property,&amp;nbsp;targetTable:&amp;nbsp;JoinTableAlias2);&lt;/pre&gt;&#xD;
&lt;p&gt;Notice that the two sets of join fields are the same field names from the database tables but use different properties on the Entity.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-04-18T14:06:13.0230000</pubDate>
      <link>http://support.surroundtech.com/thread/datamaps-join-to-the-same-table-twice-part-2/</link>
    </item>
    <item>
      <title>Datamaps - Join to the same table twice - Part 1</title>
      <description>&lt;p&gt;In order to join to the same table twice we need to alais the tables. &amp;nbsp;This is supported in the Accelerator Datamaps and is an option to Alias the tables by default when generating a module.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Define constants for tables&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;pre style="font-family: Consolas; font-size: 13; color: black; background: white;"&gt;&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;PrimaryTableName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"[dbo].[PrimaryTable]"&lt;/span&gt;;&#xD;
&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;PrimaryTableAlias&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"primaryTableAlias"&lt;/span&gt;;&#xD;
&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;JoinTableName&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"[dbo].[JoinTable]"&lt;/span&gt;;&#xD;
&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;JoinTableAlias1&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"joinTableAlias1"&lt;/span&gt;;&#xD;
&lt;span style="color: blue;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;JoinTableAlias2&amp;nbsp;=&amp;nbsp;&lt;span style="color: #a31515;"&gt;"joinTableAlias2"&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Setup alias for Primary Table&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Now in the am_LoadFieldMaps method we setup the primary table to use the alias name. &amp;nbsp;If your code is using the AB_DataMapsDictionary for creating the datamaps all you need to do is set the ap_PrimaryTable to the alias name and the ap_AliasedTable to the actual primary table name.&lt;/p&gt;&#xD;
&lt;pre style="font-family: Consolas; font-size: 13; color: black; background: white;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: gray;"&gt;summary&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Defines&amp;nbsp;the&amp;nbsp;maps&amp;nbsp;for&amp;nbsp;the&amp;nbsp;Data&amp;nbsp;Source&amp;nbsp;Field&amp;nbsp;Names&amp;nbsp;and&amp;nbsp;Entity&amp;nbsp;Properties&amp;nbsp;for&amp;nbsp;module.&lt;/span&gt;&#xD;
&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: gray;"&gt;summary&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: blue;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: blue;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: blue;"&gt;string&lt;/span&gt;,&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AB_DataSourcePropertyReference&lt;/span&gt;&amp;gt;&amp;nbsp;am_LoadFieldMaps(&lt;span style="color: blue;"&gt;string&lt;/span&gt;&amp;nbsp;qualifier)&#xD;
{&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//&amp;nbsp;Set&amp;nbsp;the&amp;nbsp;Primary&amp;nbsp;File&amp;nbsp;Name,&amp;nbsp;Foreign&amp;nbsp;fields&amp;nbsp;will&amp;nbsp;have&amp;nbsp;to&amp;nbsp;be&amp;nbsp;mapped&amp;nbsp;on&amp;nbsp;a&amp;nbsp;case-by-case&amp;nbsp;basis&lt;/span&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap_PrimaryTable&amp;nbsp;=&amp;nbsp;PrimaryTableAlias;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ap_AliasedTable&amp;nbsp;=&amp;nbsp;PrimaryTableName;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green;"&gt;//Create&amp;nbsp;a&amp;nbsp;dictionary&amp;nbsp;to&amp;nbsp;hold&amp;nbsp;the&amp;nbsp;maps&lt;/span&gt;&#xD;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue;"&gt;var&lt;/span&gt;&amp;nbsp;maps&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;AB_DataMapsDictionary&lt;/span&gt;(ap_PrimaryTable,&amp;nbsp;qualifier);&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;Continued in the following discussion:&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/datamaps-join-to-the-same-table-twice-part-2/"&gt;Datamaps - Join to the same table twice - Part 2&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;</description>
      <pubDate>2016-04-18T13:34:56.3670000</pubDate>
      <link>http://support.surroundtech.com/thread/datamaps-join-to-the-same-table-twice/</link>
    </item>
    <item>
      <title>Bypass WPF logon to support Single Sign On (SSO)</title>
      <description>&lt;p&gt;Please refer to this discussion&amp;nbsp;&lt;a href="/thread/setting-up-wcf-services-to-use-ssl/"&gt;setting up WCF to use SSL&lt;/a&gt;. This is required for SSO. You also must be at Accelerator Version 6.2.1 or greater.&lt;/p&gt;&#xD;
&lt;p&gt;Make sure that you set the ClientCredentialType to "Windows"&lt;/p&gt;&#xD;
&lt;p&gt;In you system WPF startup project, open the App.xaml.cs.&lt;/p&gt;&#xD;
&lt;p&gt;Override the am_Initialize() method and add the code in bold below. The ap_UserName and ap_Password will be passed to the service and will be used to look up the user in the Accelerator User Table FWUS. &amp;nbsp;The ap_UserName is being set to the Windows Identity current user. &amp;nbsp;Refer to this documentation regarding the &lt;a href="https://msdn.microsoft.com/en-us/library/system.security.principal.windowsidentity(v=vs.110).aspx"&gt;WindowsIdentity Class&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;The ap_UserName must be a valid Accelerator User with a User Group that has authority to the system. You have the option to set the password or leave it blank. &amp;nbsp;Whatever you choose, make sure it matches the password in the FWUS table for the Accelerator User. &amp;nbsp;If you do use the password, then it will need to be the same for all users.&lt;/p&gt;&#xD;
&lt;p&gt;The call to the base.am_Dologin() will run the login code, &amp;nbsp;You need to also override the method am_ShowLogon and comment out the base call. This will stop the login from showing.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_Initialize()&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_Initialize();&#xD;
&#xD;
    &lt;strong&gt;AB_DataPropertyController.ap_UserIdentityStore.ap_UserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;&#xD;
    AB_DataPropertyController.ap_UserIdentityStore.ap_Password = &lt;span style="color: #a31515;"&gt;""&lt;/span&gt;;&#xD;
&#xD;
    &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_DoLogin();&lt;/strong&gt;&#xD;
}&#xD;
&#xD;
&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_ShowLogon(AB_LogonBase logonWindow, AB_LogonStartUpTabOption startOption)&#xD;
{&#xD;
    &lt;span style="color: #008000;"&gt;//  base.am_ShowLogon(logonWindow, startOption);&lt;/span&gt;&#xD;
}&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-04-12T15:12:06.1670000</pubDate>
      <link>http://support.surroundtech.com/thread/bypass-wpf-logon-to-support-single-sign-on-sso/</link>
    </item>
    <item>
      <title>Setting up WCF services to use SSL</title>
      <description>&lt;p&gt;By default, an Accelerator generated system has SSL turned off. With a few steps, it is easy to turn this capability on.&lt;/p&gt;&#xD;
&lt;p&gt;Here are the steps:&lt;/p&gt;&#xD;
&lt;p&gt;1)&amp;nbsp;In the Web.config for the Accelerator services and your System&amp;nbsp;services, you need to add a security and transport element to the bindings element. &amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;bindings&amp;gt;&#xD;
  &amp;lt;!-- A4DN_Tag: Binding Quota Size --&amp;gt;&#xD;
  &amp;lt;basicHttpBinding&amp;gt;&#xD;
    &amp;lt;binding name=&lt;span style="color: #a31515;"&gt;"BasicHttpWithBigQuota"&lt;/span&gt; maxReceivedMessageSize=&lt;span style="color: #a31515;"&gt;"2147483647"&lt;/span&gt;&amp;gt;&#xD;
      &amp;lt;readerQuotas maxDepth=&lt;span style="color: #a31515;"&gt;"64"&lt;/span&gt; maxStringContentLength=&lt;span style="color: #a31515;"&gt;"2147483647"&lt;/span&gt; maxArrayLength=&lt;span style="color: #a31515;"&gt;"2147483647"&lt;/span&gt; maxBytesPerRead=&lt;span style="color: #a31515;"&gt;"4096"&lt;/span&gt; maxNameTableCharCount=&lt;span style="color: #a31515;"&gt;"16384"&lt;/span&gt; /&amp;gt;&#xD;
      &amp;lt;!-- For SSL Deployment, uncomment the &amp;lt;security&amp;gt; element below --&amp;gt;&#xD;
      &lt;strong&gt;&amp;lt;security mode=&lt;span style="color: #a31515;"&gt;"Transport"&lt;/span&gt;&amp;gt;&#xD;
        &amp;lt;transport clientCredentialType=&lt;span style="color: #a31515;"&gt;"Windows"&lt;/span&gt;/&amp;gt;&#xD;
      &amp;lt;/security&amp;gt;&lt;/strong&gt;&#xD;
    &amp;lt;/binding&amp;gt;&#xD;
  &amp;lt;/basicHttpBinding&amp;gt;&#xD;
&amp;lt;/bindings&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;2) Set the clientCredentialType.&amp;nbsp;The enum &lt;a href="https://msdn.microsoft.com/en-us/library/system.servicemodel.httpclientcredentialtype(v=vs.110).aspx"&gt;HttpClientCredenttialType&lt;/a&gt;&amp;nbsp;has the valid values. For example, if you set it to "Windows", the client windows credentials will be passed to the WCF service. In you use this, you need to make sure that the windows authentication is enabled in IIS for the service.&lt;/p&gt;&#xD;
&lt;p&gt;3) Verify that all endpoints have the bindingConfiguration equal to BasicHttpWithBigQuota.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;service name=&lt;span style="color: #a31515;"&gt;"BOS.CustomerBusinessProcess.CustomerBP"&lt;/span&gt; behaviorConfiguration=&lt;span style="color: #a31515;"&gt;"BOS.EasyBuyCyclesBPServiceHost.Service1Behavior"&lt;/span&gt;&amp;gt;&#xD;
  &amp;lt;endpoint address=&lt;span style="color: #a31515;"&gt;""&lt;/span&gt; binding=&lt;span style="color: #a31515;"&gt;"basicHttpBinding"&lt;/span&gt; contract=&lt;span style="color: #a31515;"&gt;"BOS.CustomerBusinessProcess.ICustomerBPServiceContract"&lt;/span&gt; &lt;strong&gt;bindingConfiguration=&lt;span style="color: #a31515;"&gt;"BasicHttpWithBigQuota"&lt;/span&gt;&lt;/strong&gt; /&amp;gt;&#xD;
  &amp;lt;endpoint address=&lt;span style="color: #a31515;"&gt;"mex"&lt;/span&gt; binding=&lt;span style="color: #a31515;"&gt;"mexHttpBinding"&lt;/span&gt; contract=&lt;span style="color: #a31515;"&gt;"IMetadataExchange"&lt;/span&gt; /&amp;gt;&#xD;
&amp;lt;/service&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;4) In the Services.Config, set the BindingSecurityMode to "Transport" and set the BindingTransportClientCredentialType to the same value you set clientCredentialType in the Web.config. &amp;nbsp;You will need to set these setting on both the system and accelerator web services. You also need to change the address from "http" to https". &lt;strong&gt;Note: The BindingTransportClientCredentialType key is only supported with&amp;nbsp;Accelerator Version 6.2.1 or greater.&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;system.bp&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Address"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"https://localhost/EasyBuyCycles/"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"ConnectionType"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"WebServices"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Binding"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"BasicHttpBinding"&lt;/span&gt; /&amp;gt;&#xD;
   &lt;strong&gt; &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"BindingSecurityMode"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Transport"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"BindingTransportClientCredentialType"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Windows"&lt;/span&gt; /&amp;gt;&lt;/strong&gt;&#xD;
&amp;lt;/system.bp&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;5) Publish your Accelerator and System Services to IIS.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-04-12T14:51:27.3830000</pubDate>
      <link>http://support.surroundtech.com/thread/setting-up-wcf-services-to-use-ssl/</link>
    </item>
    <item>
      <title>Fix "Argument Null Exception" when creating a module's BP object in another module's BP class</title>
      <description>&lt;p&gt;When your BP class in one module needs to talk to the BP for another module, you might write code like this:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;AB_FrameworkBusinessObjectProcessBase&amp;lt;TermsCodeEntity&amp;gt; _termsBP;&#xD;
AB_FrameworkBusinessObjectProcessBase&amp;lt;TermsCodeEntity&amp;gt; _TermsBP&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (_termsBP == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&#xD;
        {&#xD;
            Type bpType = Type.GetType(&lt;span style="color: #a31515;"&gt;"BOS.TermsCodeBusinessProcess.TermsCodeBP, BOS.TermsCodeBusinessProcess, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"&lt;/span&gt;);&#xD;
            _termsBP = Activator.CreateInstance(bpType) &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AB_FrameworkBusinessObjectProcessBase&amp;lt;TermsCodeEntity&amp;gt;;&#xD;
        }&#xD;
        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _termsBP;&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;em&gt;One reason to use code like this is when your BP modules need to talk to each other through methods inherited from AB_FrameworkBusinessObjectProcessBase. If the BPs referenced each other directly you'd have a cirular reference problem, and neither BP could be compiled cleanly. But if one BP uses reflection it can instantiate the other BP at runtime, and since the methods it is calling are in the base class there's no compile-time dependency on the referenced module's non-base methods.&lt;/em&gt;&lt;/p&gt;&#xD;
&lt;p&gt;For this code to work, the BP project needs to include a reference to BOS.TermsCodeBusinessProcess. Otherwise bpType will be null, and CreateInstance will throw an Argument Null Exception.&lt;/p&gt;&#xD;
&lt;p&gt;Since reflection is being used and the type is specified with a string, this is not a compile-time error. It won't become a problem until run-time. Even then, it won't always be a problem; if this module is referenced in a program that also references BOS.TermsCodeBusinessProcess, GetType will be able to find the dll and won't return null. The exception will only occur when this module is used separately from BOS.TermsCodeBusinessProcess.&lt;/p&gt;&#xD;
&lt;p&gt;In this particular case, there's no need for reflection. If you already know the Type of object you need to create, add the reference and instantiate the object normally:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;AB_FrameworkBusinessObjectProcessBase&amp;lt;TermsCodeEntity&amp;gt; _termsBP;&#xD;
AB_FrameworkBusinessObjectProcessBase&amp;lt;TermsCodeEntity&amp;gt; _TermsBP&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (_termsBP == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&#xD;
        {&#xD;
            _termsBP = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; TermsCodeBusinessProcess.TermsCodeBP();&#xD;
        }&#xD;
        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; _termsBP;&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Reflection should only be used when you don't know the Type until run-time, and all you have is a string containing the type's full name. And in that case, you need to make sure that you've got references to all of the possible types you might have to instantiate in every application where your code is used.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-31T14:40:11.4200000</pubDate>
      <link>http://support.surroundtech.com/thread/fix-argument-null-exception-when-creating-a-module-s-bp-object-in-another-module-s-bp-class/</link>
    </item>
    <item>
      <title>NuGetPackages folder and Version Control</title>
      <description>&lt;p&gt;When using the NuGet Package Manager in Visual Studio, you will get files installed to a packages folder in your source tree. In Accelerator-generated systems we include a nuget.config file at the top of the source tree which contains this configuration:&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;configuration&amp;gt;&#xD;
  &amp;lt;config&amp;gt;&#xD;
    &amp;lt;add key=&lt;span style="color: #a31515;"&gt;"repositoryPath"&lt;/span&gt; value=&lt;span style="color: #a31515;"&gt;".\NuGetPackages"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;/config&amp;gt;&#xD;
&amp;lt;/configuration&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;This tells NuGet to install the packages for all projects into the top-level NuGetPackages folder.&lt;/p&gt;&#xD;
&lt;p&gt;The packages will almost always include dll files, and will often include exe files too. Version Control systems, like Git and TFS, will usually ignore these file types by default. Whenever you add a new NuGet package, you have to make sure you manually add all of the package's files to source control.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Git (TortoiseGit):&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Right-click on the NuGetPackages folder and find the TortoiseGit menu option "Add...". In the dialog that appears, check the "Include ignored files" checkbox at the bottom to see the dlls, exes, and other ignored file types. Select them all and commit.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;TFS&lt;/strong&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Open the Source Control Explorer, and expand to see the NuGetPackages folder. Right-click and choose "Add items to folder". In the dialog select all of the package folders and click the Next button. The next dialog has two tabs: Items to Add and Excluded Items. Open the Excluded Items tab, select everything, and click on the Include Items text in the lower right of the tab. This will add all of the files to your Pending Changes list so you can check them in.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-23T13:46:13.3270000</pubDate>
      <link>http://support.surroundtech.com/thread/nugetpackages-folder-and-version-control/</link>
    </item>
    <item>
      <title>Debugging Modules Window</title>
      <description>&lt;p&gt;Visual Studio has a window that allows you to see all the DLL's that are loaded when running your system. Along with the DLLs that are loaded it also provides information such as DLL version, last modified date, and whether the debug symbols are loaded. This is very handy to make sure the correct DLL has loaded. &amp;nbsp;Many times I have made changes to code and thought my code didn't work just to realize that my code changes were not picked up and loaded and that an older version of the DLL was being used instead. &amp;nbsp;This window will help you ensure that the DLL you expected is what was actually loaded at runtime.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;To acess this window during debug, click the menu item Debug --&amp;gt; Windows --&amp;gt; Modules (Ctrl+Alt+U)&lt;/p&gt;&#xD;
&lt;p&gt;Here is what it looks like in action:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/65afb6b0-b344-4468-bf17-a5cd01360154_2016-03-18-14-22-06.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Here is some additional information from MSDN:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="https://msdn.microsoft.com/en-us/library/4c8f14c9.aspx"&gt;https://msdn.microsoft.com/en-us/library/4c8f14c9.aspx&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-18T18:49:16.4570000</pubDate>
      <link>http://support.surroundtech.com/thread/debugging-modules-window/</link>
    </item>
    <item>
      <title>Accelerator Views</title>
      <description>&lt;p&gt;In the Accelerator Maintenance, you have the ability to add multiple views to a module based on how the module is used. &amp;nbsp;How the module is used is based on the Standard Base Interface Record. The SB Interface Record allows you to change what view or views are used based on the parent component name (The class object name where the module will be loaded). &amp;nbsp;If the SB Interface record is blank, that indicates that the module is being loaded from the navigator as a main module. &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/535e71fa-7d34-4611-8af3-a5cd00d747fd_2016-03-18-09-04-21.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;You can specifiy a default view, the number of records to load, and whether or not to show the explorer bar and/or auto load the content window based on the default view. &lt;strong&gt;Note:&lt;/strong&gt; You must&amp;nbsp;have a default view per module location.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/cc090afc-af56-4bbb-bd47-a5cd00d6eda1_2016-03-18-09-03-01.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;A view can be reused by multiple modules. &amp;nbsp;You will notice that the above detail is a View Reference. The word "Reference" means that you are referening a view and then setting information on how the view will be used per module location.&lt;/p&gt;&#xD;
&lt;p&gt;An Accelerator View allows you to specify what view columns you want the Users to be able to see. You then have the ability to hide/show the columns, set the display position, column width, sort and sort position, and whether you want the column to show in the extended view(Not supported in WPF).&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Note: This is setting the default for the view. &amp;nbsp;Each user can overide this based on their individual preferences.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/184b3ccb-59c7-47e0-abb3-a5cd00db1914_2016-03-18-08-57-47.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;You can specify multiple columns to sort on with the sort position. &amp;nbsp;The Accelerator framework will add an Order By to the query based on this information.&lt;/p&gt;&#xD;
&lt;p&gt;This is what the above Accelerator View looks like at runtime. &amp;nbsp;Notice what columns are shown, the display sequence, column width and sort.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/96c6c55d-0d87-4160-ba08-a5cd00dbe607_2016-03-18-08-58-18.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The user can override the view by click on the (1) view settings button located at the bottom of each datagrid. The user can make changes and then click OK. This will save the settings to their profile. &amp;nbsp;The User can reset to the default view settings by (2) clicking the default button.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/4901d8cf-8e04-47b1-b6dc-a5cd00dccf6a_2016-03-18-09-24-14.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;When creating an Accelerator View, you can inherit the view columns from another view and then just specify what you want to be different. &amp;nbsp;This can include adding addition columns that are not on the inherited view. This inheritence will make it much easier for you to create multiple variances of a view.&lt;/p&gt;&#xD;
&lt;p&gt;Here is an example of (1) "View by Legal Name" inheriting "View by Name". (2) The "View by Legal Name" contains 2 &amp;nbsp;columns that are different. (3) The display position and visible state are being overriden.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/d3dfe02f-f66a-46d9-97a1-a5cd00e04097_2016-03-18-09-29-40.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-18T13:36:33.1470000</pubDate>
      <link>http://support.surroundtech.com/thread/accelerator-views/</link>
    </item>
    <item>
      <title>Adding Google Maps and Bing Maps to your WPF Detail and Content Preview</title>
      <description>&lt;p&gt;You can add a google maps tab or a bing maps tab to your WPF detailer and/or content window preview.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Here are the steps:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Open your WPF Detail XAML.&lt;/li&gt;&#xD;
&lt;li&gt;Add the following Namespace:&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;xmlns:datapresentation=&lt;span style="color: #a31515;"&gt;"clr-namespace:A4DN.Core.WPF.Base.DataPresentation;assembly=A4DN.Core.WPF.Base"&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;If you are using the AB_DockingTabControl, then use the following XAML to add the google and bing maps tab item to your TabControl.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt; &amp;lt;datapresentation:AB_GoogleMapDockingTab x:Name=&lt;span style="color: #a31515;"&gt;"GoogleMapsTab"&lt;/span&gt; ap_FullAddress=&lt;span style="color: #a31515;"&gt;"{Binding Path=MapAddress}"&lt;/span&gt; Visibility=&lt;span style="color: #a31515;"&gt;"{Binding Source={StaticResource CustomerVM}, Path=IsMapTabVisible, Converter={StaticResource boolToVisibilityConverter}}"&lt;/span&gt;/&amp;gt;&#xD;
            &amp;lt;datapresentation:AB_BingMapDockingTab x:Name=&lt;span style="color: #a31515;"&gt;"BingMapsTab"&lt;/span&gt; ap_Address=&lt;span style="color: #a31515;"&gt;"{Binding Path=MapAddress}"&lt;/span&gt; Visibility=&lt;span style="color: #a31515;"&gt;"{Binding Source={StaticResource CustomerVM}, Path=IsMapTabVisible, Converter={StaticResource boolToVisibilityConverter}}"&lt;/span&gt;/&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;If you are using the AB_TabControl, then use the following XAML to add the google and bing maps tab item to your TabControl.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt; &amp;lt;datapresentation:AB_GoogleMapTab x:Name=&lt;span style="color: #a31515;"&gt;"GoogleMapsTab"&lt;/span&gt; ap_FullAddress=&lt;span style="color: #a31515;"&gt;"{Binding Path=MapAddress}"&lt;/span&gt; Visibility=&lt;span style="color: #a31515;"&gt;"{Binding Source={StaticResource CustomerVM}, Path=IsMapTabVisible, Converter={StaticResource boolToVisibilityConverter}}"&lt;/span&gt;/&amp;gt;&#xD;
            &amp;lt;datapresentation:AB_BingMapTab x:Name=&lt;span style="color: #a31515;"&gt;"BingMapsTab"&lt;/span&gt; ap_Address=&lt;span style="color: #a31515;"&gt;"{Binding Path=MapAddress}"&lt;/span&gt; Visibility=&lt;span style="color: #a31515;"&gt;"{Binding Source={StaticResource CustomerVM}, Path=IsMapTabVisible, Converter={StaticResource boolToVisibilityConverter}}"&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;In both cases, you will need to supply a property in your entity that has the full address and bind ap_FullAddress to that property. You can also create a dependency property in your viewmodel code to control when the tab is visible. For example, you may want to set the tab to collapsed on a new record.&lt;/p&gt;&#xD;
&lt;p&gt;Here is how the MapAddress property is defined in our EasyBuy system.&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;[AB_VirtualMember]&#xD;
&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt; MapAddress&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0} {1} {2} {3} {4}"&lt;/span&gt;, BillingAddress1, BillingAddress2, BillingAddress3, BillingPostalCode, BillingCountry);&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;In the Detail Code Behind, you will need to set the datacontext on the tabs and you have the option to show the tabs in the content window preview. &lt;strong&gt;(Note: use AB_DockingTabItem if you are using the AB_DockingTabControl and AB_TabItem if you are using AB_TabControl.)&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #008000;"&gt;// Add Google and Bing Maps to Content Window Preview&lt;/span&gt;&#xD;
am_AddTabToPreview(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_DockingTabItem[] { GoogleMapsTab, BingMapsTab });&#xD;
&lt;span style="color: #008000;"&gt;// Set DataContext on tabs so that the can bind to properties in the entity&lt;/span&gt;&#xD;
ap_AdditionalTabItemsToSetDataContextOn.Add(GoogleMapsTab);&#xD;
ap_AdditionalTabItemsToSetDataContextOn.Add(BingMapsTab);&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;Tabs will now show and look like this:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/8d0b32ae-1e88-4909-a200-a5cc0171e430_2016-03-17-18-27-09.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-17T22:26:51.1500000</pubDate>
      <link>http://support.surroundtech.com/thread/adding-google-maps-and-bing-maps-to-your-wpf-detail-and-content-preview/</link>
    </item>
    <item>
      <title>Drop down with Re:new using AB_NewlookDropdownController</title>
      <description>&lt;p&gt;The AB_NewlookDropdownController is a class used to simplify the process of loading a combobox on a Newlook screen using data from the Accelerator for .NET. This class can be used in any&amp;nbsp;WPF detailer that inherits AB_NewlookDetails Detailer. In the following example the steps to implement a newlook dropdown will be followed using the EasyBuy Auto Parts System as an example.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Setting up the Newlook Screen&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In order for the AB_Newlook dropdown to work properly it must be setup based on the following naming convention:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;A combobox control with the following properties set. This is not added in the designer, but by setting your field in the 'Identify' editor to the type 'Combo Entry Field'&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Name: Set to a name appropriate to the combo box. In this example the name is 'ParentName' Substitute this value anywhere you see in this document, as all other newlook controls are based off of this.&lt;/li&gt;&#xD;
&lt;li&gt;Sorted: False&lt;/li&gt;&#xD;
&lt;li&gt;Variable: var&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;A 'Search' CommandButton (Optional)&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Name: Search&lt;/li&gt;&#xD;
&lt;li&gt;TakeFocusOnClick: True, this allows the event to be trapped in the .net portion of the solution&lt;/li&gt;&#xD;
&lt;li&gt;Picture: @\Images\Find.png, the find image will need to be in the \Images directory of your newlook solution. Image&lt;/li&gt;&#xD;
&lt;li&gt;PictureSize: PicSizeStretch&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;An 'Open' CommandButton (Optional)&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Name: Open&lt;/li&gt;&#xD;
&lt;li&gt;TakeFocusOnClick: True, this allows the event to be trapped in the .net portion of the solution&lt;/li&gt;&#xD;
&lt;li&gt;Picture: @\Images\Vb_open2.png, the find image will need to be in the \Images directory of your newlook solution. Image&lt;/li&gt;&#xD;
&lt;li&gt;PictureSize: PicSizeStretch&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;An 'New' CommandButton (Optional)&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Name: New&lt;/li&gt;&#xD;
&lt;li&gt;TakeFocusOnClick: True, this allows the event to be trapped in the .net portion of the solution&lt;/li&gt;&#xD;
&lt;li&gt;Picture: @\Images\Vb_new.png, the find image will need to be in the \Images directory of your newlook solution. Image&lt;/li&gt;&#xD;
&lt;li&gt;PictureSize: PicSizeStretch&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;A hidden Entry field for the 'key'. This is used to set the actual value based on the combobox value. This is only necessary if you have a key as well as a value and you do not wish to show the key.&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Variable: varID&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Setting up the .Net Detailer&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Step 1: Create an instance of AB_NewlookDropdownController and set appropriate properties in the am_OnInitialized() Method&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;ap_SbInterfaceReferenceID: This must be setup in the SB Interface Modue, each module should ahve a generated dropdown entry&lt;/li&gt;&#xD;
&lt;li&gt;ap_NewlookControlName: Name of the combo entry field setup in the newlook screen&lt;/li&gt;&#xD;
&lt;li&gt;ap_DetailType: Type of Detail Opened when clicking the Open or New command buttons&lt;/li&gt;&#xD;
&lt;li&gt;ap_ViewModelType: View Model type used to select data to populate the combo box&lt;/li&gt;&#xD;
&lt;li&gt;ap_EntityType: Type of entity returned by the View Model Selection&lt;/li&gt;&#xD;
&lt;li&gt;ap_DisplayMemberFieldName: Name of the 'Value' field in the entity&lt;/li&gt;&#xD;
&lt;li&gt;ap_KeyFieldName: Name of the 'key' field in the entity&lt;/li&gt;&#xD;
&lt;li&gt;ap_CurrentView: View used to sort/filter combo box items&lt;/li&gt;&#xD;
&lt;li&gt;ap_ScreenName: Screen the combo box should be populated on&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Step 2: Enroll AB_NewlookDropdownController in ap_NewlookDropdownControllers collection&lt;/li&gt;&#xD;
&lt;/ul&gt;</description>
      <pubDate>2016-03-17T21:24:50.2130000</pubDate>
      <link>http://support.surroundtech.com/thread/drop-down-with-re-new-using-ab_newlookdropdowncontroller/</link>
    </item>
    <item>
      <title>Multiple Usergroups in Accelerator Security</title>
      <description>&lt;p&gt;Accelerator Security has been improved in version 6.2.0.0 to now support&amp;nbsp;two different methods&amp;nbsp;of handling multiple user groups for a single user. &amp;nbsp;The two different methods are inclusive and exclusive security. &amp;nbsp;By default the security mode is set to inclusive when working with multiple user groups. This configuration&amp;nbsp;can be changed in the web.config appSettings in the Accelerator Services by setting the following key to false.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;!--Multiple User Group Security Option --&amp;gt;&#xD;
&amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Framework.IsMultipleUserGroupSecurityInclusive"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"false"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Inclusive (true):&amp;nbsp;&lt;/strong&gt;If the security mode is set to be inclusive this will mean that the user will have access if any of the enrolled usergroups have access to that object.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Exclusive (false):&lt;/strong&gt; If the security mode is set to be exclusive this will mean that the user will have access to an object only if all of the enrolled usergroups have access to the object.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Previous to Accelerator 6.2.0.0&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Previous to the Accelerator version 6.2.0.0 the multiple usergroup security did not work correctly. &amp;nbsp;It would give you access to objects&amp;nbsp;that were enrolled in the first added usergroup and then to all modules in any applications that were added to any additional enrolled usergroups.&lt;/p&gt;</description>
      <pubDate>2016-03-15T19:53:00.6200000</pubDate>
      <link>http://support.surroundtech.com/thread/multiple-usergroups-in-accelerator-security/</link>
    </item>
    <item>
      <title>Data grid view columns are not showing correctly as defined by the Accelerator View</title>
      <description>&lt;p&gt;If you change the View Columns for your View using the Accelerator Maintenance and don't see the correct columns in your content window datagrid, then try the following troubleshooting steps:&lt;/p&gt;&#xD;
&lt;p&gt;1) Make sure you have a Datamap defined for the column and make sure the string name matches your view column name. In this case, the view column name is YD1CIID.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;maps.am_AddDataMap(&lt;span style="color: #a31515;"&gt;"YD1CIID"&lt;/span&gt;, CustomerEntity.CustomerInternalIDProperty);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;2) Make sure you don't have any user Column overrides that are being applied. To clear this, run your system and navigate to the module that has the changed view settings. Click the "Edit View Settings" button.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/1ec2695c-32b3-4ce1-b561-a5c3011b56d2_2016-03-08-12-09-43.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Then click (1) the default button and then click (2) OK.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/f49b1cab-592d-4e5e-8b90-a5c3011b7cc7_2016-03-08-12-10-19.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;The User Override will be deleted and you will be using the defaut view which should contain your view column changes.&lt;/p&gt;&#xD;
&lt;p&gt;3) Try clearing the Accelerator Cache.&lt;/p&gt;</description>
      <pubDate>2016-03-08T17:13:54.1430000</pubDate>
      <link>http://support.surroundtech.com/thread/data-grid-view-columns-are-not-showing-correctly-as-defined-by-the-accelerator-view/</link>
    </item>
    <item>
      <title>Debugging the Accelerator Core Code</title>
      <description>&lt;p&gt;When you install the Accelerator, the core dlls are included in release and debug versions as well as all the source code is included.&lt;/p&gt;&#xD;
&lt;p&gt;The release DLLs are what your projects reference from default generation.&lt;/p&gt;&#xD;
&lt;p&gt;Here are the folder paths based on installing&amp;nbsp;at&amp;nbsp;C:\Program Files\Accelerator for .NET\v6_2\.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Core Release DLLS&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;C:\Program Files\Accelerator for .NET\v6_2\Core\DotNet&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Core Debug&amp;nbsp;DLLS&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;C:\Program Files\Accelerator for .NET\v6_2\Core\DotNetDebug&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Source Code files&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;C:\Program Files\Accelerator for .NET\v6_2\Source&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;If you want to debug the Accelerator Code from your system, all you need to do is point your&amp;nbsp;&amp;lt;A4DNCoreHintPath&amp;gt; element that is located in your&amp;nbsp;A4DNReference.msbuild file to the Core\DotNetDebug folder.&lt;/p&gt;&#xD;
&lt;p&gt;You will need to restart your Visual Studio environment for the change to take effect. &amp;nbsp;You can then open the source files located in your source folder and have fun debugging.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; It is also recommended to run your build script. This will ensure the Accelerator DLLs with debug symbols are properly loaded into your bin folder.&lt;/p&gt;&#xD;
&lt;p&gt;Remember to set the &amp;nbsp;Core\DotNetDebug folder back to Core\DotNet when you are finished.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #bc7a00;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;Project&lt;/span&gt; &lt;span style="color: #7d9029;"&gt;xmlns=&lt;/span&gt;&lt;span style="color: #ba2121;"&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNVersion&amp;gt;&lt;/span&gt;6.2.0.0&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNVersion&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNCoreHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\Core\&lt;strong&gt;DotNetDebug&lt;/strong&gt;\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNCoreHintPath&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNSilverlightHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\Core\Silverlight\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNSilverlightHintPath&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNMaintenanceHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\Maintenance\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNMaintenanceHintPath&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNCodeFactoryHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\CodeFactory\Wizards\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNCodeFactoryHintPath&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNJobMonitorHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\JobMonitor\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNJobMonitorHintPath&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-03-08T15:51:17.3170000</pubDate>
      <link>http://support.surroundtech.com/thread/debugging-the-accelerator-core-code/</link>
    </item>
    <item>
      <title>How to Properly add Accelerator DLL references to your Project using A4DNReference.msbuild</title>
      <description>&lt;p&gt;When you need to add Accelerator DLL references to your project, you want to make sure that the version and hint path are pulled from your A4DNReference.msbuild file. &amp;nbsp;This&amp;nbsp;A4DNReference.msbuild file contains the Accelerator version and hintpath for your System. &amp;nbsp;When you upgrade your system using the Upgrade Utility, this is the main file that we are changing. &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Here is what the&amp;nbsp;A4DNReference.msbuild file looks like.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #bc7a00;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;Project&lt;/span&gt; &lt;span style="color: #7d9029;"&gt;xmlns=&lt;/span&gt;&lt;span style="color: #ba2121;"&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;PropertyGroup&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNVersion&amp;gt;&lt;/span&gt;6.2.0.0&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNVersion&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNCoreHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\Core\DotNet\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNCoreHintPath&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNSilverlightHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\Core\Silverlight\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNSilverlightHintPath&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNMaintenanceHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\Maintenance\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNMaintenanceHintPath&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNCodeFactoryHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\CodeFactory\Wizards\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNCodeFactoryHintPath&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;A4DNJobMonitorHintPath&amp;gt;&lt;/span&gt;C:\Program Files\Accelerator for .NET\v6_2\JobMonitor\&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/A4DNJobMonitorHintPath&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/PropertyGroup&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/Project&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;You will notice that the file has the A4DNVersion as well as hint paths such as A4DNCoreHintPath to find the location of a specific Accelerator folder.&lt;/p&gt;&#xD;
&lt;p&gt;By using this file and linking to these variables in your project instead of hard coding this information, you can easily upgrade the Accelerator&amp;nbsp;and all you projects will point to the correct folder and dll version.&lt;/p&gt;&#xD;
&lt;p&gt;To use this A4DNReference.msbuild file, we first need to add an import statement to your project file. &amp;nbsp;The Accelerator generates all your project files with this import statement already included. &amp;nbsp;If you created your own project in Visual Studio, then you need to manually add this import.&lt;/p&gt;&#xD;
&lt;p&gt;To add the import statement, open your project file (.csproj) in a text editor. Add this Import element&amp;nbsp;to the project file after the Project element. Make sure that the relative path to the A4DNReference.msbuild file is correct.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;Project&lt;/span&gt; &lt;span style="color: #7d9029;"&gt;ToolsVersion=&lt;/span&gt;&lt;span style="color: #ba2121;"&gt;"14.0"&lt;/span&gt; &lt;span style="color: #7d9029;"&gt;DefaultTargets=&lt;/span&gt;&lt;span style="color: #ba2121;"&gt;"Build"&lt;/span&gt; &lt;span style="color: #7d9029;"&gt;xmlns=&lt;/span&gt;&lt;span style="color: #ba2121;"&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;Import&lt;/span&gt; &lt;span style="color: #7d9029;"&gt;Project=&lt;/span&gt;&lt;span style="color: #ba2121;"&gt;"../../../A4DNReference.msbuild"&lt;/span&gt; &lt;span style="color: #008000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Once you import the A4DNReference.msbuild file, you can now access the XML elements by using variables like this: $(A4DNVersion),&amp;nbsp;$(A4DNCoreHintPath), $(A4DNMaintenanceHintPath) and so forth...&lt;/p&gt;&#xD;
&lt;p&gt;If you reference an Accelerator DLL via Visual Studio, it will add a reference to your project that looks like this. Notice the hard coded version number and hint path.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;Reference&lt;/span&gt; &lt;span style="color: #7d9029;"&gt;Include=&lt;/span&gt;&lt;span style="color: #ba2121;"&gt;"A4DN.Core.BOS.Base, Version=6.2.0.0, Culture=neutral, PublicKeyToken=a051f91c03e970af, processorArchitecture=MSIL"&lt;/span&gt;&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;SpecificVersion&amp;gt;&lt;/span&gt;False&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/SpecificVersion&amp;gt;&lt;/span&gt;&#xD;
      &lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;HintPath&amp;gt;&lt;/span&gt;..\..\..\..\Program Files\Accelerator for .NET\v6_2\Core\DotNet\A4DN.Core.BOS.Base.dll&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/HintPath&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #008000; font-weight: bold;"&gt;&amp;lt;/Reference&amp;gt;&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-08T15:33:16.8770000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-properly-add-accelerator-dll-references-to-your-project-using-a4dnreference-msbuild/</link>
    </item>
    <item>
      <title>Hiding the Detail and/or Audit tab from the Content Window Preview Pane</title>
      <description>&lt;p&gt;There are 2 properties in the Content WIndow that can be set to hide/show the Detail and/or Audit tab from the Content WIndow Preview Pane. &amp;nbsp;By Default, the boolean flags are set to true (Show). &amp;nbsp;You can easily set them to false (Hide) in the am_SetParentProperties method in your Content Window code behind.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_SetParentProperties()&#xD;
{&#xD;
    RG_SetParentProperties();&#xD;
&#xD;
    ap_CreateDetailPreviewTab = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&#xD;
    ap_CreateAuditPreviewTab = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&#xD;
}&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-03-04T17:18:26.6470000</pubDate>
      <link>http://support.surroundtech.com/thread/hiding-the-detail-and-or-audit-tab-from-the-content-window-preview-pane/</link>
    </item>
    <item>
      <title>Adding Accelerator Modules that reuse the same WPF and BOS code - Scenario 2</title>
      <description>&lt;p&gt;If you have multiple Accelerator modules referencing the same code, you may need to condition in the code based on Module Number. &amp;nbsp;An example would be that you want to load different preview pane sub modules based on the module number.&lt;/p&gt;&#xD;
&lt;p&gt;If you need to condition&amp;nbsp;based on module number, I suggest that you centralize where you hard code the module numbers. &amp;nbsp;This not only gives you insight into what modules you are conditioning on throughout your system, but also allows you to quickly change them if needed.&lt;/p&gt;&#xD;
&lt;p&gt;In this example, I want to load different preview sub modules in the content window and the detail based on whether the module is the Command Groups module or the User Groups module.&lt;/p&gt;&#xD;
&lt;p&gt;The best way to centralize the module numbers is to create an enum. So that it is accessible from anywhere, I would suggest you put the enum class in your system level BOS Shared project.&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; BOS.AcceleratorShared&#xD;
{&#xD;
    &lt;span style="color: #008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000;"&gt;/// Class SharedEnums.&lt;/span&gt;&#xD;
    &lt;span style="color: #008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;SharedEnums&lt;/span&gt;&#xD;
    {&#xD;
&#xD;
        &lt;span style="color: #008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #008000;"&gt;/// Enum Modules&lt;/span&gt;&#xD;
        &lt;span style="color: #008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
       &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;enum&lt;/span&gt; Modules&#xD;
        {&#xD;
            &lt;span style="color: #008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
            &lt;span style="color: #008000;"&gt;/// The command groups&lt;/span&gt;&#xD;
            &lt;span style="color: #008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
           CommandGroups = 90000365,&#xD;
           &lt;span style="color: #008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
           &lt;span style="color: #008000;"&gt;/// The user groups&lt;/span&gt;&#xD;
           &lt;span style="color: #008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
           UserGroups = 90000074,&#xD;
&#xD;
           &#xD;
        }&#xD;
&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;Now that you have the enum, we can condition the preview sub modules in the content window and the detail by changing the ap_SubBrowserLoadID property.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;In the content window&lt;/strong&gt;, you can add the condition below&amp;nbsp;to the RG_SetParentProperties() method. By default, the Accelerator will set the ap_SubBrowserLoadID property to the Content Window Class Name, so you only need to code if you want to change this default value. In the example below, we are changing it only if the module is Command Groups.&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; RG_SetParentProperties()&#xD;
{&#xD;
    &lt;span style="color: #008000;"&gt;// Call Initialize Component im order to access XAML objects in Code Behind&lt;/span&gt;&#xD;
    InitializeComponent();&#xD;
&#xD;
    ap_MainDetailType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(UserGroupsDetail);&#xD;
&#xD;
    &lt;span style="color: #008000;"&gt;// Visual State Manager&lt;/span&gt;&#xD;
    _ViewModel = FindResource(&lt;span style="color: #a31515;"&gt;"UserGroupsViewModel"&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; UserGroupsViewModel;&#xD;
    ap_ViewModel = _ViewModel;&#xD;
    ap_DataMaps = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; UserGroupsMaps().ap_FieldMaps;&#xD;
&#xD;
&#xD;
    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (ap_ModuleEntity.IsModule(SharedEnums.Modules.CommandGroups))&#xD;
    {&#xD;
&#xD;
        &lt;span style="color: #008000;"&gt;// Change SubBowser ID &lt;/span&gt;&#xD;
        ap_SubBrowserLoadID = &lt;span style="color: #a31515;"&gt;"RFWUGY01_COMMANDS"&lt;/span&gt;;&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;In the Detail&lt;/strong&gt;, you will need to override the method am_CreateSubBrowsers and set the ap_SubBrowserLoadID property. By default, the Accelerator will set the ap_SubBrowserLoadID property to the Detail&amp;nbsp;Window Class Name, so you only need to code if you want to change this default value. In the example below, we are changing it only if the module is Command Groups.&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_CreateSubBrowsers()&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (ap_ModuleEntity.IsModule(SharedEnums.Modules.CommandGroups))&#xD;
    {&#xD;
        &lt;span style="color: #008000;"&gt;// Change SubBowser ID &lt;/span&gt;&#xD;
        ap_SubBrowserLoadID = &lt;span style="color: #a31515;"&gt;"FFWUGD01_COMMANDS"&lt;/span&gt;;&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_CreateSubBrowsers();&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;It has been a standard for us to use a different ap_SubBrowserLoadID for the Content Window vs. the Detail Window. This allows you to control what Tabs show in each tab control. There is no reason why you can't use the same ap_SubBrowserLoadID for both locations.&lt;/p&gt;&#xD;
&lt;p&gt;You just need to define each ap_SubBrowserLoadID by creating a Standard Base Interface Record for each Sub Module to show and View References to the Child Module so that it knows what View or Views to load.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-04T16:43:53.5670000</pubDate>
      <link>http://support.surroundtech.com/thread/adding-accelerator-modules-that-reuse-the-same-wpf-and-bos-code-scenario-2/</link>
    </item>
    <item>
      <title>Adding Accelerator Modules that reuse the same WPF and BOS code - Scenario 1</title>
      <description>&lt;p&gt;With the Accelerator, it is possible to define multiple modules in the Accelerator Maintenance that point to the same WPF and BOS code. &amp;nbsp;This ensures a high level of reuse for easy maintenance. &amp;nbsp;An example of why you would do this can be demonstrated with 2 Accelerator Modules. In the Accelerator, we have a file FWUG that has a type field to designate whether the Group is a User Group (Type = "SYSTEM") or a Command Group (Type = "COMMAND"). &amp;nbsp;I want to create 2 separate modules, with 2 separate module names and iconography as well as only show the FWUG records for the Type selected. The best way to do this is to have both modules share the same code base and then condition where appropriate. You can condition on Module number since User Group and Command Group will have different module numbers, but I would recommend that you condition (In this case) based on the Accelerator View in the Business Process layer.&lt;/p&gt;&#xD;
&lt;p&gt;Let me take you through the steps:&lt;/p&gt;&#xD;
&lt;p&gt;Step 1 - Make sure the module is generated. This will give you a module definition for 1 of the types. &amp;nbsp;Change the module information according to match the type.&lt;/p&gt;&#xD;
&lt;p&gt;Step 2 - Create a Search Explorer Bar that will be used by the new module. In the Accelerator, views are tied to the explorer bar and not the module number. We need to create another Explorer Bar that will be used to define the new view(s). Open the module code in Visual Studio. &amp;nbsp;You can create the explorer bar 2 ways. (1) If you want to have different search fields per module, then you need to copy the existing Explorer Bar xaml and code behind and then rename. (2) If you will have the same search fields and just want different views, then you can just create a C# class that inherits the initial explorer bar code behind.&lt;/p&gt;&#xD;
&lt;p&gt;The new C# class will look like this: (In this example, UserGroupsExpBarSearch_RFWUGEBS1 (Type = "SYSTEM") is the original and UserGroupsExpBarSearch_RFWUGEBS2 (Type = "COMMAND") is the new class that inherits from the original.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;&#xD;
&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Linq;&#xD;
&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System.Text;&#xD;
&#xD;
&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; WPF.UserGroups&#xD;
{&#xD;
    &lt;span style="color: #008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #008000;"&gt;/// Class UserGroupsExpBarSearch_RFWUGEBS2. This class used by the Command Groups Module. The Group Type will be "Command".&lt;/span&gt;&#xD;
    &lt;span style="color: #008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af;"&gt;UserGroupsExpBarSearch_RFWUGEBS2&lt;/span&gt; : UserGroupsExpBarSearch_RFWUGEBS1&#xD;
    {&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Step 3&amp;nbsp;- Create New Module and View Reference and View in Accelerator. &lt;strong&gt;In order to make sure the assembly names are correct. It is important to first copy the existing&amp;nbsp;module and save it. &lt;/strong&gt;Then you can change the Module Name, Description, Image, and most importantly the Explorer Bar Item Name which must match your newly created Search Explorer Bar. Save your module again. Then click on the View References and create a new View Reference&amp;nbsp;and View. In this example, I created a new View&amp;nbsp;named "FWUGV01_COMMAND".&lt;/p&gt;&#xD;
&lt;p&gt;Step 4 - Code your query&amp;nbsp;conditions based on view name in the Module Business Process am_Select method.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; AB_SelectReturnArgs am_Select(AB_SelectInputArgs inputArgs)&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (inputArgs.ap_View)&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"FWUGV01_COMMAND"&lt;/span&gt;:&#xD;
&#xD;
            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (inputArgs.ap_Query == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&#xD;
            {&#xD;
                inputArgs.ap_Query = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_Query();&#xD;
            }&#xD;
&#xD;
            &lt;span style="color: #008000;"&gt;// Remove Group Type "SYSTEM" and add Group Type "COMMAND"&lt;/span&gt;&#xD;
            inputArgs.ap_Query.am_RemoveWhereClause(UserGroupsEntity.GroupTypeProperty.ap_PropertyName);&#xD;
            inputArgs.ap_Query.am_AddWhereClause(UserGroupsEntity.GroupTypeProperty.ap_PropertyName, &lt;span style="color: #a31515;"&gt;"="&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"COMMAND"&lt;/span&gt;);&#xD;
&#xD;
            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&#xD;
&#xD;
        &lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&#xD;
&#xD;
            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (inputArgs.ap_Query == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&#xD;
            {&#xD;
                inputArgs.ap_Query = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_Query();&#xD;
            }&#xD;
&#xD;
            &lt;span style="color: #008000;"&gt;// Make sure Group Type "SYSTEM" Exists&lt;/span&gt;&#xD;
            inputArgs.ap_Query.am_RemoveWhereClause(UserGroupsEntity.GroupTypeProperty.ap_PropertyName);&#xD;
            inputArgs.ap_Query.am_AddWhereClause(UserGroupsEntity.GroupTypeProperty.ap_PropertyName, &lt;span style="color: #a31515;"&gt;"="&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"SYSTEM"&lt;/span&gt;);&#xD;
&#xD;
&#xD;
            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&#xD;
&#xD;
    }&#xD;
&#xD;
&#xD;
    &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_Select(inputArgs);&#xD;
}&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-03-04T15:45:22.2230000</pubDate>
      <link>http://support.surroundtech.com/thread/adding-accelerator-modules-that-reuse-the-same-wpf-and-bos-code-scenario-1/</link>
    </item>
    <item>
      <title>Copying Command Bars in the Accelerator Maintenance</title>
      <description>&lt;p&gt;The Accelerator comes with alot of predefined command bars and commands. &amp;nbsp;There are 4 Accelerator systems that can serve as a template to copy command bars.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Accelerator Template 1 - Command Bars to support soft delete. This uses a DELETE command ID instead of the PERMDELETE command ID. All command bars are place in the system toolbar tray.&lt;/li&gt;&#xD;
&lt;li&gt;Accelerator Template 2 - Command Bars to support permanent delete. This uses a PERMDELETE command ID instead of the DELETE command ID. All command bars are place in the system toolbar tray.&lt;/li&gt;&#xD;
&lt;li&gt;Accelerator Template 3 - Command Bars to support soft delete. This uses a DELETE command ID instead of the PERMDELETE command ID. System command bars go in the&amp;nbsp;system toolbar tray and the module record level command bars go in the module toolbar tray.&lt;/li&gt;&#xD;
&lt;li&gt;Accelerator Template 4 - Command Bars to support permanent delete. This uses a PERMDELETE command ID instead of the DELETE command ID. System command bars go in the&amp;nbsp;system toolbar tray and the module record level command bars go in the module toolbar tray.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;You DON'T want to make any changes to command bars with a command ID greater than&amp;nbsp;9000000. These command bars are templates and may be updated with an Accelerator release. &amp;nbsp;If you need to add/remove command elements, then you should copy the command bar, make your changes, and then reference the newly created command bar. This can be done through the Command Bar Module.&lt;/p&gt;&#xD;
&lt;p&gt;You can also copy and reference all command bars from other Systems, Applications, and Modules. &amp;nbsp;This can be done by going to the System Module in the Accelerator Maintenance. (1) Select the System you want to copy command bars to. (2) Select the "Command Bars" tab in the preview. Review the command bars. If you&amp;nbsp;have command bars greater than 9000000, then review the system templates and try to identify which template the command bars came from. It may be worth taking a screen print of the command bars to make sure you don't miss any. It is also wise to back up your Accelerator data as well. Once satisfied, remove all the command bars. (2) Click the "Copy Command Bars" button. (3) Select to copy command bars from another System, Application or Module. &amp;nbsp;Most systems that were generated from the Accelerator Wizards copied the Command Bar references from a template&amp;nbsp;and didn't actually copy the command bars first. That is why you may be referenecing command bars greater that 9000000. If you want to create new command bars by copying the command bars first based on the copy from and then reference the newly created command bars, then make sure to check the "Create and Reference New Command Bars...". (4) Review the Copy To section and then click "Ok". Once you create the new command bars, you can go ahead and make changes without getting clobbered by an Accelerator upgrade.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/aacaaf7f-a1ca-44fa-ba5d-a5bf004a4c26_2016-03-03-23-28-21.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;(1) You will now notice the command bars are no longer greater than 9000000.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/9f1ab37f-25d9-4564-9d61-a5bf004a9898_2016-03-03-23-30-07.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-04T04:16:22.0100000</pubDate>
      <link>http://support.surroundtech.com/thread/copying-command-bars-in-the-accelerator-maintenance/</link>
    </item>
    <item>
      <title>Using the AB_ModuleExplorerStandalonePresenter Content Control Steps 3 and 4</title>
      <description>&lt;p&gt;This is a continuation from the following discussion:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/using-the-ab_moduleexplorerstandalonepresenter-content-control-step-1-and-2/"&gt;http://support.surroundtech.com/thread/using-the-ab_moduleexplorerstandalonepresenter-content-control-step-1-and-2/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Step 3: Add the XAML for the AB_ModuleExplorerStandalonePresenter.&lt;/p&gt;&#xD;
&lt;p&gt;Add the following namespace to your XAML&lt;/p&gt;&#xD;
&lt;pre style="margin-top: 0px; margin-bottom: 0px; line-height: 125%;"&gt; xmlns:&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"clr-namespace:A4DN.Core.WPF.Base;assembly=A4DN.Core.WPF.Base"&lt;/span&gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Add the AB_ModuleExplorerStandalonePresenter control where you want it to show. Make sure you name it using x:Name and set the Module number of the module you are showing and the Standard Base Interface Reference ID from above. &amp;nbsp;You also have properties to set whether to show/hide the Module Explorer Info Area and the Preview Pane. You can optionally add an ae_SubbrowserReady handler.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;:AB_ModuleExplorerStandalonePresenter x:Name=&lt;span style="color: #a31515;"&gt;"CustomerRemarksModuleExplorer"&lt;/span&gt; ap_ModuleNumber=&lt;span style="color: #a31515;"&gt;"90000103"&lt;/span&gt; ap_SBInterfaceReferenceID=&lt;span style="color: #a31515;"&gt;"CustomerRemarksDialog"&lt;/span&gt; ap_ModuleExplorerHeaderIsVisible=&lt;span style="color: #a31515;"&gt;"True"&lt;/span&gt;  ap_ModuleExplorerPreviewIsVisible=&lt;span style="color: #a31515;"&gt;"True"&lt;/span&gt;/&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;Step 4: In the code behind, you can control when the data gets loaded by calling am_LoadRecords() and passing the parent entity. In my example, I am loading the data in the contstructor of the window and passing in the selected customer entity. Remarks will load just for the selected customer.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre style="margin-top: 0px; margin-bottom: 0px; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; CustomerRemarksDialog(CustomerEntity selectedCustomerEntity)&#xD;
{&#xD;
&#xD;
    InitializeComponent();&#xD;
&#xD;
    Title = &lt;span style="color: #2b91af;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"Remarks for Customer: {0}"&lt;/span&gt;, selectedCustomerEntity.LegalName);&#xD;
&#xD;
    &lt;span style="color: #008000;"&gt;// Load Remark records for Customer&lt;/span&gt;&#xD;
    CustomerRemarksModuleExplorer.am_LoadRecords(selectedCustomerEntity);&#xD;
&#xD;
&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;If you want to issue commands to the Sub Module, you can do this in the SubBrowserReady handler.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;pre style="margin-top: 0px; margin-bottom: 0px; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; CustomerRemarksModuleExplorer_ae_SubbrowserReady(&lt;span style="color: #2b91af;"&gt;object&lt;/span&gt; sender, EventArgs e)&#xD;
{&#xD;
    CustomerRemarksModuleExplorer.ap_SubBrowser.ap_ModuleExplorer.am_ProcessCommand(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_Command(&lt;span style="color: #a31515;"&gt;"YourCommandID"&lt;/span&gt;), &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;);&#xD;
&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;To put this all together, I will show you how I created an instance of this window and passed in the selected customer entity. I added a command and trapped the command in the content window code behind of the customer.&lt;/p&gt;&#xD;
&lt;pre style="margin-top: 0px; margin-bottom: 0px; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (command.ap_CommandID)&#xD;
{&#xD;
&#xD;
    &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"SHOW_REMARKS"&lt;/span&gt;:&#xD;
&#xD;
        &lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; dlg = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; CustomerRemarksDialog(selectedEntity);&#xD;
        dlg.ShowDialog();&#xD;
&#xD;
        e.Handled = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&#xD;
            &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&#xD;
&#xD;
		&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;:&#xD;
			&lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;This is what the window looks like:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/9566e5db-ca75-4ffd-84bc-a5bf003c02c8_2016-03-03-22-38-19.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-03T21:30:00.3400000</pubDate>
      <link>http://support.surroundtech.com/thread/using-the-ab_moduleexplorerstandalonepresenter-content-control-step-3-and-4/</link>
    </item>
    <item>
      <title>Using the AB_ModuleExplorerStandalonePresenter Content Control Steps 1 and 2</title>
      <description>&lt;p&gt;You can show a Module Explorer anywhere you want in WPF by using the AB_ModuleExplorerStandalonePresenter. This is an example of showing Remarks in a custom window.&lt;/p&gt;&#xD;
&lt;p&gt;Step 1: Create a Standard Base Interface record within the Accelerator Maintenance&lt;/p&gt;&#xD;
&lt;p&gt;(1) The reference ID will be used in code to determine which module to load dynamically at runtime. In this example, I am going to name it "CustomerRemarksDialog".&lt;/p&gt;&#xD;
&lt;p&gt;(2) The child module information is the module you want to show. In this example, I am going to show the Accelerator Remarks Module.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/eecd8ee9-fb96-408d-973f-a5be013f8bed_2016-03-03-12-37-45.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Step 2: Create a View Reference record within the Accelerator Maintenance&lt;/p&gt;&#xD;
&lt;p&gt;Create a view reference record in the module you want to show. In this example, I am going to (1) open the Remarks Module and (2) click the View References Tab. (3) Click thw "New" button to create a new View Reference.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/172df1ab-7713-4c65-acdb-a5be01449d69_2016-03-03-12-39-45.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;On the View Reference Detail, (1) specify the&amp;nbsp;view you want to use. If this is the only view, then you need to mark it as the default view and then whether you want to show the search explorer bar or auto load the data.&lt;/p&gt;&#xD;
&lt;p&gt;Then, (2) specify the parent component. This is the Standard Base Interface Reference ID from above.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e0f2c831-a8cf-4a60-b988-a5be0146dcb1_2016-03-03-12-39-07.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;This discussion continues here:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/using-the-ab_moduleexplorerstandalonepresenter-content-control-step-3-and-4/"&gt;http://support.surroundtech.com/thread/using-the-ab_moduleexplorerstandalonepresenter-content-control-step-3-and-4/&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-03T21:26:51.6670000</pubDate>
      <link>http://support.surroundtech.com/thread/using-the-ab_moduleexplorerstandalonepresenter-content-control-step-1-and-2/</link>
    </item>
    <item>
      <title>How to Show a dialog window of In Use newlook sessions</title>
      <description>&lt;p&gt;You can show a dialog of all the newlook sessions and how they are being used from anywhere within your WPF system. &amp;nbsp;To access this window, add the following line of code to a button click.&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;AB_SystemController.ap_NewLookModel.am_ShowNewlookInUseSessionsDialog();&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;This code will show the following Dialog.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/b322dace-bd6f-415a-a882-a5be011946c0_2016-03-03-12-03-01.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-03T17:04:22.6000000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-show-a-dialog-window-of-in-use-newlook-sessions/</link>
    </item>
    <item>
      <title>Build Scripts</title>
      <description>&lt;p&gt;Accelerator version 6.2 offers a new and improved project dependency analysis and build script generator.&lt;/p&gt;&#xD;
&lt;p&gt;To take advantage of the new tool, you will need to generate your build script with Accelerator version 6.2. To do this, open the Accelerator LaunchPad and click on the Tools button on the left side. Then click on the Code Generator button. In the Code Generator, (1) Select your System Generation Configuration File and then (2) Click the Generate Build Script button.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/15484dbc-5e01-42f8-b5e9-a5bd015a81d9_2016-03-02-15-54-01.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Another window will popup. You can leave all the defaults and click the Run Tool button. &amp;nbsp;You will get a message popup once the tool has completed.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/05373bfc-a53d-429c-bc34-a5bd015afee9_2016-03-02-15-54-58.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;This will generate the build script (.bat) and MSbuild file which has the build layers as determined by the project dependency Analysis (.msbuild) to the Output Directory. Note: the "Max Circular Reference Depth" is the number of levels to hunt for circular references. 4 should be plenty to find a circular reference. You may increase this if you suspect a circular reference is deeper. The circular dependency tool will take longer as this number increases.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Here are the files that may&amp;nbsp;be generated based on the inputs and analysis:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;&amp;lt;systemName&amp;gt;_msbuild.bat&amp;nbsp;&lt;/strong&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Always generated - This is the bat file that you can double-click to excute the msbuild file. This will delete all dlls in your solution bin and obj folders. It will then run the dependency tool and exceute the build.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;&amp;lt;systemName&amp;gt;_gen.msbuild&lt;/strong&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Always generated - this is the msbuild file that the bat file executes. This file has the project build layers from the project dependency analysis.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;&amp;lt;systemName&amp;gt;_WARNINGS.txt&lt;/strong&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Generated from dependency analysis tool to warn you of any bad DLL references. If you see this file, look at the warnings and fix the references in your solution.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;&amp;lt;systemName&amp;gt;_CircularReferenceGraph.txt&lt;/strong&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Generated from dependency analysis tool if circular references were found. If you see this file, see instructions below on how to view the graph.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;&amp;lt;systemName&amp;gt;_BuildLayerGraph.txt&lt;/strong&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Generated from dependency analysis tool if "Generate Diagram Files?" is checked prior to running the tool above. See instructions below on how to view the graph.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;&amp;lt;systemName&amp;gt;_DependencyGraph.txt&lt;/strong&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Generated from dependency analysis tool if "Generate Diagram Files?" is checked prior to running the tool above. See instructions below on how to view the graph.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;If a file is generated that ends with Graph.txt, you can download a graph viewer from &lt;a href="http://www.graphviz.org/" target="_blank"&gt;Graphviz - Graph Visualization Software&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;After you install the software, you can run the tool (gvedit.exe) and&amp;nbsp;open any of the files that end with Graph.txt.&lt;/p&gt;&#xD;
&lt;p&gt;Here is an example of 2 circular references found by opening the&amp;nbsp;&lt;strong&gt;&amp;lt;systemName&amp;gt;_CircularReferenceGraph.txt&lt;/strong&gt; in GVEdit. You will need to resolve any circular references in order to get a clean build.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/25e8e4fc-5907-4cc6-b1a8-a5bd015fbe70_2016-03-02-15-56-57.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-02T21:21:53.5730000</pubDate>
      <link>http://support.surroundtech.com/thread/build-scripts/</link>
    </item>
    <item>
      <title>Accelerator Remote Error Logging</title>
      <description>&lt;p&gt;Remote Error logging allows for client systems and system services to relay errors to the Accelerator Services. These errors can then be viewed through Accelerator Maintenance in the 'Event Log' Module that is part of the 'User Access' application.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Remote error logging can be used to track down errors on client systems without checking each systems log individually. These feature 'phones home' any errors above a specified threshold to the systems Accelerator Service Host. The systems IT department can later review and diagnose these errors.&lt;/p&gt;&#xD;
&lt;p&gt;The system can also be configured to send emails to administrators to resolve critical errors, avoiding potential extended system downtime.&lt;/p&gt;&#xD;
&lt;p&gt;The data is stored in the 2 files located in the Accelerator Database:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;FWMD - Added Module Table Entry for Event Log&lt;/li&gt;&#xD;
&lt;li&gt;FWJE - Added new file to store logging data&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;The following error levels can be set as configuration values. It is recommended to keep remote logging to a minimum in production systems as each message logged requires a service call. When running a large number of clients this can generate numerous service calls. Error is the recommended setting to avoid a large log file and unnecessary network traffic.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Debug - This is the most verbose level and should not be used in production systems with the exception of limited debugging for short periods of time. It's primary purpose is tracking down issues when using the debugger is not an option.&lt;/li&gt;&#xD;
&lt;li&gt;Info - Used to report statuses that do not impact performance or require action.&lt;/li&gt;&#xD;
&lt;li&gt;Warn - Warnings of issues that could pose a problem, but do not require immediate action&lt;/li&gt;&#xD;
&lt;li&gt;Error - System errors, typically used when trapping exceptions.&lt;/li&gt;&#xD;
&lt;li&gt;Fatal - An error that causes the entire system to crash. Fatal errors are automatically reported when the entire application crashes due to an unhanded exception.&amp;nbsp;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Configuration Settings in App config files for client systems&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;!-- Remote Logging Settings (Client Settings) --&amp;gt;&#xD;
&amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.RemoteLoggingEnabled"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"True"&lt;/span&gt; /&amp;gt;&#xD;
&amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.RemoteLoggerLevel"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Error"&lt;/span&gt; /&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;Configuration Settings in Web config files for system services&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;!-- Remote Logging Settings --&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.RemoteLoggingEnabled"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"true"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.RemoteLoggerLevel"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Error"&lt;/span&gt; /&amp;gt;&#xD;
&amp;lt;!-- Remote Logging Email Settings, Requires Remote Logging Enabled, Required SMTP Server  (Service Only) --&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.SendEmailNotifications"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"false"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.EmailAddressSender"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"notifications@surroundtech.com"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.EmailNotificationLevel"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Error"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.EmailAddressReceiver"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"admin@surroundtech.com"&lt;/span&gt;/&amp;gt;&#xD;
&amp;lt;!-- Remote Logging Email SMTP Server Settings (Service Only) --&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"SMTP.Host"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"mailout.surroundtech.com"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"SMTP.Port"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"25"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"SMTP.SenderUserName"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"notifications@surroundtech.com"&lt;/span&gt;/&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"SMTP.SenderPassword"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"******"&lt;/span&gt;/&amp;gt;&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-03-02T15:51:46.9530000</pubDate>
      <link>http://support.surroundtech.com/thread/accelerator-remote-error-logging/</link>
    </item>
    <item>
      <title>Accelerator Launch Pad and Maintenance Logging</title>
      <description>&lt;p&gt;The Accelerator Maintenace also uses the same runtime logging as your system. Review this discussion on &lt;a href="/thread/accelerator-logging/"&gt;Accelerator Logging&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;The Error Logs generated from any Accelerator Tool launched from the LaunchPad are located in the &lt;strong&gt;C:\Users\&amp;lt;YourUserName&amp;gt;\AppData\Roaming\Accelerator for .NET\Logging&lt;/strong&gt; folder.&lt;/p&gt;&#xD;
&lt;p&gt;The Accelerator Maintenance BP Service Host settings are located in the WebAppSettings.config located in the folder where you publish the Accelerator Services.&lt;/p&gt;&#xD;
&lt;p&gt;The Accelerator Services WebAppSettings.config is defaulted to the following. You can change any setting in the WebAppSettings.config and your changes will not get clobbered when doing an Accelerator upgrade.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;!--Logging Settings --&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.Enabled"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"true"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.AssemblyName"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"A4DN.Core.BOS.Logging.dll"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.ClassName"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"A4DN.Core.BOS.Logging.AB_NLogLogger"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;!--Valid values are &lt;span style="color: #a31515;"&gt;"Debug,"&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Info,"&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Warn,"&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Error,"&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Fatal"&lt;/span&gt; (Debug &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; the most verbose, Fatal &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; the least.)--&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.LoggerLevel"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Error"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.Async"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"true"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.LogPath"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"C:\temp\Accelerator for .NET\Logging\AcceleratorServices"&lt;/span&gt; /&amp;gt;&#xD;
&amp;lt;!-- Remote Logging Settings (Client Settings) --&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.RemoteLoggingEnabled"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"false"&lt;/span&gt; /&amp;gt;&#xD;
  &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.RemoteLoggerLevel"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Error"&lt;/span&gt; /&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>2016-03-02T15:35:51.1870000</pubDate>
      <link>http://support.surroundtech.com/thread/accelerator-launch-pad-and-maintenance-logging/</link>
    </item>
    <item>
      <title>Accelerator Logging</title>
      <description>&lt;p&gt;The Accelerator&amp;nbsp;has logging built into the runtime engine.&lt;/p&gt;&#xD;
&lt;p&gt;For WPF, you have the ability to log both the client and server side code. &amp;nbsp;The log settings for the client are located in the app.config within your System WPF project. &amp;nbsp;The server side log settings are located in your web.config withing your BP Service Host Project.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;For MVC, you can log just the server side. The server side log settings are located in your web.config within your&amp;nbsp;MVC project.&lt;/p&gt;&#xD;
&lt;p&gt;By default, the Accelerator generates with the following log settings:&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&amp;lt;!--Logging Settings --&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.Enabled"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"True"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.AssemblyName"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"A4DN.Core.BOS.Logging.dll"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.ClassName"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"A4DN.Core.BOS.Logging.AB_NLogLogger"&lt;/span&gt; /&amp;gt;&#xD;
&amp;lt;!--Valid values are &lt;span style="color: #a31515;"&gt;"Debug,"&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Info,"&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Warn,"&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Error,"&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"Fatal"&lt;/span&gt; (Debug &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; the most verbose, Fatal &lt;span style="color: #0000ff;"&gt;is&lt;/span&gt; the least.)--&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.LoggerLevel"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Error"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.Async"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"True"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.LogPath"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"%APPDATA%\Accelerator for .NET\Logging\&amp;lt;YourSystemName&amp;gt;"&lt;/span&gt; /&amp;gt;&#xD;
&amp;lt;!-- Remote Logging Settings --&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.RemoteLoggingEnabled"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"True"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;&lt;span style="color: #0000ff;"&gt;add&lt;/span&gt; key=&lt;span style="color: #a31515;"&gt;"Logging.RemoteLoggerLevel"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;value&lt;/span&gt;=&lt;span style="color: #a31515;"&gt;"Error"&lt;/span&gt; /&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;You can change any of these settings in your WPF app.config and/or BP service Host Web.config&amp;nbsp;for WPF client and server side logging; and in your MVC project Web.config for MVC server side logging.&lt;/p&gt;&#xD;
&lt;p&gt;Here is information regarding the app.setting logging keys and values:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Key: Logging.AssemblyName&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The name of the assembly that holds the logger implementation that will be used to perform logging. By default, the accelerator uses A4DN.Core.BOS.Logging.dll. &amp;nbsp;You are welcome to develop your own and plug in your&amp;nbsp;DLL Assembly Name.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.ClassName&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The full namespace of the class that implements the logger interface.&amp;nbsp;By default, the accelerator uses A4DN.Core.BOS.Logging.AB_NLogLogger. &amp;nbsp;You are welcome to develop your own and plug in&amp;nbsp;your Class&amp;nbsp;Name.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.LoggerLevel&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The minimum message level to log.&lt;/li&gt;&#xD;
&lt;li&gt;Valid values are Debug, Info, Warn, Error, Fatal&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Debug is the most verbose, Fatal is the least.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.Enabled&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The flag to enable logging.&lt;/li&gt;&#xD;
&lt;li&gt;Valid values are True, False&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.Async&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The flag to set logging to be synchronous or asynchronous&lt;/li&gt;&#xD;
&lt;li&gt;Valid values are True, False&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.LogPath (Only use if storing logs to a file)&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Set the path the log files will be written to.&lt;/li&gt;&#xD;
&lt;li&gt;Valid values are a valid windows folder path&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.EventLogName (Only use if storing logs to event viewer)&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Set the name of the EventLog section to write the logs to.&lt;/li&gt;&#xD;
&lt;li&gt;Valid values are any permitted Event Viewer section name&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.SourceName (Only use if storing logs to event viewer)&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Set the source value in the event viewer log&lt;/li&gt;&#xD;
&lt;li&gt;Valid values are any string value&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.RemoteLoggingEnabled&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Set the client to make service calls to the error logging service for the event log module&lt;/li&gt;&#xD;
&lt;li&gt;Valid values are True, False&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Key: Logging.RemoteLoggerLevel&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Sets the value to be logged using the remote logging service to create logging entries on the server&lt;/li&gt;&#xD;
&lt;li&gt;Values include Debug, Info, Warn, Error, Fatal&lt;/li&gt;&#xD;
&lt;li&gt;Warning DO not use Info or Debug in production setting as it will make excessive network calls.&amp;nbsp;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;You have the option to log to a windows folder or windows event viewer and/or to the Accelerator remote Event Log module.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Retailed Topics:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/accelerator-launch-pad-and-maintenance-logging/"&gt;http://support.surroundtech.com/thread/accelerator-launch-pad-and-maintenance-logging/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/accelerator-remote-error-logging/"&gt;http://support.surroundtech.com/thread/accelerator-remote-error-logging/&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>2016-03-02T15:26:51.3770000</pubDate>
      <link>http://support.surroundtech.com/thread/accelerator-logging/</link>
    </item>
    <item>
      <title>Creating a SQL join using fields from another join in the Datamaps</title>
      <description>&lt;p&gt;Tables&lt;/p&gt;&#xD;
&lt;p&gt;A. &amp;nbsp;Document Master&lt;/p&gt;&#xD;
&lt;p&gt;B. &amp;nbsp;PO Master&lt;/p&gt;&#xD;
&lt;p&gt;C. &amp;nbsp;Invoice Master&lt;/p&gt;&#xD;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;Document Master (A) Keys&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;PO #&lt;/li&gt;&#xD;
&lt;li&gt;Invoice #&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;PO Master (B) Keys&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;PO #&lt;/li&gt;&#xD;
&lt;li&gt;Vendor #&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Invoice Master (C) Keys&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Invoice #&lt;/li&gt;&#xD;
&lt;li&gt;Vendor #&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Join for A-&amp;gt;B&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;relationship_A_to_B = relationshipMap.am_AddRelationshipMap(joinTable: TableName_B);&lt;/p&gt;&#xD;
&lt;p&gt;relationship_A_to_B.am_JoinWhere("PO #", "PO #");&lt;/p&gt;&#xD;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Join for B-&amp;gt;C&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;relationship_B_to_C = relationshipMap.am_AddRelationshipMap(joinTable: TableName_C, primaryTable: TableName_B);&lt;/p&gt;&#xD;
&lt;p&gt;relationship_B_to_C.am_JoinWhere("Vendor #", "Vendor #");&lt;/p&gt;&#xD;
&lt;p&gt;relationship_B_to_C.am_JoinWhere(new AB_JoinCondition(new AB_QueryField(TableName_A, "Invoice #"), "=", new AB_QueryField(TableName_C, "Invoice #"));&lt;/p&gt;&#xD;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Maps for B&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;maps.am_AddDataMap(string.Format("{0}.[NAME OF FIELD]", TableName_B), [METADATA FOR FIELD], targetTable: TableName_B);&lt;/p&gt;&#xD;
&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Maps for C&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;maps.am_AddDataMap(string.Format("{0}.[NAME OF FIELD]", TableName_C), [METADATA FOR FIELD], targetTable: TableName_C);&lt;/p&gt;&#xD;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>2016-03-01T13:49:16.7930000</pubDate>
      <link>http://support.surroundtech.com/thread/creating-a-sql-join-using-fields-from-another-join-in-the-datamaps/</link>
    </item>
    <item>
      <title>Why do I sometimes get an exception when starting an MVC project?</title>
      <description>&lt;p&gt;Sometimes when starting up an Accelerator-based MVC project from Visual Studio, the page that comes up says &lt;code&gt;Error rendering module #xxxx: AttachmentController missing?&lt;/code&gt; and this is followed by a large Exception dump. One possible reason for this error is that you've enabled a module for web access, but there is no corresponding Controller class in the MVC application. The controller class's name must be the module's &lt;em&gt;Namespace&lt;/em&gt; followed by &lt;code&gt;Controller&lt;/code&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;However, there is a more common cause. If you have a Razor template file open and focused when you start the website, by default Visual Studio will try to navigate directly to the template you've got open. This is a hold-over from the ASPX days, when every template file lived at the website root and the url was just the aspx filename. For MVC projects you generally need to start on a home page or login page. For Accelerator-based MVC projects, all module-based pages are reached via the url /Main/Index?modulenum=####. When Visual Studio tries to navigate directly to a template, it can wind up routed to /Main/Index, without the module number. The core AB_MainController class will try to navigate to the first module in the navigator list for the website application, and for CMS websites that's often the Media Library module. We don't support viewing the Media Library module directly like that, which leads to an exception getting thrown.&lt;/p&gt;&#xD;
&lt;p&gt;The fix for this is generally a Best Practice whenever working with ASP.Net MVC projects:&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;Right-click on the MVC project in Solution Explorer, and open the Properties page&lt;/li&gt;&#xD;
&lt;li&gt;Under &lt;strong&gt;Web&lt;/strong&gt;, change the &lt;strong&gt;Start Action&lt;/strong&gt; from &lt;strong&gt;Current Page&lt;/strong&gt; to &lt;strong&gt;Specific Page&lt;/strong&gt;, but leave the url box empty. This will ensure that Visual Studio starts the website on the default entry page, usually the website root.&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/06f3aa59-ff9b-4698-a30d-a5720174a646/1ab82faf-e7ff-41c3-9060-a5b8017a6d02_mvc-specific-page.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;</description>
      <pubDate>2016-02-26T22:57:55.7630000</pubDate>
      <link>http://support.surroundtech.com/thread/why-do-i-sometimes-get-an-exception-when-starting-an-mvc-project/</link>
    </item>
    <item>
      <title>How to set a global variable in each newlook session from .NET after logon</title>
      <description>&lt;p&gt;When working with multiple newlook sessions from .NET, you may want to pass information from the WPF .NET&amp;nbsp;client to each session that is created. This is epecially handy if you want to gather information once and then pass it to each session instead of having each individual session take the performance hit.&lt;/p&gt;&#xD;
&lt;p&gt;You can easily attach to the after sigon event which will be fired after each newlook session signs on. &amp;nbsp;The best place to attach to this event is in your Browser code behind in your System WPF project.&lt;/p&gt;&#xD;
&lt;p&gt;In the browser code behind, attach to the&amp;nbsp;&lt;span style="background-color: #efefef;"&gt;ae_AfterNewlookSignOn event in the Browser constructor. In the event handler, you can get access to the newlook reference and then call the&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: #efefef;"&gt;am_SetValue method.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Browser()&#xD;
{&#xD;
    &lt;span style="color: #008000;"&gt;// Set the Splash Window Type&lt;/span&gt;&#xD;
    ap_SplashWindowType = &lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;(Splash);&#xD;
&#xD;
    InitializeComponent();&#xD;
&#xD;
    &lt;span style="color: #008000;"&gt;// Attach to event&lt;/span&gt;&#xD;
    AB_SystemController.ap_NewLookModel.ae_AfterNewlookSignOn += Ap_NewLookModel_ae_AfterNewlookSignOn;&#xD;
&#xD;
}&#xD;
&#xD;
&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Ap_NewLookModel_ae_AfterNewlookSignOn(&lt;span style="color: #2b91af;"&gt;object&lt;/span&gt; sender, System.EventArgs e)&#xD;
{&#xD;
    &lt;span style="color: #2b91af;"&gt;var&lt;/span&gt; newlookReference = sender &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; AB_NewlookOCXControl;&#xD;
    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (newlookReference != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&#xD;
    {&#xD;
        newlookReference.am_SetValue(&lt;span style="color: #a31515;"&gt;"GlobalVariable"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"Value"&lt;/span&gt;);&#xD;
    }&#xD;
&#xD;
}&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-02-23T23:27:48.0800000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-set-a-global-variable-in-each-newlook-session-from-net-after-logon/</link>
    </item>
    <item>
      <title>How to run the newlook scripts prior to the detail window showing</title>
      <description>&lt;p&gt;The newlook scripts are run in the detail code behind in the method am_Newlook_ProcessCommandScript. This method is called after the data is loaded which also occurs after the detail window is shown. &amp;nbsp;The user will see a Navigating message while the script is running.&lt;/p&gt;&#xD;
&lt;p&gt;You can run the newlook scripts prior to the detail window showing. For example,&amp;nbsp;you may want to write code to close the window if the script does not navigate to the correct screen and prompt the user with a message box instead. This can easily be achieved with the following code below.&lt;/p&gt;&#xD;
&lt;p&gt;In the am_BeforeProcessCommand method in the detail code behind, you can trap individual commands or&amp;nbsp;trap all commands. When this method is called, the detail window is currently not shown. &amp;nbsp;This allows you to call the am_Newlook_ProcessCommandScript method prior to the detail window showing.&lt;/p&gt;&#xD;
&lt;p&gt;This example calls am_Newlook_ProcessCommandScript prior to the detail window showing for the "NEW" and "OPEN" commands. The screen messages are checked and if it contains a certain message, the user is prompted with a message box and the detail is closed without ever showing. &amp;nbsp;Otherwise, the detail window will show as usual.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_BeforeProcessCommand(AB_Command command, System.Windows.RoutedEventArgs e)&#xD;
{&#xD;
			&#xD;
	&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt; (command.ap_CommandID)&#xD;
	{&#xD;
                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"NEW"&lt;/span&gt;:&#xD;
                &lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #a31515;"&gt;"OPEN"&lt;/span&gt;:&#xD;
&#xD;
                    am_Newlook_ProcessCommandScript(command.ap_CommandID, ap_CurrentCommand, ap_EntityToPerformCommandOn);&#xD;
                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (ap_NewlookReference.ap_ScreenMessages.Contains(&lt;span style="color: #a31515;"&gt;"You are not authorized"&lt;/span&gt;))&#xD;
                    {&#xD;
                        MessageBox.Show(ap_NewlookReference.ap_ScreenMessages, &lt;span style="color: #a31515;"&gt;"Error"&lt;/span&gt;, MessageBoxButton.OK);&#xD;
                        e.Handled = &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;;&#xD;
                        Close();&#xD;
                    }&#xD;
                    &#xD;
&#xD;
                    &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&#xD;
	}&#xD;
			&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In the method am_Newlook_ProcessCommandScript in the detail code behind, you need to make sure of 2 things:&lt;/p&gt;&#xD;
&lt;p&gt;1) That you call the base method in am_Newlook_ProcessCommandScript. This has logic to ensure that the framework does not call the method am_Newlook_ProcessCommandScript in the data loaded event if you have already called this method in the am_BeforeProcessCommand method. Remember that the default behavior is to call am_Newlook_ProcessCommandScript when the data is loaded. We don't want to call this method twice. Add this as the first line of code in the method am_Newlook_ProcessCommandScript.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt; &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_Newlook_ProcessCommandScript(scriptCommand, command, EntityToPerformCommandOn);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2) The default when playing a transaction is to call the transaction in the completed event of a background worker. The parameter is called _RunWorkerAsync and by default is true. If &amp;nbsp;this is true, the ap_NewlookReference variable will not be updated with the screen name, title, messages etc. immediately following the am_PlayTransaction. &amp;nbsp;If you want to wait for the script to complete, then you need to set _RunWorkerAsync to false. The last parameter in this code snippet is false which will wait for the script to complete. This will allow you to access the screens and messages immediately following the am_PlayTransaction.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;ap_NewlookReference.am_PlayTransaction(&lt;span style="color: #a31515;"&gt;"&amp;lt;TransactionName&amp;gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;, scriptKeyInput, &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-02-22T23:42:42.8470000</pubDate>
      <link>http://support.surroundtech.com/thread/how-to-run-the-newlook-scripts-prior-to-the-detail-window-showing/</link>
    </item>
    <item>
      <title>Find any currently logged on Users</title>
      <description>&lt;p&gt;You can query the A4DN database to determine if there are any currently logged on users. &amp;nbsp;Here is a query which will tell you the users that are currently logged on and which systems they are logged onto.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;SELECT s.FWSYNM as 'System',&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;u.FWUSUS as 'User Id',&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;u.FWUSDS as 'User',&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;l.FWJLONDT as 'Logon Date',&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;l.FWJLONTM as 'Logon Time',&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;l.FWJLPCNM as 'Computer'&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;FROM FWJL l&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;LEFT JOIN FWUS u ON l.FWJLUSID = u.FWUSID&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;LEFT JOIN FWSY s on s.FWSYNO = l.FWJLSYNO&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;WHERE l.FWJLOFDT IS NULL&lt;/p&gt;</description>
      <pubDate>2016-02-22T22:47:29.4870000</pubDate>
      <link>http://support.surroundtech.com/thread/find-any-currently-logged-on-users/</link>
    </item>
    <item>
      <title>Adding additional Tab Items to your module WPF Detailer</title>
      <description>&lt;p&gt;The Accelerator support 2 different types of tab item controls in WPF: AB_TabItem and AB_DockingTabItem. AB_TabItem is a wrapper around&amp;nbsp;the standard WPF TabItem control and AB_DockingTabItem is a wrapper around&amp;nbsp;a 3rd party control called &lt;a href="http://dragablz.net"&gt;Dragablz&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;You can choose which tab style to generate&amp;nbsp;in the standards configuration.&lt;/p&gt;&#xD;
&lt;p&gt;The Accelerator generates by default a DetailFieldsTab and an AuditFieldsTab. &amp;nbsp;You will see these 2 tabs in the Detail XAML. &amp;nbsp;These tabs are already setup by the framework to have the correct data context as well as to show in the preview Tab Control on the Content Window.&lt;/p&gt;&#xD;
&lt;p&gt;If you need to add additional Tab Items to your WPF Detailer, then you can add additional Tab Items in the XAML. Make sure to use the same Tab Item that the DetailFieldsTab and AuditFieldsTab use.&lt;/p&gt;&#xD;
&lt;p&gt;If you want your new tab item to use the&amp;nbsp;same Data Context as the other tabs and have the Accelerator runtime manage setting it, then you need to add the following line of code to your am_SetParentProperties method in the detail code behind.&lt;/p&gt;&#xD;
&lt;!-- HTML generated using hilite.me --&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;ap_AdditionalTabItemsToSetDataContextOn.Add(GoogleMapsTab);&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;If you want to have this new tab show in the preview Tab Control on the Content Window, then you need to to add the following line of code to your am_SetParentProperties method in the detail code behind.&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;am_AddTabToPreview(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_DockingTabItem[] { GoogleMapsTab});&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;This is an example of what it may look like:&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_SetParentProperties()&#xD;
{&#xD;
     RG_SetParentProperties();	  &#xD;
     &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_SetParentProperties();&#xD;
     &lt;span style="color: #008000;"&gt;// Add Google and Bing Maps to Preview&lt;/span&gt;&#xD;
     am_AddTabToPreview(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_DockingTabItem[] { GoogleMapsTab, BingMapsTab });&#xD;
 &#xD;
     ap_AdditionalTabItemsToSetDataContextOn.Add(GoogleMapsTab);&#xD;
 &#xD;
     ap_AdditionalTabItemsToSetDataContextOn.Add(BingMapsTab);&#xD;
}&#xD;
&lt;/pre&gt;</description>
      <pubDate>2016-02-17T20:36:56.8930000</pubDate>
      <link>http://support.surroundtech.com/thread/adding-additional-tab-items-to-your-module-wpf-detailer/</link>
    </item>
    <item>
      <title>Parent Keys</title>
      <description>&lt;p&gt;Parent Keys are key-value pairs that get passed from a module to its subbrowsers. &amp;nbsp;There are two types of parent keys OnSearch and OnPreload. &amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The OnSearch parent keys are used for loading records in a subbrowser content window and the OnPreload are used for new records created in the subbrowser. &amp;nbsp;To specify a field in the parent you want broadcasted to the subbrowsers you add the AB_BroadcastMember attribute to the field in the entity. &amp;nbsp;This attribute allows you to specify if you want it to be for OnSearch, OnPreload, or Always(both).&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;[AB_BroadcastMember(AB_DataShouldBePassed.OnSearch)]&#xD;
&#xD;
[AB_BroadcastMember(AB_DataShouldBePassed.OnPreload)]&#xD;
&#xD;
[AB_BroadcastMember(AB_DataShouldBePassed.Always)]&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;There are now two collections of parent keys on the AB_ContentWindowBase class. &amp;nbsp;These two collections are ap_ParentKeys and ap_SearchParentKeys. &amp;nbsp;Both of these collections will only be populated if the content window is in a subbrowser. &amp;nbsp;The ap_ParentKeys are the OnPreload keys and will be used for new records. &amp;nbsp;The ap_SearchParentKeys are used to create the initial search entity for the explorer bar and are able to be accessed in the content window for custom use. &amp;nbsp;In most cases these two collections will have the same keys in them but it is recommended that you use the ap_ParentKeys unless you are dealing with functionality releted&amp;nbsp;&lt;/p&gt;</description>
      <pubDate>2016-02-16T21:20:26.8600000</pubDate>
      <link>http://support.surroundtech.com/thread/parent-keys/</link>
    </item>
    <item>
      <title>Services sometimes taking a long time</title>
      <description>&lt;p&gt;If your service calls are sometimes taking a very long time it may be a configuration issues with IIS. &amp;nbsp;If the settings are not correct your IIS app pool could be recycling too oftern. &amp;nbsp;You can view when IIS app pools get recycled by looking at the Window's Event Log. &amp;nbsp;The recycle events will be recorded in the Windows Logs\System and they will tell you why the recycle was requested.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Here is an example of one of those log entries:&lt;/p&gt;&#xD;
&lt;p&gt;A worker process with process id of '10788' serving application pool 'Complex' has requested a recycle because it reached its virtual memory limit.&lt;/p&gt;</description>
      <pubDate>2016-02-16T14:23:00.5330000</pubDate>
      <link>http://support.surroundtech.com/thread/services-sometimes-taking-a-long-time/</link>
    </item>
    <item>
      <title>Deploying WPF Systems to IIS</title>
      <description>&lt;p&gt;Before you can deploy a WPF system to IIS, please refer to the topic&amp;nbsp;&lt;a href="/thread/configuring-deployment-scripts/"&gt;Configuring Deployment Scripts&lt;/a&gt;&amp;nbsp;to create a deployment package.&lt;/p&gt;&#xD;
&lt;p&gt;Once you have a deployment package, you can copy the package to your IIS server. &amp;nbsp;Since the Accelerator can create a package for multiple Environments, we recommend the following folder tree and naming standard:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Create a Folder in&amp;nbsp;C:\inetpub\wwwroot&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The folder should be named as follows: {System}{EnvironmentID}&lt;/li&gt;&#xD;
&lt;li&gt;In the&amp;nbsp;{System}{EnvironmentID}, create 2 folders: A4DNServices and BPServices&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;The A4DNServices will contain the Accelerator Services and the BPServices will contain your services as well as the WPF installer folder.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;This is what is should look like for each Environment:&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;{System}{EnvironmentID}&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;A4DNServices&lt;/li&gt;&#xD;
&lt;li&gt;BPServices&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Installer&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;In IIS management, you will need to convert to application both the A4DNServices and BPServices folder.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Once the Package is on the server, all you need to do is unzip it and copy the contents of BPServices to the BPServices in the correct {System}{EnvironmentID} folder. The BP services folder has both the BOS code and the WPF click once installer.&lt;/p&gt;&#xD;
&lt;p&gt;You can now click on your desktop icon to receive the update if previously installed or use&amp;nbsp;the installer URL for first time installation.&lt;/p&gt;&#xD;
&lt;p&gt;Refer to&amp;nbsp;&lt;a href="/thread/wpf-click-once-deployment-setting-minimum-required-version-automatically/"&gt;WPF Click Once Deployment - Setting Minimum Required Version Automatically&lt;/a&gt;&amp;nbsp;if you want to force your users to upgrade when a new&amp;nbsp;version&amp;nbsp;is available.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;I&lt;/p&gt;</description>
      <pubDate>2016-02-15T23:51:56.9930000</pubDate>
      <link>http://support.surroundtech.com/thread/deploying-wpf-systems-to-iis/</link>
    </item>
    <item>
      <title>Configuring Deployment Scripts</title>
      <description>&lt;p&gt;Before you can configure the deployment scripts, please refer to the following topic:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/instructions-for-creating-deployment-scripts-in-systems-generated-prior-to-version-6-1-4-0/"&gt; Instructions for creating Deployment Scripts in systems generated prior to version 6.1.4.0&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="/thread/configuring-the-deployment-scripts/"&gt; Configuring the Click Once Settings for use with Deployment Scripts&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Here are the steps to Configure Deployment Scripts:&lt;/p&gt;&#xD;
&lt;p&gt;1)&amp;nbsp;Configuring the Deployment Script manifest xml files&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;In windows explorer, navigate to the new DeploymentScripts folder that was added to your system folder.&lt;/li&gt;&#xD;
&lt;li&gt;You will notice that a Manifest xml file was created for each of your Environment IDs.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/9d507197-367c-461c-934a-a5ad017cad90_2016-02-15-17-44-08.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Open each xml file and verify that the publisher, suiteName and product are correct. The Publisher is usually your company name and is the text that is listed in the windows start menu. The Suite Name is optional and if specified will show up under the Publisher Name as a sub folder. The Product is the name that will be used for the application shortcut.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/f234ba0c-e644-430a-89a6-a5ad017f3501_2016-02-15-18-15-58.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2) Configuring the variables in the deployment script .bat file&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Open and edit your {system}_Deployment.bat file located in the DeploymentScripts Folder.&lt;/li&gt;&#xD;
&lt;li&gt;The script is setup so that you only need to configure the variables, most of which should already be correct. &amp;nbsp;You just need to specify a couple settings that may be specific to your environment.&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Make sure the BPServiceHostPublishProfile exists and has the correct name. Refer to step 4 in&amp;nbsp;&lt;a href="/thread/configuring-the-deployment-scripts/"&gt;Configuring the Click Once Settings for use with Deployment Scripts&lt;/a&gt;&amp;nbsp;for details on setting this up (1).&lt;/li&gt;&#xD;
&lt;li&gt;Make sure the mage.exe and 7z.exe exist and the path is correct. You may need to install &lt;a href="http://www.7-zip.org"&gt;7-zip&lt;/a&gt;. Depending on your Visual Studio version, the mage.exe may be in a different folder (2)(3).&lt;/li&gt;&#xD;
&lt;li&gt;If you are using a password for your click once certificates, you need to set the variable SigningManifestPassword (4).&lt;/li&gt;&#xD;
&lt;li&gt;Set the ClickOnceIconName to the Icon Name that you specified on in step 1 of &amp;nbsp;&lt;a href="/thread/configuring-the-deployment-scripts/"&gt;Configuring the Click Once Settings for use with Deployment Scripts&lt;/a&gt;&amp;nbsp;(5).&lt;/li&gt;&#xD;
&lt;li&gt;Specify the Environment ID, Environment Icon, Environment Installation Folder URL for each Environment (6).&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e590279d-c82f-404b-a3c3-a5ad018310e5_2016-02-15-18-20-38.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;To run the Deployment Script:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Set the ApplicationVersion Variable at the top of the script to the version you want to generate a click once for.&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;Run your {System}_Deployment.bat file by double clicking it in Windows Explorer. If everything is configured correctly, Your Deployment folder will contain a zipped file for each environment. Here is wait the script is doing:&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Updates the Application Version in the WPF project and the "Version" Key in the app.config.&lt;/li&gt;&#xD;
&lt;li&gt;Runs your build script based on the BuildScriptLocation variable.&lt;/li&gt;&#xD;
&lt;li&gt;Clears the Deployment folder based on the DeploymentFolder variable.&lt;/li&gt;&#xD;
&lt;li&gt;Publishes your BPservices using the BPServiceHostPublishProfile variable.&lt;/li&gt;&#xD;
&lt;li&gt;Publishes your WPF Click Once.&lt;/li&gt;&#xD;
&lt;li&gt;Creates the Click Once html install page.&lt;/li&gt;&#xD;
&lt;li&gt;Creates a zipped package for each environment and outputs them to your Deployment Folder.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Refer to Deploying WPF Systems for details on what to do with the zipped folders for each environment.&lt;/p&gt;</description>
      <pubDate>2016-02-15T22:56:46.8970000</pubDate>
      <link>http://support.surroundtech.com/thread/configuring-deployment-scripts/</link>
    </item>
    <item>
      <title>Configuring the Click Once Settings for use with Deployment Scripts</title>
      <description>&lt;p&gt;Accelerator version 6.1.4.0&amp;nbsp;&amp;nbsp;makes deploying WPF applications to multiple environments much easier and now generates scripts to automate and standardize the deployment process. &amp;nbsp;Once configured, a developer can deploy to multiple environments by running a .bat file. &amp;nbsp;This can be further automated by using 3rd party products such as&amp;nbsp;&lt;a href="https://www.jetbrains.com/teamcity/" target="_blank"&gt;TeamCity&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;This documents contains the instructions to configure the deployment scripts.&lt;/p&gt;&#xD;
&lt;p&gt;Refer to&amp;nbsp;&lt;a href="/thread/instructions-for-creating-deployment-scripts-in-systems-generated-prior-to-version-6-1-4-0/?postbadges=true"&gt;Instructions for creating deployment scripts in systems generated prior to version 6.1.4.0&lt;/a&gt;&amp;nbsp;if your system was generated prior to Accelerator Version 6.1.4.0.&lt;/p&gt;&#xD;
&lt;p&gt;Refer to &lt;a href="/thread/wpf-click-once-deployment-setting-minimum-required-version-automatically/"&gt;WPF Click Once Deployment - Setting Minimum Required Version Automatically&lt;/a&gt;&amp;nbsp;if you want to force your users to upgrade when a new version&amp;nbsp;is available.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Steps:&lt;/p&gt;&#xD;
&lt;p&gt;1) Verfiy the WPF Click Once Properties&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Under WPF Properties, Click Application on the left and set the main icon.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/f316de6f-61ed-4c8b-92ae-a5ad01704c0b_2016-02-15-17-21-18.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Click on Publish on the left hand side and set the Publishing Folder Location (1). This location will need to match the&amp;nbsp;DeploymentFolder variable in the Deployment Script. &amp;nbsp;&lt;/li&gt;&#xD;
&lt;li&gt;Set the Installation Folder URL for your Development Environment. This is URL of the installer folder within IIS. This must match the&amp;nbsp;EnvID1InstallationFolderURL&amp;nbsp;variable in the Deployment Script.&amp;nbsp;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e975e79a-dd63-48f3-b008-a5ad01711b23_2016-02-15-17-23-10.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Click on the "Updates..." button. Verify that the settings look like this:&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e4a9eaf9-6423-475a-8444-a5ad01731ff3_2016-02-15-17-30-27.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Hit "Ok" to close the Dialog Window.&lt;/li&gt;&#xD;
&lt;li&gt;Click on the "Options..." button.&amp;nbsp;&lt;/li&gt;&#xD;
&lt;li&gt;Make sure the "Create desktop shortcut" is clicked&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/dbeb3a70-4f24-4562-881d-a5ad0174046e_2016-02-15-17-33-35.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2) Add Additional Icons for all Environments.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;You may want a different icon per environment. If you do, you need to add all Icons under your&amp;nbsp;WPF.{Solution} Project&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;3) Create&amp;nbsp;a Certificate for each Environment&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Under WPF Properties, Click Signing&amp;nbsp;on the left hand side.&lt;/li&gt;&#xD;
&lt;li&gt;Create a test certificate for each environment you have. You will need to rename each certfifcate to this naming standard: WPF.{SystemName}.{EnvironmentID}.pfx&lt;/li&gt;&#xD;
&lt;li&gt;You have the option to specify a password. &amp;nbsp;If you do, use the same password for all certificates.&lt;/li&gt;&#xD;
&lt;li&gt;After you create and rename the certificates for each environment, click the "Select from File..." button and select your development certificate.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4)&amp;nbsp;Create a Publish setting for your BPServiceHost&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Right click on your BPServiceHost Project and click "Publish"&lt;/li&gt;&#xD;
&lt;li&gt;Create a new custom Profile. Call it "FileSystemRelease".&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/67d90f28-754d-489e-ac59-a5ad016ec0d4_2016-02-15-15-35-01.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/a3166676-8ada-40fa-8d02-a5ad01538a90_2016-02-15-15-35-01.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Select the Publish Method "FileSystem" (1)&lt;/li&gt;&#xD;
&lt;li&gt;Select the Target Location. Set this to the Publish folder location you specifed earlier in the Default Standards Configuration Editor (2).&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/9e518af5-e1ee-45ae-8e1a-a5ad016ed8da_2016-02-15-15-35-59.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/6d3cf417-27a8-47e4-9d5d-a5ad015447a8_2016-02-15-15-35-59.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Set the Configuration to "Release" (1)&lt;/li&gt;&#xD;
&lt;li&gt;Click the "Delete all existing files prior to publish" (2)&lt;/li&gt;&#xD;
&lt;li&gt;Click the "Publish" button (3)&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/937b9ddf-92a7-4ea4-b21a-a5ad016f0ba1_2016-02-15-15-36-39.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/91215214-22ba-4f79-a816-a5ad0154a1b5_2016-02-15-15-36-39.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Refer to&amp;nbsp;&lt;a href="/thread/configuring-deployment-scripts"&gt;Configuring Deployment Scripts&lt;/a&gt;&amp;nbsp;to complete the Deployment Script Setup.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-02-15T22:04:20.1970000</pubDate>
      <link>http://support.surroundtech.com/thread/configuring-the-deployment-scripts/</link>
    </item>
    <item>
      <title>Services.config and the EnvironmentID Attribute</title>
      <description>&lt;p&gt;As of Accelerator version 6.1.4.0, you can now&amp;nbsp;add a new attribute to the services element called EnvironmentID in your services.config. &amp;nbsp;This attribute is picked up by the WPF runtime engine and displayed on the logon, splash and browser status bar. This helps identify what services are being called.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e9d5e088-084d-41f2-a73a-a5ad0159dae8_2016-02-08-09-44-16.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;In the WPF UX, the environment ID along with the "Version" key from the app.config shows on the logon, splash and browser window.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/3544d5a7-6c60-4cf7-bde1-a5ad0159b836_2016-02-08-09-46-03.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/5f353523-31f9-4014-bf05-a5ad015a3008_2016-02-08-09-46-57.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e318ba1c-6968-40f4-a7ac-a5ad015a3b8d_2016-02-08-17-23-38.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-02-15T21:00:45.1000000</pubDate>
      <link>http://support.surroundtech.com/thread/services-config-and-the-environmentid-attribute/</link>
    </item>
    <item>
      <title>Instructions for creating Deployment Scripts in systems generated prior to version 6.1.4.0</title>
      <description>&lt;p&gt;Accelerator version 6.1.4.0&amp;nbsp;&amp;nbsp;makes deploying WPF applications to multiple environments much easier and now generates scripts to automate and standardize the deployment process. &amp;nbsp;Once configured, a developer can deploy to multiple environments by running a .bat file. &amp;nbsp;This can be further automated by using 3rd party products such as&amp;nbsp;&lt;a href="https://www.jetbrains.com/teamcity/" target="_blank"&gt;TeamCity&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;This documents the process of adding the necessary files to your system to support the deployment scripts. Systems generated with version 6.1.4.0 and greater already have these files generated and can refer to instructions to configure the deployment scripts.&lt;/p&gt;&#xD;
&lt;p&gt;Steps:&lt;/p&gt;&#xD;
&lt;p&gt;1) Generate the Build and Deployment Scripts&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Launch the Accelerator Launchpad&lt;/li&gt;&#xD;
&lt;li&gt;Click Tools (1) and then click the Code Generator (2)&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/fc04b3ed-50be-4c33-8c2b-a5ad0142b683_2016-02-15-14-34-33.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Select the System Configuration&lt;/li&gt;&#xD;
&lt;li&gt;Click on Edit Button (1)&lt;/li&gt;&#xD;
&lt;li&gt;Expand Generation Options (2)&lt;/li&gt;&#xD;
&lt;li&gt;Specify your Envionment IDs separated by a comma (3).&lt;/li&gt;&#xD;
&lt;li&gt;Specify the Deployment Output Folder (4). It is recommended to keep this folder outside of source control. This is where the packages will be created. There will be 1 zipped folder per environment ID.&amp;nbsp;&lt;/li&gt;&#xD;
&lt;li&gt;Click Save and Close (5)&lt;/li&gt;&#xD;
&lt;li&gt;Click Generate Build Script (6)&lt;/li&gt;&#xD;
&lt;li&gt;Click Generated Deployment Script (7)&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e71dd356-1dde-4807-94ae-a5ad01484ee4_2016-02-04-11-15-57.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/aef8132a-a9cb-47f0-97cd-a5ad01487984_2016-02-08-09-35-58.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2)&amp;nbsp;Add ConnectionParms.config and Service.Config for each Environment ID.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Open one of your Visual Studio Solutions. &amp;nbsp;We will only be working with the System projects, so you can just open the .sln located in your system folder.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Updates to your DALServiceHost Project:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;In your DALServiceHost Project, Create a ConnectionParm.config for each of your Envionment IDs. &amp;nbsp;The name of each config should follow this&amp;nbsp;standard: ConnectionParms.&amp;lt;EnvironmentID&amp;gt;.config (1).&lt;/li&gt;&#xD;
&lt;li&gt;Set the Build Action to Content and the Copy to Output Directory to Copy if newer.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/dd55e301-300a-4657-ab38-a5ad014b0352_2016-02-15-15-04-14.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Setup each&amp;nbsp;ConnectionParms.&amp;lt;EnvironmentID&amp;gt;.config with the correct settings for the environment. It may be helpful to set the "idref" to something meaningful like "DEVDB", "TSTDB" etc. Just make sure to set the idref and the server id.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/2cf5af6d-8882-4d6f-9386-a5ad014c4241_2016-02-15-15-09-31.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Updates to your&amp;nbsp;BPServiceHost Project:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;In your BPServiceHost Project, Create a Services.config for each of your Envionment IDs. &amp;nbsp;The name of each config should follow this&amp;nbsp;standard: Services.&amp;lt;EnvironmentID&amp;gt;.config (2).&lt;/li&gt;&#xD;
&lt;li&gt;Set the Build Action to Content and the Copy to Output Directory to Copy if newer.&lt;/li&gt;&#xD;
&lt;li&gt;Setup each Services.&amp;lt;EnvironmentID&amp;gt;.config with the correct settings for the environment. You can also add a new attribute to the services element called EnvironmentID. &amp;nbsp;This attribute is picked up by the WPF runtime engine and displayed on the logon, splash and browser status bar. This helps identify what services are being called.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/e75446a2-0db3-4eea-809b-a5ad014d4694_2016-02-08-09-44-16.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;In your&amp;nbsp;BPServiceHost project, you can also add the existing items (all your newly created ConnectionParms.&amp;lt;EnvironmentID&amp;gt;.config) from your DalServiceHost (3). &amp;nbsp;When you add them make sure to specify "Add As Link"&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/d7aa03ae-a6f4-4b34-8a5f-a5ad014eaa18_2016-02-15-15-17-20.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Set the Build Action to Content and the Copy to Output Directory to Copy if newer.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Here is an exmaple of what your dal and bp service hosts should look like:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/f1f2dc94-4a0b-4dc7-a593-a5ad014fcd61_2016-02-08-09-41-05.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Updates to your WPF System&amp;nbsp;Project:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;&lt;/strong&gt;In the WPF System Project,&amp;nbsp;add all your newly created ConnectionParms.&amp;lt;EnvironmentID&amp;gt;.config from your DalServiceHost and all your newly created Services.&amp;lt;EnvironmentID&amp;gt;.config from your BPServiceHost as linked Items. &amp;nbsp;When you add them make sure to specify "Add As Link"&lt;/li&gt;&#xD;
&lt;li&gt;For&amp;nbsp;all the&amp;nbsp;Services.configs,&amp;nbsp;Set the Build Action to Content and the Copy to Output Directory to Copy if newer.&lt;/li&gt;&#xD;
&lt;li&gt;For&amp;nbsp;all the&amp;nbsp;ConnectionParms.config,&amp;nbsp;Set the Build Action to&amp;nbsp;&lt;strong&gt;None&lt;/strong&gt;&amp;nbsp;and the Copy to Output Directory to Copy if newer.&amp;nbsp;&lt;em&gt;(Setting the Build Action to None will ensure that the connectionParms.config is not deployed to the WPF client)&lt;/em&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Refer to &lt;a href="/thread/configuring-the-deployment-scripts/"&gt;Configuring the Click Once Settings for use with Deployment Scripts&lt;/a&gt; for more details on setting up the Deployments&lt;/p&gt;</description>
      <pubDate>2016-02-15T20:24:18.8970000</pubDate>
      <link>http://support.surroundtech.com/thread/instructions-for-creating-deployment-scripts-in-systems-generated-prior-to-version-6-1-4-0/</link>
    </item>
    <item>
      <title>AB_DropDown Dependency Properties</title>
      <description>&lt;p&gt;There are three different types of dependencies properties that can be added to a dropdown. &amp;nbsp;Below are the three types are:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;ap_KeyDependencyProperties - This should be the set of properties&amp;nbsp;that uniquely identifies a record.&lt;/li&gt;&#xD;
&lt;li&gt;ap_FilterDependecyProperties - These are properties&amp;nbsp;that filter the list of the return records. &amp;nbsp;Can also be fields in the ap_KeyDependencyProperties.&lt;/li&gt;&#xD;
&lt;li&gt;ap_NonKeyDependencyProperties - These are additional properties&amp;nbsp;that are obtained from the selected record.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;Note: A Dependency Property can belong to more than 1 of these collections, but properties&amp;nbsp;in the ap_NonKeyDependencyProperties should not be in any of the other collections.&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Each dependency property can also implement an on changed event. &amp;nbsp;The two main change event handlers are am_OnIdChanged and am_OnFilterIdChanged. &amp;nbsp;The ap_NonKeyDependencyProperties should not implement either of these change handlers.&lt;/p&gt;&#xD;
&lt;p&gt;When am_OnIdChanged gets invoked it will do the following:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;If field is in the ap_FilterDependencyProperties it will call am_OnFilterIdChanged&lt;/li&gt;&#xD;
&lt;li&gt;Creates a new entity and populates all of the ap_KeyDependencyProperties that are not non null ap_FilterDependencyProperties&lt;/li&gt;&#xD;
&lt;li&gt;If any of the ap_KeyDependencyProperties are not null then it attempts to fetch the record with a query object with only the ap_KeyDependencyProperties set.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;When am_OnFilterIdChanged gets invoked it will do the following&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Clear all records in the dropdown&lt;/li&gt;&#xD;
&lt;li&gt;Clear all of the ap_NonKeyDependencyProperties and any ap_KeyDependencyProperty that is not in the ap_FilterDependencyProperties&lt;/li&gt;&#xD;
&lt;li&gt;Set the currently selected dropdown item to null&lt;/li&gt;&#xD;
&lt;li&gt;Fire the change events&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;All ap_KeyDependencyProperties should use the am_OnIdChanged as the change hanlder even if they are also in the ap_FilterDependencyProperties. &amp;nbsp;Properties&amp;nbsp;that are only in the ap_FilterDependencyProperties should use am_OnFilterIdChanged. &amp;nbsp;Properties&amp;nbsp;that are in the ap_NonKeyDependencyProperties should not have any changed event hanlder unless it is some custom logic.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Properties that are in the ap_KeyDependencyProperties should also be in the ap_FilterDependencyProperty when&amp;nbsp;they are keys to the record but not the field that gets entered into the dropdown.&lt;/p&gt;</description>
      <pubDate>2016-02-12T20:22:24.3800000</pubDate>
      <link>http://support.surroundtech.com/thread/ab_dropdown-dependency-properties/</link>
    </item>
    <item>
      <title>WPF Click Once Deployment - Setting Minimum Required Version Automatically</title>
      <description>&lt;p&gt;&lt;target name="AutoSetMinimumRequiredVersion" beforetargets="GenerateDeploymentManifest"&gt;&lt;formatversion version="$(ApplicationVersion)" revision="$(ApplicationRevision)"&gt;When you publish a WPF Click-Once installation, you have the option to set the Minimum Required Version on the Application Updates Dialog. &amp;nbsp;&lt;/formatversion&gt;&lt;/target&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/e4888216-20bf-4459-a6bf-a572014a769b/2c2cfeb7-61e2-417c-a3b7-a59c01164d5d_2016-01-29-11-45-14.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;target name="AutoSetMinimumRequiredVersion" beforetargets="GenerateDeploymentManifest"&gt;&lt;formatversion version="$(ApplicationVersion)" revision="$(ApplicationRevision)"&gt;Setting the minimum version to the current version will force the update on the user instead of giving the user the option to download the new install. &amp;nbsp;Generally, our customers want to force the new version on the users and not give them an option. In order to do this, you need to always remember to set the minimum version. &amp;nbsp;This is a way to have the minimum version to allows be the current version. &amp;nbsp;You simplly need to add this to your Project file. &amp;nbsp;Open your wpf .csproj file into a text editor and add Target to the Project.&lt;/formatversion&gt;&lt;/target&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;target name="AutoSetMinimumRequiredVersion" beforetargets="GenerateDeploymentManifest"&gt;&lt;formatversion version="$(ApplicationVersion)" revision="$(ApplicationRevision)"&gt;&lt;output propertyname="MinimumRequiredVersion" taskparameter="OutputVersion"&gt;&lt;/output&gt; &lt;/formatversion&gt; &lt;formatversion version="$(ApplicationVersion)" revision="$(ApplicationRevision)"&gt; &lt;output propertyname="_DeploymentBuiltMinimumRequiredVersion" taskparameter="OutputVersion"&gt;&lt;/output&gt; &lt;/formatversion&gt; &lt;/target&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;  &amp;lt;Target Name=&lt;span style="color: #a31515;"&gt;"AutoSetMinimumRequiredVersion"&lt;/span&gt; BeforeTargets=&lt;span style="color: #a31515;"&gt;"GenerateDeploymentManifest"&lt;/span&gt;&amp;gt;&#xD;
    &amp;lt;FormatVersion Version=&lt;span style="color: #a31515;"&gt;"$(ApplicationVersion)"&lt;/span&gt; Revision=&lt;span style="color: #a31515;"&gt;"$(ApplicationRevision)"&lt;/span&gt;&amp;gt;&#xD;
      &amp;lt;Output PropertyName=&lt;span style="color: #a31515;"&gt;"MinimumRequiredVersion"&lt;/span&gt; TaskParameter=&lt;span style="color: #a31515;"&gt;"OutputVersion"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;/FormatVersion&amp;gt;&#xD;
    &amp;lt;FormatVersion Version=&lt;span style="color: #a31515;"&gt;"$(ApplicationVersion)"&lt;/span&gt; Revision=&lt;span style="color: #a31515;"&gt;"$(ApplicationRevision)"&lt;/span&gt;&amp;gt;&#xD;
      &amp;lt;Output PropertyName=&lt;span style="color: #a31515;"&gt;"_DeploymentBuiltMinimumRequiredVersion"&lt;/span&gt; TaskParameter=&lt;span style="color: #a31515;"&gt;"OutputVersion"&lt;/span&gt; /&amp;gt;&#xD;
    &amp;lt;/FormatVersion&amp;gt;&#xD;
  &amp;lt;/Target&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;This target is now included in the Accelerator Templates and will be added whe generating systems in the future.&lt;/p&gt;</description>
      <pubDate>2016-01-29T16:55:15.6030000</pubDate>
      <link>http://support.surroundtech.com/thread/wpf-click-once-deployment-setting-minimum-required-version-automatically/</link>
    </item>
    <item>
      <title>Use AB_LogicalOperatorScope to analyze performance using System.Diagnostics.Trace</title>
      <description>&lt;p&gt;If your code is performing slowly and you're not sure why, a useful analysis technique is to add some diagnostic logging around blocks of code you suspect might be slow and to report how much time is spent in those code blocks. System.Diagnostics provides a number of tools which can be used, including the Stopwatch class for high-resolution timing and the Trace class for sending output to various TraceListeners. When an application is running in debug mode, Visual Studio attaches a ConsoleTraceListener to the Output window for you, so any trace output, such as from calling System.Diagnostics.Trace.WriteLine(), will be visible there. It's also possible, using settings in App.Config or Web.Config, to send trace output to other places, such as text files or the Windows Event log.&lt;/p&gt;&#xD;
&lt;p&gt;The AB_LogicalOperationScope class makes it easy to wrap a block of code with tracing, with a start time, end time, duration, and nested logging. To use it, wrap the code to diagnose in a &lt;span style="font-family: Consolas;"&gt;using &lt;/span&gt;block. These blocks can be nested, which will cause the log entries to be indented to show the nesting:&lt;/p&gt;&#xD;
&#xD;
&lt;pre style="margin: 0; line-height: 125%;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; am_AsyncSearchCompleted(System.Collections.IList EntityRecords, AB_SelectReturnArgs SelectReturnArgs)&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_LogicalOperationScope(&lt;span style="color: #a31515;"&gt;"am_AsyncSearchCompleted"&lt;/span&gt;))&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_LogicalOperationScope(&lt;span style="color: #a31515;"&gt;"Call base.am_AsyncSearchCompleted"&lt;/span&gt;))&#xD;
        {&#xD;
            &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.am_AsyncSearchCompleted(EntityRecords, SelectReturnArgs);&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_LogicalOperationScope(&lt;span style="color: #a31515;"&gt;"Call _LoadTree after async search"&lt;/span&gt;))&#xD;
        {&#xD;
            &lt;span style="color: #008000;"&gt;// Load Tree&lt;/span&gt;&#xD;
            _LoadTree();&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (_SelectedModule == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&#xD;
            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;;&#xD;
&#xD;
        &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; AB_LogicalOperationScope(&lt;span style="color: #a31515;"&gt;"Set ap_SelectedItem properties after async search"&lt;/span&gt;))&#xD;
        {&#xD;
            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (AB_BusinessObjectEntityBase item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; ap_DataPresenter.ap_Items.Cast&amp;lt;ab_businessobjectentitybase&amp;gt;().Where(item =&amp;amp;gt; item.ap_CompleteUniqueKey == _SelectedModule.ap_CompleteUniqueKey))&#xD;
            {&#xD;
                ap_DataPresenter.ap_SelectedItem = item;&#xD;
                &lt;span style="color: #0000ff;"&gt;break&lt;/span&gt;;&#xD;
            }&#xD;
        }&#xD;
    } &#xD;
}&amp;lt;/ab_businessobjectentitybase&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&#xD;
&lt;p&gt;This method's log trace will look like this:&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;code&gt;&lt;xmp&gt;&#xD;
[171318832883] START am_AsyncSearchCompleted&#xD;
    [171318888188] START Call base.am_AsyncSearchCompleted&#xD;
    [171319062011] FINISH (66.916909ms) Call base.am_AsyncSearchCompleted&#xD;
    [171319074116] START Call _LoadTree after async search&#xD;
        [171319095415] START _LoadTree - 142ab766-fc33-43be-8032-8331bba53513&#xD;
            [171319104210] START Set expanded flag and event handler - 142ab766-fc33-43be-8032-8331bba53513&#xD;
            [171319114309] FINISH (3.891454ms) Set expanded flag and event handler - 142ab766-fc33-43be-8032-8331bba53513&#xD;
            [171319131723] START Add modules to recordSet - 142ab766-fc33-43be-8032-8331bba53513&#xD;
            [171319143700] FINISH (4.614388ms) Add modules to recordSet - 142ab766-fc33-43be-8032-8331bba53513&#xD;
            [171319171338] START Call ap_DataTransform for 3 records - 142ab766-fc33-43be-8032-8331bba53513&#xD;
            [171319216930] FINISH (17.554848ms) Call ap_DataTransform for 3 records - 142ab766-fc33-43be-8032-8331bba53513&#xD;
        [171319230210] FINISH (51.892719ms) _LoadTree - 142ab766-fc33-43be-8032-8331bba53513&#xD;
    [171319236621] FINISH (62.559667ms) Call _LoadTree after async search&#xD;
[171319240466] FINISH (156.903067ms) am_AsyncSearchCompleted&#xD;
&lt;/xmp&gt;&lt;/code&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-01-29T16:21:38.4930000</pubDate>
      <link>http://support.surroundtech.com/thread/use-ab_logicaloperatorscope-to-analyze-performance-using-system-diagnostics-trace/</link>
    </item>
    <item>
      <title>Accelerator Tab Controls</title>
      <description>&lt;p&gt;In order to support this new feature, the Module Detail XAML code needed to be updated to support a new TabControl and TabItem Class. The TabControl will be replaced with either AB_DockingTabControl or AB_TabControl and TabItem will be replaced with AB_Tab. The decision to replace TabControl with either AB_DockingTabControl or AB_TabControl depends on whether you want to use this new float/docking enhancement. The decision of what control to use is stored in your Standards Configuration. The Upgrade Utility and the Generation Wizards will pull from this standards configuration to decide which control to use. Before you use the Upgrade Utility, make sure to set the System Configuration to your desired setting. The default is to use the Docking control which will scrub your detail XAML and replace TabControl with AB_DockingTabControl.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The&amp;nbsp;new tab control types are AB_TabControl and AB_DockingTabControl. &amp;nbsp;The AB_TabControl inherits from the WPF TabControl and the AB_DockingTabControl inherits from the Dragablz tab control.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Scrub Program Code Changes:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The scrub program will upgrade a module's existing generated code to use one of the new Tab Control types. The scrub program does the following steps to update any existing code.&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Adds an app.config setting for Module.TabControl.AssemblyName and Module.TabControl.ClassName&lt;/li&gt;&#xD;
&lt;li&gt;If docking tabs are selected it will add a reference to the Dragablz.dll to every WPF module project&lt;/li&gt;&#xD;
&lt;li&gt;WPF Detail.xaml changes&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Docking Tab changes&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;AB_Tab, AB_TabItem, TabItem all get converted to AB_DockingTabItem&lt;/li&gt;&#xD;
&lt;li&gt;Style attribute is removed from AB_DockingTabItem&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Standard Tab changes&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;AB_Tab, AB_DockingTabItem, TabItem all get converted to AB_TabItem&lt;/li&gt;&#xD;
&lt;li&gt;Style attribute is removed from AB_TabItem&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;WPF Detail.xaml.cs changes&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;ap_MainTabControl.ap_Tabs has been changed to ap_MainTabControl.ap_TabItems&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;WPF ContentWindow.xaml.cs changes&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;ap_SubBrowserTabControl.ap_Tabs has been changed&amp;nbsp;to ap_SubBrowserTabControl.ap_TabItems&lt;/li&gt;&#xD;
&lt;li&gt;am_SubBrowsersCreated(ObservableCollection&amp;lt;AB_Tab&amp;gt; has been changed to&amp;nbsp;am_SubBrowsersCreated(ObservableCollection&amp;lt;AB_TabItem&amp;gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Issues when upgrading to AB_DockingTabControl:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The AB_DockingTabItem does not get displayed in the visual tree. Because it is not a part of the visual tree this breaks most bindings using the ElementName. &amp;nbsp;If the binding is referencing another control that is not a parent of the control you can switch and ElementName binding to use a source of x:Reference. &amp;nbsp;The x:Reference binding results in the same behavior in most cases as the ElementName but it finds the controls differently.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;The AB_DockingTabItems does not inherit the DataContext of the AB_DockingTabControl by default. &amp;nbsp;For any additional tabs added to a detail at the Main tab control level it is suggested that these tabs be added to the ap_AdditionalTabItemsToSetDataContextOn collection in the am_SetParentProperties method of the code behind for the detailer. &amp;nbsp;For any child tab controls if the desired DataContext is the ap_CurrentEntity of the detailer than the same method will work, otherwise a binding will need to be set for each TabItem to the desired DataContext for that tab.&lt;/p&gt;</description>
      <pubDate>2016-01-19T22:13:26.5500000</pubDate>
      <link>http://support.surroundtech.com/thread/accelerator-tab-controls/</link>
    </item>
    <item>
      <title>Adding Placeholder Text to Fields and Dropdowns</title>
      <description>&lt;p&gt;The Accelerator supports adding placeholder text to Textboxes and Dropdowns for the purpose of showing instructions to a user before they've entered a value. To add Placeholder text to your inputs, see the instructions below.&lt;/p&gt;&#xD;
&lt;hr&gt;&#xD;
&lt;p&gt;&lt;strong&gt;To add Placeholder text to AB_FieldWithLabel controls&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Set ap_PlaceholderText to the text you want to show.&lt;/li&gt;&#xD;
&lt;li&gt;Set ap_IsPlaceholderTextVisible to 'True'.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;/strong&gt;&lt;span style="text-decoration: underline;"&gt;Example&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;blockquote&gt;&lt;span style="background-color: #333333; color: white; padding: 3px; display: block; font-size: small;"&gt;&lt;strong&gt;XAML&lt;br&gt;&lt;/strong&gt;&lt;/span&gt;&#xD;
&lt;pre style="margin-top: 0px;"&gt;&amp;lt;base:AB_FieldWithLabel ap_PlaceholderText="Enter Product number" ap_IsPlaceholderTextVisible="True" ... /&amp;gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/ec719553-d9f3-4786-af00-a57201746f61/3a9a7677-9754-477a-b1ce-a58a011b4325_placeholder-field.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;strong&gt;To add Placeholder text to AB_DropDownBase controls&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Add an event handler to the dropdowns 'Loaded' event.&lt;/li&gt;&#xD;
&lt;li&gt;In the event handler, set ap_ComboDropDownPlaceHolderText on the MainComboBox control inside of the Dropdown to the text you want to show.&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &lt;/strong&gt;&lt;span style="text-decoration: underline;"&gt;Example&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;blockquote&gt;&lt;span style="background-color: #333333; color: white; padding: 3px; display: block; font-size: small;"&gt;&lt;strong&gt;XAML&lt;br&gt;&lt;/strong&gt;&lt;/span&gt;&#xD;
&lt;pre style="margin-top: 0px;"&gt;&amp;lt;base:AB_DropDownBase x:Name="Field_ProductDropdown" Loaded="Field_ProductDropdown_Loaded" ... /&amp;gt;&lt;/pre&gt;&#xD;
&lt;span style="background-color: #333333; color: white; padding: 3px; display: block; font-size: small;"&gt;&lt;strong&gt;C#&lt;br&gt;&lt;/strong&gt;&lt;/span&gt;&#xD;
&lt;pre style="margin-top: 0px;"&gt;private void Field_ProductDropdown_Loaded(object sender, RoutedEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp; &amp;nbsp; AB_DropDownBase dropdown = sender as AB_DropDownBase;&lt;br&gt;&amp;nbsp; &amp;nbsp; if (dropdown == null || dropdown.ap_MainComboBox == null)&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; dropdown.ap_MainComboBox.ap_ComboDropDownPlaceHolderText = "Select a Product";&lt;br&gt;}&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;img src="/content/uploads/ec719553-d9f3-4786-af00-a57201746f61/646eba41-3f7b-41ff-aade-a58a011c56af_placeholder-dropdown.jpg?width=690&amp;amp;upscale=false" alt=""&gt;&lt;/p&gt;&#xD;
&lt;/blockquote&gt;</description>
      <pubDate>2016-01-11T17:16:12.1000000</pubDate>
      <link>http://support.surroundtech.com/thread/adding-placeholder-text-to-fields-and-dropdowns/</link>
    </item>
    <item>
      <title>Fiddler (software) - Captures HTTP and HTTPS traffic and logs it for the user to review</title>
      <description>&lt;p&gt;Fiddler is a great tool to monitor network traffic which can give you insight into the service calls from your application to understand frequency and duration. &amp;nbsp;I like to use this tool as part of undertanding and improving performance. You may need to use other profiling tools as well, but this is a great tool to undertand what service calls are taking the longest to execute.&lt;/p&gt;&#xD;
&lt;p&gt;You can download Fiddler4 from &lt;a href="https://www.telerik.com/download/fiddler"&gt;here&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;Here is more information from &lt;a href="https://en.wikipedia.org/wiki/Fiddler_(software)"&gt;wikipedia&lt;/a&gt;.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;</description>
      <pubDate>2016-01-04T15:39:08.4570000</pubDate>
      <link>http://support.surroundtech.com/thread/fiddler-software-captures-http-and-https-traffic-and-logs-it-for-the-user-to-review/</link>
    </item>
    <item>
      <title>Improve MVC performance by managing Session and Output Cache</title>
      <description>&lt;p&gt;There are two attributes that can be placed on an MVC Controller class improve the performance of all the methods in the class:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;b&gt;SessionState&lt;/b&gt; - By setting to readonly, methods in the controller can be called and executed in parallel by concurrent AJAX requests. However, they won't be able to make any changes to the &lt;code&gt;Session[]&lt;/code&gt; object.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;b&gt;OutputCache&lt;/b&gt; - The responses to the class' methods will be cached for up to the specified duration. The VaryByParam value ensures that both the url and query parameters will be used to uniquely identify a request/response in the cache. The VaryByCustom value uses a method in MvcApplication to ensure that the cache is cleared when the session id changes after the user logs out and back in.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;b&gt;See Also:&lt;/b&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.stefanprodan.com/2012/02/parallel-processing-of-concurrent-ajax-requests-in-asp-net-mvc/"&gt;http://www.stefanprodan.com/2012/02/parallel-processing-of-concurrent-ajax-requests-in-asp-net-mvc/&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output-caching-cs"&gt;http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output-caching-cs&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/2289941/outputcache-controller-attribute-vary-by-user-role-is-this-possible-in-net-mvc"&gt;http://stackoverflow.com/questions/2289941/outputcache-controller-attribute-vary-by-user-role-is-this-possible-in-net-mvc&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;pre&gt;&lt;code&gt;&lt;xmp&gt;&#xD;
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]&#xD;
[OutputCache(NoStore=false, Duration=180, VaryByParam="*", VaryByCustom="SessionID", Location=OutputCacheLocation.Server)]&#xD;
public class FeaturedSpecialsController : Controller&#xD;
{&#xD;
...&#xD;
}&#xD;
&lt;/xmp&gt;&lt;/code&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;Here is the implementation of the VaryByCustom method in the &lt;code&gt;AB_MvcApplication&lt;/code&gt; class. It supports "SessionID" as the VaryByCustom value, or a special case value of "_ExpBarSearchPopulated" that's used in the Accelerator Line-of-Business application. Any other values are passed to the base HttpApplication class.&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;code&gt;&lt;xmp&gt;&#xD;
/// &lt;summary&gt;&#xD;
/// Used for OutputCacheAttribute on controller classes or action methods&#xD;
/// &lt;/summary&gt;&#xD;
///&lt;param name="context"&gt;An &lt;see cref="T:System.Web.HttpContext"&gt;&lt;/see&gt; object that contains information about the current Web request.&#xD;
///&lt;param name="custom"&gt;The custom string that specifies which cached response is used to respond to the current request.&#xD;
/// &lt;returns&gt;If the value of the &lt;paramref name="custom"&gt;&lt;/paramref&gt; parameter is "browser", the browser's &lt;see cref="P:System.Web.Configuration.HttpCapabilitiesBase.Type"&gt;&lt;/see&gt;; otherwise, null.&lt;/returns&gt;&#xD;
/// &lt;remarks&gt;&lt;example&gt;&#xD;
/// &lt;code&gt;&#xD;
/// [OutputCache(NoStore=false, Duration=180, VaryByParam="*", VaryByCustom="SessionID", Location=OutputCacheLocation.Server)]&#xD;
/// &lt;/code&gt;&#xD;
/// &lt;/example&gt;&#xD;
/// When this attribute is applied to a controller class or an &#xD;
/// individual action method, the response to the method(s) will be &#xD;
/// cached for up to the specified duration. The VaryByParam value &#xD;
/// ensures that both the url and query parameters will be used &#xD;
/// to uniquely identify a request/response in the cache.&#xD;
/// The VaryByCustom value "SessionID" is applied by this method&#xD;
/// to ensure that the cache is cleared when the session id changes &#xD;
/// after the user logs out and back in.&#xD;
/// See Also:&#xD;
/// http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output-caching-cs&#xD;
/// http://stackoverflow.com/questions/2289941/outputcache-controller-attribute-vary-by-user-role-is-this-possible-in-net-mvc&lt;/remarks&gt;&#xD;
public override string GetVaryByCustomString(HttpContext context, string custom)&#xD;
{&#xD;
    if (custom.ToLower().Equals("sessionid"))&#xD;
    {&#xD;
        return GetVaryBySessionString(context);&#xD;
    }&#xD;
    else if (custom.ToLower().Equals("_expbarsearchpopulated"))&#xD;
    {&#xD;
        // For the ExpBarSearch form in the navigator, vary by sessionid to make sure&#xD;
        // each user gets their own cache, and also by module number and any form fields&#xD;
        // that are currently cached for the module.&#xD;
&#xD;
        var modulenum = context.Request["modulenum"];  // From MainController.Index()&#xD;
        var cacheString = AB_BaseController.am_GetExpBarCustomCacheString(modulenum, context.Session);&#xD;
        return GetVaryBySessionString(context) + ";" + modulenum + ";" + cacheString;&#xD;
     }&#xD;
&#xD;
    return base.GetVaryByCustomString(context, custom);&#xD;
}&#xD;
&#xD;
/// &lt;summary&gt;&#xD;
/// Gets the vary by session string.&#xD;
/// &lt;/summary&gt;&#xD;
///&lt;param name="context"&gt;The context.&#xD;
/// &lt;returns&gt;System.String.&lt;/returns&gt;&#xD;
protected string GetVaryBySessionString(HttpContext context)&#xD;
{&#xD;
    // The combination of the ASP.NET session id and the A4DN&#xD;
    // session token should be unique per-user and per-login.&#xD;
    var aspSessionID = context.Request.Cookies["ASP.NET_SessionId"];&#xD;
    var aspxAuth = context.Request.Cookies[".ASPXAUTH"];&#xD;
    var a4dnSession = context.Request.Cookies["session"];&#xD;
&#xD;
    if (aspSessionID != null || aspxAuth != null || a4dnSession != null)&#xD;
    {&#xD;
        return (aspSessionID == null ? "" : aspSessionID.Value)&#xD;
             + (aspxAuth == null ? "" : aspxAuth.Value)&#xD;
             + (a4dnSession == null ? "" : a4dnSession.Value);&#xD;
    }&#xD;
    else&#xD;
    {&#xD;
        return "";&#xD;
    }&#xD;
}&#xD;
&lt;/xmp&gt;&lt;/code&gt;&lt;/pre&gt;</description>
      <pubDate>2016-01-03T16:56:32.4100000</pubDate>
      <link>http://support.surroundtech.com/thread/improve-mvc-performance-by-managing-session-and-output-cache/</link>
    </item>
    <item>
      <title>IIS Application Deployment Security Setup</title>
      <description>&lt;p&gt;&lt;strong&gt;Steps for setting up a new MVC/WCF Deployment on IIS7+&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;Create a new Application Pool for the deployment.&#xD;
&lt;ol type="a"&gt;&#xD;
&lt;li&gt;Right-click on Appplication Pools and choose &amp;ldquo;Add Application Pool&amp;rdquo;&lt;/li&gt;&#xD;
&lt;li&gt;Use the name of your MVC/WCF app as the name of your application pool, so it&amp;rsquo;s easy to tell that they go together later.&lt;/li&gt;&#xD;
&lt;li&gt;Make sure .NET 4.*, Integrated pipeline, and Start Immediately are selected, and click OK.&lt;/li&gt;&#xD;
&lt;li&gt;In the Application Pool list, right-click on the new pool and choose Advanced Settings&lt;/li&gt;&#xD;
&lt;li&gt;Under Process Model, set Identity to &amp;ldquo;ApplicationPoolIdentity&amp;rdquo;. This creates a new account on the machine which will be used to run the pool.&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Create your new Application&#xD;
&lt;ol type="a"&gt;&#xD;
&lt;li&gt;Right-click on the Site you want to use to host your new application, and choose &amp;ldquo;Add Application&amp;rdquo;&lt;/li&gt;&#xD;
&lt;li&gt;The Alias is usually your application name; this becomes the root portion of the url for your application.&lt;/li&gt;&#xD;
&lt;li&gt;Click the Select button to choose an application pool, and select the app pool you created in step #1&lt;/li&gt;&#xD;
&lt;li&gt;Select the physical path where the application will be deployed.&lt;/li&gt;&#xD;
&lt;li&gt;Click Connect As, and make sure &amp;ldquo;Application user&amp;rdquo; is selected. This tells IIS to use the application pool user created in step #1b.&lt;/li&gt;&#xD;
&lt;li&gt;Don&amp;rsquo;t bother with Test Settings; it will fail at this point.&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Set up file system security&#xD;
&lt;ol type="a"&gt;&#xD;
&lt;li&gt;Select your Application in the connections panel, and click on Edit Permissions in the right-hand Actions panel.&lt;/li&gt;&#xD;
&lt;li&gt;Open the Security tab, and click Edit, then click Add on the dialog that comes up.&lt;/li&gt;&#xD;
&lt;li&gt;In &amp;ldquo;Enter the object names to select&amp;rdquo;, type in &lt;code&gt;IIS AppPool\{name of the application pool from step #1b}&lt;/code&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Eg: If you named your application pool &lt;code&gt;MyApp&lt;/code&gt;, you would type in &lt;code&gt;IIS AppPool\MyApp&lt;/code&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;Click on Check Names, and it should accept the name, which will appear as just your app name underlined.&lt;/li&gt;&#xD;
&lt;li&gt;Click OK once to get back to the security settings, and choose the permissions you need. Typically "Read &amp;amp; Execute", "List Folder Contents", and "Read" are sufficient for web sites/services that don't need to modify any files. For CMS websites, the Views folder requires Full Control so that the website can write out cached razor template versions of the HTML Body content that comes from the CMS Webpages module. See step #4.&lt;/li&gt;&#xD;
&lt;li&gt;Click OK two more times to go back to IIS.&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;/li&gt;&#xD;
&lt;li&gt;For CMS-based websites, Navigate to the Views folder in Windows Explorer, right-click on it and open the Properties dialog, go to the Security tab and click on the Edit button. Choose the user for your application pool, give it Full Control, and click Apply to save the change.&lt;/li&gt;&#xD;
&lt;/ol&gt;</description>
      <pubDate>2016-01-03T16:26:33.8770000</pubDate>
      <link>http://support.surroundtech.com/thread/iis-application-deployment-security-setup/</link>
    </item>
    <item>
      <title>Intercept and Customize MVC model binding</title>
      <description>&lt;p&gt;I have an MVC project that uses data entity objects which have a virtual &lt;code&gt;DeliveryDate&lt;/code&gt; property whose getter creates a &lt;code&gt;DateTime&lt;/code&gt; from &lt;code&gt;DeliveryYear&lt;/code&gt;, &lt;code&gt;DeliveryMonth&lt;/code&gt;, and &lt;code&gt;DeliveryDay&lt;/code&gt; &lt;code&gt;int&lt;/code&gt; properties. There is no setter for converting the other way; it had been intentionally removed at some point. This caused a problem for me: I&amp;rsquo;m displaying &lt;code&gt;DeliveryDate&lt;/code&gt; in a form using &lt;code&gt;@Html.EditorFor(m =&amp;gt; m.DeliveryDate)&lt;/code&gt;, but the model that my request handler gets back from POST requests always has &lt;code&gt;DateTime.Now&lt;/code&gt; in &lt;code&gt;DeliveryDate&lt;/code&gt;, because the year, month, and day properties aren&amp;rsquo;t being set and the virtual returns &lt;code&gt;DateTime.Now&lt;/code&gt; by default.&lt;/p&gt;&#xD;
&lt;p&gt;My solution is to intercept MVC's model binding and set &lt;code&gt;DeliveryYear&lt;/code&gt;, &lt;code&gt;DeliveryMonth&lt;/code&gt;, and &lt;code&gt;DeliveryDay&lt;/code&gt; based on the &lt;code&gt;DeliveryDate&lt;/code&gt; value being submitted. This is actually pretty easy to do, but it was hard to find out how to do it.&lt;/p&gt;&#xD;
&lt;p&gt;My data entity class is named &lt;code&gt;WebOrderEntity&lt;/code&gt;. The first step is to create a class named &lt;code&gt;WebOrderEntityBinder&lt;/code&gt;. I&amp;rsquo;ll get to the details of that class in a moment.&lt;/p&gt;&#xD;
&lt;p&gt;Next, in &lt;code&gt;Global.asax&lt;/code&gt;&amp;rsquo;s &lt;code&gt;Application_Start()&lt;/code&gt; method I register my custom binder class for the &lt;code&gt;WebOrderEntity&lt;/code&gt; type:&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;code&gt;&lt;xmp&gt;&#xD;
// Register custom model binder classes&#xD;
ModelBinders.Binders[typeof(RR.Entities.WebOrderEntity)] = new WebOrderEntityBinder();&#xD;
&lt;/xmp&gt;&lt;/code&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;Easy enough.&lt;/p&gt;&#xD;
&lt;p&gt;Now, the binder class:&lt;/p&gt;&#xD;
&lt;pre&gt;&lt;code&gt;&lt;xmp&gt;&#xD;
public class WebOrderEntityBinder : DefaultModelBinder&#xD;
{&#xD;
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)&#xD;
    {&#xD;
        var model = bindingContext.Model as WebOrderEntity;&#xD;
&#xD;
        // The WebOrderEntity.DeliveryDate property is virtual and doesn't have a setter,&#xD;
        // so to bind to it we have to parse the submitted value into a DateTime object&#xD;
        // and then set the Year, Month, and Day properties individually.&#xD;
        var deliveryDateVPR = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".DeliveryDate");&#xD;
        if (deliveryDateVPR != null)&#xD;
        {&#xD;
            try&#xD;
            {&#xD;
                var deliveryDate = DateTime.Parse(deliveryDateVPR.AttemptedValue);&#xD;
                model.DeliveryYear = deliveryDate.Year;&#xD;
                model.DeliveryMonth = deliveryDate.Month;&#xD;
                model.DeliveryDay = deliveryDate.Day;&#xD;
            }&#xD;
            catch (Exception e)&#xD;
            {&#xD;
                bindingContext.ModelState.AddModelError("DeliveryDate", "Could not parse " + deliveryDateVPR.AttemptedValue);&#xD;
            }&#xD;
        }&#xD;
&#xD;
        base.OnModelUpdated(controllerContext, bindingContext);&#xD;
    }&#xD;
}&#xD;
&lt;/xmp&gt;&lt;/code&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;The tricky bits are:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;Cast &lt;code&gt;bindingContent.Model&lt;/code&gt; to the object type to get the model you&amp;rsquo;re binding to.&lt;/li&gt;&#xD;
&lt;li&gt;If the form contains a collection of the objects, and you&amp;rsquo;ve used &lt;code&gt;EditorFor&lt;/code&gt; on the whole collection or a model that contains it (like you should), the form parameters will have names like &lt;code&gt;ItemCollection[4]_ItemClass.PropName&lt;/code&gt;. If you use &lt;code&gt;EditorFor&lt;/code&gt; directly on the object, the form parameter names will just be the property names. &lt;code&gt;bindingContext.ModelName&lt;/code&gt; contains the prefix for the first case, and I&amp;rsquo;ve appended &lt;code&gt;.DeliveryDate&lt;/code&gt; to get the right form parameter name for the particular &lt;code&gt;WebOrderEntity&lt;/code&gt; I&amp;rsquo;m binding to. I&amp;rsquo;m not sure if this will work for the second case; the key might just be &lt;code&gt;DeliveryDate&lt;/code&gt; without the prefix or period.&lt;/li&gt;&#xD;
&lt;li&gt;Once you figure out the key, &lt;code&gt;bindingContext.ValueProvider.GetValue()&lt;/code&gt; returns an object that describes the value that was passed in. &lt;code&gt;AttemptedValue&lt;/code&gt; is the string that was passed in. There&amp;rsquo;s a &lt;code&gt;RawValue&lt;/code&gt; property too, but it was also a string. I&amp;rsquo;m not sure when you&amp;rsquo;d use it; I was expecting it to be a &lt;code&gt;DateTime&lt;/code&gt; object.&lt;/li&gt;&#xD;
&lt;li&gt;If there are any errors, call &lt;code&gt;bindingContext.ModelState.AddModelError()&lt;/code&gt; to add an error to the &lt;code&gt;ModelState&lt;/code&gt; object that your request handler will use to determine if the model was bound and passed validation correctly.&lt;/li&gt;&#xD;
&lt;li&gt;Finally, call the base &lt;code&gt;OnModelUpdated()&lt;/code&gt; method to let it do whatever it needs to do.&lt;/li&gt;&#xD;
&lt;/ul&gt;</description>
      <pubDate>2015-12-29T23:16:54.3570000</pubDate>
      <link>http://support.surroundtech.com/thread/intercept-and-customize-mvc-model-binding/</link>
    </item>
  </channel>
</rss>