SDK
Más reciente
False
Imagen de fondo del banner
Guía del desarrollador
Última actualización 23 de mar. de 2024

Escribir el código de actividad

Para ejemplificar cómo escribir código de actividad, recrearemos una actividad Calculadora simple que se incluye en la solución de ejemplo UiPath.Examples.Activities que puedes descargar desde GitHub. Esta actividad toma dos números y una operación (sumar, restar, multiplicar o dividir) como entrada y devuelve el resultado de la operación seleccionada.

El código de actividad consta de dos partes: la lógica de la actividad y el diseño de la actividad.

Lógica de actividad

A partir de UiPath.Activities.Template, cambiaremos el nombre de la solución y todos los archivos y referencias relacionados a UiPath.Examples.Activities.

  1. Cambia el nombre del archivo que contiene la lógica de la actividad de ActivityTemplate.cs a Calculator.cs.
  2. Actualiza las referencias y el espacio de nombres de la siguiente manera:

    using System.Activities;
    using System.Diagnostics;
    using UiPath.Examples.Activities.Helpers;
    
    namespace UiPath.Examples.Activities
    {
    }using System.Activities;
    using System.Diagnostics;
    using UiPath.Examples.Activities.Helpers;
    
    namespace UiPath.Examples.Activities
    {
    }
  3. Declara los argumentos de entrada: dos números (FirstNumber y SecondNumber como int) y la operación a realizar (SelectedOperation como enum, con un valor predeterminado opcional establecido en Multiply). Marca los tres argumentos como necesarios utilizando el atributo [RequiredArgument] . El valor devuelto se utilizará para establecer el valor del argumento Resultado.
    public class Calculator : CodeActivity<int> // This base class exposes an OutArgument named Result
        {
            [RequiredArgument]
            public InArgument<int> FirstNumber { get; set; } //InArgument allows a varriable to be set from the workflow
    
            [RequiredArgument]
            public InArgument<int> SecondNumber { get; set; }
    
            [RequiredArgument]
            public Operation SelectedOperation { get; set; } = Operation.Multiply; // default value is optional
    
            /*
             * The returned value will be used to set the value of the Result argument
             */
        }    public class Calculator : CodeActivity<int> // This base class exposes an OutArgument named Result
        {
            [RequiredArgument]
            public InArgument<int> FirstNumber { get; set; } //InArgument allows a varriable to be set from the workflow
    
            [RequiredArgument]
            public InArgument<int> SecondNumber { get; set; }
    
            [RequiredArgument]
            public Operation SelectedOperation { get; set; } = Operation.Multiply; // default value is optional
    
            /*
             * The returned value will be used to set the value of the Result argument
             */
        }
  4. Comenzando la parte de ejecución, agregaremos el registro, obtendremos los valores de los números del contexto del flujo de trabajo y agregaremos la lógica para manejar el escenario de una división por cero.

    protected override int Execute(CodeActivityContext context)
            {
                // This is how you can log messages from your activity. logs are sent to the Robot which will forward them to Orchestrator
                context.GetExecutorRuntime().LogMessage(new Robot.Activities.Api.LogMessage()
                {
                    EventType = TraceEventType.Information,
                    Message = "Executing Calculator activity"
                });
    
                var firstNumber = FirstNumber.Get(context); //get the value from the workflow context (remember, this can be a variable)
                var secondNumber = SecondNumber.Get(context);
    
                if (secondNumber == 0 && SelectedOperation == Operation.Divide)
                {
                    throw new DivideByZeroException("Second number should not be zero when the selected operation is divide");
                }
    
                return ExecuteInternal(firstNumber, secondNumber);
            } protected override int Execute(CodeActivityContext context)
            {
                // This is how you can log messages from your activity. logs are sent to the Robot which will forward them to Orchestrator
                context.GetExecutorRuntime().LogMessage(new Robot.Activities.Api.LogMessage()
                {
                    EventType = TraceEventType.Information,
                    Message = "Executing Calculator activity"
                });
    
                var firstNumber = FirstNumber.Get(context); //get the value from the workflow context (remember, this can be a variable)
                var secondNumber = SecondNumber.Get(context);
    
                if (secondNumber == 0 && SelectedOperation == Operation.Divide)
                {
                    throw new DivideByZeroException("Second number should not be zero when the selected operation is divide");
                }
    
                return ExecuteInternal(firstNumber, secondNumber);
            }
  5. Añade los cálculos a ejecutar para cada operación seleccionada.

    public int ExecuteInternal(int firstNumber, int secondNumber)
            {
                return SelectedOperation switch
                {
                    Operation.Add => firstNumber + secondNumber,
                    Operation.Subtract => firstNumber - secondNumber,
                    Operation.Multiply => firstNumber * secondNumber,
                    Operation.Divide => firstNumber / secondNumber,
                    _ => throw new NotSupportedException("Operation not supported"),
                };
            }        public int ExecuteInternal(int firstNumber, int secondNumber)
            {
                return SelectedOperation switch
                {
                    Operation.Add => firstNumber + secondNumber,
                    Operation.Subtract => firstNumber - secondNumber,
                    Operation.Multiply => firstNumber * secondNumber,
                    Operation.Divide => firstNumber / secondNumber,
                    _ => throw new NotSupportedException("Operation not supported"),
                };
            }
  6. Defina las operaciones.

    public enum Operation
        {
            Add,
            Subtract,
            Multiply,
            Divide
        } public enum Operation
        {
            Add,
            Subtract,
            Multiply,
            Divide
        }

