Oracle Portal 10g to SharePoint Migration

Do you have Oracle Portal 10g?  Want to move to SharePoint with full fidelity?  I have scripts that will do exactly that!  This would include:

  • Portal Groups
  • All pages with all "things" (URLs, content, files)
  • Files with versions and comments
  • Workflows
  • Permissions

Contact me at:
chris@architectingconnectedsystems.com

I'd be happy to chat with you about moving to SharePoint 2010!

Oh, and here are some interesting facts about Oracle Portal versus SharePoint:

  • Web part zones can have web part zones (these are called regions and subregions in Portal) 
  • Workflows have steps for approvals (whereas SharePoint an approval is just a single step)
  • Groups are global in Oracle Portal (SharePoint groups are limited to site collections)
  • Oracle uses a concept of "things".  Everything is one and everything can have other "things".  This is *super* powerful notion and means that a single page can contain "things", where a thing can be a URL, a file, content, etc.  SharePoint pages can only have web parts on them.
  • Each "thing" on the page can have security for it, SharePoint doesn't let you do this
  • Each "thing" has a version (no matter what it is), SharePoint doesn't have this
  • Each "thing" on a page can have a workflow.  SharePoint workflows are tied to list items, you can't workflow web parts
  • Each "thing" can be optionally HIDDEN.   SharePoint doesn't have a notion of hidden.  The closest you can get is by creating a second list/library and setting permissions.
  • Oracle has a built in notion of shortcut links (a GUID that takes you to the page you want to hit), SharePoint doesn't

So what saves SharePoint at the end of the day?

  • Office Web Apps is the savior, you can't do fancy Office Document manipulation in Oracle
  • Oracle Portal is *much* more expensive than SharePoint

Chris

1 Year Anniversary Tribute – eBay upgrade video

As a tribute to the 1-year anniversary of the start of the eBay upgrade project, I thought I would share the video I created to show at our celebration party in San Jose.  It is a great video, and shows how much fun we had (and you should too) when we did the upgrade.  The team deserves a tremendous amout of credit for the work and effort they put in…so here it is:

http://youtu.be/EnK2c_lntOY

As a run down, here is what occurs in the video:

  • The SharePoint odessey – the 2001 to 2010 evolution.  When the monkey discovers the monolith and evolves.  Simiarly, eBay's discovery of SharePoint 2010 starts with a monolithic-white board (its only appropriate that we use Richard Struass's Also sprach Zarathustra to show this)
  • You see that it really is a love of "SharePoint" that progresses the joining of all parties
  • As we drive through the initial requirements (found and un-found), you will realize that this project was done in 3.5 months (when similar quotes were at 14 months at 4x the cost).  This drives the selection of Queen's…"Under Pressure"
  • At one point you will see Ramin and I on the ground with our hands in the air…it was a fun moment as we were not really knowing what was going to happen…
  • You will see photos of our countdown timer of the night we went live (we had an upgrade window of the weekend to finish the upgrade successfully).  It slowly winds down until the "GO-NOGO Moment"
  • As the pictures are displayed, you will see various moments over the 3.5 months of us working intent-ly getting the job done
  • Not everything went as planned and hence you see the "GO-NOGO" which occured at least 4-5 times (some elements include NDR64 discoveries and the infamous Search ResultsProvider that has claimed countless develpers…
  • Katy Perry's song of "Firework" is perfect for our dispay of the team members that worked so very hard to make the upgrade happen and thusly are amazingly bright and wonderful people that randomly came together to accomplish something amazing (NOTE: there are moments in the song lyrics that relate to hidden moments)
  • Let me be the first to say that eBay has an amazing NetOps team that just kicks butt (Kenny Cheng and Ken MacIntosh), they saved our a$$ a few times…
  • You will see a snapshot of a fortune cookie that "I" got…it was the week of the upgrade and it said "Your hard work is about to pay off", it was the best fortune EVER!
  • There were some times when we had some pretty "interesting" dinners…hence the snapshot of the menu…
  • The video ends with 00:00:00 and pictures of the eBay intranet running SharePoint 2010 and our SharePoint Conference 2011 session – "How eBay successfully upgrade their intranet to 2010"

Enjoy!
Chris

Fixing: Action 4.0.23.0 of Microsoft.SharePoint.Upgrade.SPSiteWssSequence failed.

This was a tough error, THAT IS AN UPGRADE SHOWSTOPPER, that I ran into a few months ago.  Just now getting around to blogging it.  Here's the full error:

[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]: Action 4.0.23.0 of Microsoft.SharePoint.Upgrade.SPSiteWssSequence failed.
[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]: Inner Exception: Field name already exists.

The name used for this field is already used by another field in the list.  Select another name and try again.<nativehr>0x81020013</nativehr><nativestack></nativestack>
[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]:    at Microsoft.SharePoint.Library.SPRequestInternalClass.UpdateField(String bstrUrl, String bstrListName, String bstrXML)
   at Microsoft.SharePoint.Library.SPRequest.UpdateField(String bstrUrl, String bstrListName, String bstrXML)
[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]: Exception: Field name already exists.

The name used for this field is already used by another field in the list.  Select another name and try again.
[powershell] [SPSiteWssSequence] [ERROR] [9/29/2011 12:02:27 PM]:    at Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)
   at Microsoft.SharePoint.Library.SPRequest.UpdateField(String bstrUrl, String bstrListName, String bstrXML)
   at Microsoft.SharePoint.SPField.UpdateCore(Boolean bToggleSealed)
   at Microsoft.SharePoint.SPField.Update()
   at Microsoft.SharePoint.SPFieldIndexCollection.IndexOneField(Object field, Boolean bIndexed)
   at Microsoft.SharePoint.SPFieldIndexCollection.Add(SPField field)
   at Microsoft.SharePoint.Upgrade.RestoreWorkflowAndDatasourceLibraryPermissions.Upgrade()
   at Microsoft.SharePoint.Upgrade.SPActionSequence.Upgrade()

