Category Archives: Uncategorized

SharePoint and MAXDOP

Microsoft strongly recommends that the SQL Server MAXDOP (maximum degree of parallelism) setting be set to “1” for servers supporting SharePoint. This setting suppresses parallel plan generation, and until SQL 2016, it’s an instance level setting, which means that all databases on that SQL instance would be affected by the change. Since most databases benefit from parallel plan generation, this setting will result in worse performance for most databases, except SharePoint, where this setting is strongly recommended. Though, when Microsoft says “recommended”, they really mean “required”, as SharePoint will not install or create new databases when the SQL Server does not have a MAXDOP of 1, starting in 2013. This is an easy requirement to miss, for a few reasons. First, this requirement is not mentioned in the documentation. Second, the SharePoint installer will set MAXDOP to 1 automatically if the install account has sysadmin permissions on the SQL Server. Since many shops will follow the advice to have a SQL instance that is dedicated to SharePoint, it’s rarely an issue as the setting applies automatically and no other database is affected as SharePoint is the only application using that SQL Server instance.

However, if you have a company that decided to have one huge database server that runs as many databases as possible, then this is a significant issue. Changing the server so that all databases run without parallel execution plans is a no-go. But installing SharePoint 2013 or 2016 without this option is also a problem. The solution is to follow best practices and set up a new SQL instance to support the SharePoint installation, but it’s not always easy to convince the IT group they need to diverge from their established plan of hosting as many databases as possible on one server and to spin up a new SQL instance in order to support SharePoint.

Advertisements

How Files are Organized within Microsoft Teams/O365 Groups

If a user wants to store a file for an Office 365 Group, the could store it in in the “files” area of the Group, which is really just a library in the team site that was created for the group. Alternatively, they could store the file in the “files” area of a channel within a Team. This file will be stored in a subdirectory of the library for the Office 365 Group. If a user tries to view the files for a team that is associated with a group, they won’t be able to, as files are only associated with a channel, not the team itself. If a user views the files for a specific channel of a team that is associated with a group, they will only see files for that one channel, and will not be able to view files in other channels or files that were uploaded to the files repository for the Group. If, however, the user navigates to the normal O365 Group site and views the file repository, then they will be able to view group files, plus they will be able to see subfolders and files that were created for each channel within the Team that is associated with that Group, which makes sense, as the channels are associated with the group.

If a user would like to view a file, they could of course navigate to the appropriate repository, as described above, or they could simply click on “files” on the left nav of the Teams interface. Then, after clicking on “Microsoft Teams”, the user will be presented with a list of all files that exist across all all channels of all Teams they have access to. Helpfully, this list will also show files that are part of the Group, and not just the team’s channels. Just to clarify, if the user clicks on “OneDrive” in the Files tab, they will see the contents of their own personal OneDrive, not the OneDrive files for any of the teams or groups.

If the user clicks on “notes” within a channel of a Team, they will gain access to the OneNote notebook for that channel. More specifically, there is one single OneNote notebook for the Office 365 Group that is stored in the site assets library of the Group’s Team Site which hosts notes for the Group, including notes for each channel within the Team. Each channel of a Team will get a new tab within the notebook. If a user views the Notes section within the Team interface, they will see only the notes for the current channel. If the user clicks the “edit in onenote” button, they will be able to easily switch between tabs within onenote, and thereby view the notes from the different channels, or notes from any other tab that was created in the site notebook. If the user navigates to the Group site and clicks to view the notebook, the user will have full access to all tabs in the web interface, including the tabs for each team channel. This makes sense, as again, there’s one OneNote Notebook on a Group’s Team Site that stores notes for Group, including for all channels of the Team that is associated with that Group.

It really couldn’t be simpler. 😉

Conditional Formatting in MS Project 2010 via VBA

This is a bit tricky, as Project doesn’t give the normal hooks for getting access to cell properties, like Excel. Also, the event model for Project is accessed a bit differently.  So, a couple possibilities:

Marked Fields

VBA can set a row as marked, and the style of marked rows can be set via Gantt Chart Tools –> Text Styles –> Item to Change –> Marked Tasks

Once the formatting has been set, it’s simple enough to change a row to marked:


Dim t As Task
For Each t In ActiveProject.Tasks
If t.Cost > 10 Then
t.Marked = True
Else
t.Marked = False
End If
Next

Formatting Individual Cells

However, this colors the entire row, not an individual cell. To shade individual cells, there’s a function named “Font32Ex”. The difficulty with this function is that it works with the selected cell, and doesn’t take a cell reference. To select a cell, we can use “SelectTaskField”:

