ResourcePlan.ReadResourcePlan 方法
读取指定项目资源计划数据通过使用可选的筛选器或日期范围。(可选) 签出资源计划进行修改。
命名空间: WebSvcResourcePlan
程序集: ProjectServerServices(位于 ProjectServerServices.dll 中)
语法
声明
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/ReadResourcePlan", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/", _
ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/", _
Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Function ReadResourcePlan ( _
filter As String, _
projectUid As Guid, _
startDate As DateTime, _
endDate As DateTime, _
timeScale As Short, _
timephasedFTE As Boolean, _
autoCheckOut As Boolean _
) As ResourcePlanDataSet
用法
Dim instance As ResourcePlan
Dim filter As String
Dim projectUid As Guid
Dim startDate As DateTime
Dim endDate As DateTime
Dim timeScale As Short
Dim timephasedFTE As Boolean
Dim autoCheckOut As Boolean
Dim returnValue As ResourcePlanDataSet
returnValue = instance.ReadResourcePlan(filter, _
projectUid, startDate, endDate, timeScale, _
timephasedFTE, autoCheckOut)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/ReadResourcePlan", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/",
ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/",
Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public ResourcePlanDataSet ReadResourcePlan(
string filter,
Guid projectUid,
DateTime startDate,
DateTime endDate,
short timeScale,
bool timephasedFTE,
bool autoCheckOut
)
参数
filter
类型:System.String包含 XML 筛选器来限制返回的数据。
projectUid
类型:System.Guid包含项目的 GUID。
startDate
类型:System.DateTime包含的开始日期。
endDate
类型:System.DateTime包含的结束日期。
timeScale
类型:System.Int16与TimeScaleClass.TimeScale枚举中指定的时间刻度。
timephasedFTE
类型:System.Boolean如果true,将时间值转换为等效的全职资源。
autoCheckOut
类型:System.Boolean如果true,签出以进行编辑的资源计划。
返回值
类型:WebSvcResourcePlan.ResourcePlanDataSet
ResourcePlanDataSet.PlanResourcesDataTable包括由filter或日期参数指定的数据。
备注
在ResoucePlanDataSet主DataTable是PlanResourcesDataTable。
备注
filter参数有效使用Criteria运算符只能在主PlanResourcesDataTable中的行进行过滤。例如,不能使用filter与ReadResourcePlan方法在PlanAssignmentCustomFieldsDataTable中筛选行。如果您尝试在辅助DataTable中的行进行过滤,PSI 返回FilterInvalid异常。
但是,可以使用筛选列的Fields.Add方法,在主要的CalendarsDataTable和DataTable任何辅助。
示例
该示例在 ProjectServerServices.dll 代理服务器程序集使用SvcResourcePlan命名空间。ConfigClientEndpoints方法使用了 app.config 文件设置 WCF 绑定、 行为和resourcePlanClient对象, resourceClient对象中,与projectClient对象的终结点。有关创建和使用 PSI 的代理服务器程序集和一个 app.config 文件的信息,请参阅Project 2013 中基于 WCF 的代码示例的先决条件。
备注
下面的示例演示如何使用ReadResourcePlan方法中;它不是一个完整的解决方案。
有关如何创建资源计划的示例代码,请参阅QueueCreateResourcePlan。要使用ReadResourcePlan示例,创建一个项目,建立项目组从企业资源,然后创建并使用Project Web App发布资源计划。
创建资源计划,并将项目发布后,编译并运行该示例。例如,以下命令读取一个名为我膨胀的项目,项目的资源计划,然后将ResourcePlanDataSet内容写入C:\Project\Samples\Output\ReadResourcePlanDS.xml文件。
ReadResourcePlan -project "My Swell Project"
示例代码如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ServiceModel;
using System.Data;
using System.Xml;
using PSLibrary = Microsoft.Office.Project.Server.Library;
namespace Microsoft.SDK.Project.Samples.ReadResourcePlan
{
class ReadResourcePlan
{
private const string ENDPOINT_RESPLAN = "basicHttp_ResourcePlan";
private const string ENDPOINT_R = "basicHttp_Resource";
private const string ENDPOINT_P = "basicHttp_Project";
private const string OUTPUT_FILES = @"C:\Project\Samples\Output\";
private const string XML_FILE = "ReadResourcePlanDS.xml";
private static SvcResourcePlan.ResourcePlanClient resourcePlanClient;
private static SvcResource.ResourceClient resourceClient;
private static SvcProject.ProjectClient projectClient;
private static string outFile_ResourcePlanDS;
static void Main(string[] args)
{
string projName = string.Empty;
bool badNews = false;
try
{
if (args.Length == 2)
{
if (args[0].ToLower() == "-project")
projName = args[1];
else
{
Console.WriteLine("Incorrect argument: {0}", args[0]);
badNews = true;
}
}
else
{
badNews = true;
}
if (badNews) throw new ApplicationException(
@"Usage: ReadResourcePlan -project ""Project Name""");
// Configure the endpoints.
bool configResult = false;
configResult = ConfigClientEndpoints(ENDPOINT_RESPLAN);
configResult = ConfigClientEndpoints(ENDPOINT_P);
configResult = ConfigClientEndpoints(ENDPOINT_R);
if (!configResult) throw new ApplicationException(
"Error(s) in WCF client configuration");
// If output directory does not exist, create it.
if (!Directory.Exists(OUTPUT_FILES))
{
Directory.CreateDirectory(OUTPUT_FILES);
}
// Set the output file path.
outFile_ResourcePlanDS = OUTPUT_FILES + XML_FILE;
try
{
GetResourcePlan(projName);
}
catch (FaultException fault)
{
// Use the WCF FaultException, because the ASMX SoapException does not
// exist in a WCF-based application.
WriteFaultOutput(fault);
}
catch (CommunicationException e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(
"\n***System.ServiceModel.CommunicationException\n{0}:", e.Message);
Console.ResetColor();
}
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("\n\n***Exception:\n{0}", ex.Message);
Console.ResetColor();
}
Console.Write("\nPress any key to exit: ");
Console.ReadKey(true);
}
// Extract a PSClientError object from the WCF FaultException object, and
// then display the exception details and each error in the PSClientError stack.
private static void WriteFaultOutput(FaultException fault)
{
string errAttributeName;
string errAttribute;
string errOut;
string errMess = "".PadRight(30, '=') + "\r\n"
+ "Error details: " + "\r\n";
PSLibrary.PSClientError error = Helpers.GetPSClientError(fault, out errOut);
errMess += errOut;
if (error != null)
{
PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
PSLibrary.PSErrorInfo thisError;
for (int i = 0; i < errors.Length; i++)
{
thisError = errors[i];
errMess += "\r\n".PadRight(30, '=') + "\r\nPSClientError output:\r\n";
errMess += thisError.ErrId.ToString() + "\n";
for (int j = 0; j < thisError.ErrorAttributes.Length; j++)
{
errAttributeName = thisError.ErrorAttributeNames()[j];
errAttribute = thisError.ErrorAttributes[j];
errMess += "\r\n\t" + errAttributeName
+ ": " + errAttribute;
}
}
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(errMess);
Console.ResetColor();
}
// Get the resource plan for the specified project.
public static void GetResourcePlan(string projName)
{
Guid projUid = GetProjectUid(projName);
// Get project start date and end date.
List<DateTime> startFinishDates = GetStartFinishDates(projUid);
if (startFinishDates.Count != 2)
throw new ApplicationException("Invalid project start and finish dates.");
DateTime startDate = startFinishDates[0];
DateTime endDate = startFinishDates[1];
// Read the resource plan.
Console.WriteLine("Reading the resource plan of the project: \n\t{0}\n\t{1}",
projName, projUid.ToString());
string resPlanFilter = string.Empty;
bool fteTime = false;
bool autoCheckOut = false;
SvcResourcePlan.ResourcePlanDataSet resPlanDs = resourcePlanClient.ReadResourcePlan(
resPlanFilter, projUid, startDate, endDate,
(short)PSLibrary.ResourcePlan.TimeScale.Days, fteTime, autoCheckOut);
// Write the ResourcePlan DataSet to an XML file.
resPlanDs.WriteXml(outFile_ResourcePlanDS);
Console.WriteLine("\nSee XML output of resource plan DataSet at {0}",
outFile_ResourcePlanDS);
}
// Get the project GUID.
public static Guid GetProjectUid(string projName)
{
Guid projUid = Guid.Empty;
SvcProject.ProjectDataSet projectDs = projectClient.ReadProjectStatus(
Guid.Empty, SvcProject.DataStoreEnum.PublishedStore,
projName, (int)PSLibrary.Project.ProjectType.Project);
foreach (SvcProject.ProjectDataSet.ProjectRow project in projectDs.Project)
{
if (project.PROJ_NAME == projName)
{
projUid = project.PROJ_UID;
break;
}
}
if (projUid == Guid.Empty)
throw new ApplicationException(string.Format("No project name: {0}", projName));
return projUid;
}
// Get the project start date and finish date.
public static List<DateTime> GetStartFinishDates(Guid projUid)
{
List<DateTime> dates = new List<DateTime>();
SvcProject.ProjectDataSet projectDs = projectClient.ReadProject(
projUid, SvcProject.DataStoreEnum.PublishedStore);
dates.Add(projectDs.Project.Rows[0].Field<DateTime>("PROJ_INFO_START_DATE"));
dates.Add(projectDs.Project.Rows[0].Field<DateTime>("PROJ_INFO_FINISH_DATE"));
return dates;
}
// Configure the PSI client endpoints.
public static bool ConfigClientEndpoints(string endpt)
{
bool result = true;
switch (endpt)
{
case ENDPOINT_RESPLAN:
resourcePlanClient = new SvcResourcePlan.ResourcePlanClient(endpt);
break;
case ENDPOINT_P:
projectClient = new SvcProject.ProjectClient(endpt);
break;
case ENDPOINT_R:
resourceClient = new SvcResource.ResourceClient(endpt);
break;
default:
result = false;
Console.WriteLine("Invalid endpoint: {0}", endpt);
break;
}
return result;
}
}
class Helpers
{
/// <summary>
/// Extract a PSClientError object from the ServiceModel.FaultException,
/// for use in output of the GetPSClientError stack of errors.
/// </summary>
/// <param name="e"></param>
/// <param name="errOut">Shows that FaultException has more information
/// about the errors than PSClientError has. FaultException can also contain
/// other types of errors, such as failure to connect to the server.</param>
/// <returns>PSClientError object, for enumerating errors.</returns>
public static PSLibrary.PSClientError GetPSClientError(FaultException e,
out string errOut)
{
const string PREFIX = "GetPSClientError() returns null: ";
errOut = string.Empty;
PSLibrary.PSClientError psClientError = null;
if (e == null)
{
errOut = PREFIX + "Null parameter (FaultException e) passed in.";
psClientError = null;
}
else
{
// Get a ServiceModel.MessageFault object.
var messageFault = e.CreateMessageFault();
if (messageFault.HasDetail)
{
using (var xmlReader = messageFault.GetReaderAtDetailContents())
{
var xml = new XmlDocument();
xml.Load(xmlReader);
var serverExecutionFault = xml["ServerExecutionFault"];
if (serverExecutionFault != null)
{
var exceptionDetails = serverExecutionFault["ExceptionDetails"];
if (exceptionDetails != null)
{
try
{
errOut = exceptionDetails.InnerXml + "\r\n";
psClientError =
new PSLibrary.PSClientError(exceptionDetails.InnerXml);
}
catch (InvalidOperationException ex)
{
errOut = PREFIX + "Unable to convert fault exception info ";
errOut += "a valid Project Server error message. Message: \n\t";
errOut += ex.Message;
psClientError = null;
}
}
else
{
errOut = PREFIX + "The FaultException e is a ServerExecutionFault, "
+ "but does not have ExceptionDetails.";
}
}
else
{
errOut = PREFIX + "The FaultException e is not a ServerExecutionFault.";
}
}
}
else // No detail in the MessageFault.
{
errOut = PREFIX + "The FaultException e does not have any detail.";
}
}
errOut += "\r\n" + e.ToString() + "\r\n";
return psClientError;
}
}
}
对于扩展超过两个星期的项目,时间刻度中使用ReadResourcePlan方法,以周为单位显示资源计划中名为Interval0和Interval1两个间隔。在此示例中,资源计划的时间间隔包含 0 个小时的时间。下面是输出的在 ReadResourcePlanDS.xml 文件中的示例。
<?xml version="1.0" standalone="yes"?>
<ResourcePlanDataSet xmlns="https://schemas.microsoft.com/office/project/server/webservices/ResourcePlanDataSet/">
<Utilization>
<PROJ_UID>4f4b5ffb-e143-4c84-9cf4-299d316c7d8e</PROJ_UID>
<RESPLAN_UTILIZATION_TYPE>0</RESPLAN_UTILIZATION_TYPE>
</Utilization>
<PlanResources>
<RES_UID>0285a4e6-53f8-459a-945a-62f7ca465400</RES_UID>
<PROJ_UID>4f4b5ffb-e143-4c84-9cf4-299d316c7d8e</PROJ_UID>
<ASSN_UID>cc3f29ec-d033-473e-a6c4-5604c2e84601</ASSN_UID>
<RES_NAME>Resource Name1</RES_NAME>
<RES_TYPE>2</RES_TYPE>
<RES_CAN_LEVEL>true</RES_CAN_LEVEL>
<RES_TIMESHEET_MGR_UID>0285a4e6-53f8-459a-945a-62f7ca465400</RES_TIMESHEET_MGR_UID>
<RES_DEF_ASSN_OWNER>0285a4e6-53f8-459a-945a-62f7ca465400</RES_DEF_ASSN_OWNER>
<RES_INITIALS>R1</RES_INITIALS>
<RES_ID>71</RES_ID>
<ASSN_BOOKING_TYPE>0</ASSN_BOOKING_TYPE>
<RES_IS_TEAM>false</RES_IS_TEAM>
<RES_CHECKOUTDATE>2010-10-06T16:08:23.17-07:00</RES_CHECKOUTDATE>
<Interval0>0</Interval0>
<Interval1>0</Interval1>
</PlanResources>
<PlanResources>
<RES_UID>009380d1-29ad-40df-9511-f82adb874834</RES_UID>
<PROJ_UID>4f4b5ffb-e143-4c84-9cf4-299d316c7d8e</PROJ_UID>
<ASSN_UID>ad15c911-ac55-4463-9d1c-cf29d9b6938a</ASSN_UID>
<RES_NAME>Resource Name2</RES_NAME>
<RES_TYPE>2</RES_TYPE>
<RES_CAN_LEVEL>true</RES_CAN_LEVEL>
<RES_TIMESHEET_MGR_UID>009380d1-29ad-40df-9511-f82adb874834</RES_TIMESHEET_MGR_UID>
<RES_DEF_ASSN_OWNER>009380d1-29ad-40df-9511-f82adb874834</RES_DEF_ASSN_OWNER>
<RES_INITIALS>R2</RES_INITIALS>
<RES_ID>24</RES_ID>
<ASSN_BOOKING_TYPE>0</ASSN_BOOKING_TYPE>
<RES_HIRE_DATE>2010-09-21T00:00:00-07:00</RES_HIRE_DATE>
<RES_TERMINATION_DATE>2011-09-25T00:00:00-07:00</RES_TERMINATION_DATE>
<RES_IS_TEAM>false</RES_IS_TEAM>
<RES_CHECKOUTDATE>2010-10-06T15:43:12.73-07:00</RES_CHECKOUTDATE>
<Interval0>0</Interval0>
<Interval1>0</Interval1>
</PlanResources>
<Dates>
<StartDate>2010-10-27T00:00:00-07:00</StartDate>
<EndDate>2010-11-01T00:00:00-07:00</EndDate>
<IntervalName>Interval0</IntervalName>
</Dates>
<Dates>
<StartDate>2010-11-01T00:00:00-07:00</StartDate>
<EndDate>2010-11-05T00:00:00-07:00</EndDate>
<IntervalName>Interval1</IntervalName>
</Dates>
</ResourcePlanDataSet>