Diseño de actividad

Las entradas disponibles en una actividad están determinadas por los tipos de datos de las propiedades. En la actividad Calculadora de ejemplo, el tipo de datos int de las propiedades FirstNumber y SecondNumber da como resultado un editor de números como campo de entrada para las propiedades, mientras que para Operation, que tiene el tipo de datos enum , un menú desplegable estará disponible en la actividad.

Las etiquetas y la información sobre herramientas de las propiedades se pueden definir en el archivo Resources.resx.

La siguiente tabla describe las propiedades más comunes disponibles para cada propiedad de actividad.

PropiedadDescripción
NombreParaMostrarLa etiqueta de la propiedad.
Información sobre herramientasEl texto que se mostrará al pasar el ratón por encima de la propiedad
Es obligatorio1Si la propiedad es obligatoria. Las propiedades requeridas también deben marcarse en la actividad utilizando el atributo [RequiredArgument] .
EsPrincipal2Si la propiedad debe estar siempre visible en la categoría principal de la actividad. Si se establece en false, la propiedad aparece en un menú Mostrar opciones avanzadas que está contraído de forma predeterminada.
ÍndiceDeOrdenEl orden en el que se muestra la propiedad.

1 No disponible para las propiedades de salida, que nunca son obligatorias.

2 Por convención, las propiedades de salida se colocan al final de la actividad en las opciones avanzadas.

