パーソナルツール
現在の場所: ホーム ブログ Categories dbMAGIC
« 2018January »
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
このBlogについて
 代表の向井田ことMUKAです。当ブログサイトでは、MAGICやDB2に関する技術者向け情報を公開しています。お気軽にお立ち寄り下さい。
最近のエントリ
twitter / 新RT機能を英語モードで・・・ muka 2009年11月19日
twitter / List Widget muka 2009年11月03日
twitter API / Retweet の仕様が・・・ muka 2009年10月30日
twitter API / Lists muka 2009年10月24日
IBM Rational Software Conference 2009 と アジャイル開発 muka 2009年10月08日
twitter API / geoタグ! muka 2009年10月01日
Twitter Developers Meetup in Tokyo muka 2009年09月11日
Club DB2 2009/9/4 muka 2009年09月05日
最近のコメント
Re:Club DB2 2009/8/29 muka 2009年09月01日
Re:Club DB2 2009/8/29 SIM 2009年08月31日
最近のトラックバック
Club DB2 8/29の感想エントリと今後の予定 Unofficial DB2 BLOG 2009年09月01日
カテゴリ
misc (47)
dbMAGIC (47)
DB2 (47)
mail (47)
Web (47)
twitter (47)
 

dbMAGIC

一つ上に移動
dbMAGIC ( MAGIC SOFTWARE JAPANの開発ツール ) に関する話題等

MAGIC + DB2 で XQuery(7)


