パーソナルツール
現在の場所: ホーム ブログ 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 V10解析(5)


「XML連携」機能について


 前回は「XML連携」の機能を使って、データリポジトリ(以前は「テーブルリポジトリ」と呼んでいたんですが、XML連携が加わった関連で変更したんですね?)を定義しました。この機能を使う主な利点としては次のようなものがあると思います。

  1. データリンク機能を使用したコーディングが可能
  2. データベースに依存しないテーブルとして利用が可能(エンジンの実装が不要という意味)
  3. ノードの追加や削除もテーブルのレコードを追加したり削除するようなコーディングで処理が可能(ちょっと「コツ」が要るんですが・・・)
  4. XMLの特定のノードに対して、インデックスを付加することが可能

 もしかすると従来のXMLの利用方法を越えた使い方ができるかも知れません。例えば1のデータリンク機能を使うことにより複数のXMLファイルを連結したビューの作成も簡単にできるわけですし・・・。

 逆に、「XML連携」機能を使う場合にそぐわない使い方は次のものです。

  1. 大規模データベースには向かない
  2. 再帰的な構造の処理は不可
  3. 予め定義したノードしかアクセスできない(XML内の不特定のノードにはアクセスできない)
  4. スキーマが定義されていない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で作成してみました。


v10xsd11.jpg

 スキーマ情報が出来上がったらファイル名を「Prgs.xsd」として保存します。前回と同じように、プロジェクトフォルダに格納しておきます。


データリポジトリの定義


 前回と要領は同じです。
 まず、プログラム一覧取得用の定義は次のように設定します。
データリポジトリ名:Prgs.Program
データソース名:%Source%\Progs.xml
データベース:Default XML Database
 「Program」以下をビューに追加すると、「id」が項目一覧に追加されます。

v10xsd12.jpg

 インデックスにタブを切り替え、「id」をインデックスに追加しておきます。

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

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

v10xsd14.jpg

 ここまでできたら、APGにより、データリポジトリの内容が表示されるのを確認してみてください。



プログラムの作成


 さて、プログラムを作成します。
 手順は以下の通りです。

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

    v10xsd15.jpg

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

    v10xsd16.jpg

プログラムの実行


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

v10xsd17.jpg

 さて、プログラムリポジトリの画面と同じになったでしょうか?



まとめ


 今回のプログラムの例では、同じXMLファイルの中で複数のビューの位置を定義してデータリポジトリを定義できることが分かりました。
 また、複数のXML連携データをリンクさせ、また新しく定義したインデックスを使って、新しいビューを作成することができることを確認しました。



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
Prgs.xsd Prgs.xsd
サイズ 2.7 kB - File type text/xml
ProgramHeaders.xsd ProgramHeaders.xsd
サイズ 4.5 kB - File type text/xml
カテゴリ
dbMAGIC

MAGIC V10解析(6)


前回の訂正・・・


 今日は、息子の私立中学の受験の日だったんですが、おかげ様で無事合格することができました。ひとえにみなさんのお陰です。有難うございます。
 この数ヶ月、この日のために家族で苦労して来ましたが、ほっとしているところです。

 さて、前回、ちょっと「嘘」を書いてしまったので(をい)、はやめに訂正しておかなければと思い、これ書いています・・・。w

 場所は「プログラムの作成・・・」のところです。前回は、

「データビュー」タブの「メインリソース」に「Prgs.Program」を選択し、
インデックスには「id」を選択します。

と、書いたんですが、表示順を確保するという意味では、ここで指定するインデックスは追加作成した「id」ではなく、MAGICが自動的に作る「ノード依存」という1番目のインデックスを選択しないと駄目ですね。失礼しました。

v10xml01.jpg

 それで一応並び順はプログラムリポジトリの画面と同じになります。
 ところがよく見ると、表示される番号は「id」の番号とは一致しないこともある・・・。


v10xml02.jpg


 実はプログラムを幾つか削除したりしたんですが、削除したプログラムのidが飛ぶことによるものです。(リナンバリングされると逆に困るわけで・・・)

 さてリポジトリ画面と同じような表示にするには、どうしましょうか?

 第2回あたりで、XMLスタイルシートを作成したときは、

<xsl:value-of select="position()" />

という関数を使用することができたんですけど、この「position()」に代わるものが欲しいところです。
 で、ヘルプを探してみたところ、「DbViewRowIdx」という関数があるじゃないですか!(期待感...)
 早速プログラムを修正してみました。
 まず、この関数を使う前には、レコードを事前読込させておかないといけないとのこと。
 タスク特性画面に「ビュー事前読込」という箇所があるので、それを「Yes」に変更します・・・。(XML連携の場合はおそらく全てのノードを事前読込するでしょうし・・・?)

