Business Critical Line-Of-Business (LOB) Data in SharePoint 2013 – Simplifying Access to SAP ERP
Many organizations face the challenge today that most of their users don’t have easy access to the business critical data hidden in their line-of-business (LOB) systems such as SAP ERP or Oracle Financials. Users are often presented with a complex user interface (UI) or inflexible business processes. This problem is enhanced by the fact that these systems are usually deployed to a limited number of users. The reality is that business users at every level of an organization need access to important data and related processes to enable them to support operations and make sound decisions.
Users who need access to the data that reside in these LOB systems often need to reach out to IT to provide this information and organize it in a particular manner. This keeps IT busy with daily mundane tasks rather then spending their energy on more strategic initiatives.
Managers in these organizations are then faced with the challenge of how to get more value out of their LOB systems by extending the reach of important business data thus improving business processes. There is a growing trend to look for collaborative solutions such as using Microsoft SharePoint instead of the complex generic interface that the LOB system might provide.
Microsoft SharePoint 2013 is a business collaboration platform of choice for many companies and provides the capabilities necessary to achieve business innovation with one unified platform that can be used for intranet, extranet as well as internet sites. This enables an organization to significantly cut costs by streamlining and improving internal processes. Having a unified platform speeds up time to market around new initiatives by allowing users to share resources, ideas, and expertise and plan projects effectively.
When it comes to LOB data from systems such as SAP ERP, SharePoint 2013 can increase the visibility of critical, accurate, and real-time business data. SharePoint 2013 also offers a number of ways to surface LOB data. Once the data is surfaced in SharePoint, Search and BI capabilities can be used to provide wider end-user functionality.
The rest of this blog and the subsequent blogs in this series will focus on the different ways to integrate SharePoint with SAP ERP, and in particular SAP HCM.
I have learned from experience that no two SAP Integration projects are the same. When working on an SAP-SharePoint Integration project, there a few key principles that we have to keep in mind.
First and foremost, we need to fully understand the business process that needs integration with SharePoint. We need to make sure that project objectives are well defined before we embark on recommending a solution. High level functional requirements as well as non-functional requirements such as security, performance requirements, supportability should be defined. User Interface (UI) requirements and the data that needs to be brought to SharePoint should be clearly defined in order to surface only the data that is needed to complete a particular process. Any workflow requirements and how users want to interact with the data (BI dashboards, etc.) should be defined as well. Last but not least, we also need to keep in mind what is the organization’s overall SAP/Microsoft roadmap. Is it going to be just a one-off project or does the architecture need to be scalable to support any future projects?
Once we understand the requirements, we need to understand the current IT landscape and infrastructure. For example in the case of SAP HCM, a customer might have a need to automate the Personnel Change Notification (PCN) process. We need to understand the current architecture to see what are the components (Standard BAPIs etc.) that might be reused. Understanding the skill set of existing IT staff (SAP resources vs. Microsoft resources) will help narrow down the correct integration mechanism. You don’t want to recommend a solution that requires heavy custom BAPI development if the organizations does not have any SAP developers in house that can support that. On the other hand, you have to be careful recommending a complete Microsoft solution if the company IT staff only has SAP resources. Having said that, at the end of the day, the integration strategy should be driven by User Interface Design and User Experience requirements.
Now there are basically two different types of integration projects in MS/SAP space. One that requires little to no coding and the one that requires heavy customization using custom development. In my next blog I’ll discuss the reasoning behind selecting a particular strategy as well as pros and cons of each strategy.
SharePoint 2010 Lookup Column Limit causes Filtering Problems
Managed metadata plays a big part in knowledge management and search. Managed metadata provides support for two main features, Content Type Publishing and Taxonomy.
Content Type Publishing The sharing of content types across site collections and Web applications. For more information about content type publishing.
Taxonomies The creation and management of hierarchical collections of centrally managed terms (called term sets) that can be used as attributes for items in SharePoint sites. These term sets can be shared across site collections and Web applications. Term sets can be created and managed through a feature called the Term Store Management Tool.
In SharePoint 2010 Lists and Libraries utilize this feature to provide centralized metadata terms located in the term store to create easier maintained taxonomies and content types. A main issue with these single select value lookup fields that is not always apparent to identify is the limit of single select value lookup fields that are supported in SharePoint 2010 List and Libraries. When exceeding the limit, the OOB column filtering functionality fails to function for those single select value lookup fields that exceed the limit thus resulting in an empty results set. SharePoint 2010 allows for a maximum of 16 single select value lookup fields per list or library. Additional single select value lookup fields may be added beyond the 16 but for the 17th single select value lookup field and beyond, filtering on that column will return zero items.
Technically, for each field, a RowOrdinal property is set which describes the row that the field data is written to in the content database. By default the the RowOrdinal is set to "0". Filtering will work for these fields on the first row. When another lookup field is added to the list or library that exceeds the limit of lookup fields, the field’s RowOrdinal property is incremented to "1" since the first row has been fully occupied in the database table. Column filtering will not function correctly for those fields placed in RowOrdinal = "1" or higher. This issue is described as "SQL Row Wrapping" feature. For a lookup type in a list, SQL Server row wrapping occurs after each 16 columns in a SharePoint list. The default row wrapping value of 6 allows for the maximum of 96 lookup columns per SharePoint list (6 * 16 = 96). The same can be said for any other columns exceeding the allowable limits as designed by SQL Server. The following illustrates this concept.
A1 (ColName = "int1" RowOrdinal=0)
A2 (ColName = "int2" RowOrdinal=0)
A3 (ColName = "int3" RowOrdinal=0)
A4 (ColName = "int4" RowOrdinal=0)
A5 (ColName = "int5" RowOrdinal=0)
A6 (ColName = "int6" RowOrdinal=0)
A7 (ColName = "int7" RowOrdinal=0)
A8 (ColName = "int8" RowOrdinal=0)
A9 (ColName = "int9" RowOrdinal=0)
A10 (ColName = "int10" RowOrdinal=0)
A11 (ColName = "int11" RowOrdinal=0)
A12 (ColName = "int12" RowOrdinal=0)
A13 (ColName = "int13" RowOrdinal=0)
A14 (ColName = "int14" RowOrdinal=0)
A15 (ColName = "int15" RowOrdinal=0)
A16 (ColName = "int16" RowOrdinal=0)
B1 (ColName = "int1" RowOrdinal=1)

