SharePointRoot


Leave a comment

AUSPC 2014 – YAMMER + FORMS

Over the last few days, the Australian SharePoint conference has been held in Sydney – it’s the FIFTH year that it’s been held – and the third time I’ve presented a session.

The conference began with a speaker dinner, at an amazing gourmet Mexican restaurant – one of the amazing highlights for me was the made-at-the-table guacamole (waitress used a mortar & pestle) – and the tempura cactus chips (!)

Lots of great chatter over more food, and margarita’s and mojito’s – a great crew of local and international speakers.

I had two sessions to deliver, but not until the 2nd day – so I went to see a number of sessions, and spoke with many of the vendors and other colleagues I’ve gotten to know over the years.

There was also a great VEGAS theme party, with blackjack tables, and poker, and a prize wheel too – lots more discussion & fun was had.

But – you’re here to check out the prezzo’s, right ?

YAMMER + SHAREPOINT

Elaine van Bergen and I co-presented this slot, with Elaine covering much of the OOTB and ‘what you get’ aspects of Yammer – as well as considerations related to SSO (Single Sign-On) and DirSync.

I covered the next section, with some deep-dive DEV-content for integration of Yammer into your SharePoint site – we were showing this within Office 365 (btw).

The first of these was using the EMBED tags and SCRIPT blocks – which allows Yammer to inject an IFRAME into your page.   Some minor customisations, but still a bit limited – eg. can’t do any CSS / styles.

The next bit (and more interesting from a ‘code’ perspective) was to use the REST API from the Yammer SDK.  

This requires a SCRIPT tag reference, and then some URL’s to retrieve JSON data.   Then, you can do ‘whatever’ you want.

The demo showed :

  • Some example REST URL’s + the JSON data returned
  • An example GET to retrieve ‘messages’
  • An example GET to retrieve the current user, and determine the GROUPS they are part of – and load into a combo.  
  • The user could then choose a group – and enter some text, and click POST which would then create a Yammer post – nice !

I’ve loaded the slides for anyone wanting to see what we covered – please leave a comment if you’d like more information, and I can do another post about the demos.

FUTURE OF FORMS

My second session for the day was to cover the future of forms, with the perspective of InfoPath being deprecated, as was news earlier in the year.

This was a hot topic – and the presentation room was packed to capacity – every seat taken, and a bunch of people standing up the back, and even sitting on the floor at the front.   Was between 120-130 people – was great to have such a large audience !

My session covered the following aspects :

  • Brief history of InfoPath – why is it being put out to pasture
  • Wrap-up of the SPC348 session from Vegas – and the alternatives shown by Microsoft
    • Excel Surveys (FOSS = Forms On Spread Sheets)
      • Had a great crowd-participation survey “live demo” – lots of fun
    • Forms On SharePoint Lists (FOSL)
      • Not available until end-of-2014 – I had to do JPG demo
    • Structured documents (Word)
      • Much like content fields today – or so it seems
      • Again, not available till end of 2014
    • Access Web Apps
      • Table driven database ‘apps’ – using MS-Access
  • Other considerations
    • Rules/Validation
    • Back-end system integration
    • Workflows

After that run-down, the tone was pretty much “well, none of those are a replacement for InfoPath” !    

(I had a video-game-photo that I found entitled “Wasteland” – LOL !)

The next section covered some 3rd-party alternatives – with overview+demo :

  • Nintex Forms
  • K2 SmartForms (SmartObjects)
  • Formotus

The ending message that *I* wanted to leave with people was that you can STILL use InfoPath – it’s not going anywhere – not for 10 years (2023 – end of support).

If you’re using Office 365 of course, that could be sooner (much sooner).

So – don’t panic – just continue “as is” for now – and hopefully we’ll see something from Microsoft towards the end-of-the-year.

The murmurings I’ve heard are that Santa will kind to us – watch this space !

** Again, please leave a comment if you’d like to know more about FORMS – or you can contact me via twitter / email – check the slides for details :

OK – that’s all for now – only a few days until I head off to New Zealand, and do it all again !    

Hope you had a great AUSPC – if you were there.   If not, you MISSED OUT !

:-)


Leave a comment

Nintex Workflow FAILED to Start

The current project I’m working on is a sizeable SP2010 to SP2013 upgrade, and we hit a problem with the Nintex Workflow piece.

When running a workflow after upgrading, the message is simply :

FAILED TO START

When looking at the SharePoint logs, the following message was shown :

Error establishing database connection. SQL Error: 515.: System.Data.SqlClient.SqlException (0×80131904): Cannot insert the value NULL into column ‘DatabaseID’, table ‘SvcApp_NintexWorkflow2013_UPG.dbo.Storage’; column does not allow nulls. INSERT fails.  The statement has been terminated.    

