データベースへのデータ格納
このセクションでは、Kofax RPA データベース ストレージの仕組みについて説明します。
- オブジェクト キー
-
データベースのタイプに対して作成したテーブルには、自分のタイプの各属性に対応する列と、以下の 7 つのハウスホールド フィールドがあります。ObjectKey、RobotName、ExecutionId、 FirstExtracted、LastExtracted、 ExtractedInLastRun、および LastUpdated。ObjectKey はテーブルの主キーになるため、最も重要なフィールドです。
注 "ObjectKey" という名前の理由は、以前 Kofax RPA で使用されていた用語にあります。以前は、タイプと変数は「オブジェクト」と呼ばれていました。新しい用語を使うのであれば、"ObjectKey" を "ValueKey" と呼びます。しかし、名前を変更すると後に互換性の問題が多発することから、古い名前を保持することが許容されています。タイプの ObjectKey は、そのタイプの変数から抽出された値を、データベースに格納されているときに一意に識別するためものです。タイプの値を一意に識別するものを把握しておく必要があります。車のリポジトリを構築する場合は、VIN コードだけで十分に各車両を一意に識別できるでしょう。野球の結果を収集する場合は、各試合を一意に識別するために、年、チーム名、球場、日付が必要になるでしょう。
タイプを構築するときには、ObjectKey の計算方法を選択することができます。新しい属性の作成時に「データベース キーの一部」オプションにチェックを入れて選択します。先ほどの車の例では、VIN コードのみがデータベース キーの一部としてマークされた属性となり、野球の試合を例にとると、年、チーム名、球場、および日付の属性は、すべてデータベース キーの一部としてマークされます。
ロボットの開発者は、データベース データ登録アクションで直接キーを指定し、タイプに定義されているデフォルトのアルゴリズムをオーバーライドすることもできます。
データベース キーの一部ではない属性は、非キー フィールドと呼ばれます。例えば、車に価格の属性がある場合、価格が変更されても、同一の車と見なされます。
- データベース データ登録
-
Kofax RPA には、データベース内の値を管理する次の 3 つのアクションがあります:データベース データ登録、データベース データ抽出、データベース データ削除。検索と削除の操作はシンプルですが、データベース データ登録は、値を格納するだけではありません。
データベースデータ登録は、テーブルに新しい値を挿入したり、または以前に格納された既存の値を更新したりできます。以下が操作についての詳細なリストです。
-
変数の値を格納するとき、ObjectKey は、変数のタイプが「データベース キーの一部」にマークされている属性の変数値に基づいて計算されます。ロボット開発者がアクションでキーを指定した場合は、そのキーが代わりに使われます。
- 計算キーを使って、その値がすでにデータベースに存在するかどうかをチェックします。
- 値が存在しない場合は、データベースに新しい行が挿入されます (この ObjectKey の下)。
- 値がすでに存在する場合は、更新され、すべての非キー属性がテーブル (この ObjectKey の下) に書き込まれます。
-
- ハウスホールド フィールド
-
値が挿入されると、ハウスホールド フィールドの 7 つすべてが更新されます。更新時は、一部のフィールドのみが変更されます。次のテーブルに概要を示します。
フィールド
説明
変更されるタイミング
ObjectKey
この値の主キー。
挿入
RobotName
この値を格納したロボットの名前。
挿入と更新
ExecutionId
この値を格納したロボット実行の実行 ID。
挿入と更新
FirstExtracted
値が初めて格納された時間。
挿入
LastExtracted
値が最後に格納された時間。
挿入と更新
LastUpdated
値が最後に更新された日付。
更新
ExtractedInLastRun
値が最新の実行で抽出されたかどうか ( 'y' と 'n' を使用)。
挿入と更新
各ロボットの実行後 (ロボットがデータベースデータ登録を使用)、このロボットによって以前に収集され、この実行中に保存されないすべての値は、ExtractedInLastRun が "n" に、LastUpdated が "now" に設定されます。これは、値が最新の実行中に Web サイト上で見つからなかったことを示します。
注 値が直前の実行で見つかり、変更された非キー フィールドがない場合、LastUpdated は更新されません。ただし、直前の実行で値が見つからず、その前の実行では見つかっていた場合は、非キー フィールドが変更されていない場合でも、LastUpdated は更新されます。これは、値がサイトから削除され、その後に再び表示されていることを意味します。 - ハーベスト テーブル
-
Kofax RPA で作成されたテーブルは、ロボットがデータを収集しているため、しばしばハーベスト テーブルと呼ばれます。
ロボットが最後に実行されたときに Web サイトで利用可能だった情報を確認するには、次の SQL コマンドを使用できます。
SELECT * FROM table WHERE ExtractedInLastRun = 'y'
ロボットがテーブルにデータを格納するのと同時に、テーブルに対して同時にクエリを実行すると、結果は、前回の実行からのデータと、実行中のロボットがこれまでに保存したデータが混合した状態になります。安定したデータセットに対してクエリを実行できるように、データをハーベスト テーブルから別のプロダクション テーブルにコピーすることをお勧めします。
データベースにデータを格納するのにロボットを使用するソリューションは多数ありますが、ほとんどは次のテーブルに示す 3 つのシナリオのいずれかに該当します。
シナリオ
説明
Web サイトと照合するリポジトリ (小さなデータ セット)
Web サイト上のアイテムと 1 対 1 で照合するリポジトリという考え方です。
これを実現する最も簡単な方法は、ロボットの実行ごとに、すべての行を削除したプロダクション テーブルを作成し、ExtractedInLastRun='y' となっているレコードをハーベスト テーブルからこのテーブルにコピーします。これは小さなデータ セットでは適切に機能します。
Web サイトと照合するリポジトリ (大きなデータ セット)
上記と同様ですが、ロボットの実行後にすべてのデータをコピーするには、データセットが大きすぎます。代わりに、生じた変更に基づき、ロボットの各実行後にプロダクション テーブルを更新することにします。
ここでは LastUpdated フィールドが便利です。更新された値にはすべて、ロボットの開始時刻より大きい LastUpdated フィールド値があります。開始時刻は、データベースのログ テーブルから取得することも、ロボットでどこかに格納することもできます。
削除された値を検出するには、次のコマンドを使います。
SELECT * FROM table WHERE LastUpdated > 'StartTime' AND ExtractedInLastRun = 'n'
新しい値を検出する場合
SELECT * FROM table WHERE LastUpdated > 'StartTime' AND ExtractedInLastRun = 'y' AND FirstExtracted > 'StartTime'
更新した値を検出する場合
SELECT * FROM table WHERE LastUpdated > 'StartTime' AND ExtractedInLastRun = 'y' AND FirstExtracted < 'StartTime'
次にプロダクション テーブルを更新します。
履歴データ
デフォルトの設定では、値が最初に抽出されたタイミングと最後に更新されたタイミングを確認できますが、値が見つかったロボットの実行を確認することはできません。
この場合、ロボットの実行後、ハーベスト テーブルからすべてのデータを別のテーブルにコピーする必要がありますが、新しいテーブルでは、ObjectKey を主キーにすることはできません。代わりに、RUN_ID という列を追加で作成し、ObjectKey と一緒に使用して複合の主キーを作成します。RUN_ID が必要ない場合は、自動インクリメントされた列を作成し、それをセカンダリ テーブルの主キーとして使います。各実行前にハーベスト テーブルから行を削除します。
すべてのハウスホールド フィールドをプロダクション テーブルにコピーする必要はありません。プロダクション テーブルの更新には ObjectKey のみが必須です。
- 競合に関する注意点
-
同じタイプの値を同じデータベースに格納する複数のロボットがある場合、次の点に注意してください。
- 値が格納されるたびに、RobotName 列が更新されます。2 つのロボットが同じ値 (ObjectKey によって識別) を格納している場合、ロボットが実行された後に最後のものだけが表示されます。
- 2 つのロボットが同時に同じ値を登録すると、エラーが発生します。いずれのロボットも、値がテーブルにないことを発見し、値を挿入しようとしますが、そのうちの 1 つだけが成功します。同じ値であるため、多くの場合、このエラーは無視できます。
- 同じロボットを同時に 2 回実行し、ロボットがデータベースにデータを格納すると、ExtractedInLastRun 列が適切に機能しなくなります。1 番目のロボットの実行が終了すると、ロボットは格納されていないすべての値の ExtractedInLastRun を "n" に更新します。これには、これまでに 2 番目のロボットによって格納されたすべての値が含まれます。その後、2 番目のロボットが終了すると、1 番目のロボットによって格納されたすべての値の ExtractedInLastRun を "n" に設定し、最初の実行を完全に否定します。
- 値の関係
-
ストレージ システムには、値間の関係を自動管理する手段がありません。Person タイプと Address タイプの値があり、これらをリンクさせたい場合は、このリンクを維持する必要があります。
リンクを作成する一番簡単な方法は、Person 値の ObjectKey を、この個人にリンクする Address 値の外部キーにすることです。
ObjectKey がタイプから自動的に計算される場合、ObjectKey の計算アクションを使用してキーを生成し、各アドレス値に割り当ててから格納することができます。
格納された値の間に接続があるロボットを構築するときは注意が必要です。Person 値を格納するときにエラーが発生した場合は、Address 値が格納されていないことを確認します。
- ObjectKey に関する警告
-
MySQL、Oracle、Sybase を使う場合は、ここにある重要な ObjectKeys のルールを確認してください。
- Oracle では、空の文字列は null として格納されます。
- Sybase では、空の文字列は " " (スペースがひとつある文字列)として格納されます。
- MySQL のタイム スタンプにはミリ秒の精度はありません。
これらの 3 つの事例はすべて、データがデータベースに格納されたときにデータが失われる可能性があります。ObjectKey は、指定の変数のデータに基づいてロボット内で計算されます。後にデータベースから値をロードし、ObjectKey を再計算しようとすると、データベース キーの一部としてマークされた属性のいずれかでデータ損失が生じた場合に、ObjectKey が異なります。