Possible Workarounds
- Reduce the number of lookup fields defined in the content type for the taxonomy
- Change some fields to choice fields
- Change the single select value lookup fields to Multi select lookup fields
Using the TransitionFrame and Fast Resume together
Introduction
When using shipping versions of the Windows Phone Toolkit’s TransitionFrame together with the new Windows Phone 8 fast app resume feature, application transitions get confused.
The Windows Phone Toolkit gives us easy intra-app transitions. Windows Phone 8 includes an easy-to-implement fast resume feature along with its own ‘application suspending’ and ‘application resuming’ transitions which are similar to full-page Turnstile animations. Using both of these already-written-and-tested features makes our development lives much easier, so what can we do to get them working together?
Let’s review how each of these components work on their own.
TransitionFrame
Before we get to transitions, let’s check out the base class implementation. The process for navigating between pages within a PhoneApplicationFrame is as follows:
1. Frame.Navigate(NewUri) is called
2. Frame.Navigating event is fired
a. NavigatingCancelEventArgs.Uri: NewUri
b. NavigatingCancelEventArgs.NavigationMode: NavigationMode.New
c. Frame.Source: OldUri
3. Unless Canceled, Frame.Navigated event is fired
a. NavigationEventArgs.Uri: NewUri
b. NavigationEventArgs.NavigationMode: NavigationMode.New
The TransitionFrame component lets us assign TransitionIn and TransitionOut transitions for both back and forward navigation. These are executed by the TransitionFrame via the Frame.Navigating event.
The TransitionFrame augments the PhoneApplicationFrame as such:
1. Frame.Navigate(NewUri) is called
2. Frame.Navigating event is fired
a. TransitionFrame starts playing transition but does not block;
3. Unless Canceled, Frame.Navigated event is fired
a. TransitionFrame is not equipped to handle Canceled Navigations.
Fast App Resume
Before fast app resume, Windows Phone would just fire PhoneApplicationService.Launching, usually sending the user into the app as if it had just been opened, unless complicated custom resume functionality had been implemented.
With fast app resume, we just add an ActiviationPolicy to our WMAppManifest.xml file…
<DefaultTask Name=“_default“ ActivationPolicy=“Resume“ />
And we get pretty easy, free resume logic.
On suspend, Windows Phone will store the current Uri of the root frame (referred to later as SuspendUri).
On resume, Windows Phone will:
1. Fire the Frame.Navigating event
a. NavigatingCancelEventArgs.Uri: SuspendUri
b. NavigatingCancelEventArgs.NavigationMode: NavigationMode.Reset
c. Frame.Source: SuspendUri
2. Fire the Frame.Navigated event
a. NavigationEventArgs.Uri: SuspendUri
b. NavigationEventArgs.NavigationMode: NavigationMode.Reset
3. Fire the Frame.Navigated event a second time
a. NavigationEventArgs.Uri: SuspendUri
b. NavigationEventArgs.NavigationMode: NavigationMode.Refresh
Perfect, right?
The Problem
All this ‘free’ functionality from any major player within the mobile space, especially one trying to catch up to the pack. As an application developer, I’ll take any shortcuts I can get for my app to have a great native user experience. What do we get for trying to have all our cake and eat it too? Unfortunately, Bad news. The TransitionFrame and fast app resume have clearly been written without any consideration for the other and obviously weren’t tested together. I will cut TransitionFrame some slack as it is somewhat old. So all fingers point to fast app resume.
Let’s review the combined chronology of TransitionFrame and fast app resume:
1. (Our application is in foreground at SuspendUri and user presses Windows button on phone)
2. Concurrently:
a. Windows Phone 8 built-in full-page out-of-process TransitionOut Forward Turnstile transition on application being suspended
b. Our application:
i. Frame.Navigating fired: NavigationMode.New from SuspendUri to app://external/ (our application is suspended before TransitionFrame gets to start the transition associated with this event)
ii. Frame.Navigated fired: NavigationMode.New to app://external/
3. (User selects suspended application from home screen or all applications list)
4. Windows Phone 8 built-in full-page out-of-process TransitionIn Forward Turnstile transition on application being resumed
5. TransitionFrame starts playing transition for (2.b.i)
6. Frame.Navigating fired: NavigationMode.Reset from SuspendUri to SuspendUri
7. TransitionFrame starts playing transition into OldUri
8. Frame.Navigated fired: NavigationMode.Reset to SuspendUri
9. Frame.Navigated fired: NavigationMode.Refresh to SuspendUri
Which to the user looks like:
Not good.
The Solution
We need a way to prevent the TransitionFrame from playing these extra transitions.
My first thought: There must be some property or event I can hook into and attempt to cancel or bypass the animations. This was a quick no-go. TransitionFrame is functionally bare. How about fast app resume? Same situation: no flexibility at all.
My second thought: Subclass TransitionFrame! This quickly leads to a brick wall: practically everything is internal or private, especially the stuff we care about.
My third thought: To my surprise, TransitionFrame is actually open source! We can grab a copy and make some modifications!
After you copy the file in, change the namespace, and compile we are dealt our first hurdle: OnBeginTransition and OnEndTransition are both private. Reflection to the rescue!
Make the following code substitutions:
//navigationTransition.OnBeginTransition();
MethodInfo dynMethod
= navigationTransition.GetType().GetMethod(“OnBeginTransition”,
BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod.Invoke(navigationTransition,
new object[] {
});
//navigationTransition.OnEndTransition();
MethodInfo dynMethod
= navigationTransition.GetType().GetMethod(“OnEndTransition”,
BindingFlags.NonPublic | BindingFlags.Instance);
dynMethod.Invoke(navigationTransition,
new object[] {
});
Let’s now set App.xaml.cs to use our new TransitionFrame inside InitializePhoneApplication.
It builds! But does it run? Yes, with a huge caveat: the transitions don’t play. It turns out we also need a style from Themes\Generic.xml:
<Style TargetType=”transition:TransitionFrame”>
<Setter Property=”Background” Value=
“{StaticResource PhoneBackgroundBrush}”/>
<Setter Property=”BorderBrush” Value=”Transparent”/>
<Setter Property=”BorderThickness” Value=”0″/>
<Setter Property=”HorizontalContentAlignment” Value=”Stretch”/>
<Setter Property=”VerticalContentAlignment” Value=”Stretch”/>
<Setter Property=”Template”>
<Setter.Value>
<ControlTemplate TargetType=”transition:TransitionFrame”>
<Border
x:Name=”ClientArea”
Background=”{TemplateBinding Background}”
BorderBrush=”{TemplateBindingBorderBrush}”
BorderThickness=”{TemplateBindingBorderThickness}”
Margin=”{TemplateBinding Margin}”>
<Grid>
<ContentPresenter
x:Name=”FirstContentPresenter”
HorizontalAlignment=
“{TemplateBindingHorizontalContentAlignment}”
VerticalAlignment=
“{TemplateBindingVerticalContentAlignment}”/>
<ContentPresenter
x:Name=”SecondContentPresenter”
HorizontalAlignment=
“{TemplateBindingHorizontalContentAlignment}”
VerticalAlignment=
“{TemplateBindingVerticalContentAlignment}”/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
I added a copy of this to my ApplicationStyleDictionary.xaml.
Okay, now we can move onto actually fixing the problem. Because Windows Phone 8 plays its own transitions in and out of our application on resume and suspend respectively, the transitions our application plays in and out of the active frame are redundant; we need to prevent one pair from playing. Windows Phone 8 gives us no control over the animations it’s playing, so that leaves our own transitions to deal with.
If we look back at our review of the combined chronology of TransitionFrame and fast app resume, we can see we have no choice but to keep (2.a) and (4), and we want to prevent (5) and (7). Our next step is to figure out where TransitionFrame is starting transitions so that we may prevent the ones in question from occurring.
The only time the TransitionFrame starts transitions is within the Frame.Navigating event handler private void OnNavigating(objectsender, NavigatingCancelEventArgs e) so let’s start investigating there. If we look back at our chronology again, we can figure out what sets the OnNavigating invocations we are interested in apart from the others. The cause of transition (5) is the invocation (2.b.i) and the cause for transition (7) is invocation (6). Invocation (2.b.i) is unique in that the NavigatingCancelEventArgs.Uri is equal to app://external/ and (6) is unique in that NavigatingCancelEventArgs.NavigationMode is equal to NavigationMode.Reset. Now that we have our two special conditions, let’s skip execution of OnNavigating when they are true:
private void
OnNavigating(object sender, NavigatingCancelEventArgs e)
{
if (e.NavigationMode == NavigationMode.Reset
|| e.Uri.OriginalString == “app://external/”)
return;
…
}
Problem solved? Let’s build, run, and test the solution.
Success!
Conclusion
After coercing a copy of the open-source TransitionFrame class into our project and making a single minor change, we can now use fast app resume with our transitions intact!
Implications
I’m guessing distributing our modified copy of TransitionFrame.cs and Generic.xaml requires us to also include some mention of the fact that part of our application is Copyright Microsoft under the terms of the Microsoft Public License (Ms-PL).
Migrating Classic Mode Authentication web application to SharePoint 2013
SharePoint 2013 no longer supports classic mode authentication. After attaching a content database that contains classic mode site collections users will not be able to authenticate. If you check a users permissions in site settings you will see someting like this: i:0#.w|sprcompanies\cctest
The solution is to migrate your web application users to with the following PowerShell command. This should be done in an elevated (administrator) SharePoint management shell by a user who is a securityadmin in SQL and is db_owner (in SQL) for the content databases being migrated.
PS C:\> Convert-SPWebApplication -Identity https://projects.sprcompanies.com -To Claims -RetainPermissions
Installing SQL Server 2012 for SharePoint
Windows Server 2012
Installed in a Hyper-V virtual machine
|
Volumes: |
C (Windows disk) |
|
|
D (SQL Data) 200GB |
|
|
E Virtual DVD ROM |
Before installing
SQL ensure that the .NET 3.5 framework is installed by running the following
command (the windows install disk should be mounted in the E drive):
dism
/online /enable-feature /all /featurename:NetFx3 /source:e:\sources\sxs
- Mount Installer ISO
in Hyper-V console for SQL install and double click on ‘setup.exe’
- Chose ‘New
Installation’ and click thru entering key if necessary and accept any updates
- Correct any
deficiencies flagged by the installer (if necessary) and click thru to ‘Setup
Role’
- Select ‘SQL Server
Feature Installation’ and Check the
boxes for ‘Database Engine Services’ and ‘Management Tools – Complete’
- Click thru and
select ‘Default Instance’, changing the Instance root directory to the D drive (D:\Program Files\Microsoft
SQL Server\)
- Change the SQL
Server Agent and SQL Server Database Engine to run under domain accounts
- On the next screen
add at least one SQL Server administrator and confirm that the data directories
are on the D drive
- Click thru to the
‘Ready to Install’ page and confirm the installation parameters
- Click ‘Install’ -
the install will take some time (depending on server resources)
Using Entrerprise Library In Biztalk Orchestration To Log To A File
There are time when I would like to setup logging in my Biztalk orchestrations to be able to log to a file. Since it is not straight forward, I would like write this to show the steps that I take to accomplish this.
1. Install Microsoft Enterprise Library 4.1 – October 2008.msi
2. Open configuration. Start?All Programs?Microsoft patterns & practices?Enterprise Library 4.1 – October 2008?Enterprise Library Configuration
4. Right click “Application Configuration”, “New” and select “Logging Application Block”
5. Leave all default configurations except for the following steps.
7. Under Special Sources, Logging Errors & Warnings, set the property for ReferencedTraceListener to “Rolling Flat File Trace Listener”
8. Right click “Trace Listeners”, “New” and select “Rolling Flat File Listener”.
a. Modify the following for Rolling Flat File Listener properties
- Filename: d:\biztalk logs\biztalk.log
- Formatter: Text FormatterFilter: All
- RollFileExistsBehavior: Increment
- RollInterval: Day
- TraceOutputOption: DateTime
- You can also modify the Formatter template to customize what you want in the log file.
a. Open C:\Program Files (x86)\Microsoft BizTalk Server 2010\BTSNTSvc64.exe.config.xml
b. Add the following code at the top right after <?xml version=”1.0″?><configuration>
<section name=”enterpriseLibrary.ConfigurationSource” type=”Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ConfigurationSourceSection, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ />
</configSections>
<enterpriseLibrary.ConfigurationSource selectedSource=”File Configuration Source: EntLib.config”>
<sources>
<add name=”File Configuration Source: EntLib.config” type=”Microsoft.Practices.EnterpriseLibrary.Common.Configuration.FileConfigurationSource, Microsoft.Practices.EnterpriseLibrary.Common, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ filePath=”C:\Program Files (x86)\Microsoft BizTalk Server 2010\EntLib.config” />
</sources>
</enterpriseLibrary.ConfigurationSource>
d. Save the file. You will need to restart any host instances that your orchestration runs under.
11. Setup your biztalk project to use the enterprise library
a. Open your solution with your orchestration project.
b. Add the following references to your project
Microsoft.Practices.EnterpriseLibrary.Common.dll
Microsoft.Practices.EnterpriseLibrary.Logging.dll
Microsoft.Practices.ObjectBuilder2.dll
- In orchestration view, create a new variable (ie LogEntry)
- Assign the “Type” property to Microsoft.Practices.EnterpriseLibrary.Logging.LogEntry
- Add an expression shape to your orchestration and call it LogEntry
- Add the following code you your expression shape:
LogEntry.Message = “Orchestration Started”;
LogEntry.ProcessName = “MyOrchestrationNameHere”;
LogEntry.Severity = System.Diagnostics.TraceEventType.Information;
Microsoft.Practices.EnterpriseLibrary.Logging.Logger.Write(LogEntry);
e. Run the process to instantiate your orchestration to completion.
f. Open the biztlak log you setup in your configuration (d:\biztalk logs\biztalk.log). You should see the following:
—————————————-
Timestamp: 12/5/2012 8:58:17 PM
Message: Orchestration Started
Category: General
Priority: -1
EventId: 0
Severity: Information
Title:
Machine: BiztalkDevServer1
Application Domain: __XDomain_3.0.1.0_0
Process Id: 26868
Process Name: MyOrchestrationNameHere
Win32 Thread Id: 21408
Thread Name:
Extended Properties:
—————————————-
Generating a Biztalk Schema for Typed Polling
- Open visual studio solution and right click your project and select "Add" then "Add generated items…"
-
Select "Consume Adapter Service" under Installed Templates pane. Select Consume Adapter Service Generated Schema Files in middle window pane and click add button (or double click it)
- Select the sqlBinding in drop down. Click configure button.
-
Under security tab configure your login credentials.
-
Under URI properties filling in the following
Server: Name of sql server (use period for local server)
InstanceName: Name of the instance on the sql server (blank for default instance)
InitialCatalog: Name of the database
InboundId: any name you want to come up with for a unique "polling id" (for example if you have 2 receive locations that are polling the same table, this will uniquely identify it other wise biztalk admin console will error out)
-
Under the binding properties tab, filling the following
InboundOperationType: TypePolling
PollingStatement: exec usp_Biztalk_GetOrdersToProcess
-
Go back to main window and click connect.
-
Select service (inbound operations) under "Select Contract Type"
-
Click the forward slash under "Select a category". This will show options under the "Available categories and opeations" window pane.
- Under "Available categories and opeations" window pane selct "TypedPolling" and click the Add button (or double click it)
-
This will add "TypedPolling" under the "Added categories and operations" pane.
-
Add a prefix if you want it added to the beginning of your schema name
- Click OK
-
You should get one schema with all definitions similar to this:
- Now need to setup for debatching
-
Select Schema folder, and in properties, set Envelope property to "Yes"
-
Select TypedPolling and in the properties window, set the BodyXpath property by clicking the button with three periods
-
In the BodyXpath window, select the node highlighted in picture (TypedPollingResultSet0 under TypedPolling).
- Finally select the child TypedPollingResultSet0 (Under the TypedPollingResultSet0 you just set as the BodyXpath) and change the Max Occurs from unbounded to 1
-
Save your changes.
Generating a Biztalk Schema for Typed Polling
Simplifying SAP Material Master using Winshuttle
In this post we will show how we can use Winshuttle to integrate SAP Material Master with Microsoft SharePoint Portal using a no-code approach. Using this approach we will show how we can achieve integration with SAP without any ABAP development.
So Let’s get started.
First step is to record an SAP transaction using Winshuttle TRANSACTION and exposes the transaction as web service. Winshuttle TRANSACTION simplifies the automated recording, mapping, and running of SAP ERP transactional data. In this example we will record an MM01 transaction.
Launch Winshuttle Transaction and click on New button to create a new script.
Enter Transaction Code MM01 in the Transaction Code field.
In the Recording Properties screen, select Batch Input Mode and press Next.
Shortly thereafter SAP MM01 transaction should launch.
Enter the material name, industry sector and material type and then click Select views(s) button.
Click the Basic Data 1 Selection. Enter data into some of the fields in the Basic Data 1 screen.
Select the view Sales:General/Plant. Enter the Plant, Sales Org and Distr Channel when prompted.
Enter data into some of the fields in the Sales:General/Plant screen.
Click the Save icon when all updates have been made. This will also end the recording.
Next we will create the mapping for this transaction. Mapping a Transaction script is just a matter of connecting the SAP fields to a data file. Transaction provides a Mapper to facilitate this process.
In the mapper, we changed the Source Type to XML. This will allow us to publish this script as a web service. Mapper has two views, Basic and Expert. Basic view only shows the fields that we touched while recording the transaction. If we need to add additional fields that are part of the transaction we recorded, we can find them in the Expert view.
Once we have mapped all the fields that we need for our web service, we can save the script. At this point we are ready to test the script using the tool that WS Transaction provides.
Click on Test on the Run screen. A form will appear with the values that we entered during the recording step.
Press Run to call SAP the SAP transaction we recorded.
We have now successfully created a material in SAP using MM01 transaction that we recorded using Winshuttle Transaction.
In the next blog we will show you how to publish this script as a web service an consume it through a form in Microsoft SharePoint.
A duplicate field name {GUID} was found
A duplicate field name {GUID} was found….
I have run into this error a number of times while creating custom content types that utilize custom taxonomy fields. Sometimes closing and re-opening Visual Studio works and changing the GUID of the field mentioned in the error message also works.
The last project I was working on, neither of those fixes made a difference. After many GUID changes and re-opening of Visual studio I realized that the Enterprise Keywords field that I had in my content type also had the DisplayName attribute in the FieldRef tag, but my custom fields did not. So, I decided to give that a try. Problem Solved!!! I didn’t need to add the DisplayName to all taxonomy fields that I added to my content types, but if I received the error, added the attribute, and re-deployed the error was resolved.