The steps we’d followed, to do the upgrade are via upgrade guide PDF.

  • Install Nintex binaries (using v3.0.7 – as we’re on SP2013 SP1)
  • Restore SQL Server DB
  • Configure within Central Admin

This is where we’d missed a step – oops !

Resolution

Within Central Admin, you actually have to specify the database to use TWICE.

This is due to the fact that Nintex has a “Config” and “Content” database – mostly (usually) within the same SQL database.

This is the same metaphor is true with SharePoint – Config + Content.

In *MY* environment – this was BLANK. #facepalm !

Once I’d set this correctly – my Nintex Workflows began working – yay !

image


Leave a comment

Reporting Services w.SharePoint 2013 (SafeControls)

We’ve faced a problem with a SharePoint 2010->SharePoint 2013 upgrade, with regard to the display of SharePoint Reporting Services WebParts.

After installing the SSRS Add-In for Integrated mode, we still had an error :

Web Part Error: A Web Part or Web Form Control on this Page cannot be displayed or imported. The type Microsoft.ReportingServices.SharePoint.UI.WebParts.ReportViewerWebPart, Microsoft.ReportingServices.SharePoint.UI.WebParts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91 could not be found or it is not registered as safe.

This is due to the components from SQL Server 2008 – it’s the v10 DLL.

From a quick look into the WEB.CONFIG, there is a SAFECONTROLS entry for the new v11 Reporting Services WebPart (as part of SQL Server 2012) – AND – also a BINDING REDIRECT for the v10 –> v11 DLL (assembly).

BUT – there isn’t a SafeControls entry – doh !

There was a blogpost about needing to manually add to WEB.CONFIG – no, thanks !

I have SIX web-app’s – and FIVE server’s in the farm – so that would be 30 changes.   AND – that’s for DEV, let alone TEST and PROD.

My resolution (drumroll) was to define a SPWebConfigModification – unfortunately, there were lots of examples in C# – but none using PowerShell.

So – here’s the script to do – just need to run ONCE for each WebApp that needs the fix.

Let me know if this helps you – it was a good ‘win’ for our team :

Param
(
   $webUrl
)
Add-PsSnapin Microsoft.SharePoint.PowerShell

# USAGE :AddToSafeControls_SSRSv10 -webUrl http://portal

# ADDS THE FOLLOWING TO WEB.CONFIG – MANAGED BY SHAREPOINT
# <SafeControl Assembly=”Microsoft.ReportingServices.SharePoint.UI.WebParts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91″ Namespace=”Microsoft.ReportingServices.SharePoint.UI.WebParts” TypeName=”*” Safe=”True” />

$safeControlsConfig = New-Object Microsoft.SharePoint.Administration.SPWebConfigModification
$safeControlsConfig.Path = “/configuration/SharePoint/SafeControls”
$safeControlsConfig.Name = “SafeControl[@Assembly='Microsoft.ReportingServices.SharePoint.UI.WebParts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91'][@Namespace='Microsoft.ReportingServices.SharePoint.UI.WebParts'][@TypeName='*'][@Safe='True']“
$safeControlsConfig.Value = “<SafeControl Assembly=’Microsoft.ReportingServices.SharePoint.UI.WebParts, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91′ Namespace=’Microsoft.ReportingServices.SharePoint.UI.WebParts’ TypeName=’*’ Safe=’True’ />”
$webApp = Get-SPWebApplication $webUrl
$webApp.WebConfigModifications.Add($safeControlsConfig)
$webApp.Update()

$webApp.Parent.ApplyWebConfigModifications()
Write-Host “Finished Updating web.config.”
Remove-PsSnapin Microsoft.SharePoint.PowerShell


1 Comment

Add Geolocation Column to SharePoint

Unfortunately, the new “Geolocation” column in SP2013 doesn’t come ‘turned on’ by default.

I was able to easily add it as a ‘site column’ – and then can add to any list.

  • Open Visual Studio project
  • Create a C# console app
  • Add a reference to the following :
    • Microsoft.SharePoint.Client
    • Microsoft.SharePoint.Client.Runtime
  • Include the following code :