v10xml09.jpg


 次にプログラムの修正です。

v10xml08.jpg

 カラム(id)が指定してあったところを「V=変数」に書き換えちゃいます。(荒っぽい!)
 数値項目にして、代入に「DbViewRowIdx (0)」を指定すれば出来上がり!
 で、結果は・・・。
 上手く行きました!!!

 うん?え!あ!?
 インクリメンタルサーチができない!!!(T_T)

 やはり駄目でしょうね。変数項目は・・・。(惜しい)

 しょうがないので、プログラム番号に相当する連番を割り振るためのテーブルをメモリテーブルで作成することにします。(妥協してはいけない・・・)


表示用テーブルの定義

 表示順をコントロールするためのテーブルを定義します。
 メモリテーブルを使うことにより物理的なファイルを作成しないで済みますから、とても重宝します・・・。

<データの定義>

 データ名:任意「Progs.ProgNo」等
 データソース名:任意「Progs.ProgNo」等
 データベース:「Memory」


カラム名
 型
 書式
1
NodeId  N12
2
id N 5Z
3
ProgNo. N 5Z



インデックス名
タイプ
カラム
 1NodeIdU=重複不可
1:NodeId
 2
idU=重複不可
2:id 
 3
ProgNo.N=重複可3:ProgNo. 


 テーブルが出来たら、こんどはプログラムを修正します。


プログラムの修正


 前回作成したプログラムを複写して新しいプログラムを作ります。以前のV9Plusでは「Ctrl+R」で複写できたんですが、V10になって「Ctrl+Shift+R」に変わりました。ちょっと左手片手では押せないですよね。
 ロジックのタブを開き、タスク前処理にコールタスクを追加します。
 条件欄には、次の式を追加します。

DbRecs('4'DSOURCE,'')=0

v10xml03.jpg


 今度は追加したタスクを開きます。
 このタスクでは、XML連携ファイルを順に読み込み、新しく定義したメモリテーブルにレコードを登録しながら、プログラム番号を生成することを目的としています。

v10xml04.jpg

 以下は、作成手順です。

  1. 「データビュー」タブを選択します。
  2. メインリソースには、前回作成した「Prgs.Program」テーブルを選択し、「ノードID」のインデックスを選択します。
  3. カラム1(ノードID)と3(id)を追加します。
  4. 「C=登録」リンクを作成し、「ノードID」のインデックスを選択します。
  5. 追加されたカラム「NodeId」にはメインリソースの「ノードId」を代入します。
  6. カラム2(id)を追加し、メインリソースの「id」を代入します。
  7. カラム3(ProgNo.)を追加し、「Counter(0)+1」を代入します。

 次に、再び親タスクに戻り、修正を行います。

v10xml06.jpg

 以下は、修正手順です。

  1.  「データビュー」タブを選択します。
  2. メインリソースのデータを、作成したテーブル「Progs.ProgNo」に置き換えます。
  3. インデックスを3の「ProgNo.」に変更します。
  4. カラムの番号を2の「id」に変更し、その上の行に新たに3の「ProgNo」カラムを追加します。
  5. フォームの画面を開きます。(「Ctrl+M」キー)
  6. 「id」と表示されていた項目「B」を「ProgNo.」の項目「A」に変更します。また、カラム名等も修正します。(必要に応じてカラムのサイズなども調整します。)

v10xml07.jpg


 以上で、プログラムの修正は終了です。
 早速、実行してみましょう。


プログラムの実行


 プログラムを実行させると、正しい番号(数値1からの連番)で表示されるようになりました。
 当然ながら、今度はインクリメンタルサーチも効きます!


v10xml05.jpg


まとめ


 今回の例では、必要なビューを作成するために一時テーブルをメモリテーブルを利用して作成しました。
 ノードIDはXML上の記述順を保証する番号のようですが、連番ではないために、場合によってはこのような一時ファイルを利用しなければならない場面があるかもしれません。
 新しく増えた関数(DbViewRowIdx関数や、DbViewSize関数)も、いろいろなケースで利用できそうな・・・。



追記


 フォルダの表示ロジックなのですが、「Progs.Folder」のリンク方法に誤りがあるようで、正しいフォルダ名が表示されないことに気付きました。
プログラムは、下記のように修正をお願い致します。

