Saturday, August 27, 2011

Removing a CRM2011 Pluging which does not want to be removed...

When all else fails, and you have backupd you system twice...


use ????_MSCRM
--- derived from http://mayankp.wordpress.com/2010/07/28/plug-in-type-with-id-guid-does-not-exist/
go
declare @PluginAssemblyId uniqueidentifier
select @PluginAssemblyId = PluginAssemblyId from [PluginAssemblyBase] where Name = 'financialInterface'
select * from [PluginAssemblyBase]
where  PluginAssemblyId  = @PluginAssemblyId

select * from [PluginAssemblyBaseIds]
where  PluginAssemblyId  = @PluginAssemblyId
select * from [PluginTypeBaseIds]
where  [PluginTypeId]  =@PluginAssemblyId
   
select * from [PluginTypeBase]
where  PluginAssemblyId  = @PluginAssemblyId
   
 Select SdkMessageProcessingStepId,*  FROM [SdkMessageProcessingStepBase]
 where PluginTypeId in
 (    select PluginTypeId from [PluginTypeBase]
      where  PluginAssemblyId  = @PluginAssemblyId
    )
   
    
 SELECT * FROM [SdkMessageProcessingStepBaseIds] where [SdkMessageProcessingStepId] in
 (Select
  SdkMessageProcessingStepId FROM [SdkMessageProcessingStepBase]
  where PluginTypeId   in  (   
      select PluginTypeId from [PluginTypeBase]
      where  PluginAssemblyId  = @PluginAssemblyId
      )
    )
   
   
   -- /***************************************************************Start the deletes if all looks right...  /
 begin tran
 --The DELETE statement conflicted with the REFERENCE constraint "FK_SdkMessageProcessingStepId".
 --The conflict occurred in database "OSBA_MSCRM", table "dbo.SdkMessageProcessingStepBase", column 'SdkMessageProcessingStepId'.

delete   FROM [SdkMessageProcessingStepBase]
 where PluginTypeId in
 (    select PluginTypeId from [PluginTypeBase]
      where  PluginAssemblyId  = @PluginAssemblyId
    )
 delete from    [SdkMessageProcessingStepBaseIds] where [SdkMessageProcessingStepId] in
 (Select
  SdkMessageProcessingStepId FROM [SdkMessageProcessingStepBase]
  where PluginTypeId   in  (   
      select PluginTypeId from [PluginTypeBase]
      where  PluginAssemblyId  = @PluginAssemblyId
      )
)
delete from [PluginAssemblyBase]
where  PluginAssemblyId  = @PluginAssemblyId

delete from [PluginAssemblyBaseIds]
where  PluginAssemblyId  = @PluginAssemblyId
delete from [PluginTypeBaseIds]
where  [PluginTypeId]  =@PluginAssemblyId
   
delete from [PluginTypeBase]
where  PluginAssemblyId  = @PluginAssemblyId
rollback or commit
   
/*  Find phantom 
select * from PluginTypeBaseIds where PluginTypeId = '{54d67125-81be-40eb-9a61-00b139c62094}'
 (e.g. select * from PluginTypeBaseIds where PluginTypeId = 'FB270B8E-B48D-DF11-8D06-18A90547D5EE')

SELECT * FROM PluginTypeBase where PluginTypeId = '{54d67125-81be-40eb-9a61-00b139c62094}'

SELECT * FROM [SdkMessageProcessingStepBase] where PluginTypeId = '{54d67125-81be-40eb-9a61-00b139c62094}'
select * from [SdkMessageProcessingStepBase]
where PluginTypeId not in ( select PluginTypeId  from PluginTypeBaseIds )
and Name like 'Altai.finan%'


 SELECT * FROM [SdkMessageProcessingStepBaseIds] where [SdkMessageProcessingStepId] in (Select
 SdkMessageProcessingStepId FROM [SdkMessageProcessingStepBase]
 where PluginTypeId not in (select PluginTypeId  from PluginTypeBaseIds))


SELECT * FROM [SdkMessageProcessingStepBaseIds] where [SdkMessageProcessingStepId] in (Select
 SdkMessageProcessingStepId FROM [SdkMessageProcessingStepBase]
 where PluginTypeId = '{54d67125-81be-40eb-9a61-00b139c62094}')

SELECT * FROM [SdkMessageProcessingStepImageBase]
where [SdkMessageProcessingStepId] in (Select
 SdkMessageProcessingStepId FROM [SdkMessageProcessingStepBase]
 where SdkMessageProcessingStepId = '{FBD15E5F-64B8-E011-AB4F-00155D00051E}')
 --FBD15E5F-64B8-E011-AB4F-00155D00051E

 (Select SdkMessageProcessingStepId FROM [SdkMessageProcessingStepBase]
 where PluginTypeId = '{54d67125-81be-40eb-9a61-00b139c62094}')

 --{FBD15E5F-64B8-E011-AB4F-00155D00051E}
SELECT * FROM [SdkMessageProcessingStepSecureConfigBase]
-- Work from the bottom up....
/*


begin tran
delete FROM [SdkMessageProcessingStepBaseIds] where [SdkMessageProcessingStepId] in (Select
 SdkMessageProcessingStepId FROM [SdkMessageProcessingStepBase]
 where PluginTypeId not in (select PluginTypeId  from PluginTypeBaseIds))

  rollback
 commit


begin tran
delete from [SdkMessageProcessingStepBase] where PluginTypeId not in
( select PluginTypeId  from PluginTypeBaseIds ) and Name like 'Altai.finan%'
 rollback
 commit


 cleanup

 delete from [SdkMessageProcessingStepBaseIds] where [SdkMessageProcessingStepId] not  in (Select
 SdkMessageProcessingStepId FROM [SdkMessageProcessingStepBase] )


 begin tran
 Delete  from   [SdkMessageProcessingStepBase] where PluginTypeId = '{825c8382-4da6-4969-8c2b-7f26dbf65ccb}'
rollback
delete form  [SdkMessageProcessingStepSecureConfigBase]
commit
begin tran
SELECT * FROM [SdkMessageProcessingStepImageBase] where [SdkMessageProcessingStepId] = '{FBD15E5F-64B8-E011-AB4F-00155D00051E}'
*/
select * from [PluginTypeBaseIds] 
where PluginTypeId not in (select PluginTypeId from [PluginTypeBase])
and PluginTypeId <>  '{6ECDC53E-EF93-4B01-A4FF-CB78E779B88B}'
     