SelectTaskField Row:=100, Column:=”Cost”, RowRelative:=False

RowRelative is key here, in that the above will select the 100th row, regardless of where the focus was. So, we can put the above in a loop:


Dim i As Integer
For i = 1 To pj.Tasks.Count
Dim t As Task
Set t = pj.Tasks(i)
If t.Cost > 5 Then
SelectTaskField Row:=i, Column:="Cost", RowRelative:=False
Font32Ex CellColor:=62207
Else
SelectTaskField Row:=i, Column:="Cost", RowRelative:=False
Font32Ex CellColor:=-16777216
End If
Next

Note: the color values were obtained just by recording a macro and changing the color in the macro.

The above meets my needs, but perhaps the cell needs to be changed on edit, and not loop through all tasks. If so, check out the technet article that goes over hooking into task level events:

https://msdn.microsoft.com/en-us/library/ee355232%28v=office.12%29.aspx#odc_pj2007_bk_VBAProgrammingProject_UsingTaskEvents

Sway vs PowerPoint

Many people have been asking about the purpose of Sway, and since it’s a tool to create presentations, the natural follow-up question is why is there a new tool when PowerPoint is perfectly capable of creating presentations.

PowerPoint was designed for use with a projector. Optionally, slides can be printed, but its main focus is to build presentations that will be displayed using a device with a particular size. In PowerPoint, you control exactly where elements will be displayed, the font sizes, the alignment,… .everything. And, for projectors, this is nice. But if someone tries to view a PowerPoint presentation on a phone, they’re going to have issues. Fonts that are sized well for a projector are not sized well for a small screen. Photos that look good in a horizontal layout may not appear correctly when viewed in a vertical layout.

So, this is where sway fits in. It’s a new, web based tool that allows you to create presentations that are optimized for viewing on various sizes devices. Sway does not provide a lot of options that PowerPoint users are used to, as the goal is not to define pixel by pixel exactly where things will appear, as sway takes care of positioning elements based on the size of the screen that is being used by each user.

Why didn’t they add this to PowerPoint? PowerPoint has a lot of existing capabilities like slide transitions and animations, and the ability to precisely define the slide layout that wouldn’t work well in this new environment. So instead of creating two different PowerPoint modes with radically different capabilities, they’ve built a new tool.

Rationale for Office 365 Groups

I think I finally understand Office 365 Groups. I have been thinking of them as a competitor to Team Sites, and in that role they fall short. However, it is true that a few (or more) users may need to start working on a project together, and often the process to request and configure a team site is more than they want to deal with. Right or wrong, the solution for many people in the past has been to go around IT and just use services such as Dropbox. So thinking that Groups somehow replaces Team Sites is wrong; Groups replace the 3rd party tools that people have been using instead of Team Sites. Will Groups replace some team sites? Most likely. But the team sites they will replace are the ones where structure and process really weren’t needed anyway.

I’ve seen quite a few people asking for the ability to turn off Groups for many users. I understand the concerns that those people have. But now I think I get Microsoft’s perspective. If Groups are turned off for some users, those users will still have access to products from Microsoft’s competitors.

404 for SharePoint 2013 Apps hosted in a Subdomain

This is just a minor clarification on setting up DNS for SharePoint 2013 apps that are configured via a subdomain. If you’re looking for a full walkthrough of the whole process of enabling the App Store, see here:

http://sharepointchick.com/archive/2012/07/29/setting-up-your-app-domain-for-sharepoint-2013.aspx

(And, just a reminder, MS recommends that you not use a subdomain of the domain that hosts the SharePoint site anyway, but in case you did…)

Specifically, if you can get to the store, add the app, but when you browse to the app you get a 404 page not found message, then perhaps the problem is DNS. If you have the following SharePoint server:

http://sp2013.mydomain.com

Then one option for setting up apps is to create a subdomain:

http://app.sp2013.mydomain.com

 

To set up the above in DNS, add a new Alias (CNAME) record as follows:

Alias Name: *.app

This will give a FQDN of: *.app.mydomain.com

FQDN for target host: sp2013.mydomain.com

(I’ve found a few pages that describe this process but are vague about what should be specified for the FQDN for the target host. To be clear, the target host should be the SharePoint server, specifically, the WFE).

 

To confirm, once you have the above set up, the following commands should all return the IP for sp2013.mydomain.com:

Nslookup abc.app.mydomain.com

Nslookup xyz.app.mydomain.com

Nslookup anythingatall.app.mydomain.com