<修正方法>
 リンクしたテーブル「Progs.Folder」の「位置付:終了」へは、「B-1」ではなく「A-1」(項目「ProgNo.」-1)を指定。

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
カテゴリ
dbMAGIC

MAGIC V10解析(7)


再帰の処理をMAGICで・・・ 

 今回はプログラムのタスク構造の取得です。これがMAGICで出来れば、あとのいわゆる「MAGIC解析」?は殆ど力作業なんじゃないかなぁ?
 第三回目のときに、XMLスタイルシートを使って再帰的な構造のXMLを読み込んだと思いますが、それをMAGICのプログラムでやるにはどうするか・・・という話です。
 方法はXSL(XMLスタイルシート)使ったのと全く同じように考えれば良いのですが、前回まで使用した「XML連携」は残念ながら使えません。従来方法・・・つまり、V9からの関数「XMLGet」を使うことになります(逆に言えば、スキーマ情報は無くてもOKということです)。
 このあたりは将来的にはどうなるんでしょうか?ある部分は「XML連携」で、ある部分は従来方式というのは、Helpにも推奨されないようなことが書いてあったりして、ちょっと心配なところもありますね。

 さて、前回解析したダミープログラムの主要な部分を抜き出したのが次のソースです。
 見て頂ければお分かりのように、ネストされた「Task」タグを順にたどればOKです。「Task」以下のXMLの構造は全て同一になるので、「Header」タグやその他のタグの情報を順に取得していけば1プログラム内の全ての情報を取得することが可能です。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Application>
<ProgramsRepository>
<Programs>
<Task MainProgram="N">
<Header Description="タスク階層テスト" ISN_2="1" LastIsn="8">
</Header>
<Task MainProgram="N">
<Header Description="処理1" ISN_2="2" LastIsn="8">
</Header>
<Task MainProgram="N">
<Header Description="処理2" ISN_2="3" LastIsn="8">
</Header>
<Task MainProgram="N">
<Header Description="処理3" ISN_2="4" LastIsn="8">
</Header>
</Task>
</Task>
<Task MainProgram="N">
<Header Description="処理4" ISN_2="5" LastIsn="8">
</Header>
<Task MainProgram="N">
<Header Description="処理5" ISN_2="6" LastIsn="8">
</Header>
</Task>
</Task>
</Task>
<Task MainProgram="N">
<Header Description="処理6" ISN_2="8" LastIsn="8">
</Header>
</Task>
</Task>
</Programs>
</ProgramsRepository>
</Application>

(上記のソースは、骨格の部分のみを抜き出しています。更に、「Header」タグ中のいくつかの属性もカットしました。)


 さて、このソースを解析するプログラムですが、今回は2本のプログラムを作成します。
 ひとつめは、XMLをオブジェクトにロードし、開始位置であるところの最初のタスク(=プログラムのルートタスク)の場所「Application/ProgramsRepository/Programs/Task」を次の再帰プログラムに受け渡すプログラム。
 もうひとつは、最初のプログラムから呼ばれ、タスク情報を取得していくプログラム。もし更にサブタスクが存在すれば、今度は自分自身を呼び出して順に処理する再帰的なプログラム。
 今回はそれぞれのプログラムを、「タスク構造取得」、「タスク解析再帰」と名付けることとします。