What causes this?  Diving into the upgrade code I find that it is obviously trying to add a column to a list.  But which one?  The hint was in the name of one of the methods – "RestoreWorkflowAndDatasourceLibraryPermissions".  Looking at this, it is checking for all task lists in each site that are setup for workflow.

I reran the code in powershell and eventually found the offending list:

foreach($web in $site.allwebs)

{

$ht = new-object system.collections.hashtable

foreach($list in $web.lists)

{

foreach($ct in $list.ContentTypes)

{

if ($ct.Id.IsCHildof([Microsoft.SHarePoint.SPBuiltInContentTYpeId]::WorkflowTask))

{

$ht.add($list.id, $list.id)

"Web:" + $web.TItle

"List: " + $list.Title

"Content Type:" + $ct.Name

} #end if

} #end ct

} #end list

foreach($id in $ht.values)

{

$l1 = $web.lists[$id]

#$g = new-object system.guid ([Microsoft.SHarePoint.SPBuiltInFieldId]::WorkflowInstanceID.tostring())

$g = new-object system.guid ("de8beacf-5505-47cd-80a6-aa44e7ffe2f4")

#$l1.FieldIndexes.delete($g);

$l1.FieldIndexes.add($list.fields[[Microsoft.SHarePoint.SPBuiltInFieldId]::WorkflowInstanceID]);

$l1.update()

#$g = new-object system.guid([Microsoft.SHarePoint.SPBuiltInFieldId]::Guid.tostring())

$g = new-object system.guid("ae069f25-3ac2-4256-b9c3-15dbc15da0e0")

#$l1.FieldIndexes.delete($g);

$l1.FieldIndexes.add($list.fields[[Microsoft.SHarePoint.SPBuiltInFieldId]::Guid]);

$l1.update() 

} #end hashtable

} #end web

What was the cause?   When you create a workflow, it asks for a task list. 
You can point the workflow at an existing task list or create a new one.  It seems that not only did the users create a workflow that pointed to an existing list, but that list in fact was the task list that the workflow was using for task tracking!!  This causes a loop in the upgrade code and hence the failure.

Fixing it requires deleting some of the fields that were added by the workflow.

Enjoy!

Chris


Adding "Add folder" to SharePoint 2010 document library views

A customer asked me if they could add a "Add Folder" to the document library list type in SharePoint 2010.  I said, "probably", but wasn't sure exactly how one might do it.  I dug in and found it!  The secret lies in the vwstyles.xsl file.  It is located in:

C:Program FilesCommon FilesMicrosoft SharedWeb Server Extensions14TEMPLATELAYOUTSXSL

You will want to open the file and find the template called:

<xsl:template name="Freeform">

From there you should see some XSLT that is responsible for creating the "Add document" link.  Right above the variable declaraton"<xsl:variable name="Url">", you need to add a new one:

<xsl:variable name="FolderUrl">
<xsl:value-of select="$HttpVDir"/>/<xsl:value-of select="
$XmlDefinition/List/@title"/>/Forms/Upload.aspx?Type=1&amp;IsDlg=1&amp;List=<xsl:value-of select="$List"/>&amp;RootFolder=<xsl:value-of select="$XmlDefinition/List/@RootFolder"/>
</xsl:variable>

Then add a new table row below the current one that defines the "Add Document" link:

        <tr>
          <td class="ms-addnew" style=’padding-bottom: 3px’>
          <span style=’height:10px;width:10px;position:relative;display:inline-block;overflow:hidden;’ class=’s4-clust’><img src=’/_layouts/images/fgimg.png’ alt=” style=’left:-0px !important;top:-128px !important;position:absolute;’  /></span>
          <xsl:text disable-output-escaping="yes" ddwrt:nbsp-preserve="yes">&amp;nbsp;</xsl:text>
          <xsl:choose>
            <xsl:when test="
