Resource.DeleteResources Method
Deletes one or more enterprise resources or users.
Namespace: WebSvcResource
Assembly: ProjectServerWebServices (in ProjectServerWebServices.dll)
Syntax
'Declaration
<SoapDocumentMethodAttribute("http://schemas.microsoft.com/office/project/server/webservices/Resource/DeleteResources", RequestNamespace := "http://schemas.microsoft.com/office/project/server/webservices/Resource/", _
ResponseNamespace := "http://schemas.microsoft.com/office/project/server/webservices/Resource/", _
Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Sub DeleteResources ( _
arrayRes As Guid(), _
deletionComment As String _
)
'Usage
Dim instance As Resource
Dim arrayRes As Guid()
Dim deletionComment As String
instance.DeleteResources(arrayRes, deletionComment)
[SoapDocumentMethodAttribute("http://schemas.microsoft.com/office/project/server/webservices/Resource/DeleteResources", RequestNamespace = "http://schemas.microsoft.com/office/project/server/webservices/Resource/",
ResponseNamespace = "http://schemas.microsoft.com/office/project/server/webservices/Resource/",
Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public void DeleteResources(
Guid[] arrayRes,
string deletionComment
)
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.
Remarks
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 |
---|---|
Delete information from the database. Global permission. |
Examples
This example creates several resources, retrieving them if they already exist, reports them, and then deletes them.
Please see Prerequisites for Reference Code Samples 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";
ResourceWebSvc.ResourceDataSet resourceDs;
// Set up the Web service objects
ResourceWebSvc.Resource resourceSvc = new ResourceWebSvc.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(ResourceWebSvc.ResourceDataSet resourceDs)
{
foreach (ResourceWebSvc.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(ResourceWebSvc.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(ResourceWebSvc.Resource resourceSvc, string resourceName, PSLibrary.Resource.Type resourceType)
{
ResourceWebSvc.ResourceDataSet resourceDs = new ResourceWebSvc.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 ResourceWebSvc.ResourceDataSet();
ResourceWebSvc.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)
{
ResourceWebSvc.ResourceDataSet resourceDs = new ResourceWebSvc.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);
}
}
}