Personal tools
You are here: Home ブログ MAGIC V10解析(6)
« May 2012 »
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    
About this blog
 当ブログサイトでは、MAGIC(uniPaaS)やDB2に関する技術者向け情報を公開しています。お気軽にお立ち寄り下さい。
Recent comments
Re:Club DB2 2009/8/29 muka 2009-09-01
Re:Club DB2 2009/8/29 SIM 2009-08-31
 

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)
Size 8339 - File type text/html
MAGIC V10解析(2) MAGIC V10解析(2)
Size 8904 - File type text/html
MAGIC V10解析(3) MAGIC V10解析(3)
Size 9714 - File type text/html
MAGIC V10解析(4) MAGIC V10解析(4)
Size 9882 - File type text/html
MAGIC V10解析(5) MAGIC V10解析(5)
Size 10443 - File type text/html
Category(s)
dbMAGIC