zoukankan      html  css  js  c++  java
  • UiPath

    其实UiPath自带的Filter DataTable活动可以满足多数情况下的数据筛选,如果你感兴趣的话也可以学习一下通过DataTable的Select()方法实现。

    p.s.貌似Select()方法可能对RE Framework的考试有点用处~ 

    先简单介绍一下DataTable的Select()方法,不知道DataTable是啥的小伙伴请重修UiPath Level 1的相关课程

    DataTable.Select()方法

    根据参数指定的筛选条件,对DataTable的数据行进行筛选,返回符合条件的所有行。

    • 返回值的类型是一个DataRow的数组(显示在UiPath里就是DataRow[])。

    语法:Select(filterExpression[, sort])

    参数:1) filterExpression:必选参数,用来表示筛选条件,类型是字符串(String)。

       2) sort:可选参数,用来指定返回结果的排序方式,类型也是字符串。sort不太常用这里就不介绍了,感兴趣的小伙伴可以自己查~


    我们来看一个实例。假如有一个Excel表格如下(第一列订单编号,第二列商品名称,第三列数量)。

    我们的需求是用UiPath找出同时符合下列条件的行:

    • Order ID = 11003
    • Quantity >= 50
    • Product Name = DLL1001或ASL1003

    开始做!首先是前置工作。

    • 用Read Range活动读取Excel的数据,存放在一个DataTable变量里,这个变量叫order_Dt。
    • 还需要创建一个DataRow的数组用来存放Select()的结果,这个变量叫result_Rows。

    现在我们使用Select()筛选。拖一个Assign活动,左边填入刚才创建的变量result_Rows,右边的写法如下:

    order_Dt.Select("[Order ID] = '11003' AND [Quantity] >= 50 AND [Product Name] IN('DLL1001', 'ASL1003')")

    我们一部分一部分看:

    • order_Dt.Select():要筛选的DataTable即order_Dt,写在Select()前面,中间用点连接。
    • order_Dt.Select("......"):Select()括号里面的整个条件都需要用双引号括起来,因为参数filterExpression是个字符串,引用字符串必须用双引号。
    • [Order ID] = '11003':对于filterExpression参数里的条件表达式,列名要用中括号括起,值如果是字符串的话用单引号括起。
    • [Order ID] = '11003' AND [Quantity] >= 50:多个条件表达式可以用逻辑运算符AND、OR连接。
    • [Product Name] IN('DLL1001', 'ASL1003'):如果条件为一个列表,可以用IN关键字表示,即[col name] IN(Value1, Value2, Value3...)。

    以上。 


    有时候可能需要在筛选条件里引入一些变量,让筛选变成动态的,这个Select()也可以实现。 

    我们来看看怎么把“Product Name = DLL1001或ASL1003”这个条件用变量表示。

    • 首先创建一个字符串数组String[],变量名为arr_ProdName。用Assign赋值,arr_ProdName = {"'DLL1001'", "'ASL1003'"}
      • 注意:字符串用双引号括起来,双引号内部还有一层单引号,[双引号][单引号]字符串[单引号][双引号]。
      • 这里的单引号是字符串的一部分,因为Select()的条件表达式里,字符串需要用单引号括起来。如果是数值的话就不需要单引号和双引号了。
    • 然后再创建一个字符串变量(不是数组),变量名为str_Criteria。用Assign赋值str_Criteria = String.Join(",", arr_ProdName)
      • String.Join()方法可以把一个数组的所有元素连接成一个字符串,它的第一个参数是连接符(注意要用双引号括起来),第二个参数是要连接的数组。
      • 此例中连接符是逗号,连接的数组是arr_ProdName,这个数组里有两个元素,'DLL1001'和'ASL1003'(单引号不是为了引用字符串加上的,单引号本身就是字符串的一部分)。
      • 最后的连接结果就是'DLL1001','ASL1003'这样一个字符串。实际上,上面这些操作都是为了获得符合Select()要求的条件格式。
    • 最后的Select()的写法改为:order_Dt.Select("[Order ID] = '11003' AND [Quantity] >= 20 OR [Product Name] IN (" + str_Criteria + ")")
      • 就和平时用变量替换一部分字符串的写法是一样一样的,用+号连接左右两边的字符串。

    这就是Select()方法的一些基本用法了,看上去麻烦可能是因为我写的太罗嗦,用个一两遍你就会了

    还有最后一个问题,最后得到了一个DataRow[],怎么去用它呢?

    你当然可以像处理其他数组一样去循环这个DataRow数组,但如果你想把它变成DataTable可以吗?

    可以的。

    假如我们要把筛选后的DataRow数组变量result_Rows赋值给一个DataTable变量result_Dt。

    使用Assign赋值,result_Dt = result_Rows.CopyToDataTable。

    • 务必在赋值前加一个判断,result_Rows.Count > 0。因为如果最后的筛选结果为空,也就是数组里一个row也没有,此时赋值给DataTable变量时会抛出异常。
    • 如果你的Assign出现了编译错误,就是Assign活动的右边出现了蓝色小叹号,错误提示大意是说你不能对一个DataRow的Array使用CopyToDatatable方法。此时你可能需要手动修改一下你的xaml文件,以解决这个问题。
      • 关闭UiPath,找到你刚才编辑的那个程序,它是个后缀为.xaml的文件。
      • 右键这个xaml文件,用记事本打开它,也可以用Notepad++,VS Code之类的代码编辑器打开。
      • 打开后就是这个程序的源代码,你需要找到长下面这个样子的部分,并加上一句:<AssemblyReference>System.Data.DataSetExtensions</AssemblyReference>
      • 保存文件,退出。重新打开,应该就不会存在那个编译错误了。

    以上内容供大家一起学习研究。我只是个小菜鸡,如果有写的不对的地方,欢迎大家友好指正。

    相关内容出处

    http://www.surfandperf.com/2019/05/uipath-how-to-filter-multiple-dynamic.html

    https://forum.uipath.com/t/datatable-select/22419

    https://forum.uipath.com/t/how-to-filter-data-table-with-variable/29539

    https://forum.uipath.com/t/how-to-convert-a-system-data-datarow-in-a-datatable/19946

  • 相关阅读:
    Q15格式表示负小数
    音频算法处理笔试面试题
    有符号和无符号之间的转化
    PE5 Smallest multiple
    PE3 Largest prime factor(最大素数因子)
    PE2 Even Fibonacci numbers(最大菲波那列偶数)
    PE 4 Largest palindrome product(最大回文)
    PE1 Multiples of 3 and 5
    Codevs高精度入门(减法、加法和乘法)解题报告
    计算机网络学习笔记(二) 计算机网络结构
  • 原文地址:https://www.cnblogs.com/TeresaMu/p/12058559.html
Copyright © 2011-2022 走看看