List/@TemplateType = '115'">
              <a class="ms-addnew" id="{$ID}-{$WPQ}"
                 href="{$Url}"
                 onclick="javascript:NewItem2(event, &quot;{$Url}&quot;);javascript:return false;"
                 target="_self">
                <xsl:value-of select="$AddNewText" />
              </a>
            </xsl:when>
            <xsl:otherwise>
              <a class="ms-addnew" id="{$ID}Folder"
                 href="{$FolderUrl}"
                 onclick="javascript:NewItem2(event, &quot;{$FolderUrl}&quot;);javascript:return false;"
                 target="_self">Add folder
              </a>
            </xsl:otherwise>
          </xsl:choose>
          </td>
        </tr>

BAM!  You now have a handly "Add folder" link at the bottom of the page instead of using the ribbon.  NOTE:  This change would need to be applied to all WFEs in the farm and you would need to re-check after every CU or Service Pack deployed.  Also, you will need to add some other logic to keep it from showing up in places you don't want it…I'll have to add this in a later update to this blog.

NOTE: Also keep in mind that this file is cached on its first load and an IISRESET is required in order to see any changes.

Enjoy!
Chris

 

CanUpgrade [Microsoft.SharePoint.Administration.SPIisWebSite] failed.

How do I always seem to be the guy finding this stuff is beyond me, but I'm always excited when I figure this stuff out…ok, was getting this error after trying to run the PSConfig after an upgrade to SP1 and December 2011 CU.

[OWSTIMER] [SPUpgradeSession] [INFO] [1/8/2012 1:48:44 PM]: SPWebApplication Name=SharePoint – xxx
[OWSTIMER] [SPUpgradeSession] [ERROR] [1/8/2012 1:48:44 PM]: CanUpgrade [Microsoft.SharePoint.Administration.SPIisWebSite] failed.
[OWSTIMER] [SPUpgradeSession] [INFO] [1/8/2012 1:48:44 PM]: SPWebApplication Name=SharePoint – xxx
[OWSTIMER] [SPUpgradeSession] [ERROR] [1/8/2012 1:48:44 PM]: Exception: The system cannot find the path specified.
[OWSTIMER] [SPUpgradeSession] [INFO] [1/8/2012 1:48:44 PM]: SPWebApplication Name=SharePoint – xxx
[OWSTIMER] [SPUpgradeSession] [ERROR] [1/8/2012 1:48:44 PM]:    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at Microsoft.SharePoint.Administration.SPIisVirtualDirectory.get_Path()
   at Microsoft.SharePoint.Administration.SPProvisioningAssistant.GetBuildVersionOnIisWebSite(Int32 iisInstanceId)
   at Microsoft.SharePoint.Upgrade.SPSequence.get_CanUpgrade()
   at Microsoft.SharePoint.Upgrade.SPUpgradeSession.CanUpgrade(Object o)

So what is causing this?  Using the handy reflector tool I went into the upgrade code and found the sequence that upgrades SPWebApplication objects.  This creates a list of all children objects that must be upgraded and then upgrades those objects one by one.  One of the children objects is the created or extended IIS web sites.  In order to check if these "CanUpgrade", it must look at the file in the IIS virtual directory "_vti_pvtuildversion.cnf".  If it can't find this file (the virtual path is deleted or missing), then the upgrade will stop for that web application and your upgrade is stuck in a weird state with this crappy error "Product / patch installation or server upgrade required"!

How do you fix?  You can try to add the directory back, but how do you know what the directory is that you need to add?  Funny thing, you can't find it unless you open up the SharePoint_Config database.  I will spare you the details and jump to the "supported" way of fixing this.  In Central administration you won't see the offending missing zone to delete it, therefore you must resort to powershell:

$webapp = get-spwebapplication "http://yourfailedurl"

foreach($setting in $webapp.iissettings.values)
{
$setting.path
}

foreach($zone in $webapp.iissettings.keys)
{
$z = $zone
}

$webapp.IisSettings.Remove("missingzone")
$webapp.update()

Rerun your PSconfig command, viola, you are back in business!!!

Enjoy!
Chris

SQL Azure supported tables/views

Here is a complete list of supported tablesviews in SQL Azure (11.0.1814.30):

sys.all_columns;
sys.all_objects;
sys.all_parameters;
sys.all_sql_modules;
sys.all_views;
sys.assemblies;
sys.assembly_types;
sys.CHECK_CONSTRAINTS;
sys.column_type_usages;
sys.columns;
sys.COLUMNS;
sys.computed_columns;
sys.database_permissions;
sys.database_role_members;
sys.databases;
sys.default_constraints;
sys.dm_exec_requests;
sys.dm_exec_sessions;
sys.dm_tran_active_transactions;
sys.dm_tran_database_transactions;
sys.dm_tran_locks;
sys.dm_tran_session_transactions;
sys.event_notification_event_types;
sys.event_notifications;
sys.events;
sys.foreign_key_columns;
sys.foreign_keys;
sys.identity_columns;
sys.index_columns;
sys.indexes;
sys.key_constraints;
sys.numbered_procedure_parameters;
sys.numbered_procedures;
sys.objects;
sys.parameters;
sys.plan_guides;
sys.procedures;
sys.schemas;
sys.spatial_index_tessellations;
sys.spatial_indexes;
sys.spatial_reference_systems;
sys.sql_expression_dependencies;
sys.sql_logins;
sys.sql_modules;
sys.stats;
sys.stats_columns;
sys.synonyms;
sys.syscharsets;
sys.syscolumns;
sys.syscursorrefs;
sys.syscursors;
sys.sysdatabases;
sys.syslanguages;
sys.sysobjects;
sys.sysreferences;
sys.system_columns;
sys.system_objects;
sys.system_parameters;
sys.system_sql_modules;
sys.system_views;
sys.systypes;
sys.sysusers;
sys.table_types;
sys.tables;
sys.trigger_event_types;
sys.trigger_events;
sys.triggers;
sys.types;
sys.views;