--delete from [PluginAssemblyBase]
--where  PluginAssemblyId  = '{D7DCD169-7214-4D91-B075-FB517D94B643}'
--or PluginAssemblyIdUnique = '{DD1F22B3-D6F1-43AD-A808-855A6934273A}'
--delete from [PluginAssemblyBaseIds]
--where  PluginAssemblyId  = '{D7DCD169-7214-4D91-B075-FB517D94B643}'
--delete from [PluginTypeBase]
--where  PluginAssemblyId  = '{D7DCD169-7214-4D91-B075-FB517D94B643}'
   
--delete from [PluginTypeBaseIds] 
--where PluginTypeId not in (select PluginTypeId from [PluginTypeBase])
--and PluginTypeId <>  '{6ECDC53E-EF93-4B01-A4FF-CB78E779B88B}'

Monday, July 11, 2011

10 Reasons Why Nonprofits Have Upgraded To Microsoft Dynamics CRM 2011

The nonprofit world went from limited choices for association management software (AMS) to a dizzying array of options.  When Microsoft introduced Dynamics CRM the design of the system allowed for industry specific configurations like nonprofit association management and this platform is a game changer.  The following list contains the top reasons nonprofit clients have given for upgrading their AMS to Microsoft Dynamics CRM:
1.       Low Initial and Ongoing Cost
Whether it's monthly using CRM Online or hosted on-premise a Microsoft Dynamics CRM solution can be dramatically less than similar solutions.  And if your association is a 501c3 you may qualify for Microsoft's charity pricing. Plus the architecture allows you to make changes and create new features on your own at no charge.
2.       Easy Configuration and Changes
Microsoft CRM is built to be easily modified by your organization.  This gives you amazing flexibility to modify the solution to match changes in your association.
3.       Native Outlook Integration
This is one of the most powerful features. You can access all the functions of your association management solution right in Outlook without having to launch another program.  Plus all the contacts, appointments, tasks and even emails are synced with all users to create a central database of member information and staff contact.  And if you sync Outlook with your smartphone then your CRM is everywhere you go.
4.       Export to Excel
Need a new report and don't want to wait for someone to design it?  Using the Advanced Find you can create unlimited views of your data and with a single click export it to Excel.  And it is dynamic so you have the latest data in your worksheet or pivot table.
5.       Regular Upgrades
Most software vendors delay upgrades but not Microsoft.  With a proven history of regular feature rich upgrades you are assured that the Microsoft resources are hard at work on the next release.  There are more Microsoft engineers working on CRM than all the current AMS vendors combined.
6.       Access to Data
The structure of CRM gives you transparent access to all your data.  It is your data after all, shouldn't you have complete access?
7.       Hosting Options
Microsoft gives you the option to host CRM on your server locally or in the cloud at CRM online.
8.       Systems Integration
Using Microsoft GP or QuickBooks for accounting?  Want to integrate with other systems like social media?   Microsoft CRM integrates with other systems from simple web services to complex integrations. 
9.       Member Portal
A Member Portal not only extends CRM data like contact info and events registration, it can use the CRM to create new Portal pages.  This gives you the ability to create new member pages without needing a web programmer.  
10.   It’s a Microsoft Product – An enterprise level industry leader and the fastest growing CRM system worldwide.
Altai Systems is a Washington, DC area CRM Technology Consulting firm specializing in Microsoft Dynamics CRM 2011 for non-profit association management with offices in Maryland, Florida, Pennsylvania and Texas. Their signature solution, Altai Membership, is a full-feature Microsoft Dynamics CRM solution and is implementing on version 2011 online and on-premise.
For more information on Microsoft Dynamics CRM 2011 and Altai Membership solutions for not-for-profits, contact David Mangold at sales@altaisystems.com.