プログラムの作成手順

 プログラムの作成手順を以下に示します。箇条書きにしますので分かり辛いかもしれませんがご了解下さい。
  1. タスク構造取得メインプログラム
    最初に第一のプログラムを作成します。
    1. タスク特性
      • プログラム名:「タスク構造取得」
      • タスクタイプ:バッチ
      • タスク終了条件:「Yes」
      • チェック時期:「A=後置」

    2. データビュー
      データビューに以下のパラメータと変数を追加します。
      パラメータで受け取ったidにより任意のプログラムソースを読めるようにします。

      v10xml11.jpg
      • パラメータ:「プログラムID」、数値4
      • 変数:「XMLファイル名」、文字255、代入:式1「'%Source%\Prg_'&Trim(Str(A,'4'))&'.xml'」
      • 変数:「XMLオブジェクト」、BLOB


    3. ロジック
      ロジックにレコード後処理を追加します。
      XMLをBlobに取り込んで、再帰用のプログラムをコールしますが、その際に、最初のタスク(ルートタスク)の位置をパラメータで渡してあげます。

      v10xml12.jpg
      1. レコード後処理

        • ブロック:条件:「FileExist (B)」
        • 項目更新:C、値=式3:「File2Blb(B)」
        • コールP:4(タスク解析再帰)、パラメータ1:式4:「0」、パラメータ2:式5:「'/Application/ProgramsRepository/Programs/Task'」
        • ブロック:Else
        • エラーW=警告:式6:「'プログラムリポジトリファイル「Prg_'&Trim(Str(A,'4'))&'.xml」が見つかりません。'」
        • ブロック:End

    4. 入出力ファイル
      入出力ファイルにXML読込の定義を記載します。
      • 名前:「XML」
      • メディア:V=項目
      • アクセス:R=読込
      • 書式:N=なし
      • 式/項目:C(XMLオブジェクト)


  2. タスク構造取得サブプログラム
    次に第二の再帰的なプログラムを作成します。
    1. タスク特性
      • プログラム名:「タスク解析再帰」
      • タスクタイプ:バッチ
      • タスク終了条件:「Yes」
      • チェック時期:「A=後置」

    2. データビュー
      下記のパラメータと変数を追加します。
      階層レベルは、ネストしているレベルを意味しますが、最初のプログラムで読み込んだXMLオブジェクトの位置を取得するのにも利用されます。ヘッダからタスクのIDと名前(それぞれ属性値)を取得し、変数にセットします。

      v10xml13.jpg

      • パラメータ:「階層レベル」、N=数値、3
      • パラメータ:「XPATH」、A=文字、512
      • 変数:「タスクID」、N=数値、3、代入:「Val(XMLGet (A+1,1,Trim(B)&'/Header','ISN_2'),'5')」
      • 変数:「タスク名」、A=文字、30、代入:「XMLGet (A+1,1,Trim(B)&'/Header','Description')」
      • 変数:「カウンター」、N=数値、3


    3. ロジック
      レコード後処理と、タスク後処理を追加します。
      1. レコード後処理
        エラー文を利用し、メッセージボックスにタスクIDと名前を表示させます。
        • エラー:W=警告、「Trim(Str(C,'3'))&'.'&D」

      2. タスク後処理
        子タスクがあるかどうかを判定し、ある場合は、その個数分だけ更に自分自身を呼び出します。
        Task[1]、Task[2]、Task[3]、・・・とpositionを指定します。

        v10xml14.jpg
        • 項目更新:E:カウンター、値:「E+1」
        • ブロック:w=while式:「XMLExist (A+1,1,Trim(B)&'/Task['&Trim(Str(E,'3'))&']','')」
        • コールプログラム:4(「タスク解析再帰」=自分自身)、パラメータ1:式:「A+1」、パラメータ2:式「Trim(B)&'/Task['&Trim(Str(E,'3'))&']'」
        • 項目更新:E:カウンター、値:「E+1」
        • ブロック:N=End


  3. 作成プログラムの組み込み
    作成したプログラムは、前回作成したプログラム(リポジトリ一覧表示プログラム)を修正し、ホットキーによりコールできるようにします。
    1. ロジックタブにイベントを追加します。
      • 「Ctrl+H」キー→「E」キー→「S」キー→「↓」キー→「F5」キー→「Enter」キー
    2. 追加したイベントに、コールプログラムを追加します。
      • 作成プログラム3(タスク構造取得)を指定、パラメータ1:一覧から「id」項目を選択
    さあ、これでいよいよ実行です。
  4. プログラムのテスト実行
    一覧表示プログラムを起動し、任意のプログラムで「F5」キーを押すと、今回作成したプログラムが起動します。

    v10xml15.jpg

    メッセージボックスに順に取得したタスクの名称が表示されます。


改良・・・

 ここまでくれば、あとは「お化粧」の世界です。タスクツリーを表示させてみましょう。
 まず、メモリテーブルにタスク一覧取得用のテーブルを定義します。

v10xml16.jpg



 「タスク解析再帰」プログラムは、次のような修正を行います。


v10xml17.jpg

  • パラメータ「親ID」(N=数値、3)を追加します。
  • 変数「タスクタイプ」(A=文字、1)を追加し、代入に「XMLGet (A+1,1,Trim(B)&'/Header/TaskType','val')」をセットします。
  • C=登録リンクを追加します。
  • レコード後処理のエラー行は無効にします。
  • タスク後処理のコールプログラムにパラメータ3(変数項目「タスクID」)を追加します。


 「タスク構造取得」プログラムの修正箇所は次のとおりです。

  • レコード後処理のブロック文にアクション(DbDel ('5'DSOURCE,''))を追加します。
  • コールプログラムのパラメータ3に式で「0」をセットするかスキップにチェックします。


 結果は、ツリーコントロールを使用し、ネストしたタスクの構造を表示させてみましょう。「タスク一覧表示」というプログラムを作成します。
 最後に、「プログラム一覧」のプログラムのイベントを修正し、完成です。