Unsupported tables:

sys.allocation_units;
sys.assembly_modules;
sys.assembly_references;
sys.asymmetric_keys;
sys.backup_devices;
sys.certificates;
sys.change_tracking_databases;
sys.change_tracking_tables;
sys.COLUMN_DOMAIN_USAGE;
sys.COLUMN_PRIVILEGES;
sys.column_xml_schema_collection_usages;
sys.configurations;
sys.CONSTRAINT_COLUMN_USAGE;
sys.CONSTRAINT_TABLE_USAGE;
sys.conversation_endpoints;
sys.conversation_groups;
sys.conversation_priorities;
sys.credentials;
sys.crypt_properties;
sys.cryptographic_providers;
sys.data_spaces;
sys.database_audit_specification_details;
sys.database_audit_specifications;
sys.database_files;
sys.database_mirroring;
sys.database_mirroring_endpoints;
sys.database_mirroring_witnesses;
sys.database_principal_aliases;
sys.database_principals;
sys.database_recovery_status;
sys.destination_data_spaces;
sys.dm_audit_actions;
sys.dm_audit_class_type_map;
sys.dm_broker_activated_tasks;
sys.dm_broker_connections;
sys.dm_broker_forwarded_messages;
sys.dm_broker_queue_monitors;
sys.dm_cdc_errors;
sys.dm_cdc_log_scan_sessions;
sys.dm_clr_appdomains;
sys.dm_clr_loaded_assemblies;
sys.dm_clr_properties;
sys.dm_clr_tasks;
sys.dm_cryptographic_provider_properties;
sys.dm_database_encryption_keys;
sys.dm_db_file_space_usage;
sys.dm_db_index_usage_stats;
sys.dm_db_mirroring_auto_page_repair;
sys.dm_db_mirroring_connections;
sys.dm_db_mirroring_past_actions;
sys.dm_db_missing_index_details;
sys.dm_db_missing_index_group_stats;
sys.dm_db_missing_index_groups;
sys.dm_db_partition_stats;
sys.dm_db_persisted_sku_features;
sys.dm_db_script_level;
sys.dm_db_session_space_usage;
sys.dm_db_task_space_usage;
sys.dm_exec_background_job_queue;
sys.dm_exec_background_job_queue_stats;
sys.dm_exec_cached_plans;
sys.dm_exec_connections;
sys.dm_exec_procedure_stats;
sys.dm_exec_query_memory_grants;
sys.dm_exec_query_optimizer_info;
sys.dm_exec_query_resource_semaphores;
sys.dm_exec_query_stats;
sys.dm_exec_query_transformation_stats;
sys.dm_exec_trigger_stats;
sys.dm_filestream_file_io_handles;
sys.dm_filestream_file_io_requests;
sys.dm_fts_active_catalogs;
sys.dm_fts_fdhosts;
sys.dm_fts_index_population;
sys.dm_fts_memory_buffers;
sys.dm_fts_memory_pools;
sys.dm_fts_outstanding_batches;
sys.dm_fts_population_ranges;
sys.dm_io_backup_tapes;
sys.dm_io_cluster_shared_drives;
sys.dm_io_pending_io_requests;
sys.dm_os_buffer_descriptors;
sys.dm_os_child_instances;
sys.dm_os_cluster_nodes;
sys.dm_os_dispatcher_pools;
sys.dm_os_dispatchers;
sys.dm_os_hosts;
sys.dm_os_latch_stats;
sys.dm_os_loaded_modules;
sys.dm_os_memory_allocations;
sys.dm_os_memory_brokers;
sys.dm_os_memory_cache_clock_hands;
sys.dm_os_memory_cache_counters;
sys.dm_os_memory_cache_entries;
sys.dm_os_memory_cache_hash_tables;
sys.dm_os_memory_clerks;
sys.dm_os_memory_node_access_stats;
sys.dm_os_memory_nodes;
sys.dm_os_memory_objects;
sys.dm_os_memory_pools;
sys.dm_os_nodes;
sys.dm_os_performance_counters;
sys.dm_os_process_memory;
sys.dm_os_ring_buffers;
sys.dm_os_schedulers;
sys.dm_os_spinlock_stats;
sys.dm_os_stacks;
sys.dm_os_sublatches;
sys.dm_os_sys_info;
sys.dm_os_sys_memory;
sys.dm_os_tasks;
sys.dm_os_threads;
sys.dm_os_virtual_address_dump;
sys.dm_os_wait_stats;
sys.dm_os_waiting_tasks;
sys.dm_os_worker_local_storage;
sys.dm_os_workers;
sys.dm_qn_subscriptions;
sys.dm_repl_articles;
sys.dm_repl_schemas;
sys.dm_repl_tranhash;
sys.dm_repl_traninfo;
sys.dm_resource_governor_configuration;
sys.dm_resource_governor_resource_pools;
sys.dm_resource_governor_workload_groups;
sys.dm_server_audit_status;
sys.dm_tran_active_snapshot_database_transactions;
sys.dm_tran_commit_table;
sys.dm_tran_current_snapshot;
sys.dm_tran_current_transaction;
sys.dm_tran_top_version_generators;
sys.dm_tran_transactions_snapshot;
sys.dm_tran_version_store;
sys.dm_xe_map_values;
sys.dm_xe_object_columns;
sys.dm_xe_objects;
sys.dm_xe_packages;
sys.dm_xe_session_event_actions;
sys.dm_xe_session_events;
sys.dm_xe_session_object_columns;
sys.dm_xe_session_targets;
sys.dm_xe_sessions;
sys.DOMAIN_CONSTRAINTS;
sys.DOMAINS;
sys.endpoint_webmethods;
sys.endpoints;
sys.extended_procedures;
sys.extended_properties;
sys.filegroups;
sys.fulltext_catalogs;
sys.fulltext_document_types;
sys.fulltext_index_catalog_usages;
sys.fulltext_index_columns;
sys.fulltext_index_fragments;
sys.fulltext_indexes;
sys.fulltext_languages;
sys.fulltext_stoplists;
sys.fulltext_stopwords;
sys.fulltext_system_stopwords;
sys.function_order_columns;
sys.http_endpoints;
sys.internal_tables;
sys.KEY_COLUMN_USAGE;
sys.key_encryptions;
sys.linked_logins;
sys.login_token;
sys.master_files;
sys.master_key_passwords;
sys.message_type_xml_schema_collection_usages;
sys.messages;
sys.module_assembly_usages;
sys.openkeys;
sys.parameter_type_usages;
sys.parameter_xml_schema_collection_usages;
sys.partition_functions;
sys.partition_parameters;
sys.partition_range_values;
sys.partition_schemes;
sys.partitions;
sys.REFERENTIAL_CONSTRAINTS;
sys.remote_logins;
sys.remote_service_bindings;
sys.resource_governor_configuration;
sys.resource_governor_resource_pools;
sys.resource_governor_workload_groups;
sys.routes;
sys.ROUTINE_COLUMNS;
sys.ROUTINES;
sys.SCHEMATA;
sys.securable_classes;
sys.server_assembly_modules;
sys.server_audit_specification_details;
sys.server_audit_specifications;
sys.server_audits;
sys.server_event_notifications;
sys.server_event_session_actions;
sys.ser
ver_event_session_events;
sys.server_event_session_fields;
sys.server_event_session_targets;
sys.server_event_sessions;
sys.server_events;
sys.server_file_audits;
sys.server_permissions;
sys.server_principal_credentials;
sys.server_principals;
sys.server_role_members;
sys.server_sql_modules;
sys.server_trigger_events;
sys.server_triggers;
sys.servers;
sys.service_broker_endpoints;
sys.service_contract_message_usages;
sys.service_contract_usages;
sys.service_contracts;
sys.service_message_types;
sys.service_queue_usages;
sys.service_queues;
sys.services;
sys.soap_endpoints;
sys.sql_dependencies;
sys.symmetric_keys;
sys.sysaltfiles;
sys.syscacheobjects;
sys.syscomments;
sys.sysconfigures;
sys.sysconstraints;
sys.syscurconfigs;
sys.syscursorcolumns;
sys.syscursortables;
sys.sysdepends;
sys.sysdevices;
sys.sysfilegroups;
sys.sysfiles;
sys.sysforeignkeys;
sys.sysfulltextcatalogs;
sys.sysindexes;
sys.sysindexkeys;
sys.syslockinfo;
sys.syslogins;
sys.sysmembers;
sys.sysmessages;
sys.sysoledbusers;
sys.sysopentapes;
sys.sysperfinfo;
sys.syspermissions;
sys.sysprocesses;
sys.sysprotects;
sys.sysremotelogins;
sys.sysservers;
sys.system_components_surface_area_configuration;
sys.system_internals_allocation_units;
sys.system_internals_partition_columns;
sys.system_internals_partitions;
sys.TABLE_CONSTRAINTS;
sys.TABLE_PRIVILEGES;
sys.tcp_endpoints;
sys.trace_categories;
sys.trace_columns;
sys.trace_event_bindings;
sys.trace_events;
sys.trace_subclass_values;
sys.traces;
sys.transmission_queue;
sys.type_assembly_usages;
sys.user_token;
sys.via_endpoints;
sys.VIEW_COLUMN_USAGE;
sys.VIEW_TABLE_USAGE;
sys.xml_indexes;
sys.xml_schema_attributes;
sys.xml_schema_collections;
sys.xml_schema_component_placements;
sys.xml_schema_components;
sys.xml_schema_elements;
sys.xml_schema_facets;
sys.xml_schema_model_groups;
sys.xml_schema_namespaces;
sys.xml_schema_types;
sys.xml_schema_wildcard_namespaces;
sys.xml_schema_wildcards;