ユーザ定義関数の利用


 皆様、ゴールデンウイークは如何でしたでしょうか?
 こちらは、家族サービスで江ノ島に行ってきたんですが、予想通り、すごい人でした。食事は2時間近く待たされたり、息子とはぐれてしまったり・・・。
 まぁ、それなりには楽しめましたが・・・。

 さて、前回は、DB2オンリーの話題でしたので、今回はMAGIC中心でいきます。
 「ユーザ定義関数」は、もう皆さんお使いでしょうか?
 V10で新しく追加された機能の中でも、今までのMAGICの常識を覆す機能という意味で、かなり「目玉」じゃないかと個人的には思っております。
 何が凄いのかというのは、MAGICを知ってる人でないと判らないところが哀しいところですが、要は、自分の作ったプログラムを関数にできるということです。(他の言語系の開発ツールを使っている人なら、「何を当たり前じゃないの」と言われてしまいそう・・・)
 

 例えば、XMLドキュメントの任意のノードからテキストを取得する場合はどういうコーディングになるでしょうか?
 XMLGETという関数があるじゃない?と言われてしまいそうですが、これが難点なのは「入出力テーブルを定義して介さないと使えない」という点です。
 加えて言うなら、「親子二つのタスクを定義する必要がある」ということです。
 つまり、この関数を利用するには、入出力ファイルを定義した親タスクと、XMLGET関数を実行する子タスクの二つのタスクを作らなければなりません。
 もし、この2点が不要になったらどうでしょうか?

 例えば、DB2用に下記のような表を作成しました。(第2回

CREATE TABLE DB2ADMIN.XMLDBTEST(DATAID CHAR(20) NOT NULL,
DATAXML XML,CONSTRAINT DATAID PRIMARY KEY(DATAID))
このDATAXMLカラムに格納したXMLドキュメント(プログラムリポジトリのファイル-Prg_????.xml-を入れることを想定している)から、プログラム名やプログラムの日付を並べてテーブル表示しようとする場合は、メモリテーブルなどに予めそれらのカラムを定義しておいて、一時的なテーブルを作成するかも知れません。
 あるいは、いろいろと悩んだあげく、上記の「CREATE TABEL」文を修正して、プログラム名やその他のカラムを別個に追加することを考えるかもしれませんね。

 しかし、もし「任意のXMLドキュメントの任意のXPathのテキストを取得する関数」みたいなものがあれば、ワーク用のテーブルも子タスクも不要になります。
 しかも、手続き型の呼び出し処理ではなく、関数ですから、どこでも使えるわけです。
 これがすなわち、「ユーザ定義関数」です。


プログラミングの実際


 今回もソースを公開していますので、コーディングの詳細については、データをダウンロードして下さい。


 準備するのは、1本のプログラムです。
 取り敢えず、「XMLノード値取得」という名前で作成しましょう。
 下記のパラメータを親タスクに定義します。
#
パラメータ名称

書式 説明
1
XMLオブジェクト BLOB
入力パラメータ
2 XPath UNICODE 1000 入力パラメータ
属性を指定する場合は、
「Path/@Atr」のように指定することを想定
3 TEXT UNICODE 1000
出力パラメータ
2番目のパラメータ「XPath」は属性名も一緒に指定できるようにしましたが、MAGICの関数に合わせて、2個のパラメータに予め分割してもOKです。1個にする場合は、分割した値をセットするための変数等を定義しておきます。
 入出力テーブルに1のオブジェクトを「V=項目」で定義します。

 子タスクを作成します。

v10db2_051.jpg

 パラメータ3を「XMLGet」関数で更新します。
XMLGet (1,1,[XPathの項目],[属性名の項目])

 作成したプログラムを今度は、メインプログラムに登録します。

v10db2_052.jpg

 「ロジック」タブを開き、「F=関数」を定義します。関数名は「XMLGetNodeText」としました。
 スコープを「G=グローバル」とするとコンポーネントとして作成することにより、他のプロジェクトでも利用できるようになります。
 項目を追加し、2個(XMLObject, XPATH)はパラメータ、1個(NodeText)は変数にします。作成したプログラムをコールして、それぞれをパラメータに割り当てます。
 最後に、関数の「戻り値」に、3個目に定義した変数「NodeText」を返してあげればOKです。
 作成した関数を、データビューの「代入」等で使う場合を考慮し、2個のパラメータがいずれもNULLでないときに動作するよう、条件を定義します。


作成した関数の利用方法



 今度は、作成した関数を利用する場合のコーディング方法です。
 DB2の表に格納したプログラムリポジトリの名称と、編集時刻、コメントをテーブルで表示させてみましょう。
 メインソースに「XMLDBTEST」を定義し、DATAIDとDATAXMLを配置します。

v10db2_053.jpg

 変数を、6個(Description、Comment、_date、_time、修正日付、修正時刻)定義し、それらの代入式に次のものをセットすればOKです。

C/V
NO
S
名称
TYPE
PIC
代入
C
1
F
DATAID
A
20

C
2
G
DATAXML
B


V
1
H
Description
A
30
1
V
2
I
Comment
A
1000
2
V
3
J
_date
A
10
3
V
4
K
_time
A
10
4
V
5
L
修正日付
D
YYYY/MM/DDZ
5
V
6
M
修正時刻
T
HH:MM:SSZ
6

 代入した式は次の通りです。
#
式定義
1 XMLGetNodeText (G,'/Application/ProgramsRepository/Programs
/Task/Header/@Description')
2 XMLGetNodeText (G,'/Application/ProgramsRepository/Programs
/Task/Header/Comment/@val')
3 XMLGetNodeText (G,'/Application/ProgramsRepository/Programs
/Task/Header/LastModified/@_date')
4 XMLGetNodeText (G,'/Application/ProgramsRepository/Programs
/Task/Header/LastModified/@_time')
5 IF(J=' ',0,Val(Trim(J),'6'))
6 IF(K=' ',0,Val(Trim(K),'6'))

 下図は、フォームの編集画面です。

v10db2_054.jpg

 それでは、作成したプログラムを実行させてみましょう。
 データビューの定義のみで、DB2に格納されたXMLドキュメントから任意のテキストを取得することができました。

v10db2_055.jpg



ユーザ定義関数の活用について


 このユーザ定義関数は、ちょっとした工夫で効果絶大だと思います。
 似たような処理を共通化し、それをコンポーネントに関数として実装させれば、利用度も上がります。
アプリケーション開発も、これによって大きく変わる可能性・・・を秘めています。

 実は現在、メールデータを管理するアプリケーションの開発を行っているのですが、どうしても厄介なのがメールの日付の処理です。その部分を、このユーザ定義関数に実装しました。
 下の表は、ある一通のメール中に記載された日付文字列の例ですが、関数を定義して使うことによりコーディングをすっきりさせることができました。
 値の大小を比較できるデータに置き換えることが可能です。
 関数ですから、いろいろな場面で使えますし・・・。

メールヘッダに記載された日付
関数の戻り値
変換日付
変換時刻
Thu, 1 Mar 2007 21:46:30 -0700 (MST) 20070302044630 07/03/02
04:46:30
Thu, 1 Mar 2007 23:46:31 -0500
20070302044631
07/03/02 04:46:31
Fri, 2 Mar 2007 13:46:35 +0900 (JST)
20070302044635
07/03/02 04:46:35
Fri, 02 Mar 2007 13:46:37 +0900 20070302044637 07/03/02 04:46:37

 ということで、ちょっとV10の紹介が中心的話題となりましたが、如何でしたでしょうか?
 この機能は、是非実際に試してみられることをお勧めします。



MAGIC + DB2 で XQuery(1) MAGIC + DB2 で XQuery(1)
サイズ 4320 - File type text/html
MAGIC + DB2 で XQuery(2) MAGIC + DB2 で XQuery(2)
サイズ 7143 - File type text/html
MAGIC + DB2 で XQuery(3) MAGIC + DB2 で XQuery(3)
サイズ 10488 - File type text/html
MAGIC + DB2 で XQuery(4) MAGIC + DB2 で XQuery(4)
サイズ 14638 - File type text/html
MAGIC + DB2 で XQuery(5) MAGIC + DB2 で XQuery(5)
サイズ 7537 - File type text/html
MAGIC + DB2 で XQuery(6) MAGIC + DB2 で XQuery(6)
サイズ 7699 - File type text/html
V10HACKS_20070509.lzh V10HACKS_20070509.lzh
サイズ 124.0 kB - File type application/x-lzh
カテゴリ
dbMAGIC
DB2

MAGIC V10解析(9)


MAGICフォーラム2007


MAGIC Forum 2007 みなさん、お元気ですか?
 さて、一昨日は、MAGICフォーラムに参加して参りました。
 多くの方が参加し大盛況で、本当に何よりでした。プレゼンは楽しかったですし、ブラクラじゃないリッチクライアントはちょっと驚きで、やはりMAGICやるしかないかな・・・(どういう意味だ?)、なんて思った次第です。w
 MAGICビジネスの発展を祈るばかりです。
 そうそう、お会いした方の何人かに、「ブログを見てるよ」と言って頂きましてとても嬉しかったです。有難うございます。m(__)m

 さて、MSJの技術の人たちとちょっと立ち話になりまして(立食パーティだったので、当然ながら、立って話すしかなかったんですが・・・w)、そのときにMAGICのリポジトリソースの話になったんです。
 「そんなことはなかんべぇ・・・」と言われてしまったのですが、この場をお借りして(借りるまでも無く私のサイトですねw)、私の言いたかったことを説明させて頂きたいと思います。

データソースインデックスのセグメントとカラムの関連について


 ところで先日ベータ公開させて頂きましたリポジトリ解析ツールは無事動きましたでしょうか?
 実は公開したあと気付いたんですが、第三者が作成したコンポーネントを使っているようなアプリケーションでは多少問題が発生します。というのは、コンポーネントを使っているアプリケーションの場合、そのコンポーネントのソースを探しに行くんですが、そのとき情報の取得に失敗してエラーが出てしまうようです。近いうちにまた修正版を出したいと思います。
 そのリポジトリ解析ツールで、私が定義したとあるプロジェクトのデータソースの情報を見てみたいと思います。
 下の図が、データソースのカラムを表示している画面です。

dav10ds01.jpg


 解析ツールは、通常見ることのできないカラムのid(下のソースの赤枠部分)を表示してくれます。
 この例は、カラム表示順に対して、「4」,「3」,「2」,「5」と変則的な順番になっていますが、これはカラムを削除したり順番を入替えたりした痕跡です。(おそらく試行錯誤をしたんですね!)
 

dav10ds02.jpg


 さて、今度は、インデックスの一覧です。
 インデックスにも「id」などの通常見れない番号があるんです。(idがあるものについては、たいていの場合、コメントなども入れられるようになっているようです。)

dav10ds03.jpg


 この例では3つのインデックスが作成してあります。
 画面下に表示されるテーブルは、一番目のインデックスのセグメントを表示しています。
 ここで注目して欲しいのは、カラム番号として「1」と「2」を指していることです。
 ソースファイルを見ると、下図の赤い囲みの数値になります。

dav10ds04.jpg

 このカラムを指す番号は、最初カラムに付けられた「id」を指すものと予想したのですが、どうやらそうではなくて、いわゆる「カラム情報のXML上の出現順の番号」を指しています。
(上の例では「id」が「1」となるカラムは存在していないことから、「id」を指すものでなさそうなことは推測できますね。)

 さて、これが原因で問題になるケースがあるのでしょうか?
 実は次のような手順でXMLタイプのデータを定義した場合に、インデックスで指定したカラムがズレてしまう・・・という現象が起きます。

  1. XMLタイプのデータソースを定義

    dav10ds05.jpg

  2. スキーマ情報を「定義取得」
  3. インデックスを任意のカラムに対して定義

    dav10ds06.jpg

  4. スキーマを変更し、インデックスを指定したセグメントカラムに該当する属性の前に、新しい属性を追加

    dav10ds07.jpg

  5. 変更したスキーマ情報を「定義取得」で再取得
  6. インデックスのカラム位置が新しいカラムに付け変わる

    dav10ds08.jpg

 ということで、XMLスキーマの定義を変えた場合は、インデックスで指定したカラムがズレることがありますので、ご注意下さい。
 私は、これに気付かずにプログラムを実行した途端に誤動作(インデックスが重複している等のエラーが発生)したことがありました。
 まぁ、それ以外のケースで問題になることはなさそうなので、これはこれでなんとか我慢できるかな?とは思っていますが・・・。
 ついでなので、今までXMLタイプのデータを扱ってみて、ちょっと不満に思う点を記述しておきます。

<XMLタイプデータを扱う際の不満点>

  1. 定義取得の再取得が上手く動作しないことがある

     スキーマを変更したときに、「定義取得」を再度行うのですが、追加したノードや属性が追加されないことがあります。そんなときは、しょうがないので最初からやり直すのですが、プログラムと関連している場合は修正が大変です。

  2. 除去したカラムが再度追加される

     ビューから削除したノードや属性が、「定義取得」の再読込で全て追加されてしまいます。
     カラムが多い場合は大変で、ひとつひとつ再度操作しなければなりません。
     再読込の際に表示される「関連するビューの検索と再読込」のチェックを外しても結果は同じなんですが、こういう動作は仕様でしょうか?
     ちなみに、これらの操作の度に、カラムのidが増えてしまいまして、あるデータはカラムidが1000を超えてしまっているものがあります。


もしMSJの方でこの書込みを見る機会がありましたら、ご検討を宜しくお願い致します。
(プライオリティ的には、リッチクライアントのリリースを最優先にして頂いて構いませんので・・・w)



MAGIC Decrypter for V10 MAGIC Decrypter for V10
サイズ 6.3 kB - File type text/html
MAGIC V10解析(1) MAGIC V10解析(1)
サイズ 8337 - File type text/html
MAGIC V10解析(2) MAGIC V10解析(2)
サイズ 8904 - File type text/html
MAGIC V10解析(3) MAGIC V10解析(3)
サイズ 9714 - File type text/html
MAGIC V10解析(4) MAGIC V10解析(4)
サイズ 9882 - File type text/html
MAGIC V10解析(5) MAGIC V10解析(5)
サイズ 10443 - File type text/html
MAGIC V10解析(6) MAGIC V10解析(6)
サイズ 9739 - File type text/html
MAGIC V10解析(7) MAGIC V10解析(7)
サイズ 12563 - File type text/html
カテゴリ
dbMAGIC

MAGIC + DB2 で XQuery(8)


再度XQuery・・・



 梅雨の鬱陶しい季節ですが、皆さん如何お過ごしでしょうか?
 さて、私のほうは、この何ヶ月にわたり受託開発していたシステムの納品も済んで、少し落ち着いているところでしょうか?

 ところで、このブログもなかなかこまめに投稿できず、かなり不定期的連載となっています。(申し訳ありません)
 思えば、前回から一月も経ってしまいました。でも今回はご安心下さい。すでに書ききれないので、近日「続き」を書かないといけなくなりました。w

 ところで、この連載の始まった頃からの課題といいますか、XMLデータベースの使い方の中で、「これは、どうすればいいんだ・・・?」と疑問に思いながら追求していたことが幾つかあったんですが、そのうち一番大きいやつがこのほど、霧が晴れたように解決してしまいました。
 まぁ、この連載も手探りでやっていますので、どこに行き着くかも分からないんですが、それがまた楽しいのかも・・・w
 ということで、今回は、再びXQueryがテーマです。(正確には「今回から」=「次回も・・・」?)


「RM互換」のタスクの検索・・・


 たまたまテーマにしてるのが、MAGIC V10のソースの解析なんですが、プログラムのソース(=XMLドキュメント)をXMLデータベースに格納することにより、効率良く該当ドキュメントを検索することが可能になることは、今までの連載の中で述べてきたとおりです。
 ここで、その要点をまとめておきます。

  • XMLドキュメントは、XMLデータベース(DB2 9)のXMLタイプのカラムにそのまま格納することができる
  • 該当するドキュメントは、SQLを拡張したSQL/XMLを使用することにより検索が可能
  • 具体的には、where句でxmlexist関数を使い、XPathで指定する

 最近、某MLで、「RM互換のタスクをどうやって探せばいいか?」という話題になりました。
 「RM互換」というのは、古いバージョンのコーディング方法をサポートするために、MAGIC V10で実装された機能?で、純粋なイベントドリブンコーディングにするためには、取り除くことが望ましいとされているものです。
 私は思わずその問いの答えとして、「XMLデータベースを使って検索すれば・・・」という回答を投げたんですが、かろうじてシスオペの方に反応して頂くに留まりました。(DB2 9をいじっているMAGICの技術者はまだ少ないと思うので・・・。いや、はたして、いるのかどうか?)
 まぁ、機会ある度にDB2 9の宣伝・普及活動はしようと思っていますので、半分目的は遂げられたんですが・・・。w

 さて、この「RM互換」という機能は、良く出来ているというか、不思議な機能というか、普通のV10のコーディングであれば作成できないんですが、隠しスイッチ(MAGIC.INIに記載)で入力できるようになります。

[MAGIC_SPECIALS]SpecialRMCompatibleLogic = Y

 「ロジックテーブル」に1つだけ挿入が可能で、挿入すると自動的にデータビューの内容(パラメータ、変数、メインソースやリンクしたテーブルのカラム)が自動的に展開されます。そして、その中に項目更新やズームなどの従来レコードメインというロジックテーブルに記載していた内容を記録できるようになります。下の図は、ブロックとコールタスクを挿入した例です。

v10db2_061.jpg

 しかし、面白いのは画面上とソース上では、記載される場所が違うという点です。
 つまり、RM互換に記載したロジックは、「LogicUnit/Level/@va」lが"R"でかつ、「LogicUnit/Type@val」が"M"の「TaskLogic」(いわゆるレコードメイン)に記載されます。

v10db2_062.jpg

 これに対して、ロジックテーブルのRM互換そのもの(「LogicUnit/Level/@va」lが"M"で、「LogicUnit/Type@val」は存在しない)は、ごくわずかなその属性値が記載されるだけです。その記載の有無が問題となるのではないかと推測します。

v10db2_063.jpg

 さて、ということで、「RM互換のあるプログラムの検索」を行うためにはどうすれば良いか?という問題に戻ります。
 下のSQL文がその答えです。

select c.DATAID from DB2ADMIN.XMLDBTEST c where 
xmlexists('$i/Application//LogicUnit/Level[@val="M"]'
 passing c.DATAXML as "i")

 上記のコマンド中、「Application//LogicUnit」とある、「//」はどういう意味でしょうか?
 これは、任意の階層のタグを現すXPathの表現です。
 MAGICのプログラムのソースが悩ましいのは、タスクの記述が再帰的に記載されることです。
 ルートタスクは、「Application/ProgramsRepository/Programs/Task」ですが、孫タスクは、「Application/ProgramsRepository/Programs/Task/Task/Task」です。でも子供が3人いて、孫は全部で10人かも知れません。
 「LogicUnit」は「Task」の子の「TaskLogic」の下に作成されますが、「Application//LogicUnit」は、全ての任意のタスクの下にある「LogicUnit」を意味します。
 もしかしたら、途中を省略せずに「Application//Task/TaskLogic/LogicUnit」にしたほうが良いのかもしれません。
 「Level[@val="M"]」は、属性値が「M」である「Level」ノードを意味します。この"[" "]"で条件を特定させます。
 ここまでは、おさらいですね。
ところで、「RM互換」タスクが同じプログラム中に複数個存在したとき、それを検索するにはどうすれば良いでしょうか?当然、大きなプログラムであれば、何十というタスクが存在するかも知れません。
 上のSQL文では、プログラム(ドキュメント)のある行(レコード)は返ってきますが、それがどこのタスクにあるのかまでは分かりません。

 実は、これが、私の当初からの悩みだったのです!

 で、ちょっと前までは、検索されたドキュメント(=プログラムソース)をゴリゴリと分析することを考えていました。
 ところが、もっとスマートな方法があったんですね・・・。

(ということで、次回につづく・・・)


DB2 Star Festival 2007


 来週の月曜日に、IBMさん主催のイベントがありますね。(私も参加します!)

 去年の「Viper Night」に参加したのがDB2 9との出会いでしたが、今度のイベントでもまた「新しい出会い」があるといいな・・・と楽しみにしています。



v10db2_064.jpg


 写真(右)は、その案内状です・・・。プリマベーラって・・・?(ぐぐったらありました。(^^;)
 写真(左)に写っているのは、英文の書籍「DB2 9 : pureXML」。(いろいろと参考になりました。斜め読みですが...(^^;)
 いずれも前回の「クラブDB2」(ナイトスクール)で頂いたものです。(いつも感謝してます!)



MAGIC + DB2 で XQuery(1) MAGIC + DB2 で XQuery(1)
サイズ 4320 - File type text/html
MAGIC + DB2 で XQuery(2) MAGIC + DB2 で XQuery(2)
サイズ 7143 - File type text/html
MAGIC + DB2 で XQuery(3) MAGIC + DB2 で XQuery(3)
サイズ 10488 - File type text/html
MAGIC + DB2 で XQuery(4) MAGIC + DB2 で XQuery(4)
サイズ 14638 - File type text/html
MAGIC + DB2 で XQuery(5) MAGIC + DB2 で XQuery(5)
サイズ 7537 - File type text/html
MAGIC + DB2 で XQuery(6) MAGIC + DB2 で XQuery(6)
サイズ 7699 - File type text/html
MAGIC + DB2 で XQuery(7) MAGIC + DB2 で XQuery(7)
サイズ 12220 - File type text/html
カテゴリ
dbMAGIC
DB2

MAGIC + DB2 で XQuery(9)




DB2 Star Festival 2007


 昨日、IBMさんのイベントに行ってまいりました。
 どちらかと言えば、技術指向の内容ではないのがちょっと物足りないところもありましたが、IBMさんのDB2にかける思いが伝わるようなイベントではなかったかと思います。

 「IOD-インフォメーション・オンデマンド」という言葉は初めて聞くものでしたが、なんでも「アプリケーションと密接に結びついたデータのあり方を、必要なアプリケーションが必要に応じて必要なデータにアクセスできる環境を提供する」ということだそうです。
 聞けば当たり前のことのように思えますが、まだまだコンピュータシステムはそういうレベルまで到達できていないんでしょう。それを(XMLとDB2 9で)実現することが、日本の活力に繋がる・・・というようなお話があり、とても印象に残りました。
 懇親会も、楽しめましたし、とても良かったと思います。(プリマベーラのファンになりました。w)


再帰的に出現するノードの取得


 前回で問題となった「ドキュメント内の該当タスクの情報を取得するためにはどうしたらよいか」というのが今回の主テーマです。

 さて第4回の中で紹介したように、DB2 9では、xmlquery関数を使うことにより、カラムの情報を取得するのと同様に、任意のXQuery検索結果を取得することが可能です。

 第4回の記事では、プログラムの名称(Header/@Description)などの情報を取得するために、「Application/ProgramsRepository/Programs/Task/Header」というノードを指定していました。
select c.DATAID, 
xmlquery('$i/Application/ProgramsRepository/Programs/Task/Header'
passing c.DATAXML as "i")

from DB2ADMIN.XMLDBTEST c
where xmlexists('$i/Application//LogicUnit/Level[@val="M"]'
passing c.DATAXML as "i")
上記は、絶対パス指定で、プログラムの名称を取得することが可能です。
 さてここで、xmlquery関数のXPATHに対し、xmlexistで指定したものと同じ条件のものを指定するとどうなるでしょうか?
xmlquery('$i/Application//LogicUnit/Level[@val="M"]' 
passing c.DATAXML as "i")
DB2のコントロールセンターを使って結果を試してみます。

v10db2_071.jpg

 上記の画面では、3つのドキュメント(プログラム)が該当しています。
 XMLドキュメントの内容を確認すると、どうやら該当箇所そのものが返っているようです。

v10db2_072.jpg


 検索された場所は、「Level」ノードそのものであることが分かります。今度は、そこから相対的にパスをたどって、「Task」ノードを指定できることを確認してみましょう。
xmlquery('$i/Application//LogicUnit/Level[@val="M"]/../../../Header' 
passing c.DATAXML as "i")
 下図にソースの内容を示しますが、「Level」ノードからたどり、相対的なパスから「Task」ノードを探すことができるわけです。(実際は、そこから「Header」ノードに下がる...)
 タスクの「ISN_2」属性は、同一プログラム内では、ユニークに割り当てられている番号なので、この番号を取得することにより、タスクを特定することが可能です。

v10db2_077.jpg

 XPATHの後ろに「../../../Header」を追加しただけですが、これは「Level」ノードを起点として、「親の親の親の子のHeader」ノードという意味になります。
 文書ビュアーで正しく情報が取得できているかどうかを確認してみましょう。


v10db2_074.jpg

 どうやら探そうと思っていたタスクの情報をGetすることができたようですね!
 ちなみに、先のXPATH式は、起点を「Level」から「LogicUnit」にずらし、下記のような記述にも置き換えることも可能です。(上がり下がりが少ないほうがコーディング時の間違いは減る?)
xmlquery('$i/Application//LogicUnit[Level/@val="M"]/../../Header' 
passing c.DATAXML as "i")

 ところで、検索結果のXMLのうちいくつかは、正しくツリーが表示されないというエラーになります。

v10db2_075.jpg

 さて、これはどうしてでしょうか?
 このソースを表示させてみましょう。
<?xml version="1.0" encoding="UTF-16" ?>
<Header Description="ツリー表示" ISN_2="3" LastIsn="33" id="76">
<ExecutionRight comp="-1"/>
<Resident val="Y"/>
<SQL val="N"/>
<ReturnValue>
<ParametersAttributes/>
</ReturnValue>
<SqlWhereExist val="N"/>
<TaskType val="O"/>
<External val="N"/>
<LastModified _date="732797" _time="32413" date="2007/05/01"
time="09:00:13"/>
</Header>
<Header Description="ビュー項目" ISN_2="4" LastIsn="33" id="76">
<ExecutionRight comp="-1"/>
<Resident val="Y"/>
<SQL val="N"/>
<ReturnValue>
<ParametersAttributes/>
</ReturnValue>
<SqlWhereExist val="N"/>
<TaskType val="O"/>
<External val="N"/>
<LastModified _date="732702" _time="32361" date="2007/01/26"
time="08:59:21"/>
</Header>
<Header Description="グローバルパラメータ" ISN_2="14" LastIsn="33" id="76">
<ExecutionRight comp="-1"/>
<Resident val="N"/>
<SQL val="N"/>
<ReturnValue>
<ParametersAttributes/>
</ReturnValue>
<SqlWhereExist val="N"/>
<TaskType val="O"/>
<External val="N"/>
<LastModified _date="732689" _time="56122" date="2007/01/13"
time="15:35:22"/>
</Header>
(以下略)
どうやら「Header」ノードが何回も出現していることがわかります。
 これは、該当するXMLノードが複数件存在していることによるものです。ということは、タスク情報をドキュメント(=プログラムソース)内から全て探してくれているわけです。
(XMLツリー文書で見ようとしたときにエラーとなるのは、単にルートのノードが無いためです。)

 ひとまず、これで、文書内の再帰的に出現するタスクの情報も、Task/Headerノードを相対的に指定することにより、検索できることが判りました。(^^)v


出力結果の整形は、FLOWRで・・・


 XQueryには、強力な整形機能があります。すっきりした形に整えてみましょう。
 まず、さしあたって必要なのは、「Header」ノードの「Description」属性と、「ISN_2」という属性なので、これだけを取得するようにします。
 「for」文で指定した変数「$e」に、「in ~」で指定したノードが格納され、「return」文で整形して出力することが可能です。このように、「for」、「let」、「order by」、「where」、「return」の先頭文字をとって「フラワー」と呼ぶそうです。
xmlquery(
'for $e
in $i/Application//LogicUnit[Level/@val="M"]/../../Header
return <Data>{$e/@Description,$e/@ISN_2}</Data>'
passing c.DATAXML as "i")
出力結果は次のようになります。
<?xml version="1.0" encoding="UTF-16" ?>
<Data Description="ツリー表示" ISN_2="3"/>
<Data Description="ビュー項目" ISN_2="4"/>
<Data Description="グローバルパラメータ" ISN_2="14"/>
(以下略)
どうでしょうか。取得した属性は、「Data」ノードの属性に入れ替わりました。

ルートノードを追加するには、下記のように修正します。
xmlquery('
<Datas>{
for $e
in $i/Application//LogicUnit[Level/@val="M"]/../../Header
return <Data>{$e/@Description,$e/@ISN_2}</Data>
}</Datas>'
passing c.DATAXML as "i")
今度は、該当箇所が複数検索された場合でも、正しいXML文書の形で処理ができるようになりました。

v10db2_076.jpg



 ここで、おさらいしておきましょう。

  • 該当するドキュメントの検索は、XMLカラムに関しては、Where句のxmlexist関数で行う(※1)
  • ドキュメント内のノードの検索は、Select句のxmlquery関数で行う
  • xmlquery関数は、整形機能を使うことにより、いろいろな形式に出力を操作できる(※2)

 ※1  「Net Search Extender」を使う場合は、若干変わります。
 ※2 整形のみならず、絞り込んだり並べ替えも可能です。



MAGICでの結果表示


 MAGICのXML連携機能を使用し、DB2から返ったタスク情報をテーブルに展開してみましょう。
 xmlqueryのレイアウトに合わせてスキーマを定義しておきます。

v10db2_078.jpg

 作成したスキーマを「定義取得」で指定し、データリポジトリを定義します。

v10db2_079.jpg

プログラム上では、パラメータで受け取るXML結果を、「XMLソース項目」で指定することが可能です。

v10db2_080.jpg

 実行結果の画面も、検索結果のタスク一覧(左)と連動させて、タスクツリー(右)の該当箇所をハイライト表示するように改良してみました。

v10db2_081.jpg

 ちょっと最後は駆け足でしたので、例によってプログラムソースを公開しておきます。
 なお、第5回で作成したクロスリファレンスのプログラムも、同じように該当タスクの一覧を表示できるように改良してあります。
 このプログラムも、だいぶ、バージョンアップしましたね...。

 現在ベータ公開中の、「MAGIC Decrypter for V10」のほうも、誠意改良中です。 今月中には、新しいバージョンも公開できるのではないかと思いますので、またベータ評価など、宜しくお願い致します。

p.s
 ソースに添付してあるキャビネットファイルは、昨日公開された 「MAGIC eDeveloper Ver 10.1 SP2a」で作成してあります。


MAGIC + DB2 で XQuery(1) MAGIC + DB2 で XQuery(1)
サイズ 4320 - File type text/html
MAGIC + DB2 で XQuery(2) MAGIC + DB2 で XQuery(2)
サイズ 7143 - File type text/html
MAGIC + DB2 で XQuery(3) MAGIC + DB2 で XQuery(3)
サイズ 10488 - File type text/html
MAGIC + DB2 で XQuery(4) MAGIC + DB2 で XQuery(4)
サイズ 14638 - File type text/html
MAGIC + DB2 で XQuery(5) MAGIC + DB2 で XQuery(5)
サイズ 7537 - File type text/html
MAGIC + DB2 で XQuery(6) MAGIC + DB2 で XQuery(6)
サイズ 7699 - File type text/html
MAGIC + DB2 で XQuery(7) MAGIC + DB2 で XQuery(7)
サイズ 12220 - File type text/html
MAGIC + DB2 で XQuery(8) MAGIC + DB2 で XQuery(8)
サイズ 9523 - File type text/html
V10HACKS_20070710.lzh V10HACKS_20070710.lzh
サイズ 142.0 kB - File type application/x-lzh
カテゴリ
dbMAGIC
DB2

MAGIC V10 SP2a その後



ようやく夏全開?


 ちょっと前までの東京は、梅雨が明けたのにも関わらず、涼しい日が続いていたりしましたが、ようやく夏らしい日の続くこの頃です。
 今年の夏は、当初「酷暑」とか言われていたのですが、とうやら例年並みらしいですね。(花粉症に悩む立場にとっては、「暑い夏」かどうかが、結構重要な関心事になっています・・・。)
 先々週の土曜日はとても蒸し暑い一日でしたが、夏休み中の息子を連れて、隅田川の花火とやらを見に行きました。東京に住んでかなりになりますが、今までは行ったことが無く、初めての経験となりました。
 家のある練馬から行くのは結構大変なんですけれど、花火を見に行くと分かるような人達も多くて、あの大量の人は東京中(関東中)から集まるんだと思いました。
 さて、今回は、ちょっと溜まったMAGICネタなどの、少し軽めの話題を・・・。



V10 SP2aその後



 MAGIC V10 SP2a のリリース後、結構バトル状態でコーディングを行っています。サポートセンターの方々にもいろいろとお世話になっているのですが、幾つか不具合らしきものや、原因不明の現象などとも遭遇しております。その中で幾つかをピックアップして掲載しておきたいと思います。


  1. スキーマ情報の取得時のコメント情報の問題

     「データソースタイプがXMLファイルタイプのデータベース」と書けば良いんでしょうか、最近DB2 9などのいわゆる「XMLデータベース」と、MAGICのデータソースの「XMLタイプのデータベース」を、どうやって言い分けたら良いのか少し悩むんですが、要はMAGICの扱う「XML連携」機能のことです。
     コメント機能を使用して、データに対するメモを入れてあると、スキーマ情報の「定義取得」でハングしてしまうようです。
     一旦、コメントを除去して、「定義取得」後に除去したコメントを入れなおせば回避できるんですが、「複行編集可能なエディットにクリップボードの内容を貼り付けるとハングする」というホット?な不具合もあるようで、編集操作には十分気を付ける必要があるようです。

  2. プログラムソースに不正な文字が混入

     例によって、DB2にソースをインポートしていたんですが、入らないプログラムがあったんですね。どうしても、原因が分からなくて、こっそり某I◎Mの方に調査をお願いしたんです。そうしたら、文字化けしている箇所がみつかり、それでインポートできないということが分かりました。
     どうしてそんな文字が紛れてしまったかは未だ不明です。
     場所は「外部コール」コマンドで「COM」や「Webサービス」をコールする時に作成されるらしい、「ENUMNAME」タグの属性値の箇所でした。
    <ENUMNAME val="ここにXMLでは使用できない文字が混入"/>
    もう起きてほしくは無いんですが・・・。インポートできないと困ることになるので・・・。

  3. SDIで無限ループ

     実は、とある新しいアプリケーションを現在開発しているんですが、それをSDI(シングル・ドキュメント・インタフェース)にしようと思ったんですね。何しろ、新しい機能は何かの機会には試しておかないと・・・、と思いまして・・・。
     割と安易に考えていたんですが、ちょっとしたツボみたいなところがありまして、それをはずしてしまったんです。
     さて、実行版を起動すると無限ループ。ウインドウがリソースを食い尽くすまで出てきて、コンピュータを再起動しなければならなくなるというハメに・・・。(実は、数回再起動しました。(^^;)
     そのツボですが、実はヘルプを読んだだけでは分かりません。「マスタリング eDeveloper」は必読のようです。
     さて、SDIですが、なかなか良いんじゃないでしょうか!研究の価値ありです。
     でも幾つか制限があるんですね。
     一番大きいのは、「プログラムのルートタスクはオンラインタスクにしなければならない」というのかな?これ、かなりプログラムの作り方を制限します。

  4. リッチエディットの挙動

     リッチエディットを画面に配置して、それをクリックすると全体が選択された状態になります。
     これはV9と挙動が異なるので、不具合でしょうか?
     一応、コントロール前処理に、「項目先頭」アクションを入れてあげて回避できるようですが・・・。
     
  5. その他

     Sp2aで、アクション関連の名前に全角カタカナを使用していたものが半角カナを使用するようになりましたが、あれは一体どういう意味があったのでしょう?(一度読んだけど忘れた(^^;)
     いまひとつ良く分からないのですが、その変更と関連してなのか、ヘルプとの連結が途切れてしまったものが結構あるようです。

今回は、不具合っぽい話(≒グチ?)が多くなってしまい、申し訳ありません。
 でも、確実に、V10は良くなっていると思います。次回は、V9と比べたらこんなに良いよ、というような話をしたいと思っています。



MAGIC V10 解析ツール 新バージョン公開



 もうすでに、他のページを読まれてご存知かと思いますが、「MAGIC Decrypter for V10 Beta」の新バージョンを公開させて頂きました。

 現在、プログラムリポジトリのタスク解析をコーディングしているんですが、思っていたよりかなり難航しているのが実情で、このままいくと7月末と約束したのが、9月になってしまいそうな気配です。

 XMLデータベースとの連携機能は、プログラム、データ、モデルのコンポーネントアプリとホストアプリを跨いだ一括クロスリファレンス機能という、まぁそこそこの機能まではできています。
 ただ、DB2の環境をセットする部分が間に合いませんでした。別途、環境設定用のプログラムを準備し、近日公開しようと思っています。

 ということで、実務的に有効となる機能アップの内容としては、帳票出力としてのExcelシート出力機能のみということになります。(サンプルは、下記の関連コンテンツからダウンロードできます)

 開発画面から、いつでも起動し、必要なリストを出力・・・という使い方ができますので、V10の開発を行っている方は、是非お試しください。





Ver 0.6 Excelシート出力サンプル Ver 0.6 Excelシート出力サンプル
サイズ 50.5 kB - File type application/vnd.ms-excel
カテゴリ
dbMAGIC