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

  • 相关阅读:
    Can't remove netstandard folder from output path (.net standard)
    website项目的reference问题
    The type exists in both DLLs
    git常用配置
    Map dependencies with code maps
    How to check HTML version of any website
    Bootstrap UI 编辑器
    网上职位要求对照
    Use of implicitly declared global variable
    ResolveUrl in external JavaScript file in asp.net project
  • 原文地址:https://www.cnblogs.com/TeresaMu/p/12058559.html
Copyright © 2011-2022 走看看