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)
Hi
Please take a look Removedatarow. It helps you.
Regards
Balamurugan.S
ryokoさん
ご回答ありがとうございます。
Filter data Table、初めて知りました。
とても便利でこちらを利用してみます!
その中で一点もう一つ質問させてください。
フィルターをかける際に、"値段"列が"5000"以下を除外したいと思うのですが、
エラーが出てしまいます。
こちらが設定した画面です。
Excelの書式を数値に変えてみたりしたのですが同様です。
下記がエラーです。
何か良い手はないのでしょうか。。。
お知恵を貸していただけますと助かります。
Double.Parse(“5000”) にしてもだめでしょうか?
Watanabeさん
出来ました!
ありがとうございます!
よく考えたらとても単純な事でして、
お恥ずかしい限りです。。
大変助かりました!