Aというテーブルから、条件を指定し、当てはまったもののうち、上位10件だけを格納した新しいテーブルBを作成したいのですが、どのように設定したら良いでしょうか?
こんにちは
フィルターデータテーブルアクティビティで条件に合致するものの抽出までは、できていますでしょうか?
それの出力をdtとすると、代入アクティビティで
dtResult = ddt.AsEnumerable.Take(10).CopyToDataTable()
で取得できます。
すみません、2点質問があります。
やりたいこと
・エクセルに記載された番号を社内システムに登録したい(一括処理できるのは10件のみ)
・登録時に社内システムに表示されるステータス(テキスト要素)を取得して、結果を行ごと保持したい
・エクセルにステータス列を追記したい
1.エクセルデータを読み込み、UiPathのテーブルを活用して処理させる方法
2.エクセルスコープを使い、都度エクセルからデータを取得し処理させる方法
質問1
1.と2.だと、どちらの処理がおすすめですか?(処理速度やエラー処理含めて)
質問2
1の場合、テーブルを10件ごと処理させて、処理結果を処理結果列に行ごともちたいのですが(処理完了後まとめてエクセルに書き出し)どのようなWFにしたらよいでしょうか?
知恵をお貸しください、よろしくお願いします。
こんにちは
おそらく2択ではなく、要件にあわせて設計する必要があると思います。あくまで一般的なケースを
想定しますと
読み込みは一括でDataTableに取り込んでも良いように思えます。
ステータス等の書き込みは、システムへの書き込み処理が完了した時点で、更新すべきかと思います。
質問2
1の場合、テーブルを10件ごと処理させて、処理結果を処理結果列に行ごともちたいのですが(処理完了後まとめてエクセルに書き出し)どのようなWFにしたらよいでしょうか?
こちらも要件によりますが
- 基本的には取り込んだDataTableをForEachRow等で一行ずつ処理する
- 入力すべきレコードであれば入力し、画面上の行数(?)を保持している変数をインクリメントする
- 画面上の行数の変数が10になるまたは最終行になれば、サブミット処理を行い、結果を取得→ワークシート側に反映する。画面を入力初期画面に遷移させ、行数変数をリセットする。
といった感じかと思います。
返信ありがとうございます。
メインテーブルAから上位10件を別テーブルBで保持するやり方はわかってできたのですが、
このテーブルAから取り出した10件分を削除する方法に悩んでおります。
どのように処理したらよろしいですか?
理由としては、Bテーブルのデータを10件分処理が終わったら、メインテーブルAにマージしたいからです。
最終的に、このメインテーブルAをエクセルに出力しようと考えています。
よろしくお願いします。
こんにちは
やりたいことを勘案すると、10件分をテーブルBに切り出す必要性はあまりないように思えます。
切り出して、削除して、またマージするよりも
テーブルAで一貫して処理を行った方が処理も楽なように思えます。
ちなみに最初から10件を削除したいのであれば
dt = dt.AsEnumerable.Skip(10).CopyToDataTable
で可能です。
最終的に、このメインテーブルAをエクセルに出力しようと考えています。
先のPOSTでも少し言及したのですが、システムへの書き込みを伴う処理結果を
一連の処理の最後に書き込むにはあまりよろしくありません。
理由は、例えば途中で障害が発生した時に、どこまでシステムに入力が完了したかの把握が
困難になる可能性があるからです。
基本的には1回システムにサブミットしたら、その結果をエクセル等に書き込むようにします。
仮に例外などで処理が停止しても、システムに書き込めている範囲を明確にすることにより
リカバリあるいはリラン等が容易になります。
なるほどです。
テーブルAをそのまま処理を行うとすると、
ループ開始
カウント
ステータスが入っていない分岐
ステータス入っていない10件処理
すぐにエクセルに出力
行数カウント用の変数をリセット
ループ開始へ戻る
といったイメージでしょうか?
文字だけなのでニュアンスが異なっているかもしれませんが(条件分岐が表現しきれていない等)、
大まかな流れとしては大丈夫ではないかと思います。
あとは個別の要件に応じた調整が必要になると思います。