NEXT IMAGE
ユーザー:匿名希望 さん      総合情報ポータルログイン 総合情報ポータルとは?  
  リンコム通信(公開メッセージ)  > メッセージ詳細表示 
公開メッセージ
検索 検索
[ 閉じる ]

前へ前へ      次へ次へ
グループ表示順を管理する (2011年3月)
カテゴリー:ネクスト活用事例紹介  登録者:リンコム営業   登録日時:2011/03/08 13:20  表示期限:無期限  
グループ表示順を管理する

text by 山田晃生(ITアーティテクチャ)


3月になりましたが、多くのお客様が決算を迎え大変忙しい日々ではないでしょうか?
システム構築も追い込みの案件が多く、大変忙しい毎日です。
今月はちょっと簡単な内容で、しかもかなり技術的な内容になると思います。
DBにあまり詳しくない方には厳しいかもしれませんが、ネクストのDBに詳しい方は必見です。


グループの表示順を見直そう
リンコムネクストではグループの階層構造をグループマスタ(m_group)というテーブルで管理しています。
各グループ毎にレコードで持たせ、親のID(parent)と子供のID群(vieworder)で親子関係を紐つけています。
この構造だと1テーブルで1レコードの親子関係が分かるメリットもあるのですが、テーブルをシンプルな構造にした分、ツリー形式への構築には必ずプログラムが必要となってしまうデメリットもあります。
ちょっと特殊な構造でもあるので、初めてテーブルを見た方には驚いた方もいるかもしれませんね。
(一般的には親子関係の構造を別テーブルで管理する事が多いです)

さてこのグループマスタ、もう少しDB単独で扱いやすくできないだろうか?と考えてみました。
やりたかったのは
SELECT * FROM m_group ORDER BY XXXXXXXXX
というSQL文で階層構造順に検索できれば理想です。

結論から言えば、グループマスタに以下の項目を追加しました。
viewnum int
viewnum_all char(60)
まず表示順を管理するのがviewnumです。
これは単純にネクストACMのグループ表示順設置画面で入力した値をそのまま持たせます。
(標準の処理では入力された表示順の値は持たず、その順序を使ってvieworderの結合に利用しています)
さてここからがキモなのですが、viewnum_allとはviewnumの値を3桁で頭ゼロ詰めをして、親階層に属するグループのviewnumをすべて結合、残階層にはすべてゼロを詰めて60桁固定にした値です。
・・・と文面で書いてもさっぱりだと思うので、下の図を見てください。
viewnum_allの仕組み
viewnum_allの仕組み

このように設定されたviewnumを頭ゼロ詰めのchar(3)としてしまい、ツリー構造上親にくるグループすべてを結合しています。
ポイントは最終的にchar(60)とするにあたって、後ろにゼロを詰め、階層が上位ならば数値として見た時に大きい値となるようにしています。
こういった値を生成すれば
SELECT * FROM m_group ORDER BY viewnum_all
というSQL文でツリー階層を綺麗に検索することができます。

肝心のviewnum_allを生成する方法ですが、自分はストアドプロシジャで組みました。
その一部を公開しますので、興味のある方は是非考えてみてください。
   
-- 3) マッチングテーブルとm_groupから表示順を生成する
UPDATE m_group
SET
m_group.viewnum_all =
   substring(mg2.viewnum_all,1,@LOOP * 3) +
   RIGHT('000' + cast(m_group.viewnum as varchar(3)),3) +
   LEFT(@ZERO60,60 - (@LOOP * 3 + 3))
FROM m_group_tmp mg2
WHERE mg2.viewid = m_group.gparent
AND m_group.glevel = @LOOP

と、今回はかなり技術的な内容にもなりましたが、このviewnum_allなかなか便利です。
またこの改修でいいのは、従来のネクストグループ処理には一切影響を与えないで出来る点です。
そして必要に応じて、vieworderやカスタムタグを使うのか、viewnum_allを使うのか自由に選択できる点にあります。

今回はかなり技術的な内容で分かりにくかったかもしれませんが、ご質問などありましたらご連絡いただければ幸いです。


リンコム通信へのご意見はこちらからお願いします


リンコム ネクスト・総合情報ポータル
Copyright © 2002-2011 LINKcom corporation. All rights reserved.
グループウェアならリンコム ネクスト