Compartir a través de


del método CustomFields.UpdateCustomFields2

Crea, modifica o elimina los campos personalizados de empresa, donde las fórmulas se encuentran en un formato dependen del idioma.

Espacio de nombres:  WebSvcCustomFields
Ensamblado:  ProjectServerServices (en ProjectServerServices.dll)

Sintaxis

'Declaración
<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 _
)
'Uso
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
)

Parámetros

  • validateOnly
    Tipo: System.Boolean

    Si true, validar la CustomFieldDataSet.

  • autoCheckIn
    Tipo: System.Boolean

    Si true, verificación de los campos personalizados después de que se actualicen.

Comentarios

Nuevo método en Project Server 2010. UpdateCustomFields2 crea campos personalizados si el CustomFieldDataSet incluye nuevos campos personalizados, modifica los campos personalizados existentes y elimina los campos personalizados que no están en la CustomFieldDataSet.

Pueden escribir fórmulas en el CustomFieldDataSet que se usan para calcular los campos personalizados o indicadores gráficos en el formato de la configuración regional especificado en el panel de control de Configuración Regional e idioma del equipo que ejecuta Project Server. El método UpdateCustomFields2 guarda las fórmulas en un formato independiente del idioma. En comparación, el método UpdateCustomFields guarda las fórmulas sin tener en cuenta el formato de la configuración regional.

Advertencia

El método UpdateCustomFields y el método UpdateCustomFields2 , así como Project Web App, permiten crear un campo personalizado de proyecto de empresa de tipo de marca y establezca el campo personalizado como flujo de trabajo controlado. Sin embargo, los flujos de trabajo de Project Server no pueden controlar los campos personalizados de indicador. No deben establecer los campos personalizados de proyecto del tipo de marca para el control de flujo de trabajo.

Permisos de Project Server

Permiso

Descripción

ManageEnterpriseCustomFields

Permite que un usuario modificar las definiciones de campos personalizados de empresa y los valores de tabla de búsqueda. Permiso global.

Si el usuario no ha desprotegido los campos personalizados, UpdateCustomFields2 también requiere permisos administrativos para forzar la protección de.

Ejemplos

En el siguiente ejemplo utiliza ReadCustomFieldsByMdPropUids y ReadCustomFieldsByMdPropUids2 para leer un campo personalizado y, a continuación, escribe el contenido de customFieldDSCustomFieldDataSet.xml y CustomFieldDataSet2.xml, respectivamente. Excepto MD_PROP_FORMULA, los dos métodos devuelven los mismos datos.

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.

El campo de fórmula MD_PROP_FORMULA devuelto por ReadCustomFieldsByMdPropUids depende de la configuración regional (el idioma del servidor y la instalación de Project) .y se muestra en el siguiente código.

<MD_PROP_FORMULA>Switch(Not ([MSPJ188743724] &gt;= #01/01/1984# And [MSPJ188743724] &lt; #01/01/2050#), 
"No Baseline", ([MSPJ188743685] + 1) / ([MSPJ188743686] + 1) &gt; 1.2, "Overbudget by 20% or more", 
([MSPJ188743685] + 1) / ([MSPJ188743686] + 1) &gt; 1, "Overbudget", True, "Under budget")</MD_PROP_FORMULA>

El campo de fórmula MD_PROP_FORMULA devuelto por ReadCustomFieldsByMdPropUids2 (como se muestra en el siguiente código) es independiente de la configuración regional. Funciona del mismo modo en las instalaciones de idioma diferente. Por este motivo, el método ReadCustomFieldsByMdPropUids2 se prefiere sobre el método ReadCustomFieldsByMdPropUids .

<MD_PROP_FORMULA><MD_PROP_FORMULA>Switch(Not ([Baseline Estimated Finish] &gt;= #1/1/1984# And [Baseline Estimated Finish] &lt; #1/1/2050#), 
"No Baseline", ([Cost] + 1) / ([Baseline Cost] + 1) &gt; 1.2, "Overbudget by 20% or more", 
([Cost] + 1) / ([Baseline Cost] + 1) &gt; 1, "Overbudget", True, "Under budget")</MD_PROP_FORMULA>

Además, en el ejemplo se modifica la fórmula y llama al método UpdateCustomFields2 para actualizar el campo personalizado y, a continuación, escribe el conjunto de datos actualizado en UpdatedCustomFieldData.xml

Se llama a la CheckInCustomFields para buscar en el campo personalizado después de la modificación y llama a la CheckOutCustomFields para desproteger los campos personalizados antes de modificarlas.

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 Prerequisites for WCF-Based Code Samples.

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);
        }

    }
}

El conjunto de datos actualizado, con el campo de fórmula modificada MD_PROP_FORMULA, se escribe en UpdatedCustomFieldData.xml y se muestra en el siguiente código.

<?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] &gt;= #1/1/1984# And [Baseline Estimated Finish] &lt; #1/1/2050#), 
"No Baseline", ([Cost] + 1) / ([Baseline Cost] + 1) &gt; 1.5, "Overbudget by 50% or more", 
([Cost] + 1) / ([Baseline Cost] + 1) &gt; 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>

Vea también

Referencia

clase CustomFields

Miembros CustomFields

Espacio de nombres WebSvcCustomFields

UpdateCustomFields(CustomFieldDataSet, Boolean, Boolean)