Softlanding: SharePoint Consulting & Managed Services | Vancouver, BC

    ​​​Delivering Solutions, Empowering Clients

    Softlanding specializes in SharePoint Solutions, Managed Services, Microsoft Enterprise Infrastructure and specialized IT Staff Augmentation. Our mission is to exceed your expectations by combining technical excellence, the highest ethical standards and a deep understanding of your business needs to provide you with the most effective, reliable and scalable solutions.

     SharePointROI Sustainment Services

    SharePointROI is a, fixed- fee managed service providing end-to-end SharePoint sustainment, user support and adoption services. Eliminate SharePoint expertise hiring headaches and get the most out of your SharePoint investment.

    Learn More >>

     2014 Profit 500 List

    Softlanding is proud to be listed on the 26th annual PROFIT 500 ranking of Canada’s Fastest-Growing Companies by Canadian Business and PROFIT magazines.

    More >>

     We're Hiring!

    We're on the lookout for fun, talented people to join our growing teams. If you're looking to move up in your career, come check us out.

    Openings >>



    Takes Place:
    Description: Interested to hear from our clients about projects and strategic partnerships we've been involved in? Good news, our Case Studies are live!

    Takes Place:
    Description: Softlanding is listed on the 26th annual PROFIT 500 ranking of Canada’s Fastest-Growing Companies by Canadian Business and PROFIT.

     Featured Solutions

    Connecting Talent and Resources for Better Performance

    Corix finds a scalable solution to communication issues and improves organizational performance in the process. Read more here


     Hidden Title

    Strategic IT to Support Organizational Change

    The BC First Nations Health Authority finds a strategic partner for a major transition, plus continued IT support for successful delivery of essential services. Read more here​. 



    Posted on:
    Categories: SharePoint
    Description: We had a requirement to add a multiple-selection list box field to an InfoPath form with values populated from a SQL Server database. In this blog, we create a hidden text field that stores the display names of the list box selections.
    ​Scenario We had a requirement to add a multiple-selection list box field to an InfoPath form with values populated from a SQL Server database. First we created the data connections and added and configured a multiple-selection list box to get choices from the data source in InfoPath. The ID was set as the Value and the name of the items that you want displayed in the list box was set as the Display Name (example pictured below). It is important that you select the ID for the Value. We were encountering a bug when we specified the name of the item (rather than the ID) to be the Value (ie. setting @_LONG_NAME as both the Value and the Display Name was causing this bug). The bug would render duplicates of the multiple-selection list box selections when a saved form was being viewed or edited. Although setting the ID as the Value eliminated this bug, the ID numbers of selections were being displayed in the list view which is not very user-friendly. We would like to see their display names instead. Therefore, to address this issue we came up with a workaround to retrieve and store the display name of the selections in a separate text field. We are going to step through the configuration in this blog. Implementation In InfoPath, add a Rich Text Box field to the form.Remove the Rich Text Box field from the display of the form (the data field still exists, it is simply hidden in the form).Go to edit the Rich Text Box field's properties.Under the Default Value setting, click to Insert Formula.The formula essentially boils down to this eval(eval(X[Y = Z], 'concat(.,", ")'), "..")X is the data field from the data connection that you want displayed in the text field Y is the value of the selection from the multiple-selection box (which is an ID)Z is the ID data field from the data connectionThe double eval loops through X[Y = Z] and concatenates each item.In place of X[Y = Z], click Insert Field or Group, then in the dropdown under Fields, select your data connection, then select the data field property to be displayed (in our case it's "LONG_NAME"), then click Filter Data Add a filter with the conditions Value is equal to ID In the first dropdown, choose Select a field or group. Then select Value from the multiple-selection list box data field. For the last dropdown, choose Select a field or group again. Then select the ID from the data connection The formula expression for our case iseval(eval(@_LONG_NAME[Value= @PRO_BRAND_ID], 'concat(., ", ")'), "..") The XPath expression of this formula isxdMathEval(xdMathEval(xdXDocumentGetDOM("ProductsSQL2")/dfsmyFields/dfsdataFields/ns1PRO_BRAND/@_LONG_NAME[xdXDocumentget-DOM()/dfsmyFields/dfsdataFields/mySharePointListItem_RW/myProducts/Value= ../@PRO_BRAND_ID], 'concat(., ", ")'), "..")Publish the form. In the list view, ensure that it is showing the rich text field and hiding the multiple-selection field.The result is that you have a multi-selection list box with choices from a SQL Server database in your InfoPath form and a separate text field that shows the display names of all selections.

    Posted on:
    Categories: PowerShell;SharePoint
    Description: Remotely provisioning a list from CustomSchemaXml is easy once you know how to structure the XML.
    This PowerShell script will provi​sion a new list remotely using ListCreationInformation.CustomSchemaXml.Further below is an example of the XML to be fed in, which is the tricky part.​param(​ [Parameter(Mandatory = $true)][string]$webUrl, [Parameter(Mandatory = $true)][string]$schemaXmlFilePath, [Parameter(Mandatory = $true)][int]$listTemplateId ) $csom = [Reflection.Assembly]LoadWithPartialName('Microsoft.SharePoint.Client') $ctx = New-Object Microsoft.SharePoint.Client.ClientContext $webUrl $ctx.Load($ctx.Web.Lists) $ctx.Load($ctx.Web.ListTemplates) $ctx.ExecuteQuery() $schemaXml = [xml] (Get-Content $schemaXmlFilePath) $template = $ctx.Web.ListTemplates | WHERE $_.ListTemplateTypeKind -eq $listTemplateId $info = New-Object Microsoft.SharePoint.Client.ListCreationInformation $info.Title = $schemaXml.List.Title $info.Url = $schemaXml.List.Url $info.CustomSchemaXml = $schemaXml.OuterXml $info.TemplateType = $listTemplateId $info.TemplateFeatureId = $template.FeatureId $list = $ctx.Web.Lists.Add($info) $ctx.ExecuteQuery()​ This script works against SharePoint 2010 and SharePoint 2013, but requires PowerShell v3 or higher.​How to structure the XMLSimply grabbing the SchemaXml from an existing list does not work. An easy way to start is to use Visual Studio. Add a list to a SharePoint project and then grab the Schema.xml file. It can be used as-is. Here is an example generated when choosing the Custom List template.<?xml version="1.0" encoding="utf-8"?> <List xmlnsows="Microsoft SharePoint" Title="List1" FolderCreation="FALSE" Direction="$ResourcesDirection;" Url="Lists/List1" BaseType="0" xmlns="http//"> <MetaData> <ContentTypes> <ContentTypeRef ID="0x01"> <Folder TargetName="Item" /> </ContentTypeRef> <ContentTypeRef ID="0x0120" /> </ContentTypes> <Fields> <Field ID="fa564e0f-0c70-4ab9-b863-0177e6ddd247" Type="Text" Name="Title" DisplayName="$Resourcescore,Title;" Required="TRUE" SourceID="http//" StaticName="Title" MaxLength="255" /> </Fields> <Views> <View BaseViewID="0" Type="HTML" MobileView="TRUE" TabularView="FALSE"> <Toolbar Type="Standard" /> <XslLink Default="TRUE">main.xsl</XslLink> <RowLimit Paged="TRUE">30</RowLimit> <ViewFields> <FieldRef Name="LinkTitleNoMenu"></FieldRef> </ViewFields> <Query> <OrderBy> <FieldRef Name="Modified" Ascending="FALSE"></FieldRef> </OrderBy> </Query> <ParameterBindings> <ParameterBinding Name="AddNewAnnouncement" Location="Resource(wss,addnewitem)" /> <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" /> <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_ONET_HOME)" /> </ParameterBindings> </View> <View BaseViewID="1" Type="HTML" WebPartZoneID="Main" DisplayName="$Resourcescore,objectiv_schema_mwsidcamlidC24;" DefaultView="TRUE" MobileView="TRUE" MobileDefaultView="TRUE" SetupPath="pages\viewpage.aspx" ImageUrl="/_layouts/15/images/generic.png?rev=23" Url="AllItems.aspx"> <Toolbar Type="Standard" /> <XslLink Default="TRUE">main.xsl</XslLink> <JSLink>clienttemplates.js</JSLink> <RowLimit Paged="TRUE">30</RowLimit> <ViewFields> <FieldRef Name="LinkTitle"></FieldRef> </ViewFields> <Query> <OrderBy> <FieldRef Name="ID"></FieldRef> </OrderBy> </Query> <ParameterBindings> <ParameterBinding Name="NoAnnouncements" Location="Resource(wss,noXinviewofY_LIST)" /> <ParameterBinding Name="NoAnnouncementsHowTo" Location="Resource(wss,noXinviewofY_DEFAULT)" /> </ParameterBindings> </View> </Views> <Forms> <Form Type="DisplayForm" Url="DispForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> <Form Type="EditForm" Url="EditForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> <Form Type="NewForm" Url="NewForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> </Forms> </MetaData> </List>