Wednesday, June 1, 2016

SharePoint End Date on Workday using a Holiday List

  • Typical scenario where you need to add a certain number of days to a start date and set the due date to a working day (Ex: service window).  Note that this is not "number of working days".  It is "the next working day after X days".
  • You can easily adapt this code to provide the last working day before X days.
  • The working day must bypass weekends and holidays.
  • You have a Holidays list in SharePoint that you can query.
    • The Holidays list uses the out of the box "Holiday" list content type.
      • Note: In code, the "Holiday" "Date" field's internal name is "V4HolidayDate"
  • You need to add some code to an event receiver or custom workflow action to get this date.
  • This was coded for SharePoint 2013 but should work for other versions

         protected void MAIN_FUNCTION()  
           DateTime startdate = Convert.ToDateTime(START_DATE_VALUE).Date;  
           DateTime finaldate = startdate.AddDays(Convert.ToInt16(FINAL_DATE_VALUE));  
           SPList holidayLibrary = web.GetList("/Lists/Holidays");  
           Int16 CurrentHolidayIndex = 0;  
           SPQuery query = new SPQuery();  
           query.Query = string.Concat(  
                    "<FieldRef Name='V4HolidayDate'/>",  
                    "<Value Type='DateTime'>", SPUtility.CreateISO8601DateTimeFromSystemDateTime(finaldate) , "</Value>",  
                    "<FieldRef Name='V4HolidayDate'/>",  
                    "<Value Type='DateTime'>", SPUtility.CreateISO8601DateTimeFromSystemDateTime(finaldate.AddDays(14)), "</Value>",  
                    "<FieldRef Name='Date' Ascending='FALSE' />",  
           query.ViewFields = "<FieldRef Name='V4HolidayDate' />";  
           query.ViewFieldsOnly = true;  
           //Limited to 14 days of continuous holidays  
           while (IsWeekend(finaldate) || IsHoliday(finaldate, holidays, ref CurrentHolidayIndex))  
             finaldate = finaldate.AddDays(1);  
           OUTPUT_FIELD_VALUE = finaldate.ToShortDateString();  
         bool IsWeekend(DateTime date)  
           if (date.DayOfWeek == DayOfWeek.Saturday || date.DayOfWeek == DayOfWeek.Sunday) return true;  
           return false;  
         bool IsHoliday(DateTime date, SPListItemCollection holidays, ref Int16 holidayIndex)  
           for (; holidayIndex < holidays.Count; holidayIndex++)  
             DateTime holiday = Convert.ToDateTime(holidays[holidayIndex]["V4HolidayDate"]);  
             if (date == holiday) return true;  
             if (holiday > date) break; //stop checking once we pass the current date  
           return false;  

Tuesday, November 3, 2015

SharePoint Saturday, Sacramento, 11/7/2015

My Presentation
Conference Link

Wednesday, August 12, 2015

SharePoint ParameterBinding the DateTime Control

  • You have a custom form providing values to an XsltListViewWebPart or similar List View Web Part that supports ParameterBinding.
  • You need to provide a date picker control and would like to use the standard SharePoint control.  You only need the date, not time.
  • You are using SharePoint Designer and may not have access to code blocks or other server side code.
  • You are using the ParameterBinding in a CAML Query or similar.
  • The SharePoint date picker control is easy enough to add directly to a SharePoint aspx page, but accessing the values from the Form or Control ParameterBindings are not straightforward.
  • Add JQuery and JQuery formatDateTime libraries to the page you are working on if they're not already included in your master page.
    • Example where you have downloaded the jquery and formatDateTime files to the root Style Library:
      <script language="javascript" type="text/javascript" src="/Style%20Library/Scripts/jquery-1.11.3.min.js"></script>
      <script language="javascript" type="text/javascript" src="/Style%20Library/Scripts/jquery.formatDateTime.min.js"></script>
  • Add the DateTime control followed by a standard TextBox element with the Same ID + "Value". 
    • This extra TextBox control will be used to pass the value to the ParameterBinding and should be hidden.  You should specify the date you wish to use when a blank is entered (be sure to change both).  The OnValueChangeClientScript property is used to call the JavaScript function you will add next.
    • Example:
      <SharePoint:DateTimeControl runat=server id="publishDateStart" OnValueChangeClientScript="spDateChanged('publishDateStart', '1901-01-01');" DateOnly="True"></SharePoint:DateTimeControl>
      <asp:textbox id="publishDateStartValue" runat="server" style="display: none;">1901-01-01</asp:textbox>
  • Add the following JavaScript code.  This converts the DateTime control's date format to the format required by your XSLT CAML query and stores it in your hidden textbox.  It also swaps in a date for a blank.
    •  Code:
      <script type="text/javascript">
      function spDateChanged(id, blankdate) {
      var datetimeID = '"_' + id + '_' + id + 'Date"';
      var dateSelected = $('[id$=' + datetimeID + ']:first');
      var dateSelectedValue = $('[id$="' + id + 'Value"]:first');
      if (dateSelected[0].value == "")
      dateSelectedValue[0].value = blankdate
      dateSelectedValue[0].value = $.formatDateTime('yy-mm-dd', new Date(dateSelected[0].value));
  • Set your ParameterBinding element to the TextBox Control's ID
    • Example:
      <parameterbinding defaultvalue="" location="Control(publishDateStartValue)" name="AdoptedFrom"></parameterbinding> 
  • Note that this example does not include the time elements since it was not needed in my use case and would add in some extra complexity to the function above.  This was written for a 2010 SharePoint Server.
  • Also note that typed in entries need to be in the "m/d/yyyy" format.  Example: 1/1/2015

Wednesday, May 13, 2015

SharePoint Saturday, Silicon Valley, 5/30/2015

My Presentation
Conference Link

Monday, May 4, 2015

My MS Ignite 2015

Day 1 - Monday
  • Keynote (~23,000 attendees)
    • SharePoint 2016 release not mentioned in the keynote!
    • No mention of the SharePoint brand even though several new Office 365 SharePoint features were demoed
      • Does this mean MS is splitting off the SharePoint brand into its cloud use-cases: Office 365, Sites, OneDrive, Search, Delve, etc.?
        • Will SharePoint end up being rebranded as "Office 365 On-Prem"?
      • Or possibly an indicator of a lack-luster SharePoint 2016 release?
    • Best newly demoed SharePoint/Outlook feature is the new email integration with attach file links integrated into Azure groups and SharePoint security
    • Best Windows 10 demos were the Cortana Power BI demo and the facial recognition login demo
    • Other stuff:
      • Skye for Business, Threat Analytics, Ops Management Suite, Azure Stack On-Premises, Windows Update changes, and the Surface Hub
  • Evolution of SharePoint: Overview and Roadmap (over-capacity including overflow room)
    • SharePoint 2016 = Office 365 On Premises
      • Basically most of what is already on or is coming to Office 365 SharePoint will now be made available on premises
    • Deployment wizard will allow deployment by Role
      • WFE, App, Search, etc.
    • Delve will be made available to SharePoint 2013 on-prem (soon?) 
Day 2 - Tuesday
  • Power BI
    • Live Dashboards
      • Drill into data
      • Ad-hoc BI
    • Power BI Designer (client app)
      • Preview release version
    • On-Prem Data Sources
      • Scheduled Refresh or Analysis Services Live Query
    • API for data pushes / live monitoring
      • Demoed mobile phone accelerometer data live reporting
        • App used API to send data directly to dashboard
  • Transforming your SharePoint Full Trust Code to the Office App Model
    • Branding
      • Why brand collab sites?
      • Leverage Office 365 Themes
      • SharePoint Themes
      • CDM instead of Site Assets to avoid caching/blob cache issues
      • Use alternate CSS and javascript instead of modifying master pages when possible
    • Provisioning
      • App/add-ins
      • Scripting
      • PnP Provisioning Engine
        • Security
        • Fields
        • TermGroups
        • Lists
        • Pages
        • Files
        • ComposedLook
        • Apply-SPOProvisioningTemplate
          • Will provision new items only, no updates
    • Sandboxed Solutions
      • Still deprecated, should continue to n bb  work in 2016
    • Script parts
      • Embedded javascript (node/jquery)
    • Office 365 App Model
      • Mail, contacts, lists, libraries, and other Office 365 features
      • Standalone apps interface for ez app launch
Day 3 - Wednesday
  • NanoServer
    • Preview bits available
    • No UI at all
    • Remote Powershell and Managemen Console support
      • Limited cmdlet support, no local workflows
    • Clustering and HyperV supported
    • Fast boot, minimal services running
    • Graphical remote management web based tool demoed
      • Works on all versions of Windows server
      • Process Manager
      • PowerShell window
      • System Settings
      • Device Manager
      • Event Viewer
    • ServerCore will be renamed to Server
    • Full Server/Server with a GUI will be renamed to Client
      • Not allowed in containers
    • Visual studio server apps targeted to either Server or Nano, not Client
    • Nano is simply a subset of Server, full compatibility for all features that are in both
      • You select features and drivers at deployment
    • Demo of Chef deployment to Nano with Ruby, Python, and C# components
    • More videos on channel 9
    • Reduces attack surface and maintenance requirements
      • Fewer services, memory usage, patches, reboots
      • .4GB footprint compared to 4.84GB
    • No MSI support
      • Nano Server installer in the works
  • CRM Online and Office 365: What's New
    • Integration Points
      • Outlook/Exchange
        • Email folder mapping of metadata
        • Create entities from email
      • Excel
      • Power BI
      • OneNote
      • Office 365
        • Groups integration
      • OneDrive
      • SharePoint
      • Yammer
      • Skype
      • Skype for Business
  • Office 365 Groups -Eric Zenz
    • Office 365 Group = SharePoint Site Collection
    • Outlook and Office App integrations
    • Groups include
      • Files
      • Group Notebook
      • Shared with us feed
      • Recycle Bin
      • Pages
    • Delve provides insights into groups
    • Future planned feature: Link groups to existing SharePoint sites
    • Discovery works across group mail and group viles
    • Coming in 2015
      • Guests membership
      • Dynamic membership
      • Data Leakage Prevention (DLP)
      • Quota management
      • Soft-delete
    • Graph REST endpoint
  • Line of Business Dev on Dynamics CRM (small room)
    • Dynamics CRM
      • Line of business and Customer Engagement
      • Solution development
        • Relationship
        • Process
        • Interaction
        • LOB
      • Giving campaign demo
        • Theme
        • Personalized
        • Navigation
        • Office 365 Integration
        • Configurable
        • Social and Collaborative
        • Mobile Ready
        • Customizable Search
        • Secured
        • Analytical
    • Build, Integrate, Manage
Day 4 - Thursday
  • Best Practices for Design and Performance in SharePoint Online
    • Branding Impact
      • Low Impact
      • High Impact
    • Responsive Web Design
      • Limited support for some common collaboration site features
        • Ex: Gantt charts
    • Composed Looks (Themes)
    • Design Manager
      • Converts HMTL to Masterpage automatically
    • Custom Branding
      • Use a starter masterpage
      • Layout with html css and imagers
      • Add SP Controls
    • Performance considerations
      • Image sizes
      • SharePoint Online caching less reliable due to number of servers
      • Demo of custom rollup nav delaying page load
    • Custom Masterpages will continue to be supported
      • Make sure to stay up to date with MS improvements
  • Deploying Yammer
    • Levi Strauss+
    • Yammer Embed
    • My Feed
    • Group Feeds
    • Liking
    • Sharing
    • Following
Day 5 - Friday
  • BCS to SQL hybrid
    • OData service on-prem exposes SQL data
  • Search hybrid
    • Search center on-prem or online
  • Security
    • AD sync
    • DirSync server
      • Claims from User Profile Sync Service
      • Config steps
        • Add on prem domain to tenant
        • Activate DirSync in your tenant
        • Update DNS records
        • Run DirSync wizard and start sync
        • Check users and groups in Tenant Admin
        • Activate and License users
      • Validate synchronization
        • DirSync Troubleshooter App
    • Azure AD Proxy on-prem manages ACS (Access Control Services) Trust
    • ADFS + ADFS Proxy for single sign-on
    • Configuring S2S
      • Replace STS Cert on all farms
      • Install S Sign in assistant and azure PowerShell
      • Register on-prem STS as Service Principle in 0365
      • Add SPN for on-prem domain
      • Register 0365 app principal as trusted provider
      • Set the auth realm on prem
    • Validate User Profile Service App
    • Search Validation
      • Result Source
        • ECB menu, click test source
      • Query builder
        • From Query Rules
      • Investigation
        • Partitioned search service or proxy not supported in hybrid
          • Fix: IgnoreTenatization
        • 400, 401, 403, 500 errors
    • BCS Validation

Thursday, April 9, 2015

SharePoint Migration and Administration Notification Tool

  • You are performing an administrative change at the SharePoint site level or for all sub-sites starting at a particular location
    • Examples
      • Migration
      • Retention, Archival or Deletion
      • Redesign
      • User Acceptance Testing (UAT)
      • Upgrade
      • Restructure
      • Merge
  • You need to convey the administrative status to all users on the site
    • Likely as part of your SharePoint administrative communications plan
    • There is no simple or easy out of the box way to accomplish this
    • We don't want to manually replicate notifications on each sub-site, modify the master pages, or configure content roll-ups on each site
    • I developed the SharePoint Migration Notification Tool specifically for this purpose
      • Download SharePointMigrationNotification.wsp for deployment at the Site Collection level on a SharePoint on-premises farm
      • Add and Install the WSP file you downloaded
      • Enable the site collection feature named "Migration Notification" on each site collection
      • Add a list to the root site for each site collection.  Select the "Migration Notification URLs" list template (found under Blank & Custom list types)
        • You can name this whatever you like, but you should only have 1 of these lists at the site collection root because the tool uses the first one it finds
    • Here are some examples of the default notifications you can configure
      • You can also add your own custom notification messages

    • Here is the list configured at the Site Collection root level that defines your notifications
      • The new/edit item forms describe what should be entered in each field

    • Notification Tool Feature List
      • Site Collection Deployed full trust solution (Currently designed for SharePoint 2010+)
      • Client object model exclusively used for notification processing in order to support future releases on the SharePoint 2013 app model and Office 365 environments
      • Drop down selection of common notification scenarios
      • Migration notification list definition
        • Must be added to the root site collection
      • Configurable notification text with wiki-like syntax for inserting hyperlinks or a date from the Migration Notification List
        • More Info URL
        • New URL
        • Migration Date
      • SharePoint client object model property bag caching to reduce server load and increase performance
      • Supports the standard notification color selections
      • Include all sub-sites (notification can be overridden at the child site level)
      • New / test site URL replacement including the full path to the current page/form
      • Notification disable flag
      • Automatic population of the title field from the New Site URL wiki when sent to a ".../NewForm.aspx?source=..."  page (Using "New URL Set Title" syntax)
      • Permission based notification visibility (security trimming)
      • Notification dismissal option (cookie based)
        • 1 day dismissal duration
      • Automatically delete sites from the migration notification list by selecting Auto Delete or Auto Recycle in the Old Site Status field
        • This capability is enabled through a separate Site Collection feature and requires the user to have permissions to delete the site
        • This feature is especially useful for retention policies that require you to post a notice of deletion before deleting the site.
        • If you use Auto Delete instead of Auto Recycle, you should backup the site first if there is any possibility of needing a restore
    • Contact me for SharePoint Farm Upgrade or Migration services, to request a customized version of this solution, or to provide SharePoint Solution Architecture services
    • Release (2013 only): 11/7/2015
      • Fixed a bug when removing an existing Migration Notification List and adding another with a different name.
    • Release 7/6/2015
      • SharePoint 2013 list view fix
      • 3 digit year date format fix (115 fixed to be 2015)
    • Release 5/29/2015
      • SharePoint 2013 version created
    • Release 5/27/2015
      • New Features
        • Auto Delete Old Site feature added
          • New feature activates migration notification list event receiver keying off a new field type "Old Site Status"
        • Refactored to use ScriptLink and _layouts JavaScript code file to enable browser based code caching
    • Release 5/15/2015
      • Bug Fixes
        • Redirect URL now works when browsing folders within a list/library
          • These links now redirect to the Document Library root folder
      • New Features
        • Notification dismissal option (cookie based)
          • 1 day dismissal duration
    • Release 5/13/2015
      • Bug Fixes
        • URLs with spaces and special characters now work correctly
          • You will need to make sure to unencode the URLs when entering them in the list.  The title field description now reflects this requirement.
        • Redirect URLs with special characters will now be encoded correctly
      • Added Features
        • Permission based notification visibility (security trimming)
    • Develop an Office 365 app version
    • Add parameter for dismissal duration length

    Tuesday, March 10, 2015

    CRM and xRM vs SharePoint: Business Solution Architecture

    • You are tasked with developing an enterprise application or business process solution using a stable platform tool
    • You have MS SharePoint / Office 365 and MS Dynamics CRM options available and need to decide which to use
    SharePoint / Office 365 and Microsoft Dynamics CRM and xRM Comparison
    • SharePoint and Office 365 is a(n)
      • Customizable and flexible business solution platform
        • Content-centric
      • Content/document management and versioning system (CMS/DMS)
      • Enterprise search engine
      • Workflow system (WWF/Azure Workflow)
      • Alert engine
      • Extension for MS Office client apps and MS OfficeWeb Apps (OWA)
      • Web site development and web content management tool (WCM)
      • Publishing tool
      • Personalizable web interface
      • Social platform
      • Cloud capable, multi-tenant framework
      • MS Access web database platform
      • MS Project platform
      • MS Team Foundation Studio site platform
      • MS Dynamics CRM document repository
    • Dynamics CRM (xRM) is a(n)
      • Customizable CRM line of business system
        • For Sales and Marketing departments
      • Entity management platform
        • Ex: Accounts, contacts, orders, cases and opportunities
        • May be configured for case management solutions such as health and human services, benefits administration, legal cases, grant management, etc.
      • Query tool
      • Workflow engine (WWF)
      • Analytics tool
      • Extension for MS Outlook, Excel, and Word
      • Custom business solution platform
        • Email and conversation-centric applications
          • Customer service, tech support, employee relations, outreach, campaigning, contracts, etc.

    MS Dynamics CRM is designed as a customer relationship management system and the platform has native relational design at its heart.  It can be adapted to many conversational and relationship based business processes.  The primary problem with CRM, is that it lacks the popularity of SharePoint and Office 365 due to reduced feature set and increased cost and is therefore less likely to be available as a platform to most business developers and end users.  This makes finding third party solutions, developers, community forums, and experienced users difficult or costly.  Dynamics CRM as a line of business app has many competing products that make the base feature set less important when choosing a solutions platform.  These include those from MS partners built directly on SharePoint such as BPA Solutions CRM, SP CRM Template, and SP Marketplace CRM.

    The capabilities of SharePoint and Office 365 currently outweigh those of Dynamics CRM for general purpose custom business solutions.  This is especially true when business solutions incorporate enterprise search, documents and content management, publishing and approval, personalization, collaboration, or public web content.   SharePoint with a typical set of third party add-ins provides the best long term, affordable, and flexible solution architecture.  Microsoft has embraced SharePoint as an application platform within most of its divisions, Dynamics being the outlier.  SharePoint/Office 365 is also the fastest growing product within Microsoft due to its rapid adoption globally.  Finally, SharePoint has many more third party solution providers and COTS line of business systems than Dynamics CRM.

    For highly relational and performance based web applications it is better to develop a user interface in SharePoint (app model or web parts) with a SQL DBA developed backend or MS Access Web Database rather than develop a solution using the Dynamics CRM drag drop interface or native SharePoint lists/libraries.  This will remain the case until Dynamics CRM catches up to SharePoint/Office 365 in functionality, SharePoint integrates a better relational/back end framework, or another company develops a better web application platform.

    Microsoft Corporate Strategy and Product Roadmap Commentary

    Ideal Objective: SharePoint = Microsoft's Web Operating System

    SharePoint must be the single web based application platform for all Microsoft's business solutions.  MS Dynamics CRM has not been ported to the SharePoint platform for the main reason that customizable relational models are not embraced within SharePoint.  Every attempt by the SharePoint product team to incorporate true relational database (RDBMS) integrity, performance, and design into the product have met with limited success.  External lists and lookups are feature deprived and difficult to configure. Access web databases are siloed from other SharePoint features and sites.  Native lookup fields lack basic features and have limited relational support. Database synchronization to or from lists is non-existent.  Many third party vendors have stepped up to fill these gaps, but that leaves Microsoft without the capabilities for internal development utilizing these missing features.  For now, we are stuck in that period where the Dynamics CRM platform is not yet obsolete, but SharePoint (without third party add-ins) is not ready for the port.

    If Microsoft is to succeed in its primary focus towards enterprise software, then these product teams need to work together to bolster SharePoint's feature set as a solutions development platform and then port the Dynamics business solutions onto the improved platform.  This would allow the Dynamics teams to contribute to the design of the SharePoint platform while also removing the CRM team's burden of having to re-invent the wheel regarding the existing and continually improving SharePoint feature set.  Examples of these shared functionality opportunities include: workflow engine, search engine, forms engine, list engine, authorization, authentication, UI, admin consoles, deployment methods, device support, mobile applications, OneDrive for Business synchronization, web services, application object model, BI, content management, metadata, analytics services, patches, upgrades, and MS Office integration.  Microsoft has taken the first steps with incorporating the MS Access team into SharePoint forms and Access web database design, but the SharePoint team also needs the real world requirements and feedback from the Dynamics teams to ensure the future success of both products.

    Nearly 10 years ago, at the last SharePoint Conference he keynoted, I asked Bill Gates if SharePoint would get true relational design functionality.  His answer was that they were working on some of these features (which turned out to be External Lists and Lookup RI) but he still insisted on using SQL RDBMS for highly relational solutions.  This answer was inadequate and shortsighted.  It is now time for Microsoft to step up and take advantage of the monumental opportunity to combine relational design into the worlds most prevalent and feature rich Web OS, SharePoint (aka Office 365).

    Sources and Other Resources

    MS Ignite 2015 Update
    While attending MS Ignite 2015, I used the opportunity to talk with product leads and managers on both Dynamics CRM and SharePoint/Office 365 to find out how this is going down within Microsoft.  Both teams admit that there is very little collaboration between the Dynamics and SharePoint teams and there is a lack of direction from the executive level.  This issue flows from the Microsoft organizational structure and requires executive action or an internal grass roots effort to remediate.  If Microsoft wants to establish itself as the king of business solutions, then we need these teams (Dynamics, SharePoint/Office 365, and MS Access) to combine their platforms and stop wasting time reinventing the wheel.

    One prime example of waste was brought up in the CRM line of business development session.  Since the CRM team does not collaborate with the SharePoint team, they are developing their own separate enterprise search engine rather than utilizing the highly efficient FAST search engine the SharePoint/Office 365 team bought for $1.2 Billion.

    Thursday, September 25, 2014

    Office 365 E1-4 Subscription Fail - Now Fixed by Microsoft!

    • You created an account under the Enterprise plans (E1, E2, E3, or E4)
    • You don't have more than 300 users and would like to change to the Office 365 small or midsize business plans (Small Business, Small Business Premium, Midsize Business)
    • As of 10/4/2014 Microsoft now supports this.  Thank you Microsoft! :) 
      • I have redacted the complaint below.

    • Microsoft is scalping its clients by not providing an option to downgrade these accounts
    • Their recommendation is to delete your old account and then create a new account, then migrate all your emails, sites, and apps to the new account!
      • This is a ridiculous requirement that will result in tens of hours of configuration and system downtime
      • This may also result in data loss if not done correctly
    • Downgrading the account must be done by adding the new subscription, reassigning licenses, and then cancelling the old subscription.
      • Note: Just ignore the your data will be deleted warnings.  As long as a user has valid licenses assigned, they will not lose their data.

    • If creating a new Office 365 account NEVER create an E1 plan unless you are immediately surpassing the 300 user limit
    • Please open tickets with MS to support automated conversion from your Enterprise plan to Small Business plan
    • Also petition MS to provide a billing discount solution to the enterprise plans to make up for their incompetence

    Tuesday, August 5, 2014

    AutoSpInstaller Notes

    • Using AutoSpInstaller to run a multi-server farm install.
    • When provisiong the User Profile Service the second window pops up and immediately closes, then the main window eventually hits a Timed Out error
      • This was caused by the Farm account being unable to run PowerShell commands on the app server despite being configured correctly as local admin and having the log on locally permission
        • When running any command  as the farm account, the following error is displayed: "The term 'Get-ChildItem' is not recognized as the name of a cmdlet, function, script, ...."
          • 'Get-ChildItem' here could be any PowerShell command
      • This anomaly only occurred on the app server in the farm and only with the farm account, but unfortunately, the User Profile Service must be configured as the farm account.
      • The solution ended up being that the PSModulePath environment variable had been removed for the farm account.  We re-added and it ran fine.

    Tuesday, June 3, 2014

    Office 365, SharePoint, and OneNote Slides

    I enjoyed speaking at SharePoint Saturday 2014.  Here is the link to my presentation.

    One item I forgot to mention is how to create a new OneNote notebook if OWA is not installed and you do not get the default Notebook for the team site.  The correct way to do this is to create a new Notebook from OneNote and then save it to your SharePoint document library.

    Wednesday, May 21, 2014

    SharePoint 2013 Virtual Development Environment Installation Guide - Part 1

    SharePoint 2010 dev server deployment guide can be found here

      • Your workstation must be running a 64bit processor with Hardware Virtualization enabled
      • You must have enough memory (6 GB), disk space (60 GB), and processor power (2 cores) to run the VM and hold all snapshots.  Disk space will need to grow as you add content.
        • I highly recommend running this VM from a solid state drive (SSD) for optimum performance.  Disk speed is the greatest limiter for performance and if your RAM is limited, then the SSD swap file will help compensate.
      • You must have access to and appropriate licensing for above products
        • ex: MSDN Subscription
      • You must have time (about 8 hours) to install everything.
        • Hints:
          • Look for "Wait" for good break points
          • Snapshots can be used to create other virtual machines or to test minimally installed environments
          • Hyper-V, VirtualBox and VMWare specific settings will be called out
    How To
    • Download the Software Listed Above - Wait
    • Enable Windows 8 Hyper-V, install VMWare, or install VirtualBox and the Extension Pack
    • Hyper-V: Enable a Shared/NAT virtual switch
      • ICS can only be set up from one network card at a time in Windows 8 so if you have a laptop and switch between WiFi and Ethernet you will need to change the ICS if you need the VM to access the internet
    • Create a new virtual machine named "sp2013"
      • Hyper-V: Generation 2 option
      • 6144 GB RAM (not dynamic)
      • Network: Use a Shared/NAT connection
      • 125GB dynamically expanding boot hard disk
        • You will likely use 45GB of this without any content
      • Increase the processors: 2-8 range
      • Mount the Windows Server 2012 R2 ISO
      • VirtualBox: Enable RDP support
    • Start the sp2013 virtual machine and boot from DVD
      • Hyper-V: Hold down a key to boot to DVD
        • Don't wait till the prompt to "Press a Key" or you will get this error: "Boot Failed. EFI SCSI Device."
    • The Windows Server 2012 R2 installer should begin
      • Select Windows Server 2012 Standard (Server with a GUI)
      • Select Custom (new install)
      • Short Wait
    • Set a new administrator password
      • pass@word1
    • Install VM guest tools (none for Hyper-V)
      • VirtualBox: VirtualBox Guest Additions
        • Auto Reboot
      • VMWare: VMWare Tools
    • Configure Server Manager: Local Server properties
      • Rename the server to sp2013 (Both the name and the computer description)
        • Note: If you forget this step, you will have a randomly named server.
          I have included instructions for aliasing and configuring a randomly named server
        • Restart later (so we can shut down instead)
      • Enable Remote Desktop
      • Disable IE Enhanced Security Configuration
    • Shut down and take a Snapshot named "Windows Install" then boot the machine
    • Server Manager Dashboard: Add Roles
      • Server Roles
        • Active Directory Domain Services
          • Add features and Include management tools
        • Application Server
        • DNS Server
          • Add features and Include management tools
          • Ignore Static IP warning
        • Web Server (IIS)
          • Add features and Include management tools
      • Features
        • ASP.NET 4.5 (under .NET Framework 4.5)
        • Telnet Client
          • SMTP connectivity troubleshooting tool
        • User Interfaces and Infrastructure
          • Desktop Experience
            • Also adds Ink and Handwriting Services
      • Application Server / Role Services
        • Web Server (IIS) Support
          • Add features and Include management tools
      • Allow auto-restarts then Install
      • Short Wait
      • Click "Promote this server to a domain controller"
        • Select "Add a new forest"
        • Root domain name: sp.local
        • Next
        • Forest and Domain functional level: Windows Server 2012 R2
        • Password: pass@word1
        • Continue pressing Next until Install
          • Short Wait for NetBIOS domain name to be recognized and for Prerequisite check
          • Ignore the 3 warnings
        • Install
        • Short Wait
        • Accept reboot prompt
        • Log back in as Administrator
    • Server Manager Dashboard: Add Roles
      • Features
        • ASP.NET 3.5 Features
        • Before installing specify the following alternate path
          • D:\sources\sxs  (where D: is the Windows Server DVD drive)
    • Verify Internet connectivity by opening Internet Explorer and browse to Bing
    • Disable SmartScreen Notifications from the Action Center
    • Windows Update: Turn on auto updates
      • Install Updates and Wait
      • Reboot when prompted
      • Some errors in windows update may occur as they are installed and the server is rebooted. Here are some solutions:
        • Several updates fail and require reboots
          • Open System Configuration (msconfig)
          • Check Selective startup
            • Uncheck Load Startup items
          • OK
          • Restart when prompted
        • Hyper-V: Security Update for Windows Server 2012 R2 (KB2920189) Failed 800F0922
          • Only occurs on Gen 2 Hyper-V with Secure Boot
          • Temporarily disable Secure Boot in the VM settings while installing the update
    • Open Active Directory Administrative Center (Pin to desktop and Start menu)
      • Administrator account
        • Account / Password Options: Password never expires
        • Organization / Email: administrator@sp.local
      • Create a user in the Users OU
        • Full Name: User
        • User SamAccount: sp\user
        • pass: same as Administrator password
        • Account / Password Options: Password never expires
        • Organization / Email: user@sp.local
      • Add User to the Users group
      • Create a user in the Managed Service Accounts OU
        • Full Name: spservice
        • User SamAccount: sp\spservice
        • pass: same as Administrator password
        • Account / Password Options: Password never expires
    • Open Group Policy Management console
      • sp.local / Domains / sp.local / Domain Controllers / Default Domain Controllers Policy
      • Right click and Edit
        • Policies / Windows Settings / Security Settings / Local Policies / User Rights Assignment
        • Edit Allow log on locally
          • Add the Users group
    • Stop and Disable the following Services
      • DFS Namespace
      • DFS Replication
    • Shut down, snapshot "DC and IIS", and start virtual machine
    • Mount the SQL Server ISO to the VM DVD drive
    • Start SQL Server Setup 
      • Install Stand-alone
      • Use MS Updates
      • Ignore DC and Firewall warnings
      • All Features with Defaults
      • Continue
      • Server Configuration / Service Accounts
        • Use the same account for all SQL Server services
          • specify the sp\spservice account and password created above
      • Continue
      • Analysis Services Configuration
        • Account Provisioning
          • Add Current User
      • Reporting Services Configuration
        • Install only for both
      • Distributed Replay Controller
        • Add Current User
      • Continue then Wait
    • Shut down, snapshot "SQL Server", and start virtual machine
    • Open SQL Server Configuration Manager
      • SQL Server Network Configuration
        • Protocols for MSSQLSERVER
          • Enable Named Pipes
    • Restart the SQL Server (MSSQLSERVER) service
    • If your server is randomly named - not sp2013
      • DNS Manager
        • Forward Lookup Zones
          • sp.local
            • Add a new alias
              • Name: sp2013
              • FQDN: Browse to splocal\servername
                • servername will be a randomly generated value
    • Mount the SharePoint Server 2013 iso
    • Start the Prerequisites installer
      • Run D:\Splash.hta (open with MS HTML Application Host)
      • Short Wait
      • Finish to restart
    • Start the SharePoint Install
      • Enter your Enterprise license key
      • Wait
      • Run the Configuration Wizard
      • Create a new server farm
      • Configuration Database
        • Server: sp2013
        • Name: SharePoint_Config
        • Username: sp\spservice
        • Password: same as above
      • Farm Security Settings
        • Passphrase: same as admin password above
      • Central Admin Web App
        • Port: 8000
        • Auth: NTLM
      • Wait
      • Finish
    • IE will open to the central administration website.
      • Join the experience program (or don't)
      • Start the wizard and configure as follows
    • Central Admin Initial Farm Configuration Wizard steps
      • Use existing managed account: sp\spservice
      • All items should be checked except for Lotus Notes
      • Next
      • Wait
      • Create Root Site Collection
        • Title: SP2013
        • URL: /
        • Experience version: 2013
        • Template: Collaboration \ Team Site
        • OK
          • If you encounter a  error, skip to the next step (AAM config) then delete the running timer job, restart IIS, and re-run the wizard from Central Admin
        • Finish
      • Open central admin (http://sp2013:8000) and add the following Alternate Access Mapping (AAM) internal URLs
    • Set the browser home page to http://sp2013
    • Configure Search from Central Admin
      • Central Admin \ Manage service applications \ Search Service Application (first one)
        • Content Sources
          • Local SharePoint Sites
            • Incremental every 30 minutes (or other value here based on needs)
              • Recommend disabling incremental crawls for performance
            • Note: Continuous crawls will require more resources on VM startup
          • Start a full Crawl
    • Open http://sp2013 in IE
      • Add sp\administrator to the sp2013 Members group
      • Add sp\user to the sp2013 Visitors group
      • Validate that the following workset
        • Any workflow
        • Search scopes
        • My Sites and User Profile
    • Performance Tuning
      • Run the following PowerShell scripts (in SharePoint 2013 Management Shell)
        • Set-SPEnterpriseSearchService -PerformanceLevel Reduced
      • Disable the following system services unless/until needed
        • SQL Server Analysis Services (MSSQLSERVER)
          • From Automatic to Disabled
        • SQL Server Reporting Services (MSSQLSERVER)
          • From Automatic to Disabled
        • Optional (if you do not need SharePoint search and want to reduce memory footprint)
          • Remove the incremental crawl scheduled earlier
      • More tips from Andrew Schwenker
    • Shut down, snapshot "SharePoint Configured", and restart
    Optional Configurations

    Monday, April 7, 2014

    Remove Site Collection and Reclaim Database Disk Space

    • You need to remove a large site collection from your content database.
    • SharePoint 2010 or higher
    • Use PowerShell after hours to remove the site collection:
      Remove-SPSite –Identity http://sitename
    • If you are on 2010 SP1 or later and if you used Central Admin or the SharePoint UI instead of the above PowerShell command or if you specified the -GradualDelete flag, then you must use PowerShell to remove the site collection from the recycle bin and then run the "Gradual Site Delete" timer job (or wait overnight for scheduled job), otherwise skip this step: 

      Get-SPDeletedSite -webapplication http://sitename | Remove-SPDeletedSite
    • Wait a few minutes for the database size to finish reducing (monitor via SQL Management Studio)
      Perform a FULL database backup on the content database (this will truncate the log files)
    • Then shrink the database via SQL command in SQL Management Studio:
      DBCC SHRINKDATABASE ('database_name' ,5 , NOTRUNCATE)
    • Then reorganize the indices (this should run automatically every day, but you can kick it off manually now):
      Run the following from Central Admin Health Analyzer (/Lists/HealthRules/AllItems.aspx) using Run Now:
      Databases used by SharePoint have fragmented indices

    Wednesday, March 19, 2014

    Xbox One Headset Adapter – Sharkoon Xtatic Pro Headset Fix

    Note: This has nothing to do with SharePoint or Solutions Architecture. :)

    The problem with the new Xbox One Headset Adapter is that it simply does not work with a standard TRRS 4-pole (3 ring) 3.5mm male to male cable or standard 3.5mm stereo auxiliary cable.

    Working example:
    2014-03-18 20.49.52

    4-pole TRRS Does not work - Xbox audio feeds back into the microphone:
    2014-03-18 20.29.57

    Does not work (at all) or with stereo 3.5mm:
    2014-03-18 20.34.05


    Using the Xbox 360 cable (with modifications) that came with the Sharkoon Xtatic Pro and the new 2.5mm adapter together, we get a working cable.
    2014-03-18 20.30.312014-03-18 20.30.54 2014-03-18 20.35.57

    Unscrew the 2 screws using the small Phillips head screwdriver.
    2014-03-18 20.39.16 2014-03-18 20.39.42

    Lift up on the plastic wings and then pull back.
    2014-03-18 20.41.31 2014-03-18 20.41.53 

    I had already clipped the tabs off in the above pictures but you don’t need to do this.  Instead you just cut off the entire wing as pictured here.
     2014-03-18 20.44.05

    Post surgery:
    2014-03-18 20.44.48

    Now just wrap it with a small piece of electrical tape.
    2014-03-18 20.46.44-1

    Now plug it into the 2.5mm adapter that came with the Xbox One headset adapter and all should work.  However you may want to turn down the adapter game volume so you only get voice through the adapter and not game audio, since you get that through the optical surround sound adapter.  Also note that this is mono, not stereo so you could alternatively modify a TRRS 4-pole cable to provide that stereo headset sound you’ll never use.

    Monday, March 10, 2014

    SharePoint Farm Infrastructure Architecture Recommendations

    Following are some recommendations for a typical SharePoint Development environment topology:

    In addition to the corporate Test/Stage and Prod farms, I recommend a standalone Dev VM for each of your MSDN subscriptions/developers.  Development VMs contain a standalone single server farm as well as all development tools.  Any content only solutions (OOB site collection or web scoped) should be configured directly in Production in a new site collection.  Custom development (Visual Studio) is completed on the development VMs, released to Stage, tested, and then released to Prod.  Each Dev VM should be semi-isolated from the corporate network (separate subnet and domain).  Dev VMs should be disposable, distributable, and standardized as in my article here: SharePoint 2010 Development Farm VM

    In this way every new developer would only need to copy the VM to their workstation and would be up and running after connecting to Source Control.  They would also have full control of their VM so IT admin requests would be minimized.  Simply recopying the template VM would fix any issues.

    The development VM operating system drive should be a solid-state drive.  Optionally, an external BLOB storage and search index partition may be stored on a low cost drive (requires a little more configuration).  Workstations must support hardware virtualization.

    The Test/Stage servers may need to be used for debugging and development of integration issues.  Alternatively, a standalone Dev farm on the corporate network can be set aside for this purpose.

    In each case, a process for synchronizing Production site collections back onto the Test/Stage and Dev VMs should be maintained.  Usually this includes site collection backups being made available as needed.  However care must be taken to ensure information security policies are maintained.  This can include scrubbing/redacting content, disabling alerts and emails (this may be done through network isolation), and populating sample data.

    Wednesday, February 5, 2014

    SPC14 - MS SharePoint Conference 2014

    I am attending the Microsoft SharePoint Conference 2014 in Las Vegas.  I will update my session notes here.  If you'd like to meet up with me during the conference, please comment here or contact me via LinkedIn or VoteMatrix.  Also, I set up a Sacramento SharePoint Community page on Facebook if you'd like to share your experiences and meet up with other Sacramento SharePoint professionals at the event.

    Itinerary and Session Notes

    Sunday - 3/2

    • Flight in
    • Blue Man Group

    Monday - 3/3


    • Bill Clinton
      • No real info
      • Compared Ukraine policy to the inclusiveness embraced in the gay rights movement
      • Stressed technology for solving inequalit
    • Jared Spatero
      • Intr
    • Jeff Teper
    • Transformation of Office
      • Cloud
        • Accelerating Office 365 updates
      • Personalized Insights
        • Office Graph
        • Oslo Hero Experience
      • Next Gen Porta
    • Julia White - Office 365
      • Groups
        • Yammer included on top navbar
        • Available in Outlook Online
          • Meetings
            • Can import into your calendar
          • Conversations
            • Integrated into Office Web Apps Online
      • Oslo - SharePoint Graph
        • Metro interface
        • Metrics
          • Modified by me
          • Presented to me
          • Liked by me
          • Trending around me
          • Shared with me
      • OneDrive for Business
        • Demoed on ipad
        • demoed mobile website
      • PowerBI
        • Q&A
          • Freetext pivots
            • EX: "Average annual income per person vs population"
        • PowerMap
          • Map visualization of pivot dat
    • Jeff Teper
      • Contextual Apps
      • Robust APIs
      • Services
      • Tools
        • MS Access
    • Arpan Shah - Dev
      • Demo
        • Compose App Feature
          • Outlook Online (Office 365) App
        • Android API app demoed for approval and notification
    • Jeff Teper (IT Pro)
      • Cloud Platform
        • 250000 req per secs
        • 400000 cores
        • 400 PBs storage
        • 99.98% uptime
        • Datacenter acquisitions
        • Privacy
        • Monitoring
        • 1TB site collections
        • Compliance - HIPAA, etc
      • Trust
        • E-discovery
      • Controls
    • Michal Gideon Demos
      • Compliance in Office 365
        • eDiscovery
          • Search query tool allowing policies to be configured
        • Log viewer component
      • Multi-factor auth in Office 365
    • Jeff Teper
      • Cloud onramp
      • 2013 SP1
        • Hybrid switch
      • OneDrive for Business
        • 25GB
    • Jared Spatero
      • File sync and share

    Dev Keynote (Rob Lefferts - Director of PM, Brian Jones – GPM)

    • App Model Redux - Principles
      • Open and flexible
      • Consistent platform
      • Multiple Devices


    • Contextual Apps
    • Office 365 Apps


    • Tools
    • Demos
      • Outlook (OWA) Apps integration
        • Works in rich client as well
      • Site provisioning CSOM API
      • Excel App API
        • Bing map sample app
      • DocuSign Outlook integration component demo
      • PollEverywhere poll shows File extension handler is most popular at this event
    • GitHub
      • OfficeDev O365 API open source solution
    • SAP
    • Access Web Apps
    • API Updates


    Anyone can build a SharePoint app with MS Access (Jeff Conrad and Chris Usher)

    • MS Access web apps
    • Uses SQL Server for the table back end
      • SQL Azure in Office 365
      • SQL connection info available in Access Client
    • Consuming Lists
      • Link to or import
    • Cascading combo box feature
    • MS using internally
      • Being used to reorganize MS Office and Windows divisions
      • Attorney tracking
      • Training feedback
      • TAPs

    Advanced Performance Analysis (Ryan Campbell)

    • Intro
    • Caching
      • BLOB cache too low
      • Page cache too low
    • App pool recycles caused issues
    • Load time and user count per site path request

    Tuesday - 3/4

    Wednesday - 3/5

    Thursday - 3/6

    • Flight out

    Monday, January 27, 2014

    Friday, December 6, 2013

    SharePoint 2010 Search - View Properties Link w/ folder and case support - Federated

    • You have SharePoint 2010 Server Standard or Enterprise
    • SharePoint search results provide a link to the document, but no other links
      • Often times a user has to copy and paste the document library url into the address bar and then search for the document in the library to view the properties or kick off a workflow.  This is extremely inconvenient.
    • You would also like a link to the document's View Item (DispForm.aspx) form
    • You would also like a link to the document's Document Library
    • You would like to configure this at the Search Service level so that the links appear in any search center in the farm utilizing the Search Service and also on the OSSSearchResults pages
    • Utilizing code from the following blogs

    • Configure the Search Service in Central Administration as follows
      • Xslt variables and parameters are case sensitive
      • Make sure instructions are followed exactly as written
    • Create 2 managed properties (Metadata Properties in Search Service Application) after your sites have been crawled
      • basic4
        • map to basic:4(text)

          • You have to page to the right after selecting the "basic" group.  It does not show up on the first screen when searching for the crawled properties.  You cannot use the free-text search filter to find this item.
      • listitemid
        • map to ows_ID(integer)
      • Configure Federated Locations in Search Service Application.
        • Click "Local Search Results"
        • Expand "Display Information"
        • Modify the following "Core Search Results Display Metadata" sections
          • Uncheck "Use Default Formatting"
          • Add the following columns to the "Properties" window

            <Column Name="ServerRedirectedURL"/>

            <Column Name="listitemid"/>
            <Column Name="basic4"/>
        • Copy the contents of the XSL into a text editor like Visual Studio or Notepad  
          • Find the IsDesignMode parameter and modify as follows

            <xsl:param name="IsDesignMode">True</xsl:param>

            <xsl:param name="listitemid" />
            <xsl:param name="basic4" />
        • Find the DisplaySize template call and modify as follows

          <xsl:call-template name="DisplaySize">
          <xsl:with-param name="size" select="size" />

          <xsl:call-template name="DisplayViewPropertiesLink">
          <xsl:with-param name="basicFour" select="basic4" />
          <xsl:with-param name="itemUrl" select="url" />
          <xsl:with-param name="siteUrl" select="sitename" />
          <xsl:with-param name="listItemId" select="listitemid" />
          <xsl:with-param name="contentclass" select="contentclass" />

          <img style="display:none;" alt="" src="/_layouts/images/blank.gif"/>

        • Find the end of Stylesheet tag at bottom of document and modify as follows

          <!-- A custom template to display a link to view the properties for a document -->
          <xsl:template name="DisplayViewPropertiesLink">
          <xsl:param name="basicFour" /> <xsl:param name="itemUrl" /> <xsl:param name="siteUrl" /> <xsl:param name="listItemId" /> <xsl:param name="contentclass" /> <!-- Variables to convert siteUrl to lower -->
          <xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
          <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
          <xsl:if test="$contentclass='STS_ListItem_DocumentLibrary'">
          <xsl:when test="contains($basicFour,'http')">
          <xsl:variable name="library" select="substring-before(concat(substring-after(translate($siteUrl, $uppercase, $smallcase), concat(translate($basicFour, $uppercase, $smallcase), '/')), '/'), '/')" />
          <xsl:variable name="viewPropUrl" select="concat($basicFour, '/', $library, '/Forms/DispForm.aspx?id=', $listItemId)" />
          - <a href="{$viewPropUrl}">View Properties</a>
          <xsl:variable name="docLibLoc" select="substring-before(substring-after($itemUrl, concat($siteUrl, '/')), '/')" />
          <xsl:variable name="viewPropUrl" select="concat($siteUrl, '/', $docLibLoc, '/Forms/DispForm.aspx?id=', $listItemId)" />
          - <a href="{$viewPropUrl}">View Properties</a>
          - <a href="{$siteUrl}">
          View Library

          <!-- End of Stylesheet -->

        • Copy the contents of the text file into the "Properties:" textbox, replacing all existing text
        • Hit OK to save the changes
      • You may need to reset the index and run a full crawl to get everything working afterwards
        • Sometimes the Search Centers cache the old XSLT for awhile, so the index reset and possibly an app pool recycle may get it to refresh from the federated location.  Or toggling the Core Results web part on the search center page can work as well.

      Thursday, November 21, 2013

      Attach a Document from SharePoint or Office 365 in Outlook

      • You would like to attach a document to an Outlook email that you have located within SharePoint or Office 365.
      • Note that for internal documents, you should always just link to the document in SharePoint.  Only when sharing with a user who doesn’t have access to your SharePoint site should you send a document as an attachment.
        • You can still use the following to get the link to the document.
      • You don't want to have to download it and then attach it from you local file system first
      • In addition to being able to email attachments directly from MS Word, you can attach the file directly from Outlook using the SharePoint shortcut as follows
      • Right-Click Document Name (This works from anywhere in SharePoint, even search results)
      • Select Copy Shortcut (This puts the Link to the Document in your clipboard)


      • Open the email you wish to attach to
      • Select Attach File 
        • If the recipient does have access to this document in SharePoint, you should just paste the link into the email instead, increasing security and avoiding change management issues.


      • Paste the shortcut into the File name field (Right click and select Paste or use Ctrl-V)


      • Click Insert and finish composing the Email


      Friday, November 15, 2013

      Unable to display this Web Part. SharePoint Designer modified XSLTListViewWebPart

      • A list or library view in the farm has ben modified in SharePoint Designer 2010
      • SharePoint Server 2010
      • An app pool recycle occurs (usually due to automatic nightly app pool restart)
      • You get the "Unable to display this Web Part." error message on any modified view.
      • SP Logs for the correlation id contain the following:
        • Failed to cache field with id "{GUID}", overwrite=0
        • Error while executing web part: System.InvalidCastException: Unable to cast object of type 'System.Reflection.RuntimeMethodInfo' to type 'System.Type'.     at Microsoft.Xslt.MethodCollection.MethodDescription.DeclareDynamicMethod(MethodCollection methodColl)     at Microsoft.Xslt.MethodCollection.CreateDynamicMethods()     at Microsoft.Xslt.MethodCollection.GetMethodInfoInternal(Int32 methodNumber)     at Microsoft.Xslt.MethodCollection.GetMethodInfo(Int32 methodNumber)     at Microsoft.Xslt.STransform.GetCompiledTransform()     at Microsoft.SharePoint.WebPartPages.BaseXsltListWebPart.LoadXslCompiledTransform(WSSXmlUrlResolver someXmlResolver)     at Microsoft.SharePoint.WebPartPages.DataFormWebPart.GetXslCompiledTransform()     at Microsoft.SharePoint.WebPartPages.DataFormWebPart.PrepareAndPerformTransform(Boolean bDeferExecuteTransform)
      • This seems to be a Microsoft bug and only occurs after occasional app pool resets
      • IIS Reset
      • Open the view in SharePoint designer and save