Thursday, February 17, 2011

CRM 2011, Removing partitioning from SQL Enterprise Database

In Microsoft CRM-2011, during the install, if the CRM installer sees that you are using SQL Enterprise, it will install partitioning schemes and functions into the database.   This is dandy until you need to restore this database to SQL- Standard Editon.  You cannot restore an enterprise database into sql standard.

Luckly this partitioning is done only for the AuditBase Table.   There are ways of moving and reconfiguring partitioning, but to keep this simple, my solution is to simply dump the audit table.  If you want to back up the audit table and restore the data, you can do that also....

Please backup your database before doing any of the procedures described below.  In fact you should only do the following on a copy of your production database.  Never do this on a production database or you will be working all weekend and ....


Here is a query to remove it so you can backup and restore this database to SQL Standard....

Dont just execute this query, but run each section at a time and look at the results and my comments...


--lets work with the correct database
USE [YOURCOMPANYNAME_MSCRM]

GO

--   *****READ AND UNDERSTAND    ARE YOU NOW IN THE CORRECT DATABSE.  PLEASE DOUBECHECK
--what tables use partitioning....

SELECT O.Name as TableName, I.Name as IndexName, I.Type, I.type_desc as IndexType, ps.name as PartitionSchema

FROM sys.objects O

INNER JOIN sys.partitions p on P.object_id = O.object_id

INNER JOIN sys.indexes i on p.object_id = i.object_id and p.index_id = i.index_id

