MAGIC V10解析(6)
前回の訂正・・・
今日は、息子の私立中学の受験の日だったんですが、おかげ様で無事合格することができました。ひとえにみなさんのお陰です。有難うございます。
この数ヶ月、この日のために家族で苦労して来ましたが、ほっとしているところです。
さて、前回、ちょっと「嘘」を書いてしまったので(をい)、はやめに訂正しておかなければと思い、これ書いています・・・。w
場所は「プログラムの作成・・・」のところです。前回は、
「データビュー」タブの「メインリソース」に「Prgs.Program」を選択し、
インデックスには「id」を選択します。
と、書いたんですが、表示順を確保するという意味では、ここで指定するインデックスは追加作成した「id」ではなく、MAGICが自動的に作る「ノード依存」という1番目のインデックスを選択しないと駄目ですね。失礼しました。


実はプログラムを幾つか削除したりしたんですが、削除したプログラムのidが飛ぶことによるものです。(リナンバリングされると逆に困るわけで・・・)
さてリポジトリ画面と同じような表示にするには、どうしましょうか?
第2回あたりで、XMLスタイルシートを作成したときは、
<xsl:value-of select="position()" />
という関数を使用することができたんですけど、この「position()」に代わるものが欲しいところです。
で、ヘルプを探してみたところ、「DbViewRowIdx」という関数があるじゃないですか!(期待感...)
早速プログラムを修正してみました。
まず、この関数を使う前には、レコードを事前読込させておかないといけないとのこと。
タスク特性画面に「ビュー事前読込」という箇所があるので、それを「Yes」に変更します・・・。(XML連携の場合はおそらく全てのノードを事前読込するでしょうし・・・?)

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

カラム(id)が指定してあったところを「V=変数」に書き換えちゃいます。(荒っぽい!)
数値項目にして、代入に「DbViewRowIdx (0)」を指定すれば出来上がり!
で、結果は・・・。
上手く行きました!!!
うん?え!あ!?
インクリメンタルサーチができない!!!(T_T)
やはり駄目でしょうね。変数項目は・・・。(惜しい)
しょうがないので、プログラム番号に相当する連番を割り振るためのテーブルをメモリテーブルで作成することにします。(妥協してはいけない・・・)
表示用テーブルの定義
表示順をコントロールするためのテーブルを定義します。
メモリテーブルを使うことにより物理的なファイルを作成しないで済みますから、とても重宝します・・・。
<データの定義>
データ名:任意「Progs.ProgNo」等
データソース名:任意「Progs.ProgNo」等
データベース:「Memory」
| # | カラム名 | 型 | 書式 |
|---|---|---|---|
| 1 | NodeId | N | 12 |
| 2 | id | N | 5Z |
| 3 | ProgNo. | N | 5Z |
| # | インデックス名 | タイプ | カラム |
|---|---|---|---|
| 1 | NodeId | U=重複不可 | 1:NodeId |
| 2 | id | U=重複不可 | 2:id |
| 3 | ProgNo. | N=重複可 | 3:ProgNo. |
テーブルが出来たら、こんどはプログラムを修正します。
プログラムの修正
前回作成したプログラムを複写して新しいプログラムを作ります。以前のV9Plusでは「Ctrl+R」で複写できたんですが、V10になって「Ctrl+Shift+R」に変わりました。ちょっと左手片手では押せないですよね。
ロジックのタブを開き、タスク前処理にコールタスクを追加します。
条件欄には、次の式を追加します。
DbRecs('4'DSOURCE,'')=0
今度は追加したタスクを開きます。
このタスクでは、XML連携ファイルを順に読み込み、新しく定義したメモリテーブルにレコードを登録しながら、プログラム番号を生成することを目的としています。

以下は、作成手順です。
- 「データビュー」タブを選択します。
- メインリソースには、前回作成した「Prgs.Program」テーブルを選択し、「ノードID」のインデックスを選択します。
- カラム1(ノードID)と3(id)を追加します。
- 「C=登録」リンクを作成し、「ノードID」のインデックスを選択します。
- 追加されたカラム「NodeId」にはメインリソースの「ノードId」を代入します。
- カラム2(id)を追加し、メインリソースの「id」を代入します。
- カラム3(ProgNo.)を追加し、「Counter(0)+1」を代入します。
次に、再び親タスクに戻り、修正を行います。

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

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

まとめ
今回の例では、必要なビューを作成するために一時テーブルをメモリテーブルを利用して作成しました。
ノードIDはXML上の記述順を保証する番号のようですが、連番ではないために、場合によってはこのような一時ファイルを利用しなければならない場面があるかもしれません。
新しく増えた関数(DbViewRowIdx関数や、DbViewSize関数)も、いろいろなケースで利用できそうな・・・。
追記
フォルダの表示ロジックなのですが、「Progs.Folder」のリンク方法に誤りがあるようで、正しいフォルダ名が表示されないことに気付きました。
プログラムは、下記のように修正をお願い致します。
<修正方法>
リンクしたテーブル「Progs.Folder」の「位置付:終了」へは、「B-1」ではなく「A-1」(項目「ProgNo.」-1)を指定。
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
MAGIC V10解析(5)
Size
10443
-
File type
text/html
- Category(s)
- dbMAGIC