Fixing GroupBy List Views in SharePoint 2010 with SharePoint Designer

You may run into a problem with getting your list views to work in SharePoint 2010 if you keep your old 2007 look and feel.  Their are several articles out there that show you how to fix it programmatically, but not as an end user.

The problem is with list views that have a "Group by" added and the default XML in the CAML query is set to "TRUE" for the Collapsed attribute.  Here are the steps to fix this:

  1. You can open the view page you created for the list in SharePoint designer
  2. Do a search for "GroupBy" in the page ASP.NET code.
  3. Set the Collapse property to "FALSE"
  4. Add the following Javascript to the page to "Click" the links to collapse the elements:

<script language="javascript" type="text/javascript">               

ExpLinkFormer = function()
{
this._init();
}

ExpLinkFormer.prototype = {
_init: function() {

var links = document.links;

for (var i = 0; i < links.length; i++) {          
if (links[i].href == "javascript:" && links[i].onclick.toString().indexOf("ExpCollGroup") > -1) {
links[i].click();
}
}
}
}   
      
var expLnk = new ExpLinkFormer();
   
</script>

  • Save the page – problem solved!
  • Repeat for all the views that have the problem

Enjoy!

Chris

Top SharePoint Conference 2011 Sessions and Stats

They didn't say I couldn't post this data, so here it is.  If you wanted to know what sessions you should reviewwatch, this should help you out.  Also, if you are thinking about being a speaker, these are the type of eval scores you should expect to get:

