Maximoで添付されたCSVファイルをプレビューするダイアログを作成する方法
今回は自動化スクリプトおよびテーラリングの応用として、添付されたCSVファイルをテーブルに展開しプレビューする方法を解説します。
順に実装していきましょう。まずは内容を格納をするためのMBO定義を作成します。注意しなければならないことは永続MBOを作成するとファイルを開くたびにDBへ行が保存されてしまいます。したがってプレビューする場合は、非永続MBOを使ってメモリのみにデータを展開するようにします。非永続MBOはDBにテーブルを作成せずにMaximoのメモリ上にだけデータを格納します。非永続MBOを使うことによってMaximoアプリケーションからDBテーブルなしにデータへアクセスすることができるようになります。
非永続MBOは以下のように新規オブジェクト作成時に永続(Persistent)のチェックをオフにします。これによってオブジェクト全体が非永続になります。
次に属性の設定です。今回はプレビューということでC1からC20までの20カラムを作成します。残念ながら可変のデータを扱うことは難しいので、必要な数だけ用意してください。属性は以下のようにC20まで定義します。
最後にDOCLINKSオブジェクトからCSVPREVIEWオブジェクトへの関係を定義します。非永続MBOはDBアクセスでデータを取得しないため関係名だけ定義して他は空に設定します。
自動化スクリプトの設定を行います。非永続MBOも自動化スクリプトを使って操作することが可能です。非永続MBOはデータが空の状態で始まります。データを展開するのは自動化スクリプトの役割です。そのため、起動ポイントはオブジェクトの初期化時に設定します。
しかし、ここで注意が必要になります。自動化スクリプト内でCSVファイルを読み込み、MBOにデータを挿入していきますが、行を挿入するたびに初期化の自動化スクリプトが起動してしまいます。そうなるとスクリプトの呼び出しが無限に続くことになります。これを防ぐには、以下のプロパティを1に設定します。非永続MBOは初期化時に内部でsetupというメソッドが呼び出されます。このプロパティはsetupが呼び出されたときに初期化時にセットした起動ポイントのスクリプトを呼ぶオプションです。これはオブジェクト起動時の1回のみ呼び出されるため、setupから呼び出されたときに処理を開始し、その他のときは処理しないようにすることで無限ループを回避します。設定を変更しLive Refreshをしてください。
自動化スクリプトを作成します。ポイントは2つです。添付ファイルへアクセスするためにFileAttachmentStorage (https://developer.ibm.com/static/site-id/155/maximodev/7609/maximocore/businessobjects/com/ibm/tivoli/maximo/oslc/provider/FileAttachmentStorage.html)を使用します。こちらのgetAttAchment(MboRemote) を使用すればファイルのデータ配列が取得できます。2つ目はCSVをパースする方法です。MaximoのJythonは標準ライブラリを提供していません。標準ライブラリを使用するには外部でライブラリを保存してアクセスしなければなりません(https://www.maximoscripting.com/using-external-libraries-in-jython/)。あとは自前で実装するかJavaライブラリを利用するかになりますが、psdi.app.bim.parser.cobie.CsvInputTokenizer (https://developer.ibm.com/static/site-id/155/maximodev/7609/maximocore/businessobjects/psdi/app/bim/parser/cobie/CsvInputTokenizer.html)がCSVのパーサーとして利用できそうです。今回はこちらを使った実装を試してみます。
以下のように起動ポイントはオブジェクトの初期化で設定します。
from java.io import ByteArrayInputStream from com.ibm.tivoli.maximo.oslc.provider import FileAttachmentStorage from psdi.app.bim.parser.cobie import CsvInputTokenizer if onsetup: doclink = mboset.getOwner() if doclink and doclink.getString('urlname').lower().split('.')[-1] == 'csv': # AttachmentStorage can get a byte array of local file. storage = FileAttachmentStorage() buf = storage.getAttachment(doclink) # remove a record because a mbo was inserted automatically by Maximo. mboset.deleteAll() mboset.save() tokenizer = CsvInputTokenizer(ByteArrayInputStream(buf)) row = tokenizer.getRow() try: while row: row_mbo = mboset.addAtEnd() col_index = 1 for col in row[0:20]: # loop until the max column size col_name = "c%d" % col_index row_mbo.setValue(col_name, col[0:20]) # subs to ALN length col_index = col_index + 1 row = tokenizer.getRow() finally: tokenizer.close()
最後にダイアログを設定します。アプリケーション・デザイナーの「システム設定のエクスポート」からLIBRARY.xmlをダウンロードし保存します。以下のダイアログを挿入します。
<dialog id="csv_preview" label="Preview" relationship="CSVPREVIEW"> <table id="csv_preview_table" inputmode="readonly" selectmode="single"> <tablebody displayrowsperpage="20" filterable="false" filterexpanded="true" id="csv_preview_tablebody" witdh="75%"> <tablecol dataattribute="c1" label="1" id="csv_preview_tablebody_col_1"/> <tablecol dataattribute="c2" label="2" id="csv_preview_tablebody_col_2"/> <tablecol dataattribute="c3" label="3" id="csv_preview_tablebody_col_3"/> <tablecol dataattribute="c4" label="4" id="csv_preview_tablebody_col_4"/> <tablecol dataattribute="c5" label="5" id="csv_preview_tablebody_col_5"/> <tablecol dataattribute="c6" label="6" id="csv_preview_tablebody_col_6"/> <tablecol dataattribute="c7" label="7" id="csv_preview_tablebody_col_7"/> <tablecol dataattribute="c8" label="8" id="csv_preview_tablebody_col_8"/> <tablecol dataattribute="c9" label="9" id="csv_preview_tablebody_col_9"/> <tablecol dataattribute="c10" label="10" id="csv_preview_tablebody_col_10"/> <tablecol dataattribute="c11" label="11" id="csv_preview_tablebody_col_11"/> <tablecol dataattribute="c12" label="12" id="csv_preview_tablebody_col_12"/> <tablecol dataattribute="c13" label="13" id="csv_preview_tablebody_col_13"/> <tablecol dataattribute="c14" label="14" id="csv_preview_tablebody_col_14"/> <tablecol dataattribute="c15" label="15" id="csv_preview_tablebody_col_15"/> <tablecol dataattribute="c16" label="16" id="csv_preview_tablebody_col_16"/> <tablecol dataattribute="c17" label="17" id="csv_preview_tablebody_col_17"/> <tablecol dataattribute="c18" label="18" id="csv_preview_tablebody_col_18"/> <tablecol dataattribute="c19" label="19" id="csv_preview_tablebody_col_19"/> <tablecol dataattribute="c20" label="20" id="csv_preview_tablebody_col_20"/> </tablebody> </table> <buttongroup id="csv_preview_buttons"> <pushbutton default="true" id="csv_preview_button_1" label="Close" mxevent="dialogclose"/> </buttongroup> </dialog>
添付ファイルのダイアログからプレビュー・ダイアログを呼び出せるように以下のように変更します。mxeventにダイアログのIDを指定します。
<dialog id="viewattachments" label="View Attachments" savemode="ONLOAD"> <table id="viewattachments_table" inputmode="readonly"> <tablebody id="viewattachments_tablebody"> <tablecol dataattribute="document" id="viewattachments_table_tablebody_4" label="Document" type="openurl" urlattribute="weburl"/> <tablecol dataattribute="docinfo.description" id="viewattachments_table_tablebody_6" label="Description" sortable="false"/> <tablecol dataattribute="doctype" id="viewattachments_table_tablebody_3" label="Document Folder"/> <tablecol dataattribute="docversion" id="viewattachments_table_tablebody_5" label="Document Version"/> <tablecol dataattribute="printthrulink" id="viewattachments_table_tablebody_9" label="Print"/> <tablecol dataattribute="ownertable" id="viewattachments_table_tablebody_1" label="Application"/> <tablecol filterable="false" hidden="false" id="csv_preview_viewattachments_table_tablebody_10" mxevent="csv_preview" mxevent_desc="CSV Preview" mxevent_icon="nav_icon_preview.gif" sortable="false" type="event"/> <tablecol filterable="false" hidden="false" id="viewattachments_table_tablebody_7" mxevent="linkproperties" mxevent_desc="Attachment Properties" mxevent_icon="img_information.gif" sortable="false" type="event"/> <tablecol filterable="false" hidden="false" id="viewattachments_table_tablebody_8" mxevent="instantdelete" mxevent_desc="Delete Row" mxevent_icon="btn_delete.gif" sortable="false" type="event"/> </tablebody> </table> <buttongroup id="viewattachments_2"> <pushbutton default="true" id="viewattachments_2_1" label="OK" mxevent="dialogok"/> </buttongroup> </dialog>
LIBRARY.xmlをアップロードして設定は終わりです。
機能を確認します。以下のサイトからテスト・データを取得し、こちらでテストします。
ファイルをアップロードし、添付ファイル・ダイアログのプレビューボタンを押すとこちらのようにCSVの内容が確認できます。
本記事では添付ファイルのCSVをダイアログにプレビューする方法を解説しました。内容を編集できるようにし保存時にCSVファイルを更新するようにも改変できますし、Excelファイルへの対応やJavaScriptのカスタマイズを使って埋め込みプレビューすることも可能です。添付ファイルへのアクセス方法を覚えて様々な応用を試してみてください。