ClientContext context = new ClientContext(“https//server/site”);
Web web = context.Web;
context.ExecuteQuery();

var newField = web.Fields.AddFieldAsXml(“<Field Type=’Geolocation’ DisplayName=’Map GeoLocation’/>”, false, AddFieldOptions.DefaultValue);

context.ExecuteQuery();

After executing the project, you should be able to go back to SharePoint – and do the following ;

Edit properties of a list, and click “add from existing site columns” :

image
Choose the new column :

image

And there it is :

image

That’s about it – too easy, eh !?

** The same code should work for Office 365 – I haven’t tried it yet though – will update soon…


Leave a comment

Cannot select variables in Nintex Workflow (SP2010)

Have been looking into a strange occurrence, in which some variables can’t be chosen.   

The activity we’ve been trying is the FLEXI TASK and TO-DO TASK.

I’ve created a new Workflow – and added an activity :

image

Choose to configure the activity :

image

Where are the VARIABLES ??

image

I have a TEXT and a PERSON variable – see below :

image

BUT – these don’t show in the field chooser – WHY !!??

The problem :

I’m using Internet Explorer 11 – on Windows 8.1 – and the same happens on IE10.  

This doesn’t happen on IE9 though – so it’s a BROWSER issue !!

The other clue is that there are no save/cancel buttons :

image

The solution :

Firstly, SAVE the workflow – as the browser will need to reload the page.

Within IE11, you need to change the ‘compatibility’ setting.

image

Make sure to add the current URL (in my case : dev.local)

image

Click “Close” – and the browser will refresh.

The test

After re-loading the workflow – and checking the activity, it now works !

image

If you get this problem – or any JavaScript errors while working on a Nintex Workflow 2010 environment, check the ‘compatibility’ settings.

:-)


Leave a comment

Passing values INTO a SharePoint AppWeb (IFRAME)

The new application architecture for SharePoint 2013 is a big change, with the contents of an ‘app’ being contained within an IFRAME (old school for the new school !)

There are some challenges – most notably with ‘cross domain’ calls.

Much of the details on the web discuss HOW you can include JavaScript (CSOM) within the APP Web (inside the iframe) for calling to some parts of SharePoint – within the HOST Web.

Have a look at the great articles from Chris O’Brien – very good detail :

http://www.sharepointnutsandbolts.com/2012/11/access-end-user-data-in-host-web-from.html

BUT – what if you want to do the opposite ?    And pass values INTO the IFrame ?

Problem Statement

In the example below, there are some URL’s at play – for the main ‘outer browser page’ – and the SharePoint “AppPart” IFRAME SRC attribute – which will be detailed below.

image

The problem I have, is to pass the “CompanyId” and “Service” into the APP WEB.

Investigation

From looking at the ‘source’ of the page (with the AppPart), there is an IFRAME :

image

Looking at the source (SRC) for the IFRAME, there is a massive URL :

https://TENANT.sharepoint.com/_layouts/15/appredirect.aspx?redirect_uri=https%3A%2F%2Fa57e0d4b%2Db308%2D4d37%2D933f%2Df6ac34cc3caf%2Eo365apps%2Enet%2FPages%2FContactUs%2Easpx%3FSPHostUrl%3Dhttps%253A%252F%252Fsdfsdfsdf%252Dpublic%252Esharepoint%252Ecom%26SPHostTitle%3DWebsite%26SPAppWebUrl%3Dhttps%253A%252F%252Fsdfsdfsdf%252D0b8387559abd0a%252Esharepoint%252Ecom%252FExchangeBookings%26SPLanguage%3Den%252DUS%26SPClientTag%3D24%26SPProductNumber%3D16%252E0%252E2510%252E1213%26SenderId%3D43AA3E140%26%26CTYPE%3De%26EID=282&client_id=i%3A0i%2Et%7Cms%2Esp%2Eext%7Ca57e0d4b%2Db308%2D4d37%2D933f%2Df6ac34cc3caf%40691f8b90%2Df291%2D48a2%2Db6a4%2D173a73073f2c

In reality – it’s not THAT scary, when you break it down :

And so – what if we’re able to UPDATE the ‘redirect_uri’ to include the custom properties as mentioned above ??     Oooooh !   That might just work.

Proof Of Concept

The next bits cover the code I tried – using some JavaScript/jQuery – on the main page that I’m hosting the AppPart.

  • Add a “Script Block” and include the following :

<script type=”text/javascript” src=”/Style%20Library/jquery-1.10.2.min.js” ></script>

<script type=”text/javascript” src=”/Style%20Library/IFrameHelper.js” ></script>

  • Obviously – need to download jQuery.js, into Style Library
  • Then, within the code for the “IFrameHelper.js” do the following :
    • Use jQuery to run ‘on document load’
    • Get the current page URL (entire browser)
    • Get the QueryString part from main window (CompanyId / Service)
    • ADD this to the ‘redirect_uri’ piece
    • Put it back together
    • Update the SRC for the IFRAME
  • Params will now be passed INTO the IFRAME – and you can grab in C# code

The main change is to define a new URL :

And – this is updated as the SRC of the IFRAME.     The good bit is, that this will send ALL + ANY QueryString bits to the child IFRAME.

Here’s the full code of the “JS” file – PLEASE let me know if this helps you – or you managed to do this a nicer way (??)

image

