Project::ReadProjectEntities method
Gets one or more types of information within a project, such as tasks, resources, and assignments.
Namespace: WebSvcProject
Assembly: ProjectServerServices (in ProjectServerServices.dll)
Parameters
- projectUid
- Type: System.Guid
The GUID of the project. Required.
- ProjectEntityType
- Type: System.Int32
Specifies one or more types of entities. You can perform a binary OR on the values to specify multiple entities.
- dataStore
- Type: WebSvcProject.DataStoreEnum
The DataStoreEnum that specifys the database in which the project data is located (Drafts, Published, or Archive).
The ProjectEntityType takes the following values:
Project = 1
Task = 2
Resource = 4
Assignment = 8
Dependency = 16
ProjectCustomFields = 32
TaskCustomFields = 64
ResourceCustomFields = 128
AssignmentCustomFields = 256
AssignmentCore = 512
ProjectDefaults = 1024
AssignmentOwnerDefaults = 2048
AssignmentCustomFieldsNoRolldown = 4096
Project Server Permissions
Permission | Description |
|---|---|
Allows a user to access the server. Global permission. | |
Allows a user to open the specified project. Category permission. | |
Allows a user to add a new project to the Project Server database. |
The following example creates a sample project, and then reads selected items from the project.
For critical information about running this code sample, see Prerequisites for ASMX-based code samples in Project 2013.
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Web.Services.Protocols; using System.Data; using System.Threading; using PSLibrary = Microsoft.Office.Project.Server.Library; namespace Microsoft.SDK.Project.Samples.ReadProjectEntities { class Program { [STAThread] static void Main() { try { #region Setup const string PROJECT_SERVER_URI = "http://ServerName/ProjectServerName/"; const string PROJECT_SERVICE_PATH = "_vti_bin/psi/project.asmx"; const string QUEUESYSTEM_SERVICE_PATH = "_vti_bin/psi/queuesystem.asmx"; const int PROJECT_ENTITY_TYPE_TASK = 2; const int PROJECT_ENTITY_TYPE_RESOURCE = 4; const int PROJECT_ENTITY_TYPE_TASK_AND_RESOURCE = PROJECT_ENTITY_TYPE_TASK | PROJECT_ENTITY_TYPE_RESOURCE; // Set up the web service objects. SvcProject.Project projectSvc = new SvcProject.Project(); projectSvc.Url = PROJECT_SERVER_URI + PROJECT_SERVICE_PATH; projectSvc.Credentials = CredentialCache.DefaultCredentials; SvcQueueSystem.QueueSystem q = new SvcQueueSystem.QueueSystem(); q.Url = PROJECT_SERVER_URI + QUEUESYSTEM_SERVICE_PATH; q.Credentials = CredentialCache.DefaultCredentials; // Create a sample project. Console.WriteLine("Creating sample project"); Guid projectId = CreateSampleProject(projectSvc, q); #endregion #region Synchronize the project in the reporting database Console.WriteLine("Reading tasks and resources\r\n"); SvcProject.ProjectDataSet readProjDs = projectSvc.ReadProjectEntities(projectId, PROJECT_ENTITY_TYPE_TASK_AND_RESOURCE, SvcProject.DataStoreEnum.WorkingStore); #endregion #region Write out project // Write the project tables to the console. Console.WriteLine("And here it is:"); WriteTablesToConsole(readProjDs.Tables); #endregion } #region Exception Handling and Final 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(); } #endregion } static private void WaitForQueue(SvcQueueSystem.QueueSystem q, Guid jobId) { SvcQueueSystem.JobState jobState; const int QUEUE_WAIT_TIME = 2; // two seconds bool jobDone = false; string xmlError = string.Empty; int wait = 0; // Wait for the project to get through the queue. // Get the estimated wait time in seconds. wait = q.GetJobWaitTime(jobId); // Wait for it. Thread.Sleep(wait * 1000); // Wait until it is finished. do { // Get the job state. jobState = q.GetJobCompletionState(jobId, out xmlError); if (jobState == SvcQueueSystem.JobState.Success) { jobDone = true; } else { if (jobState == SvcQueueSystem.JobState.Unknown || jobState == SvcQueueSystem.JobState.Failed || jobState == SvcQueueSystem.JobState.FailedNotBlocking || jobState == SvcQueueSystem.JobState.CorrelationBlocked || jobState == SvcQueueSystem.JobState.Canceled) { // If the job failed, error out. throw (new ApplicationException("Queue request " + jobState + " for Job ID " + jobId + ".\r\n" + xmlError)); } else { Console.WriteLine("Job State: " + jobState + " for Job ID: " + jobId); Thread.Sleep(QUEUE_WAIT_TIME * 1000); } } } while (!jobDone); } static private Guid CreateSampleProject(SvcProject.Project projectSvc, SvcQueueSystem.QueueSystem q) { SvcProject.ProjectDataSet projectDs = new SvcProject.ProjectDataSet(); Guid jobId; // Create the project. SvcProject.ProjectDataSet.ProjectRow projectRow = projectDs.Project.NewProjectRow(); projectRow.PROJ_UID = Guid.NewGuid(); projectRow.PROJ_NAME = "Its a wonderful project at " + DateTime.Now.ToShortDateString().Replace("/", "") + " " + DateTime.Now.ToShortTimeString().Replace(":", ""); projectRow.PROJ_TYPE = (int)PSLibrary.Project.ProjectType.Project; projectDs.Project.AddProjectRow(projectRow); // Add some tasks. SvcProject.ProjectDataSet.TaskRow taskOne = projectDs.Task.NewTaskRow(); taskOne.PROJ_UID = projectRow.PROJ_UID; taskOne.TASK_UID = Guid.NewGuid(); // The Task Duration format must be specified. taskOne.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day; taskOne.TASK_DUR = 4800; // 8 hours in duration units (minute/10) taskOne.TASK_NAME = "Task One"; taskOne.TASK_START_DATE = System.DateTime.Now.AddDays(1); projectDs.Task.AddTaskRow(taskOne); SvcProject.ProjectDataSet.TaskRow taskTwo = projectDs.Task.NewTaskRow(); taskTwo.PROJ_UID = projectRow.PROJ_UID; taskTwo.TASK_UID = Guid.NewGuid(); // The Task Duration format must be specified. taskTwo.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day; taskTwo.TASK_DUR = 4800; // 8 hours in duration units (minute/10) taskTwo.TASK_NAME = "Task Two"; taskTwo.TASK_START_DATE = System.DateTime.Now.AddDays(1); projectDs.Task.AddTaskRow(taskTwo); // Add a couple of resources. SvcProject.ProjectDataSet.ProjectResourceRow resOne = projectDs.ProjectResource.NewProjectResourceRow(); resOne.PROJ_UID = projectRow.PROJ_UID; resOne.RES_UID = Guid.NewGuid(); resOne.RES_NAME = "Brynja Sigrídur Blomsterberg"; resOne.RES_INITIALS= "BSB"; resOne.RES_TYPE = (int) PSLibrary.Resource.Type.WorkResource; projectDs.ProjectResource.AddProjectResourceRow(resOne); SvcProject.ProjectDataSet.ProjectResourceRow resTwo = projectDs.ProjectResource.NewProjectResourceRow(); resTwo.PROJ_UID = projectRow.PROJ_UID; resTwo.RES_UID = Guid.NewGuid(); resTwo.RES_NAME = "Worapon Pitayaphongpat"; resTwo.RES_INITIALS = "WP"; resTwo.RES_TYPE = (int) PSLibrary.Resource.Type.WorkResource; projectDs.ProjectResource.AddProjectResourceRow(resTwo); // Save the project to the database. jobId = Guid.NewGuid(); projectSvc.QueueCreateProject(jobId, projectDs, false); WaitForQueue(q, jobId); return projectRow.PROJ_UID; } // Write all contents of a table collection to the console. 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 that it will not 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(); } // A 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); } } }