Crear el diseño para la actividad Calculadora

  1. Cambia el nombre del archivo ActivityTemplateViewModel.cs a CalculatorViewModel.cs y añade el código para la interfaz de usuario de la actividad.
  2. Actualiza las referencias y el espacio de nombres de la siguiente manera:

    using System.Activities.DesignViewModels;
    using System.Diagnostics;
    
    namespace UiPath.Examples.Activities.ViewModels
    {
    }using System.Activities.DesignViewModels;
    using System.Diagnostics;
    
    namespace UiPath.Examples.Activities.ViewModels
    {
    }
  3. Declara las propiedades de entrada. La propiedad de resultado proviene de la clase base de la actividad. Los nombres y los argumentos de tipo deben coincidir con los de la actividad.

    public class CalculatorViewModel : DesignPropertiesViewModel
        {
            /*
             * Properties names must match the names and generic type arguments of the properties in the activity
             * Use DesignInArgument for properties that accept a variable
             */
            public DesignInArgument<int> FirstNumber { get; set; }
            public DesignInArgument<int> SecondNumber { get; set; }
            /*
             * Use DesignProperty for properties that accept a constant value                
             */
            public DesignProperty<Operation> SelectedOperation { get; set; }
             /*
             * The result property comes from the activity's base class
             */
            public DesignOutArgument<int> Result { get; set; }
            
            public CalculatorViewModel(IDesignServices services) : base(services)
            {
            }
        }public class CalculatorViewModel : DesignPropertiesViewModel
        {
            /*
             * Properties names must match the names and generic type arguments of the properties in the activity
             * Use DesignInArgument for properties that accept a variable
             */
            public DesignInArgument<int> FirstNumber { get; set; }
            public DesignInArgument<int> SecondNumber { get; set; }
            /*
             * Use DesignProperty for properties that accept a constant value                
             */
            public DesignProperty<Operation> SelectedOperation { get; set; }
             /*
             * The result property comes from the activity's base class
             */
            public DesignOutArgument<int> Result { get; set; }
            
            public CalculatorViewModel(IDesignServices services) : base(services)
            {
            }
        }
  4. Añade el código para el diseño de la actividad. Opcionalmente, podemos añadir un punto de interrupción para depurar la inicialización de ViewModel descomentando la línea que contiene Debugger.Break();. Inicializaremos las propiedades del ModeloDeVista, añadiremos una llamada PersistValuesChangedDuringInit() que es obligatoria cuando se cambian los valores de propiedad durante la inicialización, y definiremos las propiedades de entrada y salida de la actividad.

    El código debe tener el siguiente aspecto:

    protected override void InitializeModel()
            {
               //Debugger.Break(); 
                /*
                 * The base call will initialize the properties of the view model with the values from the xaml or with the default values from the activity
                 */
                base.InitializeModel();
    
                PersistValuesChangedDuringInit(); // just for heads-up here; it's a mandatory call only when you change the values of properties during initialization
    
                var orderIndex = 0;
    
                FirstNumber.DisplayName = Resources.Calculator_FirstNumber_DisplayName;
                FirstNumber.Tooltip = Resources.Calculator_FirstNumber_Tooltip;
                /*
                 * Required fields will automatically raise validation errors when empty.
                 * Unless you do custom validation, required activity properties should be marked as such both in the view model and in the activity:
                 *   -> in the view model use the IsRequired property
                 *   -> in the activity use the [RequiredArgument] attribute.
                 */
                FirstNumber.IsRequired = true;
    
                FirstNumber.IsPrincipal = true; // specifies if it belongs to the main category (which cannot be collapsed)
                FirstNumber.OrderIndex = orderIndex++; // indicates the order in which the fields appear in the designer (i.e. the line number);
    
                SecondNumber.DisplayName = Resources.Calculator_SecondNumber_DisplayName;
                SecondNumber.Tooltip = Resources.Calculator_SecondNumber_Tooltip;
                SecondNumber.IsRequired = true;
                SecondNumber.IsPrincipal = true;
                SecondNumber.OrderIndex = orderIndex++;
    
                SelectedOperation.DisplayName = Resources.Calculator_SelectedOperation_DisplayName;
                SelectedOperation.Tooltip = Resources.Calculator_SelectedOperation_Tooltip;
                SelectedOperation.IsRequired = true;
                SelectedOperation.IsPrincipal = true;
                SelectedOperation.OrderIndex = orderIndex++;
    
                /*
                 * Output properties are never mandatory.
                 * By convention, they are not principal and they are placed at the end of the activity.
                 */
                Result.DisplayName = Resources.Calculator_Result_DisplayName;
                Result.Tooltip = Resources.Calculator_Result_Tooltip;
                Result.OrderIndex = orderIndex;
            } protected override void InitializeModel()
            {
               //Debugger.Break(); 
                /*
                 * The base call will initialize the properties of the view model with the values from the xaml or with the default values from the activity
                 */
                base.InitializeModel();
    
                PersistValuesChangedDuringInit(); // just for heads-up here; it's a mandatory call only when you change the values of properties during initialization
    
                var orderIndex = 0;
    
                FirstNumber.DisplayName = Resources.Calculator_FirstNumber_DisplayName;
                FirstNumber.Tooltip = Resources.Calculator_FirstNumber_Tooltip;
                /*
                 * Required fields will automatically raise validation errors when empty.
                 * Unless you do custom validation, required activity properties should be marked as such both in the view model and in the activity:
                 *   -> in the view model use the IsRequired property
                 *   -> in the activity use the [RequiredArgument] attribute.
                 */
                FirstNumber.IsRequired = true;
    
                FirstNumber.IsPrincipal = true; // specifies if it belongs to the main category (which cannot be collapsed)
                FirstNumber.OrderIndex = orderIndex++; // indicates the order in which the fields appear in the designer (i.e. the line number);
    
                SecondNumber.DisplayName = Resources.Calculator_SecondNumber_DisplayName;
                SecondNumber.Tooltip = Resources.Calculator_SecondNumber_Tooltip;
                SecondNumber.IsRequired = true;
                SecondNumber.IsPrincipal = true;
                SecondNumber.OrderIndex = orderIndex++;
    
                SelectedOperation.DisplayName = Resources.Calculator_SelectedOperation_DisplayName;
                SelectedOperation.Tooltip = Resources.Calculator_SelectedOperation_Tooltip;
                SelectedOperation.IsRequired = true;
                SelectedOperation.IsPrincipal = true;
                SelectedOperation.OrderIndex = orderIndex++;
    
                /*
                 * Output properties are never mandatory.
                 * By convention, they are not principal and they are placed at the end of the activity.
                 */
                Result.DisplayName = Resources.Calculator_Result_DisplayName;
                Result.Tooltip = Resources.Calculator_Result_Tooltip;
                Result.OrderIndex = orderIndex;
            }
  5. Añade los valores de cadena para las etiquetas y la información sobre herramientas en el archivo Resources.resx como en la siguiente imagen. Para fines de localización, debes utilizar comentarios específicos para el nombre de la actividad (Activity name) y la descripción de la actividad (Activity description). Para otras cadenas, se recomienda añadir comentarios, pero no es obligatorio.


En Studio, la configuración da como resultado lo siguiente:



1: etiquetas (nombres para mostrar) de las tres propiedades de entrada.

2: información sobre herramientas para la propiedad FirstNumber .
  • Lógica de actividad
  • Diseño de actividad
  • Crear el diseño para la actividad Calculadora

Was this page helpful?

Obtén la ayuda que necesitas
RPA para el aprendizaje - Cursos de automatización
Foro de la comunidad UiPath
Logotipo blanco de UiPath
Confianza y seguridad
© 2005-2024 UiPath. All rights reserved.