テーブルフィルタで、上位10件だけを取得したい

Aというテーブルから、条件を指定し、当てはまったもののうち、上位10件だけを格納した新しいテーブルBを作成したいのですが、どのように設定したら良いでしょうか?

こんにちは

フィルターデータテーブルアクティビティで条件に合致するものの抽出までは、できていますでしょうか?

それの出力をdtとすると、代入アクティビティで

dtResult = ddt.AsEnumerable.Take(10).CopyToDataTable()

で取得できます。

1 Like

すみません、2点質問があります。

やりたいこと
・エクセルに記載された番号を社内システムに登録したい(一括処理できるのは10件のみ)

・登録時に社内システムに表示されるステータス(テキスト要素)を取得して、結果を行ごと保持したい

・エクセルにステータス列を追記したい

1.エクセルデータを読み込み、UiPathのテーブルを活用して処理させる方法

2.エクセルスコープを使い、都度エクセルからデータを取得し処理させる方法

質問1
1.と2.だと、どちらの処理がおすすめですか?(処理速度やエラー処理含めて)

質問2
1の場合、テーブルを10件ごと処理させて、処理結果を処理結果列に行ごともちたいのですが(処理完了後まとめてエクセルに書き出し)どのようなWFにしたらよいでしょうか?

知恵をお貸しください、よろしくお願いします。

こんにちは

おそらく2択ではなく、要件にあわせて設計する必要があると思います。あくまで一般的なケースを
想定しますと
読み込みは一括でDataTableに取り込んでも良いように思えます。
ステータス等の書き込みは、システムへの書き込み処理が完了した時点で、更新すべきかと思います。

質問2
1の場合、テーブルを10件ごと処理させて、処理結果を処理結果列に行ごともちたいのですが(処理完了後まとめてエクセルに書き出し)どのようなWFにしたらよいでしょうか?

こちらも要件によりますが

  • 基本的には取り込んだDataTableをForEachRow等で一行ずつ処理する
  • 入力すべきレコードであれば入力し、画面上の行数(?)を保持している変数をインクリメントする
  • 画面上の行数の変数が10になるまたは最終行になれば、サブミット処理を行い、結果を取得→ワークシート側に反映する。画面を入力初期画面に遷移させ、行数変数をリセットする。

といった感じかと思います。

1 Like

返信ありがとうございます。

メインテーブルAから上位10件を別テーブルBで保持するやり方はわかってできたのですが、
このテーブルAから取り出した10件分を削除する方法に悩んでおります。

どのように処理したらよろしいですか?

理由としては、Bテーブルのデータを10件分処理が終わったら、メインテーブルAにマージしたいからです。

最終的に、このメインテーブルAをエクセルに出力しようと考えています。

よろしくお願いします。

こんにちは

やりたいことを勘案すると、10件分をテーブルBに切り出す必要性はあまりないように思えます。
切り出して、削除して、またマージするよりも
テーブルAで一貫して処理を行った方が処理も楽なように思えます。

ちなみに最初から10件を削除したいのであれば

dt = dt.AsEnumerable.Skip(10).CopyToDataTable

で可能です。

最終的に、このメインテーブルAをエクセルに出力しようと考えています。

先のPOSTでも少し言及したのですが、システムへの書き込みを伴う処理結果を
一連の処理の最後に書き込むにはあまりよろしくありません。
理由は、例えば途中で障害が発生した時に、どこまでシステムに入力が完了したかの把握が
困難になる可能性があるからです。
基本的には1回システムにサブミットしたら、その結果をエクセル等に書き込むようにします。
仮に例外などで処理が停止しても、システムに書き込めている範囲を明確にすることにより
リカバリあるいはリラン等が容易になります。

なるほどです。

テーブルAをそのまま処理を行うとすると、

ループ開始
カウント
ステータスが入っていない分岐
ステータス入っていない10件処理
すぐにエクセルに出力
行数カウント用の変数をリセット
ループ開始へ戻る

といったイメージでしょうか?

文字だけなのでニュアンスが異なっているかもしれませんが(条件分岐が表現しきれていない等)、
大まかな流れとしては大丈夫ではないかと思います。
あとは個別の要件に応じた調整が必要になると思います。

1 Like