INNER JOIN sys.data_spaces ds on i.data_space_id = ds.data_space_id

INNER JOIN sys.partition_schemes ps on ds.data_space_id = ps.data_space_id

WHERE p.partition_number = 1

go
--   *****READ AND UNDERSTAND   This better just produce the AuditBase table.  If there are more, then you may need to move partitions vs recreate....


/* Its only the Audit table, lets drop and recreate...



*/





/****** Object: View [dbo].[Audit] Script Date: 02/17/2011 12:49:47 ******/

DROP VIEW [dbo].[Audit]

GO

/****** Object: Table [dbo].[AuditBase] Script Date: 02/17/2011 12:49:46 ******/

ALTER TABLE [dbo].[AuditBase] DROP CONSTRAINT [DF_AuditBase_AuditId]

GO

DROP TABLE [dbo].[AuditBase]

GO

/****** Object: Table [dbo].[AuditBase] Script Date: 02/17/2011 12:49:46 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[AuditBase](

[AttributeMask] [nvarchar](max) NULL,

[TransactionId] [uniqueidentifier] NOT NULL,

[Action] [int] NULL,

[ObjectId] [uniqueidentifier] NOT NULL,

[ObjectIdName] [nvarchar](1) NULL,

[UserId] [uniqueidentifier] NOT NULL,

[ChangeData] [nvarchar](max) NULL,

[CreatedOn] [datetime] NOT NULL,

[Operation] [int] NOT NULL,

[AuditId] [uniqueidentifier] NOT NULL CONSTRAINT [DF_AuditBase_AuditId] DEFAULT (newsequentialid()),

[CallingUserId] [uniqueidentifier] NULL,

[ObjectTypeCode] [int] NULL

) ON [AuditPScheme]([CreatedOn])

GO

CREATE UNIQUE CLUSTERED INDEX [cndx_PrimaryKey_Audit] ON [dbo].[AuditBase]

(

[CreatedOn] DESC,

[AuditId] DESC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

CREATE NONCLUSTERED INDEX [fndx_ObjectTypeCode] ON [dbo].[AuditBase]

(

[ObjectTypeCode] ASC

)

WHERE ([ObjectTypeCode] IS NOT NULL)

WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

CREATE NONCLUSTERED INDEX [ndx_ObjectId] ON [dbo].[AuditBase]

(

[ObjectId] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

CREATE NONCLUSTERED INDEX [ndx_PrimaryKey_Audit] ON [dbo].[AuditBase]

(

[AuditId] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

CREATE UNIQUE NONCLUSTERED INDEX [ndx_PrimaryKey_Audit_Primary] ON [dbo].[AuditBase]

(

[CreatedOn] DESC,

[AuditId] DESC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

CREATE NONCLUSTERED INDEX [ndx_SystemManaged_Audit] ON [dbo].[AuditBase]

(

[CreatedOn] ASC,

[CallingUserId] ASC,

[Action] ASC,

[Operation] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]

GO

CREATE NONCLUSTERED INDEX [ndx_UserId] ON [dbo].[AuditBase]

(

[UserId] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO

/****** Object: View [dbo].[Audit] Script Date: 02/17/2011 12:49:47 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

--

-- base view for Audit

--

create view [dbo].[Audit]

(

-- logical attributes

[UserIdName],

[CallingUserIdName],



-- physical attributes

[AttributeMask],

[TransactionId],

[Action],

[ObjectId],

[UserId],

[ChangeData],

[CreatedOn],

[Operation],

[AuditId],

[CallingUserId],

[ObjectTypeCode],

[ObjectIdName]

) with view_metadata as

select

-- logical attributes

[lk_audit_userid].[FullName],

[lk_audit_callinguserid].[FullName],



-- physical attribute

[AuditBase].[AttributeMask],

[AuditBase].[TransactionId],

[AuditBase].[Action],

[AuditBase].[ObjectId],

[AuditBase].[UserId],

[AuditBase].[ChangeData],

[AuditBase].[CreatedOn],

[AuditBase].[Operation],

[AuditBase].[AuditId],

[AuditBase].[CallingUserId],

[AuditBase].[ObjectTypeCode],

[AuditBase].[ObjectIdName]

from [AuditBase]

left join [SystemUserBase] [lk_audit_callinguserid] with(nolock) on ([AuditBase].[CallingUserId] = [lk_audit_callinguserid].[SystemUserId])

left join [SystemUserBase] [lk_audit_userid] with(nolock) on ([AuditBase].[UserId] = [lk_audit_userid].[SystemUserId])

GO

/****** Object: PartitionScheme [AuditPScheme] Script Date: 02/17/2011 12:59:16 ******/

