3.A.A.8. SQLテーブルをDataTableにフェッチする

このセクションでは、既存のSQL テーブルを DataTableに取り込む方法を学びます。

まず、[ データベース 接続の開始]シーケンスに[クエリの実行]アクティビティをドラッグします。

編集フィールドに「select * from airbnbdata;」を挿入 実行 する クエリ です 。これは、すべてのデータを取得するために実行されるSQL クエリです。このステートメントは単純なselectで構成されていますが、このクエリは必要なだけ複雑にすることができることに注意してください。

編集フィールドにsqlrawdtを挿入する 結果の 保存 なる DataTableです これはデータが保存されるDataTableオブジェクトです。

このDataTable sqlrawdtの目的は、後でSQL Tableに修正・コミットされるデータを保持することです。OpenRPAで クエリActivityを実行すると、結果のオブジェクトはDataViewとなり、SQL Table には 全く接続されません。そこで、多くのクエリの結果を持つsqlrawdtを操作し、後の段階でDataTableからの更新Activityを使用して、全ての変更を一度にコミットすることができます。

images/openrpa_workflow_examples_using_datatables_execute_query.png

3.A.A.9. データセットをループする

この節では、収集したデータセットをループし、データを適切なデータ型にパースし、IfActivity を使ってデータセット内に含まれる異常なエントリにデフォルト値を割り当てる方法を学習します。最後に、sqldtと sqlrawdtの両方に行を追加します。このセクションの最後に、与えられたデータセットの 特徴をそのデータ 型とともに索引付けするための参照表があります。

まず、Foreach DataRowアクティビティをDatabase Scopeアクティビティ内のシーケンスにドラッグします。Enter a VB Expressionを含むフィールドの中に、amsterdamdtを挿入します。

Read ExcelWorkflowの例では、Read Excelアクティビティによって返されたDataTableからセルを読み取るのと同様に、データセットの各特徴は変数に割り当てられる必要があります。

ここでは4種類のデータが扱われています。これらはそれぞれ,SQL テーブルの bigint,double,date,varchar(255)に対応する。

Int64型の場合、ユーザーはInt64.Parseメソッドを使用してデータを解析する必要があります。

id_dataset変数の値をInt64.Parse(row.Item(0).ToString)とし、型をSystem.Data.Int64 とする例が示されています。続いて、残りの変数も設定します。これらは、“host_id“,price,minimum_nights,number_of_reviews,calculated_host_listings_countandavailability_365 です。

images/openrpa_workflow_examples_using_datatables_loop_through_dataset_assign_int64.png

この特定のInsideAirBnBデータセットでは、Double型のフィーチャーは、NULL値(つまり variable.ToString が “” を返す)か、CDbl()を使用して適切に変換できる数値のどちらかになります。

このように、NULL値と有効値を区別するために、IfActivityを使用しています。 また、row.item(xx)[...]を何度も記述しないように、一時変数<featureNameValue>をいくつか使用しています。

下図はその例で、temp 変数に latitudeValue、テーブルに挿入される実際の値をlatitudeとして設定しています。残りの変数も設定してください。これらはlongitudeと reviews_per_monthです。

images/openrpa_workflow_examples_using_datatables_loop_through_double_variables.png

DateTime型では、異常な入力に対してチェックするためにtemp 変数を 使用する必要があります。ここでは、先ほど示したIfActivityも使用していますが、唯一の違いは、デフォルト値が0ではなくNew System.DateTime(2011,10,12,0,0,0)と任意に設定されている点です。

images/openrpa_workflow_examples_using_datatables_loop_through_date_variable.png

最後の型はString です。ユーザがすべきことは、行のi番目のエントリを見つけ、データセット内の指定されたエントリとマッチさせ、.ToStringメソッドでStringにキャストすることです。OpenRPAは0からインデックスを開始することをユーザーに思い出させるのに便利です。

images/openrpa_workflow_examples_using_datatables_loop_through_string_variables.png

各指標の参照表は以下のとおりです。

id_dataset – Int64 – 0 場所名 – 文字列 – 1 host_id – Int64 – 2 host_name – 文字列 – 3 neighbourhood_group – 文字列 – 4 neighborhood – 文字列 – 5 latitude – Double – 6 longitude – Double – 7 room_type – 文字列 – 8 price – Int64 – 9 minimum_ights – Int64 – 10 number_of_views – Int64 – 11 last_views – DateTime – 12 reviews_permonth – Double – 13 calculated_reviews_permonth – String – 4.8 価格 – Int64 – 9 最小宿泊日数 – Int64 – 10 レビュー数 – Int64 – 11 last_review – DateTime – 12 reviews_per_month – Double – 13 calculated_host_listings_count – Int64 – 14 availability_365 – Int64 – 15 “$.

備考

OpenRPAでは、DataTableは値を保持するために使われる2次元の非シリアライズ可能なオブジェクトに相当します。これはij列の行列と考えることができます。i行は.Rows(n)属性でアクセスできます。nはアクセスしたい行の番号です(0から始まる)。j列には、.Item(n)属性を使ってアクセスします。nは、アクセスしたい列の番号-0から始まる-です。ここで、ユーザがRows属性にアクセスしなければならないことを思い出してください。したがって、ユーザがデータ テーブルの 3 行目の 2 列目にアクセスしたい場合は、.Rows(2).Item(1)属性を使用することになります。

