Resource::DeleteResources method
Deletes one or more enterprise resources or users.
Namespace: WebSvcResource
Assembly: ProjectServerServices (in ProjectServerServices.dll)
Parameters
- arrayRes
- Type: []
Guids of the resources to delete.
- deletionComment
- Type: System.String
A brief note describing the deletion. This comment is sent to any affected project manager when a resource in their project changes from an enterprise resource to a local resource.
The resource must be checked out before it can be deleted.
A resource may not be deleted if the resource:
Has anything checked out
Is the current user
Owns a project
Is a timesheet manager
Owns an assignment
Is the default assignment owner
Is used in a resource plan
Project Server Permissions
Permission | Description |
|---|---|
Allows a user to delete information from the database. Global permission. |
The following example creates several resources, retrieving them if they already exist, reports them, and then deletes them.
Please see Prerequisites for ASMX-based code samples in Project 2013 for critical information on running this code sample.
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Data; using System.Web.Services.Protocols; using System.Threading; using PSLibrary = Microsoft.Office.Project.Server.Library; namespace Microsoft.SDK.Project.Samples.DeleteResources { class Program { [STAThread] static void Main() { try { const string PROJECT_SERVER_URI = "http://ServerName/ProjectServerName/"; const string RESOURCE_SERVICE_PATH = "_vti_bin/psi/resource.asmx"; SvcResource.ResourceDataSet resourceDs; // Set up the Web service objects SvcResource.Resource resourceSvc = new SvcResource.Resource(); resourceSvc.Url = PROJECT_SERVER_URI + RESOURCE_SERVICE_PATH; resourceSvc.Credentials = CredentialCache.DefaultCredentials; // Get the resources Console.WriteLine("Getting/Creating resources"); Guid[] resources = EnsureEnterpriseResources(resourceSvc); // retrieve the data from the server for display Console.WriteLine("Retrieve the data just created and display"); PSLibrary.Filter resourceFilter = GetResourceFilter(resources); string filterXml = resourceFilter.GetXml(); resourceDs = resourceSvc.ReadResources(filterXml, false); WriteTablesToConsole(resourceDs.Tables); // Check out resources Console.WriteLine("Check out resources"); resourceSvc.CheckOutResources(resources); // Delete the resources Console.WriteLine("Deleting resources"); resourceSvc.DeleteResources(resources, "Deletion Utility Test"); // Display absence of resources Console.WriteLine("See? They're gone..."); resourceDs = resourceSvc.ReadResources(filterXml, false); WriteTablesToConsole(resourceDs.Tables); } catch (SoapException ex) { PSLibrary.PSClientError error = new PSLibrary.PSClientError(ex); PSLibrary.PSErrorInfo[] errors = error.GetAllErrors(); string errMess = "==============================\r\nError: \r\n"; for (int i = 0; i < errors.Length; i++) { errMess += "\n" + ex.Message.ToString() + "\r\n"; errMess += "".PadRight(30, '=') + "\r\nPSCLientError Output:\r\n \r\n"; errMess += errors[i].ErrId.ToString() + "\n"; for (int j = 0; j < errors[i].ErrorAttributes.Length; j++) { errMess += "\r\n\t" + errors[i].ErrorAttributeNames()[j] + ": " + errors[i].ErrorAttributes[j]; } errMess += "\r\n".PadRight(30, '='); } Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(errMess); } catch (WebException ex) { string errMess = ex.Message.ToString() + "\n\nLog on, or check the Project Server Queuing Service"; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error: " + errMess); } catch (Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Error: " + ex.Message); } finally { Console.ResetColor(); Console.WriteLine("\r\n\r\nPress any key..."); Console.ReadKey(); } } private static void WriteResourceState(SvcResource.ResourceDataSet resourceDs) { foreach (SvcResource.ResourceDataSet.ResourcesRow row in resourceDs.Resources.Rows) { // If the resource type is greater than the inactive offset, it is inactive. Console.ForegroundColor = ConsoleColor.Blue; Console.Write(row.RES_NAME); Console.ForegroundColor = ConsoleColor.Gray; Console.Write(" is "); if (row.RES_TYPE > (int)PSLibrary.Resource.Type.INACTIVATED_OFFSET) { Console.ForegroundColor = ConsoleColor.Red; Console.Write("Inactive\r\n"); } else { Console.ForegroundColor = ConsoleColor.DarkGreen; Console.Write("Active\r\n"); } Console.ResetColor(); } } private static Guid[] EnsureEnterpriseResources(SvcResource.Resource resourceSvc) { string[] resourceNames = new string[] { "Lertchai Treetawatchaiwong", "Bricks", "Conference Room A", "Rental"}; PSLibrary.Resource.Type[] resourceTypes = new PSLibrary.Resource.Type[] { PSLibrary.Resource.Type.WorkResource, PSLibrary.Resource.Type.MaterialResource, PSLibrary.Resource.Type.WorkResource, PSLibrary.Resource.Type.CostResources }; Guid[] resources = new Guid[resourceNames.Length]; for (int i = 0; i < resourceNames.Length; i++) { resources[i] = EnsureEnterpriseResource(resourceSvc, resourceNames[i], resourceTypes[i]); } return resources; } private static Guid EnsureEnterpriseResource(SvcResource.Resource resourceSvc, string resourceName, PSLibrary.Resource.Type resourceType) { SvcResource.ResourceDataSet resourceDs = new SvcResource.ResourceDataSet(); PSLibrary.Filter resourceFilter = new Microsoft.Office.Project.Server.Library.Filter(); resourceFilter.FilterTableName = resourceDs.Resources.TableName; resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None)); resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None)); resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_INITIALSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None)); resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None)); PSLibrary.Filter.FieldOperator existingResource = new PSLibrary.Filter.FieldOperator(PSLibrary.Filter.FieldOperationType.Equal, resourceDs.Resources.RES_NAMEColumn.ColumnName, resourceName); resourceFilter.Criteria = existingResource; string filterXml = resourceFilter.GetXml(); resourceDs = resourceSvc.ReadResources(filterXml, false); if (resourceDs.Resources.Count >= 1) { return resourceDs.Resources[0].RES_UID; } else { resourceDs = new SvcResource.ResourceDataSet(); SvcResource.ResourceDataSet.ResourcesRow resourceRow = resourceDs.Resources.NewResourcesRow(); resourceRow.RES_UID = Guid.NewGuid(); resourceRow.RES_NAME = resourceName; resourceRow.RES_INITIALS = resourceName.Substring(0, 1) + (resourceName.IndexOf(" ") > 0 ? resourceName.Substring(resourceName.IndexOf(" ") + 1, 1) : ""); resourceRow.RES_TYPE = (int)resourceType; resourceDs.Resources.AddResourcesRow(resourceRow); resourceSvc.CreateResources(resourceDs, false, true); return resourceRow.RES_UID; } } private static PSLibrary.Filter GetResourceFilter(Guid[] resources) { SvcResource.ResourceDataSet resourceDs = new SvcResource.ResourceDataSet(); PSLibrary.Filter resourceFilter = new PSLibrary.Filter(); resourceFilter.FilterTableName = resourceDs.Resources.TableName; resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None)); resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None)); resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_INITIALSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None)); resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None)); //List<PSLibrary.Filter.FieldOperator> resourceFieldOps = new List<PSLibrary.Filter.FieldOperator>(); PSLibrary.Filter.IOperator[] fos = new PSLibrary.Filter.IOperator[resources.Length]; for (int i = 0; i < resources.Length; i++) { fos[i] = new PSLibrary.Filter.FieldOperator(PSLibrary.Filter.FieldOperationType.Equal, resourceDs.Resources.RES_UIDColumn.ColumnName, resources[i]); } PSLibrary.Filter.LogicalOperator lo = new Microsoft.Office.Project.Server.Library.Filter.LogicalOperator(PSLibrary.Filter.LogicalOperationType.Or, fos); resourceFilter.Criteria = lo; return resourceFilter; } private static void WriteTablesToConsole(System.Data.DataTableCollection theTables) { Console.ForegroundColor = ConsoleColor.DarkGreen; foreach (System.Data.DataTable table in theTables) { int[] columnWidths = new int[table.Columns.Count]; int tableWidth = 0; string dataString; Console.WriteLine("Table: " + table.TableName); // Write out the column names and get their spacing StringBuilder tableRow = new StringBuilder(); for (int i = 0; i < table.Columns.Count; i++) { columnWidths[i] = GetColumnWidth(table.Columns[i]); tableRow.Append(table.Columns[i].ColumnName.PadRight(columnWidths[i])); tableWidth += columnWidths[i]; } // add a space so it won't wrap tableWidth += 1; // make the console as wide as the widest table Console.BufferWidth = (Console.BufferWidth > tableWidth ? Console.BufferWidth : tableWidth); tableRow.Append("\r\n"); Console.Write(tableRow.ToString()); // Write out the data foreach (DataRow row in table.Rows) { tableRow = new StringBuilder(); for (int i = 0; i < table.Columns.Count; i++) { dataString = row[i].ToString(); // truncate output if it is wider than // the desired column width if (dataString.Length >= columnWidths[i]) { dataString = dataString.Substring(0, columnWidths[i] - 1); } // add the output to the stringbuilder and pad right to fill // up to the column width. tableRow.Append(dataString.PadRight(columnWidths[i])); } tableRow.Append("\r\n"); Console.Write(tableRow.ToString()); } Console.Write("\r\n".PadLeft(tableWidth, '-')); } Console.ResetColor(); } // Helper function for WriteTablesToConsole private static int GetColumnWidth(DataColumn column) { // Note: may not handle byte[]data types well const int MAX_COL_WIDTH = 40; int dataWidth = 0; //return 12 for numbers, 30 for dates, and string width for strings. switch (column.DataType.UnderlyingSystemType.ToString()) { case "System.Boolean": case "System.Byte": case "System.Byte[]": case "System.Char": case "System.Decimal": case "System.Double": case "System.Int16": case "System.Int32": case "System.Int64": case "System.SByte": case "System.Single": case "System.UInt16": case "System.UInt32": case "System.UInt64": dataWidth = 12; break; case "System.DateTime": case "System.TimeSpan": dataWidth = 30; break; case "System.Guid": dataWidth = 37; break; case "System.String": // If it has a maxlength, use it if (column.MaxLength > 0) { dataWidth = column.MaxLength; } else { // Otherwise use the max col width dataWidth = MAX_COL_WIDTH; } break; default: dataWidth = column.ColumnName.Length; break; } // truncate if over the max length if (dataWidth > MAX_COL_WIDTH) { dataWidth = MAX_COL_WIDTH; } // always be at least as wide as the colum name return (column.ColumnName.Length > (dataWidth) ? column.ColumnName.Length + 1 : dataWidth); } } }