Here’s the code in all it’s ugly wonder – not the best to read online (that’s why I put it as a screen shot above).

$(document).ready(function () {
    // get the current url – and the query string bit
    var currentPageUrl = window.location.href;

    // if there *IS* a query string – then need to grab – and pass on to the iFRAME
    if (currentPageUrl.indexOf(‘?’) != -1) {
        // —————————————————————
        // get the query string bit for current page
        // —————————————————————
        var currentPageQueryString = currentPageUrl.substring(currentPageUrl.indexOf(‘?’));

        //need to fix some bits with the querystring
        currentPageQueryString = currentPageQueryString.replace(“?”, “%26″);
        currentPageQueryString = currentPageQueryString.replace(“&”, “%26″);
        currentPageQueryString = currentPageQueryString.replace(“=”, “%3D”);

        // —————————————————————  
        // now update the iframe src
        // —————————————————————

        //get the url from iframe on page
        var src = $(‘iframe’).attr(‘src’);

        if (src != null) {
            //need to get the query string parts – esp.find the ‘redirect_uri’ – and APPEND some bits to it
            var iframeUrl = src.substring(0, src.indexOf(‘?’));

            var vars = getUrlVars(src);
            var redirectUrl = vars["redirect_uri"];
            var clientID = vars["client_id"];

            //add on the extra bit (for this page querystring)
            redirectUrl = redirectUrl + “%26″ + currentPageQueryString;

            //piece back together – and update the iframe
            var newUrl = iframeUrl + “?redirect_uri=” + redirectUrl + “&client_id=” + clientID;

            //update the SRC in the IFRAME
            $(‘iframe’).attr(‘src’, newUrl);

        }
    }

});

function getUrlVars(url) {
    //split up the pieces of the URL
    var vars = [], hash;

    var hashes = url.slice(url.indexOf(‘?’) + 1).split(‘&’);

    for (var i = 0; i < hashes.length; i++) {
        hash = hashes[i].split(‘=’);
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }

    return vars;
}

NB.   I’m using this within Office 365 – but – it should be OK for an on-premises environment of SharePoint 2013.


Leave a comment

DispForm.aspx Error in Office 365

I’ve been tracking down a very wierd (!!!) problem with Office 365, and a SharePoint 2013 environment.  

From a few support calls with Microsoft, it turned out to be the ‘Master Page’ in use.

The basic symptom is as follows :

  • Create a custom SharePoint list – eg. Test List
  • Add a few items – at least 4-5 items
  • Click on the “View Item” dropdown

Error message shown :

Sorry, something went wrong

No item exists at https://TENANT.sharepoint.com/Lists/Test List/DispForm.aspx?ID=3&Source=https://TENANT.sharepoint.com/Lists/Test%2520List/AllItems.aspx&ContentTypeId=0x0100C960232A60E32F4A9E0F734CBF3C7428&RootFolder=/Lists/Test List.  It may have been deleted or renamed by another user.

Technical Details

Troubleshoot issues with Microsoft SharePoint Foundation.

Correlation ID: 73906e9c-bcaf-3050-c352-cfaf2db01581

But – the item is there – I can view within a REST URL :

https://TENANT/_vti_bin/listdata.svc/TestList(3)

And – the page ONLY works for VIEWITEM.ASPX?ID=1 and ?ID=2

Further wierdness – if I add a querystring to ANY page – it errors :

Eg.   https://TENANT/Pages/About-us.aspx?ID=1    (no problem – and ID=2)

https://TENANT/Pages/About-us.aspx?ID=3     (error !!)

===================================================

For some reason, there is a problem with the “OSLO.MASTER” master page – in use for the SYSTEM master page.

If you try to VIEW – or EDIT a list item with ID > 2 (only #1 and #2 will work) – you get this error.

When I switched to the SEATTLE.MASTER master page, the problem went away.

WTF !?

image

I’ve spoken with a few Microsoft ppl – and some internal “Masters” (MCM) at my company – and we’re all a little bewildered by this behaviour.

I’ll need to look into it some more – and see which tags in the Master Page have caused this problem…

Anyone else noticed this problem ??     (or have an answer WHY !?)

** Will update soon – if/when I find an answer.

 

UPDATE :

From some trial+error, and plenty of WinDiff, and cut/copy/paste markup within SharePoint Designer, I finally determined the error.

There is a “DelegateControl” that is used in the OSLO master page, but not within SEATTLE.   

When I remove this, then all is OK.   

Add it back again, and the error returns.

<SharePoint:DelegateControl runat=”server” ControlId=”PageHeader” AllowMultipleControls=”false” />

The next question is – what does this delegate do ?    And, does it happen with SP2013 ‘on-premises’ also ??      More to investigate….

Follow

Get every new post delivered to your Inbox.

Join 31 other followers