Interesting Facts:

      Over
11,000 evals submitted,

      Core
Conference Average: 4.28
  (Partner, Customer, Analyst tracks excluded)
(up from 4.24 in 2009!),

      Customer
track avg. 4.1,

      Partner
track avg. 3.76,

      Analyst
track avg. 3.79

      Keynote
avg. 3.83 (only 415 evals)

 

(the following stats have sessions with <10 evals
removed)

Core Track Ranking:

Track Name

Evals

Average

IT Professional

2303

4.41

Search

931

4.29

Communities/Sites

646

4.27

Insights

1217

4.25

Planning, Deployment and
Adoption

500

4.25

Internet Business

1064

4.25

Developer

2190

4.25

Content

760

4.19

Office Client

310

4.17

Project

188

4.13

Grand Total

10109

4.28

 

Top 20
Sessions Overall

Session

Evals

Average

SPC373: Performance Tuning
SharePoint 2010  (Eric Shupps)

188

4.84

SPC402: Deep Dive on SharePoint
Ribbon Development & Extensibility   (Chris O'Brien)

74

4.82

SPC393: Step-by-step: Building
Search Driven Applications That Matter  (Scot Hillier)

72

4.82

SPC315: Beyond the Basics: An
Advanced Conversation on FAST Search for SharePoint 2010  (Thomas
Molbach)

58

4.79

SPC270: SharePoint 2010
Solutions for Public Sector  (Ken Mallit)

27

4.78

SPC224: Architecting and
Automating SharePoint Governance  (Dan Holme)

142

4.77

SPC392: Solving Enterprise
Search Challenges with SharePoint 2010  (Matthew McDermott)

41

4.76

SPC404: Deep Dive: Implementing
Kerberos for your BI Applications  (Tom Wisnowski)

34

4.74

SPC407: Enterprise Deployment
Considerations for the User Profile Service Application   (Spencer
Harbar)

80

4.74

SPC370: Multi-Tenancy with
SharePoint 2010  (Spencer Harbar)

40

4.74

SPC202: Attractive Business
Intelligence: Dashboards, Pivots, Scorecards, KPIs, and Reports Using
Microsoft SharePoint 2010, Office 2010, PowerPivot, and SQL Server 2008
R2  (Rafal Lukawiecki)

192

4.72

SPC385: Service Application
Federation with SharePoint 2010  (Shannon Bray)

15

4.72

SPC245: Making SharePoint 2010
Collaboration Rock by Increasing Findability  (Scott Jamison)

73

4.70

SPC276: Developing Cloud-Based
Applications for SharePoint Online using Windows Azure  (Steve Fox)

50

4.70

SPC319: Application Lifecycle
Management: Automated builds and testing for SharePoint projects  (Chris
O'Brien)

98

4.70

SPC312: Best Practices for
Creating Publishing Page Layouts  (Geoffrey Edge)

35

4.69

SPC338: Developing SharePoint
applications with HTML5 and JQuery  (Ted Pattison)

207

4.68

SPC212: More Than My: How
Microsoft is Driving Social Adoption and Intranet Transformation  (Chris
Slemp)

35

4.67

SPC304: Advanced Scorecarding
and Dashboards with Excel, Visio and PerformancePoint Services  (Peter
Myers)

71

4.66

SPC331: Creating a FAST Search
Driven Windows Phone 7 Application for a SharePoint Internet Sites 
(Shad Phillips)

17

4.66

 

Overall
Conference Top Speakers

MS Speakers

1st
      
   
SPC315: Beyond the Basics: An Advanced
Conversation on FAST Search for SharePoint 2010  (Thomas Molbach &
Thomas  Svensen)

2nd                SPC270:
SharePoint 2010 Solutions for Public Sector  (Ken
Mallit)

3rd           SPC404:
Deep Dive: Implementing Kerberos for your BI Applications  (Tom Wisnowski)

Non MS Speakers

1st           SPC373:
Performance Tuning SharePoint 2010  (Eric Shupps)

2nd          SPC402:
Deep Dive on SharePoint Ribbon Development & Extensibility  
(Chris O'Brien & Andrew Connell)

3rd           SPC393:
Step-by-step: Building Search Driven Applications That Matter  (Scot
Hillier)

 

 

Case Study: How to Use Managed Metadata in Site Creation to drive Searchability

As part of our eBay presentation at the SharePoint Conference 2011, we showed how we performed the upgrade in 3 months and utilized Managed Metadata (MMS) in site creation to drive searchability across the SharePoint Farm.  The biggest question I have received so far from the presentation is about the MMS subject.  So I'm going to outline it in detail here. For those of you that are not familiar with MMS, I like to describe it using the 3rd rule in my three rules of development.  The first rule is "Don't code the same line of code twice", if you see the same line of code twice, you did something wrong (no polymorphism, missing base method calls, inheritance, etc).  The second is don't put the same thing in memory more than once (this really needs no clarification).  The third rule says don't put the same thing on disk twice.  By doing this, you now must implement synchronization between the multiple instances.  The only product I worked with over the years that ever implemented this pattern perfectly was Lotus Notes.  It is for this reason, we have MMS in 2010.

In SharePoint 2007, imagine you have created a list in SharePoint that uses a choice column. You would have 50 states, plus the other various items the US owns (Examples: Guam, Virgin Islands…can you name them all?).  If you use the state column in other places in the Farm, you pretty much have to copy and paste all the items over and over again.  This is somewhat of a problem.  For instance, if Texas ever successfully succeeds from the union, you gotta remove them from all the choice columns!  What about Iraq and Afghanistan?  Maybe those should be added to the list?   Who knows what might happen in the future, but you'd have to update each and every source in order for the data to be meaningful.  Therefore, rule #3 is a good one…don't put data on disk more than twice.  MMS helps us do this by centrally stored our list data in one place. 

So how did we use MMS at eBay?  The summary of the process is that when users create their own site, the content inside the site should be pre-tagged with MMS data so as to allow for simple searching of their content via FAST Search.  Here's a breakout of the parts:

Site Creation:

The first step is to create a site creation form.  This can be anything you are comfortable with (an aspx page, an infopath form, web parts, etc).  In the case of eBay we used two web parts.  One is the site creation landing page web part.  Previously the values used to "tag" the sites was hardcoded in the code.  As part of the upgrade I changed this to pull dynamically from MMS.  This web part allows the entry of the following information:

  • Business Unit (MMS)
  • Organization (MMS)
  • Office Location (MMS)

  • Site Name
  • Description
  • Keywords (terms that will allow users to find the site later)
  • Template (teamsite, blog, etc)
  • Security (allow inheritance/everyone to view the site)

When clicking submit, several things happen:

  • Create a new list item with all the details of the site creation request
  • Submit to the site creation processing webpart with the site creation request id
  • Start a long running transaction
  • Impersonate the user that made the request
  • Get a site number from a database for the site URL (example: 12345)
  • Determine what site collection to add the site to (allows for load balancing the sites across content databases)
  • Create the new web
  • Add to the custom site directory list (this list is used for later look up on a site lookup web part)
  • Setup navigation for the site
  • Set the web property bag with the Organization, BusinessUnit and Location properties
  • Create the metadata columns (outlined below)
  • Add the site keywords to FAST Search

All throughout this process if any errors occur another list is setup to keep track of the errors and steps of the long running process.  This allows OPS to debug the process and work with development in case something needs to be tweaked.

Site Directory:

You will need to ensure you have a list setup to keep track of your sites.  In the case of a pre-existing site directory it is likely that you have already created a choice column with your values.  This doesn't move very easily to MMS.  You will have to migrate the values to new MMS columns (create new column with different name, move value over, deleted old column, create column with old name, copy values again) .  If you already have this site directory, it is simple to run back through all the sites and add the web properties and then add the MMS columns to all the existing lists in the already existing sites (so not only new sites have MMS, but old ones too)!

MMS Setup:

We used the following PowerShell script to pre-populate the MMS:

$session = get-sptaxonomysession -site http://contoso.com
$termstore = $session.termstores["Contoso Corporate MMS"]

$termGroup = $termstore.groups["Contoso"]

if (-not $termGroup)
{
$termGroup = $termstore.creategroup("Contoso")
}

$termSet = $termGroup.TermSets["Organization"]

if (-not $termSet)
{
$termSet = $termGroup.CreateTermSet("Organization")
}

foreach($t in $termset.terms)
{
$t.delete()
}

$termSet.createterm("Finance",1033)
$termSet.createterm("Human Resources",1033)
$termSet.createterm("Information Technology",1033)
$termSet.createterm("Legal",1033)
$termSet.createterm("Marketing and Sales",1033)

$termSet = $termGroup.termsets["BusinessUnit"]

if (-not $termSet)
{
$termSet = $termGroup.CreateTermSet("BusinessUnit")
}

foreach($t in $termset.terms)
{
$t.delete()
}

$termSet.createterm("Corporate",1033)
$termSet.createterm("PayPal",1033)
$termSet.createterm("StubHub",1033)
$termSet.createterm("Bill Me Later",1033)

$termSet = $termGroup.termsets["Location"]

if (-not $termSet)
{
$termSet = $termGroup.CreateTermSet("Location")
}

foreach($t in $termset.terms)
{
$t.delete()
}

$termSet.createterm("APAC – Australia",1033)
$termSet.createterm("APAC – China",1033)
$termSet.createterm("APAC – Hong Kong",1033)
$termSet.createterm("APAC – India",1033)
$termSet.createterm("APAC – Israel",1033)
$termSet.createterm("APAC – Korea",1033)
$termSet.createterm("APAC – Taiwan",1033)
$termSet.createterm("EU – Austria",1033)
$termSet.createterm("EU – Belgium",1033)
$termSet.createterm("EU – Czech Replubic",1033)
$termSet.createterm("EU – Estonia",1033)
$termSet.createterm("EU – France",1033)
$termSet.createterm("EU – Germany",1033)
$termSet.createterm("EU – Ireland",1033)
$termSet.createterm("EU – Italy",1033)
$termSet.createterm("EU – Luxembourg",1033)
$termSet.createterm("EU – Netherlands",1033)
$termSet.createterm("EU – Poland",1033)
$termSet.createterm("EU – Spain",1033)
$termSet.createterm("EU – Sweden",1033)
$termSet.createterm("EU – Switzerland",1033)
$ter
mSet.createterm("EU – UK",1033)
$termSet.createterm("NA – Canada",1033)
$termSet.createterm("NA – U.S.",1033)
$termSet.createterm("Global",1033)
$termStore.CommitAll()

Note that once it is created, you should not delete the values.  This will cause the linkage between any previously created columns to be eliminated.  Not fun to look at and fix later.  So be sure to tell the ops team not to run the create more than once…EVER…

MMS Columns:

The hardest part of the entire process is the MMS column creation.  It works like this:

  • Check to see if the web prop bag has been set, if not then set the web props to the values in the intranet site directory list, otherwise set to some default values
  • For each list, add the metadata columns
    • You should not add metatdata to lists that are "hidden" or that are type "Survey".  It will break those list types
    • Great example is the HiddenTaxonomyList, kinda weird adding a MMS column to that one as it keeps track of MMS usage across the site, creates a bit of a loop…not good!
  • You should also avoid everything but the following site types, if you don't you will get some VERY ugly messages from SharePoint 2010 (try adding MMS to an Access Services site, it doesn't work!):
    • STS
    • MPS
    • BLANKINTERNET
    • CMSPUBLISHING
    • PUBLISHING
    • WIKI
    • BLOG
    • SPS
  • Adding the metadata column involves the following process:
    • Detemine if the column already exists (choose your column name wisely), in this case, we preappended with "Geo" to avoid any clashes with already existing column names and internal SP names
    • Provision a note field to support your MMS field (yup, each MMS column is actually two columns)
    • Create a new taxonomy field using the Guid of the note field in the TextField property
    • Set the default value of the field using the "WSSID;#VALUE|TERMID", hint: use -1 if WSSID has not been defined yet

The result is every viable list has MMS columns added:

Each MMS column has a default value set:

When a new item is created, the user doesn't have to do anything!  The values are pre-populated with the values they selected at site creation time!

Search:

As part of the site creation there is a keyword text box.  Users can type keywords delimited by semicolon.  Their keywords are then added to FAST Search.  Initially we thought adding to both SharePoint Search and FAST Search was the answer, but that didn't work as it actually would show two keywords in the results and not just one.  You can also have the keywords added as search suggestions.  What this means is that when they start typing in the search box, you will see the keyword displayed as a suggestion:

Then when the search is executed, you will see the site as a keyword and the results for that keyword displayed as business as usual:

 

Once the columns have been added to all the list items in all the sites, you have setup FAST Content SSA and indexed the content you will get some pretty cool results.  Because of the TaxonomyFilter refiners that is preconfigured in the FAST Search Center, you will see the pre-defined MMS column values on the left side of the screen:

Users can now find content specific to their geography, organization and functional group.  Results are now more meaningful and can be found much faster than with SharePoint 2007!

Enjoy!
Chris