DROP PARTITION SCHEME [AuditPScheme]

GO

DROP PARTITION FUNCTION AuditPFN;

GO

Thursday, January 27, 2011

When choosing an Association Mangement Solution look past the features.

Industry specific applications like non-profit association management solutions (AMS) are all sounding the same at the feature level. They all offer similar features and even blur when compared. But to see the real difference you must look past the features and focus on the underlying technology. This is what will determine how a solution will 1) give you the flexibility to adjust the system to meet your processes (and not vise versa); 2) scale to match your growth; and 3) upgrade to stay current with new trends in business and technology.  Otherwise you will be in a constant loop of convert and replace.

When Microsoft designed their CRM to allow the system to be configured for business processes outside of sales management, they created an application development platform that has no equal. Consider this, if an application developer has no ownership of the underlying technology or the integrations between the system components, then it is a custom solution with a very limited upgrade path. In fact custom solutions avoid upgrades to limit the cascading effect of unknown compatibility to legacy components and code. Survey the development team and the consensus will be to avoid major system upgrades.
Using Microsoft CRM as the foundation for an industry vertical application like Association Management frees us up from version control and compatibility of the OS, database, security layer, user interface, and integrations with Outlook, Excel, Word and even SharePoint and GP.  All owned and developed by Microsoft. Plus what application development company has the resources dedicated to the underlying technology that results in the over 500 v2011 enhancements to an already solid platform like CRM.

Don't get me wrong, features are important and there are some real inovations out there. My contention is that investing in a solution based on current features doesn't guarantee future innovation.

Sunday, December 5, 2010

iPhone vs DroidX

I have both. iPhone3 & DroidX.


The android is aggravating. A few examples: Want visual voice mail? Add 2$/month for a Verizon app that does not always work. Want callerid to show the city? add $15. I feel like I am being nickel and dimed (and I am) Apps are fixed. There are 2 dozen or so apps that you can’t get rid of. Some ass at Verizon made deals so these apps are fixed in the Verizon Android OS(Blockbuster video rental for example) These fixed apps take prime real-estate, but you cannot remove or move them.

3 way calls are 10 times easier on the iPHONE. Want to merge in a call? On the iPhone its one button. On the android, it’s much tougher if you need to make the 3rd call.

Mp3 player compared to iPod in iphone. Don’t kid yourself. It’s not close. The android market is clunky, gross and quite frankly is years behind Apple.

The Android requires a pin to be entered once you connect it to exchange. You cannot get rid of it.

The Android takes nice video, I like the camera better. If I was a unix hacker, I guess it would be much more fun. The android has a hotspot. I love that. I can change the battery. I can tweak power and can get a couple of days out of phone.

The bottom line for me is that the android specs don’t translate to ease of use.

When the next iPhone with a hotspot comes out, I will break my DroidX contract.

Mike

Wednesday, December 1, 2010

Find that pesky workflow that is blocking the Entity!

Crm Exception: Message: Cannot Delete Entity: Mbscrm_payment. It is used in a published workflow or used as primary entity in a draft workflow., ErrorCode: -2147200980


// Find that workflow

select ParentWorkflowIdName, * from workflow

