UiPath - DataTable.Select()

其实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不太常用这里就不介绍了,感兴趣的小伙伴可以自己查~


扫描二维码关注公众号,回复: 8228121 查看本文章

我们来看一个实例。假如有一个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

猜你喜欢

转载自www.cnblogs.com/TeresaMu/p/12058559.html
今日推荐