RPA流程机器人

本页目录

对账场景下DataTable使用技巧

更新时间:2024-08-23 10:39:30

一、背景概述

对账场景是我们RPA常见的应用场景,一般可以借助数据库组件,把数据先导入到本地数据库再处理,也可以直接使用DataTable进行处理,下面我们通过一个具体例子来讲解对账场景下DataTable的一些使用技巧。

二、方案介绍

假设有2张表,每日入账表,记录每日入账金额,一天只有一笔数据,每日交易明细表,记录每笔交易流水明细信息,一天有多笔数据。

对账要求:

(1)分别统计汇总每日入账表总金额、交易明细表总金额;

(2)核对每一天的入账金额和交易金额,对一致的标注为是,不一致的标注为否。

表格数据如下:

每日入账表

入账日期 入账金额
20240801 500
20240802 300
20240803 100

交易明细表

交易日期 交易金额
20240801 300
20240801 200
20240802 300
20240802 50
20240803 100

1. 总金额计算

假设现在每日入账表已写入 creditDt,交易明细表已写入 transDt。

 // 汇总每日入账表金额
decimal creditTotalAmt = creditDt.Select().Sum(r => Decimal.Parse(r["入账金额"].ToString()));

// 汇总交易明细表金额
decimal transTotalAmt = transDt.Select().Sum(r => Decimal.Parse(r["交易金额"].ToString()));

2. 明细汇总

// 新建明细汇总summaryDt
DataTable summaryDt = new DataTable("交易明细汇总表");
summaryDt.Columns.Add(new DataColumn("交易日期", typeof(string)));
summaryDt.Columns.Add(new DataColumn("交易金额", typeof(decimal)));

DataRow newRow;
// 分组聚合后写入summaryDt
transDt.Select().GroupBy(r => new {date = r["交易日期"]}).Select(
    r => new 
    {
        date = r.First()["交易日期"],
        groupAmt = r.Sum(s => Decimal.Parse(s["交易金额"].ToString()))
    }
).ToList().ForEach(r => {
    newRow = summaryDt.NewRow();
    newRow["交易日期"] = r.date;
    newRow["交易金额"] = r.groupAmt;
    summaryDt.Rows.Add(newRow);
});

3. 比对明细汇总表和每日入账表

// creditDt和transDt 增加“是否一致” 列,并初始化
creditDt.Columns.Add(new DataColumn("是否一致", typeof(string)));
transDt.Columns.Add(new DataColumn("是否一致", typeof(string)));

foreach (DataRow r in creditDt.Rows)
{
 r["是否一致"] = "否";
}

foreach (DataRow r in transDt.Rows)
{
 r["是否一致"] = "否";
}

// 遍历summaryDt与creditDt进行比对
DataRow[] dataRows;
foreach(DataRow row in summaryDt.Select())
{
    string transDate = row["交易日期"].ToString();
    decimal transAmt = Decimal.Parse(row["交易金额"].ToString());
   
    // 条件筛选(根据交易日期和交易金额筛选入账表是否有符合的记录)
    var creditMatchRows = creditDt.Select().Where( 
        t => t["入账日期"].ToString().Equals(transDate) && Decimal.Parse(t["入账金额"].ToString()) == transAmt
    ).ToArray();
  
    if (creditMatchRows.Count() == 1)
    {
        // 入账表标注“是否一致” 为“是”
        creditMatchRows[0]["是否一致"] = "是";
  
        //交易明细表标注
        transDt.Select("交易日期='" + transDate + "'");
        foreach(DataRow r in dataRows)
        {
        	r["是否一致"] = "是";
        }
    }
}
< 上一篇:客户端下载Excel文件读取报错处理技巧