where Workflowid in (

select distinct Workflowid from USLAX_MSCRM.dbo.WorkflowDependencyBase where ParameterName like '%mbscrm_payment%')

and StatusCode = 2

Friday, November 19, 2010

Deploying Web Parts to Microsoft SharePoint 2010

From Dan, one of our Prolific SharePoint Devlopers and Bloggers..

http://crmvoyager.wordpress.com/2010/11/19/deploying-web-parts-to-microsoft-sharepoint/

Background


Microsoft SharePoint allows developers to build custom UI pieces called Web Parts that plug into a standard SharePoint page at design time. These Web Parts can be extremely powerful, but unfortunately deployment scenarios can be confusing since Web Parts are just one small part of the SharePoint extensibility story and the documentation can be difficult to decipher as a result. In this post I’m going to go through the most straightforward deployment scenario, perhaps mentioning other possibilities in passing, to be covered in later articles.



Although there are other ways to get code deployed to SharePoint, the main mechanism by which custom or third-party code is introduced to a running SharePoint environment is via the SharePoint solution package. Solutions typically have a .wsp file extension, and are actually archives in the Microsoft .cab file format. Solution packages contain an XML manifest file, .NET assemblies and other resources.



One other important thing to note regarding the layout of a SharePoint solution is that a solution may contain one or more features. Features are units of functionality that may be enabled and disabled from within SharePoint. The relationship between features and solutions allows quite a bit of flexibility when setting up the capabilities of individual site collections, but again poses many opportunities for error and confusion.



The last thing to note before we get started with an example is that as of SharePoint 2010 solutions may be deployed in a sandbox environment in addition to being deployed at the farm level. It is possible to deploy the same solution at many levels, but unpredictable behavior may result if the features from both deployments of the solution are available in the same site.



Creating the Package

We are going to build a .wsp package using Visual Studio 2010 and deploy it at the farm level of a fresh installation of Windows Sharepoint Foundation 2010. Assuming you already have a Web Part project in your Visual Studio solution, all we need to do is check a few properties on the project and build the package. Take a look at the following screenshot of the project properties for the Web Part project. The most important things here are the Sandboxed Solution and Assembly Deployment Target. We will need to create a non-sandboxed package in order to accommodate visual web parts — that is, web parts whose layout is determined by an ascx user control. Visual Studio has a special project type for visual Web Parts and it will generate an error if we try to build a sandboxed package that contains visual web parts. The second issue is that for a farm-level deployment we must use the global assembly cache, hence the Assembly Deployment Target setting.



Visual Studio project properties pane



Once these settings are checked and we are sure that our web parts are included in the feature and the feature is included in the package, we can build the .wsp file. The build is triggered via the project context menu. Open the menu and select Package in order to build the .wsp, which will appear in the /bin folder of the Web Part project.

Creating the .wsp Package in Visual Studio





Deploying the Code

Now that we have the .wsp file, we need to pull the package into SharePoint. SharePoint provides a scriptable tool called stsadm as well as a PowerShell cmdlet, since the PowerShell interface is what Microsoft will be moving forward with in the future, I’ll stick with using the cmdlet. We’ll need to have access to the SharePoint Central Administration site in order to complete the deployment. Open the SharePoint Management Shell from the Start menu and type the following:

Add-SPSolution -LiteralPath c:\path\to\solution.wsp

Notice that the full path to the package is necessary.



Once the solution is added, we should browse to the System Settings area and click on Manage Farm Solutions as seen here:



Taking a Look at the Installed Package





This lets us see the added package and deploy it to any site collections that we wish to use the features on. Since we are deploying the .wsp files from the farm level, we “push” the solution down to the individual site collections, making the features visible to the sites. Once the feature is enabled the web parts should be visible in the web part gallery.



There are several other paths that we could have taken to get our code onto the SharePoint server, but this will suffice for the time being. Hopefully this helps out others in their journey to deploy code successfully to SharePoint.