2007/01/29
MAGIC V10解析(5)
「XML連携」機能について
前回は「XML連携」の機能を使って、データリポジトリ(以前は「テーブルリポジトリ」と呼んでいたんですが、XML連携が加わった関連で変更したんですね?)を定義しました。この機能を使う主な利点としては次のようなものがあると思います。
- データリンク機能を使用したコーディングが可能
- データベースに依存しないテーブルとして利用が可能(エンジンの実装が不要という意味)
- ノードの追加や削除もテーブルのレコードを追加したり削除するようなコーディングで処理が可能(ちょっと「コツ」が要るんですが・・・)
- XMLの特定のノードに対して、インデックスを付加することが可能
もしかすると従来のXMLの利用方法を越えた使い方ができるかも知れません。例えば1のデータリンク機能を使うことにより複数のXMLファイルを連結したビューの作成も簡単にできるわけですし・・・。
逆に、「XML連携」機能を使う場合にそぐわない使い方は次のものです。
- 大規模データベースには向かない
- 再帰的な構造の処理は不可
- 予め定義したノードしかアクセスできない(XML内の不特定のノードにはアクセスできない)
- スキーマが定義されていないXMLに対するアクセスは不可
ちなみに、レコードを書き出すプログラムを作成し、少し大規模なデータを作成してみたのですが、数万件の処理の途中でアボートしてしまいました。
また、作成されたデータを読み込むのには時間がかかります。これは特定のノード(レコード)にアクセスする場合でも、読み込む時点で、全てのノードをメモリ上に読み込んでいるものと推測されます。
ですんで、大量の件数のレコードを管理するような場合は使えません。(データベースエンジンを使うに越したことは無いということです。)
「再帰的な構造」というのは、例えば「MAGIC V10解析(3)」でも紹介したプログラムリポジトリ内に記述されるタスクの定義などのことです。この部分に対しては、スキーマは定義できていても、ビューの作成ポイントを指定することはできません。
つまり万能では無いと言うことですね。従来の関数を使用したり、DOMを利用したりするなど、方策を考えないといけません。
また、Helpを読むと、混在したアクセスは避けるべきであると書かれています。これはXML連携を使った場合に、プログラム上書き出された情報が物理的なファイルに書き込まれるタイミングにズレが生じることと関係があるからだと思われます。処理方法を混在せざるを得ない場合は、要注意ですね。
不特定のノードにアクセスできないというのは当たり前のことですね。
でも、任意のXMLデータを処理するのは、ちょっと考えるとありそうなので、スキーマの定義が必須というのも、ちょっと大きな制限かも知れません。
バリデーション関連の関数が追加されているようです。それを使って、処理可能な構造のデータかどうかを処理する必要があるかもしれませんし、スキーマ自体も変化しないとも限らないので、もしかしたら複数のスキーマを用意しなければならなくなるかも知れません。
プログラム一覧を作成する
今回は、プログラムリポジトリの画面と同じような、プログラムの一覧を表示するプログラムをMAGICのプログラムで作成してみたいと思います。
まず、プログラム一覧の表示順ですが、これは「Prgs.xml」の「Application/ProgramsRepositoryOutLine/Programs/Program」をビューにした「id」属性の一覧から取得することにより可能です。
フォルダの一覧は、同じく「Prgs.xml」の「Application/Header/Folders/Folder」以下をビューにすることにより可能です。(「id」、「Name」、「StartsAt」等)
一つのスキーマから複数のデータ定義を作成することになります。
スキーマは今回もXMLSPYで作成してみました。

スキーマ情報が出来上がったらファイル名を「Prgs.xsd」として保存します。前回と同じように、プロジェクトフォルダに格納しておきます。
データリポジトリの定義
前回と要領は同じです。
まず、プログラム一覧取得用の定義は次のように設定します。
データリポジトリ名:Prgs.Program「Program」以下をビューに追加すると、「id」が項目一覧に追加されます。
データソース名:%Source%\Progs.xml
データベース:Default XML Database

インデックスにタブを切り替え、「id」をインデックスに追加しておきます。
次は、フォルダ一覧の取得用の定義です。
データリポジトリ名:Prgs.Folder
データソース名:%Source%\Progs.xml
データベース:Default XML Database
「Folder」以下をビューに含めると、「id」、「Name.val」、「StartAt.val」、「NumberOfEntry」などの項目が追加されます。
「Name.val」は書式を「30」程度に拡げてください。
「Name.val」は書式を「30」程度に拡げてください。

インデックスを2つ追加します。
「U=重複不可」で「id」を定義し、更に「N=重複可」で「StartAt.val」を定義します。

ここまでできたら、APGにより、データリポジトリの内容が表示されるのを確認してみてください。
プログラムの作成
さて、プログラムを作成します。
手順は以下の通りです。
- プログラムリポジトリの画面で行を作成し、「プログラム一覧」等とタイトルを入力します。
- 「F5」キー(ズーム)で入ると「タスク特性」画面が表示されますが、そのまま「Enter」します。
- 「データビュー」タブの「メインリソース」に「Prgs.Program」を選択し、インデックスには「id」を選択します。
- ヘッダ行を追加し、「L=照会リンク」で前回作成した「ProgramHeaders」を選択します。インデックスは「id」を選択します。
- インデックス項目の「id」について、位置付(最小、最大)に式1「A」(メインリソースの「id」項目)を選択します。
- カラムを追加し、「Description」、「Public.val」、「_date」、「_time」を選択します。
- 更にヘッダ行を追加し、「L=照会リンク」で今回定義した「Prgs.Folder」を選択します。インデックスは「StartAt」を「逆方向」で選択します。
- インデックス項目の「StartsAt.val」について、位置付(最大)に式2「A-1」(メインリソースの「id」項目-1)を選択します。
- カラムを追加し、「Name.val」を選択します。

- フォームタブを選択し、ズームします。
- テーブルコントロールを配置します。
- テーブル上に順に項目(「id」、「Description」、「Name.val」、「Public.val」、「_date」、「_time」)を配置します。
- 「_date」はコントロール特性の画面でデータを式3「E」(_date)に変え、型を「D=日付」に、書式を「YYYY/MM/DDZ」に変更します。
- 「_time」はコントロール特性の画面でデータを式4「F」(_time)に変え、型を「T=日付」に、書式を「HH:MM:SSZ」に変更します。

プログラムの実行
プログラムが出来たら実行してみましょう。

さて、プログラムリポジトリの画面と同じになったでしょうか?
まとめ
今回のプログラムの例では、同じXMLファイルの中で複数のビューの位置を定義してデータリポジトリを定義できることが分かりました。
また、複数のXML連携データをリンクさせ、また新しく定義したインデックスを使って、新しいビューを作成することができることを確認しました。
MAGIC V10解析(1)
Size
8339
-
File type
text/html
MAGIC V10解析(2)
Size
8904
-
File type
text/html
MAGIC V10解析(3)
Size
9714
-
File type
text/html
MAGIC V10解析(4)
Size
9882
-
File type
text/html
Prgs.xsd
Size
2.7 kB
-
File type
text/xml
ProgramHeaders.xsd
Size
4.5 kB
-
File type
text/xml
- Category(s)
- dbMAGIC
