创建、 修改或删除企业自定义域,公式中的语言相关格式的位置。
命名空间: WebSvcCustomFields
程序集: ProjectServerServices(位于 ProjectServerServices.dll 中)
语法
声明
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/CustomFields/UpdateCustomFields2", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/CustomFields/", _
ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/CustomFields/", _
Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Sub UpdateCustomFields2 ( _
cfds As CustomFieldDataSet, _
validateOnly As Boolean, _
autoCheckIn As Boolean _
)
用法
Dim instance As CustomFields
Dim cfds As CustomFieldDataSet
Dim validateOnly As Boolean
Dim autoCheckIn As Boolean
instance.UpdateCustomFields2(cfds, validateOnly, _
autoCheckIn)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/CustomFields/UpdateCustomFields2", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/CustomFields/",
ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/CustomFields/",
Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public void UpdateCustomFields2(
CustomFieldDataSet cfds,
bool validateOnly,
bool autoCheckIn
)
参数
cfds
类型:WebSvcCustomFields.CustomFieldDataSetCustomFieldDataSet包含的更新的自定义字段定义。
validateOnly
类型:System.Boolean如果true,验证仅CustomFieldDataSet。
autoCheckIn
类型:System.Boolean如果true,签入他们更新后的自定义域。
备注
Project Server 2010中的新方法。如果CustomFieldDataSet包含新的自定义字段、 修改现有的自定义字段,并删除不在CustomFieldDataSet的自定义域, UpdateCustomFields2创建自定义字段。
在运行 Project Server 的计算机的区域和语言选项控制面板中指定的区域设置格式,可以编写CustomFieldDataSet用于计算自定义域或图形标记的公式。UpdateCustomFields2方法保存独立于语言的格式的公式。相比之下, UpdateCustomFields方法保存而不考虑的区域设置格式的公式。
警告
UpdateCustomFields方法和UpdateCustomFields2方法,以及Project Web App,所有允许您创建企业项目自定义域的类型标志,并设置将工作流控制的自定义字段。但是,Project Server 工作流无法控制标志自定义域。不应设置项目自定义域类型的工作流控制的标志。
Project Server 权限
权限 |
说明 |
|---|---|
允许用户修改企业自定义域和查阅表格值的定义。全局权限。 |
如果用户没有签出的自定义域, UpdateCustomFields2还需要管理权限,若要强制签入。
示例
下面的示例使用ReadCustomFieldsByMdPropUids和ReadCustomFieldsByMdPropUids2读取自定义字段中,并将写入customFieldDS内容CustomFieldDataSet.xml和CustomFieldDataSet2.xml,分别。除了MD_PROP_FORMULA,这两种方法返回相同的数据。
For more information, including a procedure that shows how to use Project Web App and Project Professional 2010 with the same formula, see Using Formulas and Graphical Indicators with Custom Fields.
返回由ReadCustomFieldsByMdPropUids公式域MD_PROP_FORMULA取决于的区域设置 (服务器与 Project 安装的语言) 和显示在下面的代码。
<MD_PROP_FORMULA>Switch(Not ([MSPJ188743724] >= #01/01/1984# And [MSPJ188743724] < #01/01/2050#),
"No Baseline", ([MSPJ188743685] + 1) / ([MSPJ188743686] + 1) > 1.2, "Overbudget by 20% or more",
([MSPJ188743685] + 1) / ([MSPJ188743686] + 1) > 1, "Overbudget", True, "Under budget")</MD_PROP_FORMULA>
(如以下代码所示),由ReadCustomFieldsByMdPropUids2返回公式域MD_PROP_FORMULA是独立于区域设置。它适用于不同语言安装的相同的方式。因此, ReadCustomFieldsByMdPropUids2方法优于ReadCustomFieldsByMdPropUids方法。
<MD_PROP_FORMULA><MD_PROP_FORMULA>Switch(Not ([Baseline Estimated Finish] >= #1/1/1984# And [Baseline Estimated Finish] < #1/1/2050#),
"No Baseline", ([Cost] + 1) / ([Baseline Cost] + 1) > 1.2, "Overbudget by 20% or more",
([Cost] + 1) / ([Baseline Cost] + 1) > 1, "Overbudget", True, "Under budget")</MD_PROP_FORMULA>
此外,示例修改公式和调用UpdateCustomFields2方法来更新的自定义字段,然后将更新的数据集写入到UpdatedCustomFieldData.xml
它调用CheckInCustomFields修改完成后,签入的自定义字段,并调用CheckOutCustomFields修改它们之前签出的自定义域。
The example uses the SvcCustomFields namespace in the ProjectServerServices.dll proxy assembly. The ConfigClientEndpoints method and the SetClientEndpoints method use an app.config file for setting the WCF binding, behavior, and endpoint. For information about creating a PSI proxy assembly and an app.config file, see Project 2013 中基于 WCF 的代码示例的先决条件.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ServiceModel;
namespace Microsoft.SDK.Project.Samples.TestCustomFields
{
class CustomFields
{
private static SvcCustomFields.CustomFieldsClient customFieldClient;
private static SvcResource.ResourceClient resourceClient;
private const string RES_ENDPOINT = "basicHttp_Resource";
private const string CUST_ENDPOINT = "basicHttp_CustomFields";
private const string OUTPUT_FILES = @"C:\Projects\Samples\Output\";
private static string outFilePathCustomFields;
private static string outFilePathCustomFields2;
private static string outFilePathCustomFields3;
static void Main(string[] args)
{
try
{
Guid[] customFieldID = new Guid[1];
customFieldID[0] = new Guid("4bfa524a-ce48-4a31-a2d6-5e8baa6c9d29");
ConfigClientEndpoints(CUST_ENDPOINT);
SetClientEndpoints(RES_ENDPOINT);
// If directory does not exist, create it.
if (!Directory.Exists(OUTPUT_FILES))
{
Directory.CreateDirectory(OUTPUT_FILES);
}
// Assign the path where the output XML file will be saved.
outFilePathCustomFields = OUTPUT_FILES + "CustomFieldData.xml";
outFilePathCustomFields2 = OUTPUT_FILES + "CustomFieldData2.xml";
outFilePathCustomFields3 = OUTPUT_FILES + "UpdatedCustomFieldData.xml";
// Create a custom fields dataset.
SvcCustomFields.CustomFieldDataSet customFieldDS =
new SvcCustomFields.CustomFieldDataSet();
// Read the custom fields data by using ReadCustomFieldsByMdPropUids.
customFieldDS = customFieldClient.ReadCustomFieldsByMdPropUids(
new Guid[] { customFieldID[0] }, false);
// Write the dataset to an XML file.
customFieldDS.WriteXml(outFilePathCustomFields);
Console.WriteLine("\nSee XML output of the CustomFieldDataSet at {0}",
outFilePathCustomFields);
// Read the custom fields data by using ReadCustomFieldsByMdPropUids2.
customFieldDS = customFieldClient.ReadCustomFieldsByMdPropUids2(
new Guid[] { customFieldID[0] }, false);
// Write the dataset to an XML file.
customFieldDS.WriteXml(outFilePathCustomFields2);
bool checkedOut = false;
// Get the ID of the user.
Guid me = resourceClient.GetCurrentUserUid();
// Check whether the custom field to be updated is checked out.
foreach (SvcCustomFields.CustomFieldDataSet.CustomFieldsRow custRow in customFieldDS.CustomFields)
{
if (custRow.MD_PROP_UID.ToString() == customFieldID[0].ToString())
{
if (custRow.IsNull("MD_PROP_CHECKOUTBY")) // If the custom field is not checked out.
{
// Check out the custom field.
customFieldClient.CheckOutCustomFields(new Guid[] { custRow.MD_PROP_UID });
checkedOut = true;
Console.WriteLine("Custom field checked out.....");
break;
}
else
{
// Check whether the custom field is checked out by you.
if (custRow.MD_PROP_CHECKOUTBY == me)
{
checkedOut = true;
Console.WriteLine("The custom field is already checked out by you");
break;
}
else
{
// The custom field is checked out by some other user.
checkedOut = false;
Console.WriteLine("This custom field has already been checked out");
Console.ReadLine();
break;
}
}
}
}
if (checkedOut)
{
// Modify the formula field of the custom field.
// Type the following statement in a single line.
customFieldDS.CustomFields[0].MD_PROP_FORMULA =
"Switch(Not ([Baseline Estimated Finish] >= #1/1/1984# And [Baseline Estimated Finish] < #1/1/2050#),
\"No Baseline\", ([Cost] + 1) / ([Baseline Cost] + 1) > 1.5, \"Overbudget by 50% or more\",
([Cost] + 1) / ([Baseline Cost] + 1) > 1, \"Overbudget\", True, \"Under budget\")";
// Update the dataset.
customFieldClient.UpdateCustomFields2(customFieldDS, false, false);
customFieldDS.WriteXml(outFilePathCustomFields3);
// Write the custom field data to an XML file.
Console.WriteLine("\nSee XML output of the CustomFieldDataSet at {0}",
outFilePathCustomFields3);
// Check in the custom field.
customFieldClient.CheckInCustomFields(new Guid[] { customFieldID[0] }, false);
}
}
catch (CommunicationException e)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("\n***System.ServiceModel.CommunicationException:");
Console.WriteLine(e.ToString());
Console.ResetColor();
}
finally
{
Console.Write("\r\n\r\nPress any key....");
Console.ReadKey();
}
}
// Configure the custom field client endpoints.
public static void ConfigClientEndpoints(string endpt)
{
customFieldClient = new SvcCustomFields.CustomFieldsClient(endpt);
}
// Configure the resource client endpoints.
public static void SetClientEndpoints(string ept)
{
resourceClient = new SvcResource.ResourceClient(ept);
}
}
}
使用修改后的公式域MD_PROP_FORMULA中,更新的数据集被写入UpdatedCustomFieldData.xml ,以下代码所示。
<?xml version="1.0" standalone="yes"?>
<CustomFieldDataSet xmlns="https://schemas.microsoft.com/office/project/server/webservices/CustomFieldDataSet/">
<CustomFields>
<MD_PROP_UID>4bfa524a-ce48-4a31-a2d6-5e8baa6c9d29</MD_PROP_UID>
<MD_PROP_ID>188776464</MD_PROP_ID>
<MD_PROP_UID_SECONDARY>64546b89-9a2a-49d8-b3ce-190119a3c562</MD_PROP_UID_SECONDARY> <MD_PROP_ID_SECONDARY>255885317</MD_PROP_ID_SECONDARY>
<MD_ENT_TYPE_UID>ebad93e7-2149-410d-9a39-a8680738329d</MD_ENT_TYPE_UID>
<MD_PROP_NAME>Budget Indicator</MD_PROP_NAME>
<MD_PROP_IS_WORKFLOW_CONTROLLED>false</MD_PROP_IS_WORKFLOW_CONTROLLED>
<MD_PROP_IS_REQUIRED>false</MD_PROP_IS_REQUIRED>
<MD_AGGREGATION_TYPE_ENUM>9</MD_AGGREGATION_TYPE_ENUM>
<MD_PROP_TYPE_ENUM>21</MD_PROP_TYPE_ENUM>
<MD_PROP_IS_MULTILINE_TEXT>false</MD_PROP_IS_MULTILINE_TEXT>
<MD_PROP_DESCRIPTION>Test for graphical indicator example in SDK</MD_PROP_DESCRIPTION>
<MD_PROP_MAX_VALUES>1</MD_PROP_MAX_VALUES>
<MD_PROP_FORMULA>Switch(Not ([Baseline Estimated Finish] >= #1/1/1984# And [Baseline Estimated Finish] < #1/1/2050#),
"No Baseline", ([Cost] + 1) / ([Baseline Cost] + 1) > 1.5, "Overbudget by 50% or more",
([Cost] + 1) / ([Baseline Cost] + 1) > 1, "Overbudget", True, "Under budget")</MD_PROP_FORMULA>
<MD_PROP_GRAPHICAL_INDICATOR>[[==No baseline][5]][[==Overbudget by 50% or more][3]]
[[==Overbudget][2]][[==Under budget][1]]</MD_PROP_GRAPHICAL_INDICATOR>
<MD_PROP_SUMM_GRAPHICAL_INDICATOR>[[==No baseline][5]][[==Overbudget by 50% or more][3]]
[[==Overbudget][2]][[==Under budget][1]]</MD_PROP_SUMM_GRAPHICAL_INDICATOR>
<MD_PROP_PROJ_SUMM_GRAPHICAL_INDICATOR>[[==No baseline][5]][[==Overbudget by 50% or more][3]]
[[==Overbudget][2]][[==Under budget][1]]</MD_PROP_PROJ_SUMM_GRAPHICAL_INDICATOR>
<MD_PROP_GRAPHICAL_INDICATOR_TOOLTIP>false</MD_PROP_GRAPHICAL_INDICATOR_TOOLTIP>
<MD_PROP_ROLLDOWN_TO_ASSN>false</MD_PROP_ROLLDOWN_TO_ASSN>
<MD_PROP_COPY_ON_REASSIGNMENT>false</MD_PROP_COPY_ON_REASSIGNMENT>
<MD_PROP_CHECKOUTDATE>2010-02-08T10:57:21.21-08:00</MD_PROP_CHECKOUTDATE>
<MOD_DATE>2010-02-08T11:12:40.78-08:00</MOD_DATE>
</CustomFields>
</CustomFieldDataSet>