Remove data rowで対象がずれてしまう

ExcelのA列に記載しているFALSE・TRUEの文字列がありますが、
Assign・For each・Remove data row を使い、TRUEの行を削除し、FALSEの行だけのテーブルを作成しようとしているのですが、なぜかFALSEの行も削除され幾つかTRUEの行が残ってしまいます。
ASSAINの箇所をTRUEからFALSEに変更するとうまくFALSEの行だけが削除されますが、TRUEの行の削除が出来ないので解決方法をご教示お願いします。
どんなものを使用しているかは、作成したシナリオとExcelを添付しましたのでご確認ください。
Main.xaml (13.6 KB)
test1.xlsx (1.3 MB)

.NET Frameworkを使用しているとありがちなDataTable操作の失敗で、原因は割と単純です。
DataRawの配列(pick)を作成したタイミングで「何行目にTRUEの行があるか」という情報を格納しているのが、上の方にあるTRUEの行を削除することで、DataTable側の情報と、DataRow配列の持つ情報がズレていくことに起因します。

なので、現状のフローに近い形で確実に処理をしようとすると、「1行消す→pickを取り直す」になるのです、が・・・、データ量が多いとかなり時間がかかってしまいます。UiPathのActivityだけを使うならこれが正攻法なのですが。

別の方法として、UiPathのRemove Data Rowを使わず、 .NET Frameworkの「.Delete」および「.AcceptChanges」というメソッドを呼び出す方法があります。
.Deleteメソッド(命令)は「とりあえず削除したというフラグを立てる」だけで、データの実体そのものは削除されないので、後続の行番号等には影響を及ぼしません。いわば「削除保留状態」にするわけです。
そのかわり、必要な変更(削除のフラグ立て)が終わったら、DataTableに対して、保留状態の変更を呼び出すAcceptChangesメソッドを呼び出す必要が出てきます。

.Delete と、.AcceptChanges を使用したサンプルをつけておきますので、上記のフローとどちらが良いか検討してみてください。処理的にわかりやすいのは前者ですが、速度は後者が圧倒的に速いです。

Main.xaml (16.0 KB)

Honokaさん
ご返信ありがとうございます。
サンプルもありがとうございます。
処理が速い方にして試してみたいと思います。

横から失礼致します。

また解決しているところで質問してしまい申し訳ありません。

本件と少し近いので合わせて質問させてください。

今回あるDataTableでColumn2が「削除」という文字だった場合、
行ごと削除をしたいと思っています。

そのためこちらにもあるように、
For each row内でDataTableをループして条件にあてはまったらrowを削除というシナリオを作成しました。
ですが、Remove Data Rowでも、Invoke Methodを使用しても同様のエラーが出てしまいます。
エラーは下記の画像の通りです。

サンプルも添付致します。
お忙しい所恐縮ですが、お知恵を貸していただけますでしょうか。。。。

RemoveTest.zip (9.4 KB)

Kinjo.Shogoさん

更に横レスですが…
2018.2から追加されたFilter data tableを使用すると楽ですよ :grin:

1 Like

Hi

Please take a look Removedatarow. It helps you.

Regards
Balamurugan.S

ryokoさん

ご回答ありがとうございます。
Filter data Table、初めて知りました。
とても便利でこちらを利用してみます!

その中で一点もう一つ質問させてください。

フィルターをかける際に、"値段"列が"5000"以下を除外したいと思うのですが、
エラーが出てしまいます。
こちらが設定した画面です。

wizard
Excelの書式を数値に変えてみたりしたのですが同様です。
下記がエラーです。

何か良い手はないのでしょうか。。。
お知恵を貸していただけますと助かります。

filter

Double.Parse(“5000”) にしてもだめでしょうか?

1 Like

Watanabeさん

出来ました!
ありがとうございます!
よく考えたらとても単純な事でして、
お恥ずかしい限りです。。

大変助かりました!