備考

.NET APIでは、DataTable オブジェクトは、同じ名前のクラスのDataSet オブジェクト 含まれるインメモリデータの1つのテーブルに対応します。Excel ファイルを読み込むと、それは自動的にDataSetクラスに割り当てられ、すべてのシートは DataTableクラス(0からExcel ファイル内のシート数まで番号が付けられている)に保存されます。ここで、DataTableオブジェクトは大文字と小文字を区別することに注意してください。

3.A.A.A. IDとバッチ番号のインクリメント変数

このセクションでは、ユーザーはAssignActivityを使用して、以下のように変数idと batch_noをインクリメントします。

まず、「割り当てアクティビティ」を「データ 処理 ロジック」シーケンスの末尾にドラッグします。

idid + 1 に代入する。

別の割り当てアクティビティをデータ 処理 ロジックのシーケンスの最後にドラッグします。

batch_noを batch_no + 1に代入する。

images/openrpa_workflow_examples_using_datatables_loop_through_increment_variables.png

3.A.A.B. DataRowsの追加とSQLテーブルの更新

sqldt: 値をフィルタリングして表示するために使用 –sqlrawdt:SQL テーブルを更新し、DataTableアクティビティから更新を使用して変更をコミットするために使用します

まず、AddDataRowアクティビティをデータ 処理 ロジックのシーケンスの最後にドラッグします。

挿入 する DataTableを含むフィールドにsqldtを挿入します。

DataTable カラムの配列を含むフィールド内に{id, id_dataset, place_name, host_id, host_name, neighbourhood_group, neighbourhood, latitude, longitude, room_type, price, minimum_nights, number_of_reviews, last_review, reviews_per_month, calculated_host_listings_count, availability_365, batch_no}をインサートしてください。

もう一度、AddDataRowアクティビティをデータ 処理 ロジックのシーケンスの最後にドラッグします。

挿入 する DataTableを含むフィールドにsqlrawdtを挿入します。

DataTableの カラムの配列を含むフィールドに{id, id_dataset, place_name, host_id, host_name, neighbourhood_group, neighbourhood, latitude, longitude, room_type, price, minimum_nights, number_of_reviews, last_review, reviews_per_month, calculated_host_listings_count, availability_365, batch_no}を 挿入してください。

images/openrpa_workflow_using_datatables_update_datatables.png

DataTable ActivityからUpdateを Database Scopeのシーケンスにドラッグする。

TableName入力フィールドの中に"airbnbdata "を挿入します(つまり、 行を 挿入 するテーブルを含むフィールドです)。

SQLrawdtを DataTableの入力フィールドに挿入します – すなわち 結果を 保存 する DataTableを含むフィールドです。

images/openrpa_workflow_using_datatables_update_from_datatable.png

WriteLineをシーケンスの最後にドラッグして、""Successfully added data into MySQL DB. “を挿入します。 追加された : " + result.ToString"テキストフィールド(VB 式を含むもの)に挿入してください。

3.B.1. 活動内容

ここでは、OpenRPAでのActivityの使い方に関する質問を取り上げます。

3.B.1.1. 要素が存在することを確認する方法

まず、GetElementActivityのMinResultsパラメータを0に変更する必要があります。

次に、使用するGetElementアクティビティに応じて、ElementsまたはResultパラメータに変数を設定する必要があります。

そして、一番外側、つまりメインのシーケンスにIfアクティビティを追加する必要があります。ElementsまたはResultパラメータの変数をitemと定義した場合、item.Length = 0– またはitem.Length <> 0に対してチェックし、Elementが存在しないことをチェックする必要があります。

3.B.1.5. OpenFlow 内部でSecureString(https://docs.microsoft.com/en-us/dotnet/api/system.security.securestring?view=netcore-3.1) として格納されているパスワードを、OpenRPA 内部で利用できるように変換するにはどうすればよいですか?

GetCredentialsActivity で取得したSecureStringSystem.Net.NetworkCredential(string.Empty, securePassword).Password に代入することができます。ここで、string.Emptyは、上記の Activity 内でPasswordパラメータとしてキャプチャされた変数です。

また、Unsecure Passwordパラメータを使用して取得することもできます。しかし、これはかなり安全性の低い方法です。

3.B.2.1. Node-REDに変数や引数を返す方法

変数はワークフローのローカルスコープに収まるため、Node-REDに渡すことはできません。

一方、引数はmsgオブジェクトの一部として渡されます。したがって、例えばユーザがname という引数を定義していた場合、関数ノードを使ってmsg.payload.namemsg.nameに代入します。

REST Service (Node-REDとの統合)のセクションで、ユーザは手近な例を見つけることができます。

3.B.3. セレクタ

ここでは、OpenRPAの内部でセレクタを使用する際の質問について説明します。