Crear un iterador utilizando el paquete SDK

En Automation 360, puede crear un iterador con el paquete SDK. Un iterador se utiliza para recorrer varios objetos de tipo similar y junto con el paquete Bucle. Consta de dos métodos, next y hasNext, que devuelven el objeto real y un valor booleano.

Anotaciones obligatorias

Cuando se utiliza el iterador, el método next devuelve el siguiente valor disponible. Si no hay más valores disponibles, se muestra una excepción. El método hasNext revisa si hay otros valores y devuelve false si no hay más valores disponibles. En Automation 360, cuando se ejecuta el bucle, hasNext() se llama primero, y next() se llama solo si hasNext() devuelve un valor true.

Para crear un iterador, se requieren las siguientes anotaciones.

Anotación Uso
BotCommand Utilice la anotación BotCommand con un iterator como el commandType. Esto garantiza que el objeto Java antiguo sin formato (POJO) se pueda utilizar para crear un iterador Automation 360.
CommandPkg Cuando cree un paquete, proporcione un nombre, una etiqueta y una descripción para la anotación.
Idx Anote todos los parámetros y las variables miembro que se requieren y que ayudan con la comprobación de la validación, o se pueden mostrar en la interfaz para la entrada. Proporcione el Idx y el tipo.
Pkg Anote todos los parámetros y variables miembro que se mostrarán en la interfaz. Esta anotación será ignorada si no va acompañada de la etiqueta Idx.
HasNext El método al que hay acceder para comprobar si la iteración tiene más elementos (devuelve true si next() devuelve un elemento en lugar de lanzar una excepción). Debe devolver un valor booleano.

Si el método acepta parámetros, estos se deben anotar con el Idx. El método hasNext lo verifica y devuelve false si no hay más valores disponibles. En Automation 360, cuando Bucle se ejecuta hasNext() se llama primero. next() se llama solo si hasNext() devuelve un valor true.

Next El método devuelve el siguiente valor disponible en la iteración. El tipo de retorno es un valor. Si no hay otro valor disponible, se muestra una excepción.
Ejemplo de caso de uso

El caso de uso de ejemplo recorre el número de veces, por ejemplo, para construcción Java (int i=0; I<n; i++). Acepta el valor de n del Bot Creator cuando se crea el bot.

  1. Asegúrese de que importó los siguientes paquetes para garantizar que todas las funcionalidades funcionan como se describe en el ejemplo.
    import com.automationanywhere.botcommand.data.Value;
    import com.automationanywhere.botcommand.data.impl.NumberValue;
    import com.automationanywhere.commandsdk.annotations.BotCommand;
    import com.automationanywhere.commandsdk.annotations.CommandPkg;
    import com.automationanywhere.commandsdk.annotations.HasNext;
    import com.automationanywhere.commandsdk.annotations.Idx;
    import com.automationanywhere.commandsdk.annotations.Inject;
    import com.automationanywhere.commandsdk.annotations.Next;
    import com.automationanywhere.commandsdk.annotations.Pkg;
    import com.automationanywhere.commandsdk.annotations.BotCommand.CommandType;
    import com.automationanywhere.commandsdk.annotations.rules.GreaterThanEqualTo;
    import com.automationanywhere.commandsdk.annotations.rules.NotEmpty;
    import com.automationanywhere.commandsdk.annotations.rules.NumberInteger;
    import com.automationanywhere.commandsdk.model.AttributeType;
    import com.automationanywhere.commandsdk.model.DataType;
  2. Cree la clase POJO con la lógica de negocio.

    Asegúrese de que el POJO tenga un método y que devuelva un valor booleano. Esto actuará como método de comparación.

    @BotCommand(commandType=CommandType.Iterator)
    @CommandPkg(return_label = "Return the value in variable", node_label = ": {{times}} times", 
    label = "Iterator demo", description = "Iterate number of times", name = "iteratorTypeDemo", return_type = DataType.NUMBER)
    public class IteratorTypeDemo {
        @Idx(index = "1", type = AttributeType.NUMBER)
        @Pkg(label = "times", default_value = "10", default_value_type = DataType.NUMBER)
        @GreaterThanEqualTo("0")
        @NumberInteger
        @NotEmpty
        @Inject
    	private Double times = 10d;
    
    	private Double counter = 0d;
    
        @HasNext
        public boolean hasNext() {
    		return counter < times;
        }
    
        @Next
        public Value<Double> next() throws Exception{
    		if (counter >= times)
    			throw new Exception("Counter '"+ counter +"' is exceed the times limit '"+times+"'");
    
    		counter++;
            NumberValue result = new NumberValue();
            result.set(counter);
            return result;
        }
    
        public void setTimes(Double times) {
            this.times = times;
        }
    }
  3. Anote la clase POJO para habilitarla para el iterador Automation 360 y para crear un paquete.
    @BotCommand(commandType = CommandType.Iterator)
    @CommandPkg(return_label = "Return the value in variable", node_label = ": {{times}} times",
    	label = "Iterator demo", description = "Iterate number of times", name = "iteratorTypeDemo", return_type = DataType.NUMBER)
    public class IteratorTypeDemo {
    
    	private Double times = 10 d;
    	private Double counter = 0 d;
    
    	public boolean hasNext() {
    		return counter < times;
    	}
  4. Anote adecuadamente el método hasNext() y next().
    @HasNext
    public boolean hasNext() {
    	return counter < times;
    }
    
    @Next
    public Value < Double > next() throws Exception {
    	if (counter >= times)
    		throw new Exception("Counter '" + counter + "' is exceed the times limit '" + times + "'");
    
    	counter++;
    	NumberValue result = new NumberValue();
    	result.set(counter);
    	return result;
    }

    Los métodos se nombran de forma sencilla y están en paralelo con la interfaz del iterador de Java. No hay restricciones del lado de SDK cuando se nombran los métodos.

    En un iterador, no utilice métodos de parámetros, sino que utilice setter injection.

  5. Anote las variables con Idx y Pkg.

    Agregue @NotEmpty para garantizar que el valor no es nulo, y agregue @GreaterThanEqualTo para garantizar que el valor es siempre mayor que 0.

    @Idx(index = "1", type = AttributeType.NUMBER)
    @Pkg(label = "times", default_value = "10", default_value_type = DataType.NUMBER)
    @GreaterThanEqualTo("0")
    @NotEmpty
    @Inject
    private Double times = 10 d;

    El número de tipo de atributo devuelve un Double.