Blue Prism ( ブループリズム )で数値や日時を操作するときには、注意が必要なのはご存じかと思います。
今回は 数値 の深堀として、「16桁以上の数列」を数値として読み込む場合の問題点について検証してみます。
検証に使用するCSVファイルの内容は下図の通りです。
1列目の [ 取得結果 ] フィールドには数値、2列目の [ 桁数 ] フィールドには桁数を入れてあります。
数値の桁数を分かりやすくしてみました。このCSVファイルを複数のアクションで読み込み、取得結果を確認してみたいと思います。
① Get CSV Text As Collectionアクション
このアクションは、Blue Prism提供オブジェクト「Utility - File Management」のアクションで、指定した CSV ファイル(カンマ区切りの値)をコレクションに取得します。
例えば、今回のようなCSVファイルの1行目(フィールドの行)をヘッダーとしてあつかい、コレクションに格納する場合などに使用します。
さて、このアクション を実行した結果は・・・
16桁以上の数値が、15桁目で四捨五入されてしまいました。
保存先のコレクションは、特にフィールド設定をしていなかったのですが、自動的に数値として取得されています。CSVはテキストファイルなので、テキスト型のフィールドを設定し取得してみましたが、同じ結果になってしまいました。
コレクションに格納される前にDouble型の数値として処理されているのかもしれません。
次に、Blue Prism提供オブジェクト ‐ MS Excel VBO内のアクションでも試してみます。
② Get Worksheet As Collection (Fast)アクション
このアクションは、現在アクティブになっているExcelの、アクティブなシート内にある表をコレクションに格納できます。そのため、このアクションでは、ワークブック名やワークシート名を指定せずに操作が可能です。
では、さっそく実行してみましょう。
こちらは、16桁以上の数値が指数表記になってしまいました。しかも、先ほどとは異なりテキスト型で取得されています。
そこで、逆に数値型のフィールドを設定してやってみました。
残念。16桁以上の数値は読み込まれず、空欄になってしまいました。
③ Get Cell Valueアクション
このアクションは、指定されたセルの値を取得できます。ちなみに実行後は、指定されたセルがアクティブ状態になることを覚えておいてください。
②の Get Worksheet As Collection (Fast) アクションの結果と同じように、16桁以上の数値は指数表記になりました。
先ほどと同じように、数値型のデータアイテムに変更し実行してみます。
なんと、エラー"Internal : データを変換できませんでした ‐ 値 '1.23456789012345E+15' を数値データアイテムにキャストできません"になってしまいました。
以上のように、アクションによってさまざまな結果になりましたが、いずれにしても標準のアクションでは16以上の桁数を持つ数値が正常に読み込まれていません。
OLEDBの動作やExcelの有効桁数が原因と思われますが、このあたりは深入りしておりません。難しそうなので。ただし、16桁以上の数値をどう扱えばよいか試してみた結果、いくつかの回避策のみ記載させていただきます。(決して手抜きではありません!)
解決(?)編
共通するポイントとしては、「いったん文字列として読み込ませて数値に変換する」という点です。
最終的に数値として扱いたいところを、あえて文字列として読み込ませるのは盲点でした。
あくまでも一例ですが、順番に紹介していきます。
①Get CSV Text As Collectionアクション
・数値部分をダブルクォーテーションで括る。(強制的に文字列として読ませます。)
・保存先のフィールドを数値型に設定する。(いわゆるキャスティングです。)
これで希望する値を読み込むことができます。変な感じですが、結果オーライということで。
② Get Worksheet As Collection (Fast)
③ Get Cell Valueアクション
この2つはまとめてやります。多少タイトルからは外れますが、CSVでの読み込みはあきらめてExcel形式に変換してから行います。
Excel形式にするメリットは、表示形式を指定してから入力できるようになる点にあります。
・数値を文字列として入力する。(数値としては入力できません。)
・保存先のデータ型を数値型にする。(①と同様です。)
「Get Worksheet As Collection (Fast)」
①とまったく同じ取得内容になりました。
「Get Cell Value」
こちらも数値として読み込むことができました。
なお、小数点を使った数値も桁数の制限は同様です。ピンとこない場合には「浮動小数点数」などで検索してみてください。(深みにはまらないよう注意です!)
余談ですが
明らかに今回のテーマとは関係がないのですが、このまま桁数を増やしていったらどうなってしまうのか、少し気になったので試してみました。
いきなり結論だけ掲載します。29桁までの数列を数値として認識させることができました。
どうやら、これがBlue Prismの限界のようです。
これ以上増やそうとすると・・・
見たことのないエラーで怒られてしまいました。さすがに、ここまで桁の多い数値を使う機会はないと思いますが、これ以上はテキストとして扱うしかなさそうです。
Blue Prism エンジニアから一言
多少横道にそれましたが、この先天文学的な数値を扱う業務をBlue Prismで自動化することになった際は、ぜひこの記事を思い出してみてください。
\もっとBlue Prismを使いこなしたい方はこちら!/