v10xml18.jpg


 プログラムのソースをダウンロードできるようにしておきます。



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
V10HACKS_20070211.lzh V10HACKS_20070211.lzh
サイズ 21.8 kB - File type application/x-lzh
カテゴリ
dbMAGIC

MAGIC V10解析(8)


ノードIDが危ない?


 いきなり変なタイトルですみません。m(__)m
 実は、XML連携時に自動的に作成されるノードIDの値がちょっと問題になっていまして・・・。(個人的にですが・・・w)
 というのは、いつぞやの回で、「ノードIDはXML上の記述順を保証する」と思い、ついつい、そう書いてしまったんですが、これがそうでもないようなのです。
 これが崩れると非常に困るわけで・・・。
 私が確認したのは、データリポジトリのカラム表示順の取得に関する現象だったのですが、つい最近、前回作成したプログラム一覧のプログラム番号の取得でも同じような現象が起きてしまいました。
 実はデータリポジトリの解析の件は、ここでの新しいネタにしようと思っていたのですが、そういうわけでしばし保留にさせて下さい。
 こうして前回までのプログラムを見直してみると、結構キケンな場所が幾つかあるようです。

その1:プログラム番号の取得

 プログラム番号の取得は、XML連携で生成されるノードIDを信じて作っていましたが、これはちょっとキケンです。やはり、「'%Source%\Progs.xml'」を取り込んで、

Val(XMLGet (1,1,'/Application/ProgramsRepositoryOutLine
/Programs/Program['&Trim(Str(D,'5'))&']','id'),'5')

で、順にIDを取得すべきかと考えます。


その2:タスク構造の取得

 前回作ったプログラムは、タスクIDの1番が必ずあるという想定ですが、これは思いっきり外しています。
 加えて言うなら、タスクIDを中心に親子の関連を形成してしまうと、タスクツリーが表示順にならないんですよねぇ・・・。(^^;
 これらは、改造が必要です。タスク番号もプログラム番号の取得と同じように、順に0(ルートタスク)からの連番で割り当てたほうが良いようです。
 タスクIDはツリー表示を行う上では属性値として扱いましょう。


 ということで、完成しました。(何時の間に・・・!)



プロジェクトフォルダの取得について


 作ったプログラム一覧のプログラムを、現在開発している任意のアプリケーションに組み込んで実行させることを考えて見ます。
 つまり、開発しているアプリケーションには殆ど何のプログラムを追加すること無しに作成したプログラム一覧のプログラムを実行させるわけですが、その場合は、キャビネットとしてアプリケーションを出力し、コール公開で呼び出せばOKです。


任意のホストアプリ  →  キャビネット出力したECF公開プログラム

公開プログラム側の手順


  1. ラッパープログラムの作成
    仮に「開発中のプログラム一覧」という名前のバッチタスクのプログラムを作成します。
    このプログラムで、下記の値から現在起動しているホストアプリケーションのプロジェクトのパスを取得することが可能です。
    Translate('%WorkingDir%')
    取得したプロジェクトのパス名を論理名にセットします。
    当アプリケーションでは、XML形式のデータリポジトリに使用している「%Source%」をセットすることになります。
    更に、プログラム番号の取得用に使用しているメモリテーブル「Progs.ProgNo」を「DbDel」し、「プログラム一覧」のプログラムをコールします。
    公開名に適当な名称(「ListProgs」など)を付けます。

  2. 「プログラム一覧」プログラム
    プログラム一覧は、プログラム番号の取得用に使用しているメモリテーブル「Progs.ProgNo」が空であれば、自動的に再取得するような仕組みになっています。

  3. タスク一覧プログラム
    タスクのツリーを表示するプログラムでは、ビットマップファイルを使用していますが、その「イメージ一覧ファイル名」の式欄に下記のようにセットします。
    ProjectDir()&'TREE.BMP'
  4. キャビネット出力
    ファイルプルダウンメニューからキャビネットファイル(「V10HACKS.ecf」等)を出力します。


任意の開発中のアプリケーション側の手順

  1. メインプログラムの修正
    メインプログラムを開き、ロジックにイベントを追加します。(「Ctrl+H」→「E」→「S」→「Tab」→「Ctrl+F7」→「Enter」等)
    行を追加(「F4」キー)し、コール、「N=公開名」、「公開プログラム名」に式で'ListProgs'、「キャビネットファイル」に、出力したキャビネットファイルのファイル名を入力します。

  2. プログラムの実行
    任意のプログラムを実行している最中などに、登録したホットキー(上の例では、「Ctrl+F7」キー)を押します。
    実行中のアプリケーションのプログラム一覧が表示され、任意のプログラムでF5キー押下によりタスクツリーが表示されればOKです。

project.jpg



プロジェクトフォルダの取得方法には2種類存在する!

 この例で述べたように、ホストアプリケーションで実行した場合は、ProjectDir()関数も、%WorkingDir%論理名もプロジェクトフォルダと同じフォルダのパス名を返しますが、コンポーネント等のアプリケーションで実行した場合は、ProjectDir()関数が、コンポーネントのフォルダを、%WorkingDir%論理名はホストアプリのフォルダをそれぞれ返すような仕様になっているようです。


今回のプログラムソース


 今回もソース公開しておきます。
 いろいろと良いアイデアがありましたら、教えて下さい。



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
V10HACKS_20070306.lzh V10HACKS_20070306.lzh
サイズ 60.3 kB - File type application/x-lzh
カテゴリ
dbMAGIC

MAGIC + DB2 で XQuery(1)



ハイブリッドデータベースDB2 9(デービー・ツー・ナイン)


 昨年の6月にアナウンスがあったとき、製品発表会に参加したんですね。確か「Viper Night」という洒落た名前のカクテルパーティだったと思うんだけど、今まで参加したことの無いような、ちょっとハイセンスな発表会だったのを覚えております。
 その後、無料のハンズオンセミナーに参加させて頂きまして、その潜在能力の素晴らしさに驚かされました。他社データベースと比較した技術資料(その資料だけは配布されなかったんですが...)なんかはちょっとインパクトがありまして、かなり良いんじゃないかな?なんて思いました。(すぐ洗脳されやすいタイプなもので・・・。(^^;)
 そんで、いつか自分もMAGICのアプリケーション開発の中でそれが使えるようになれば良いなぁ・・・と思っていたという次第です。


MAGIC V10でDB2の新機能は使えるか?


 さて、問題となるのは、MAGIC V10のDB2ゲートウェイですが、「DB2 9」への対応は正式にはうたっていないと思います。
 ですが、完全対応とまではいかないものの、そこそこに対応してくれたんじゃないでしょうか?細かいところで前よりも良くなっていますから・・・。
 で、いろいろと試行錯誤してみたんですが、なんとかMAGICからも「XMLデータベースとして使えそうかな?」という見解が出ました。
 DB2 9を、XMLデータベースとして使用するためには、最低でも次のような要件が必要になります。

  1. テーブル中に「XML」タイプのカラムを定義できること
  2. XQueryやSQL/XMLを使って検索処理を行うことができること
  3. 「XML」タイプのカラムへのアクセス
 
 これらの詳細についてはまだ言及しませんが、順を追って説明させて頂きたいと思っています。


準備編


DB2 9のインストール

 DB2 9は、開発者への無償版である「Express-C」を使用することが可能です。
 Windows XPのProfessionalなら通常版でOKです。最近、VISTA用のモジュールがアップされた模様です。
 IBMのWebサイト(http://www-06.ibm.com/jp/software/data/db2express-c/)からダウンロードが可能です。(ユーザ登録が必要です。)

 ダウンロードしたセットアップ・プログラム(setup.exe)を実行し、インストールを実行します。
 「セットアップ・ランチパッド」という画面が表示されますので、「製品のインストール」から「新規インストール」を選択して下さい。
 途中、「インストール・タイプ」の選択画面が表示されますが、「標準」でOKです。
 以後、殆ど初期値のままでインストールを進めてください。

DB2ゲートウェイのMAGIC V10への組み込み

 MAGIC V10のインストール時にゲートウェイからDB2を選択します。
 組み込むのを忘れて後から追加する場合は、セットアッププログラムを起動し、「変更」からモジュールを組み込んで下さい。
 起動するMAGIC.INI の MAGIC_GATEWAYSセクションに下記の記述があることを確認しておきます。

[MAGIC_GATEWAYS]
MGDB18=Gateways\MGdb2.DLL

 さて、ここまで準備はできたでしょうか?
 次回は、実際に、データベースの作成などを行ってみたいと考えています。



カテゴリ
dbMAGIC
DB2