2008年9月3日水曜日

ちょっと脱線 (Google Chrome)

前回ご説明していないテーブルをデータベースに登場させてしまいました。また改めて、前回の続きはご説明いたします。

ところで、実はここで作ろうとしているシステムは、一応出来上がっていて、Debian Linux上のGlassfishサーバを構築して、その上で走るようになっています。

で、本日あちこちで話題になっているGoogle Chromeが公開されましたので、Chrome上で、問題なくVisual JSFアプリケーションが表示できるかどうかを検証してみました。

結果、ここで配置したコンポーネントについては、問題なく表示することが可能でした。相変わらず、Firefoxではうまく行かないのですけれども、、、。

2008年8月28日木曜日

Woodstockコンポーネントへのデータバインディング

今回は、Page1に配置したWoodstockコンポーネントにデータベースのテーブルをバインディングしていきます。

[サービス]ウィンドウの[データベース]を展開し、前回作成したPostgreSQLのkinkiデータベースへの接続を開いてください。もし、kinkiデータベースのアイコンが破れている場合には、接続が確立されていませんので、[Ctrl]+クリックして、[接続]を選択してください。
これで、前回エントリーの最後の図の様に展開できていると思います。

次に、kinkiデータベースの[表]のの下にある[tbl_yakujyo]を選択、そのままlistboxまでドラッグ&ドロップします。listboxの枠が青色に変化した後しばらくすると、通常の選択された状態に戻るかと思います。

listboxを[Ctrl]+クリックでポップアップメニューから、[データにバインド]を選択します。
[値フィールド]に"yakuhincd"、[表示フィールド]に"kanji_name"を選択してください。次に、同様にkinkiデータベースの[tbl_interact]テーブルを、[表]にドラッグ&ドロップしてください。このままでは、tbl_interactに登録されているコードしか表示されませんので、他のテーブルの情報を追加していきます。

[ナビゲータ]ウィンドウにいったん戻り、SessionBean1を展開すると、"tbl_interactRowSet..."というCachedRowSetが出来上がっていると思います。こいつを[Ctrl]+クリックしS[SQLを編集]を選択してください。こうして開いたSQL編集ウィンドウの上部に、残りのテーブルをドラッグ&ドロップします。すると、外部結合を定義したカラム同士のリレーションが矢印で表示されると思います。この段階で、必要の無いフィールドのチェックを外しておいても良いかもしれません。以上で、[表]のバインディングを編集する準備ができました。[Page1]に戻り、[表]を[Ctrl]+クリックし、[データにバインド]を選択します。選択可能な項目から、"generic_kanji"、"kanji_name"、”syojyou"、”sayokijyo"の4項目を選択します。次に、[表]を[Ctrl]+クリックして[表のレイアウト]を選択。各カラムのヘッダやサイズを指定します。ついでですから、右下のプロパティウィンドウで、表のタイトルも適当に設定しておいてください。

以上で、とりあえずデータのバインディングは終了しました。

2008年8月27日水曜日

新規データベース接続の作成

さて、いよいよ前回配置したWoodstockコンポーネントにデータをバインディングしていきます。と言っても、NetBeans上にデータベース接続を作ってしまえば、あとはドラッグ&ドロップでできてしまいます。今回は、NetBeans上に新規にデータベース接続を作成します。

最初にPostgreSQLが起動している事を確認してください。
tmiura:~ tmiura$ ps ax | grep postgres
32 ?? Ss 0:00.01 /opt/local/bin/daemondo --label=postgresql83-server --start-cmd /opt/local/etc/LaunchDaemons/org.macports.postgresql83-server/postgresql83-server.
70 ?? S 0:01.08 /opt/local/lib/postgresql83/bin/postgres -D /opt/local/var/db/postgresql83/defaultdb

83 ?? Ss 0:02.68 postgres: writer process
84 ?? Ss 0:02.06 postgres: wal writer process
85 ?? Ss 0:00.64 postgres: autovacuum launcher process
86 ?? Ss 0:01.07 postgres: stats collector process
こんな感じで出てくれば起動しています。ん〜、なんかPIDが変ですが、コピーペーストの問題ですので、気にせず次に進みましょう。

ここからは、NetBeans上での作業になります。

まず、サービスウィンドウのデータベースを選択肢[Ctrl]+クリックして、[新規接続]を選択します。
[データベースの新規接続]ウィンドウが出てきます。まずは、[基本設定]からセッティングしていきます。
[名前]のドロップダウンリストからPostgreSQLを選択します。おそらく[ドライバ]が自動的に"org.postgresql.Driver"に変わったと思います。
[データベースのURL]には、"jdbc:postgresql://localhost:5432/kinki"と入力してください。ポート番号の5432は、PostgreSQLのデフォルトポートです。もし、何らかの理由でPostgreSQLの待ち受けポートを変更している場合には、そのポート番号を指定してください。
[ユーザー名][パスワード]には、それぞれの設定した値を入力してください。

次に[詳細]タブをクリックします。[スキーマを取得]ボタンをクリックし、出てきたポップダウンリストから、"public"を選択してください。もし、スキーマの取得でエラーが出た場合には、[基本設定]に問題がある可能性があります。見直してみましょう。
無事にデータベースの接続が作成された場合には、以下の様に展開できると思います。

2008年8月25日月曜日

Woodstockコンポーネントの配置

さて、今回のエントリーでは、実際にWoodstockコンポーネントを配置していきます。実は、その前に一つ作業が残っています。NetBeans6.1に付属しているWoodstockのバージョンは4.1FCSなのですが、どうやらバグがあるようです。また、関連しているかどうかは分かりませんが、NetBeans6.1でWoodstockコンポーネントを利用したJSFページを作成した場合、Firefox3で表示に問題がある事が分かっています。という事で、こちらのページを参考にNetBeansのWoodstockをアップデートしました。
使用したWoodstockプラグインファイルは、こちらのページからダウンロードしました。(今回インストールしたのは、4.3Build6です。)

では、早速コンポーネントを配置していきましょう。完成イメージはこちらになります。私は絵心が無いので、飾りはいっさい省きました。
  1. まず、右の[パレット]ウィンドウの[Woodstock基本]を展開してください。
  2. [Woodstock基本]にある[テキストフィールド]をクリックし、[デザイン]パネルの左上辺りに配置してください。そして、[Ctrl]+クリックして、出てきたポップアップから[バインド属性を追加]を選択してください。
  3. 次に、[Woodstock基本]にある[ボタン]をクリックし、テキストボックスのすぐ右側に配置します。同様に[バインド属性を追加]しておきます。さらに、右下にあるプロパティウィンドウで[ラベル]を"検索"に変更しておきます。
  4. 次に、[リストボックス]をその下に配置、さらにその下に[表]を配置、それぞれバインド属性を追加しておきます。
とりあえず以上でイメージ図の様な配置が完了すると思います。この段階でどのように見えるのか見てみましょう。[主プロジェクトの実行]をしてみますと、しばらくするとデフォルトブラウザが立ち上がって下のような画面が見られる事と思います。
ちなみに、上のスクリーンショットはSafariのものです。Firefox3では、やはりうまく行かないようです。ん〜、なんでだろう。

最後に大事な事を忘れていました。Page1の[デザイン]パネル上で何もコンポーネントが配置されていないところをクリックしてください。右下のプロパティウィンドウがPage1のプロパティになっていると思います。[タイトル]のテキストを"薬剤併用禁忌検索システム"に変更してください。

2008年8月24日日曜日

NetBeansプロジェクトの作成

さて、今回からいよいよNetBeans上でWebアプリケーションを作成していきます。参考にさせていただいたサイトは、こちらのチュートリアル群です。

まずは、プロジェクトを作成します。
  1. NetBeans6.1を立ち上げます。
  2. [ファイル] → [新規プロジェクト]を選んでウィザードを立ち上げます。
  3. [プロジェクト選択]画面では、"Web", "Web アプリケーション"を選択し、[次に]をクリックします。
  4. [名前と場所]画面では、"プロジェクト名"に"kinki-search"と入力、"プロジェクトの場所"はどこでもお好きな場所を、自分の環境にあわせて設定してください。
  5. [サーバと設定]画面では、"サーバ"に"GlassFish V2"を選択、"Java EE バージョン"に"Java EE 5"を選択します。
  6. [フレームワーク]画面では、"Visual Web JavaServer Faces"をチェックして、[完了]をクリックします。
以上でNetBeansプロジェクトが作成できました。しばらく待つと、以下のような画面が出てくると思います。

データベースのセッティング(4) -外部キーの設定 解決編-

外部キーを設定しようとしましたが、日本医師会の併用禁忌データベースの情報に、現在の厚労省マスタに無い薬剤コードが含まれている事がわかり、そのためにうまく設定ができませんでした。
TBL_SSKIJYOおよびTBL_INTERACT間の外部キー参照は問題なさそうでしたので、TBL_INTERACT.DRUGCD2からTBL_YAKUJYO.YAKUHINCDへの外部キー参照のみを削除して、とりあえずすべての情報をPostgreSQLに流し込みました。
また、せっかくデータベースを最初から作り直すので、文字コードも懸念も解決しておこうと、kinkiデータベースの文字コードをUTF8に設定、iconvをもちいて流し込むデータもShift_JISからUTF8に変換しました。
tmiura:~/kinki tmiura$ createdb -E UTF-8 kinki
注意:データベースの文字コードをUTF-8にすると、Shift_JISのままのデータを流し込もうとしてもエラーが出ます。iconvなんかを使ってUTF-8に変換してください。MacOSX Tigerにはiconvは標準で入っているようです。

では、実際にどのくらいのレコードが厚労省医薬品マスタにすでに無い薬品コードを使っているのでしょうか?
kinki=# SELECT COUNT(drugcd) FROM tbl_interact WHERE NOT drugcd IN (SELECT yakuhincd FROM tbl_yakujyo);
count
-------
15022
(1 row)

kinki=# SELECT COUNT(drugcd2) FROM tbl_interact WHERE NOT drugcd2 IN (SELECT yakuhincd FROM tbl_yakujyo);
count
-------
16180
(1 row)

kinki=# SELECT COUNT(*) FROM tbl_interact;
count
-------
56040
(1 row)

psql83上で上記SQLを実行したところ、条件を満たすレコードは、全56040レコード中drugcdに15022、drugcd2に16180レコードが認められました。重なりがあるとはいえ、かなりの割合を占めています。ん〜、このデータ大丈夫かな?
次に、ここで見られた重なりのあるデータを削除していきます。
kinki=# DELETE FROM tbl_interact WHERE NOT drugcd IN (SELECT yakuhincd FROM tbl_yakujyo);
DELETE 15022
kinki=# DELETE FROM tbl_interact WHERE NOT drugcd2 IN (SELECT yakuhincd FROM tbl_yakujyo);
DELETE 11668
kinki=# SELECT COUNT(*) FROM tbl_interact;
count
-------
29350
(1 row)

とういことで、半分強にまで減ってしまいました。そして、外部キーを追加します。
kinki=# ALTER TABLE tbl_interact ADD FOREIGN KEY (drugcd2) REFERENCES tbl_yakujyo;
ALTER TABLE

これで、やっとデータベースの準備が完了しました。次回からは、いよいよNetBeans上でWebアプリケーションを作成していきたいと思います。



データベースのセッティング(3) -外部キーの設定-

前回までで公開されているデータをローカルのPostgreSQLに流し込むところまではできました。では、いよいよNetBeans上での作業に移ろうかというところで、外部キーの設定を忘れていた事を思い出しました。というか、外部キーを適切に設定していないと、NetBeans上でデータベースを取り扱うのが煩雑になるようです。

まずは、どのようなインターフェースにするかですが、


だいたい上のようなイメージで考えています。
  1. テキストボックスに商品名の一部を入力して、「検索」ボタンを押す。
  2. 下のリストボックスに候補薬品一覧が表示される。
  3. リストボックスにある候補薬品一覧の一つをクリックすると、併用禁忌になっている薬剤の一覧がしたの表に出力される。
1,2の部分は、tbl_yakujyoを検索し表示すれば良いので問題は少ないと思いますが、3の部分はリストボックスで選択された薬剤のyakuhincdを取得して、tbl_interactのdrugcdカラムを検索し、得られたレコードのdrugcd2およびsyojyoucdから、併用禁忌薬剤名、症状、作用機序の情報を得ます。ここで、外部キーの設定が必要になってきます。

ということで、外部キーの設定は、
  1. TBL_INTERACT.DRUGCD2 → TBL_YAKUJYO.YAKUHINCD
  2. TBL_INTERACT.SYOJYOUCD → TBL_SSKIJYO.SYOJYOUCD
となります。psql上でALTER TABLEを使っても良かったのですが、いったんテーブルを削除してあらたにCREATE TABLEからやり直す事にしました。以下に変更点を簡単にまとめます。
  1. 外部キーで参照されるカラムは、プライマリキーである必要があるため、TBL_YAKUJYOテーブルおよびTBL_SSKIJYOテーブルのプライマリキーをYAKUHINCD、SYOJYOUCDにそれぞれ変更。TBL_YAKUJYO_ID、TBL_SSKIJYO_IDを廃止。
  2. TBL_INTERACTテーブルを以下のように変更。
    CREATE TABLE TBL_INTERACT (
    TBL_INTERACT_ID SERIAL PRIMARY KEY,
    DRUGCD CHAR(9),
    DRUGCD2 CHAR(9) REFERENCES TBL_YAKUJYO,
    SYOJYOUCD CHAR(7) REFERENCES TBL_SSKIJYO
    );
今回は、すべてのSQLをkinki_db.sqlというファイルに書き込み、このファイルごとpsql83に流し込みました。
tmiura:~/kinki tmiura$ psql83 -d kinki -f kinki_db.sql
psql83:kinki_db.sql:36: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_yakujyo_pkey" for table "tbl_yakujyo"
CREATE TABLE
psql83:kinki_db.sql:42: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_sskijyo_pkey" for table "tbl_sskijyo"
CREATE TABLE
psql83:kinki_db.sql:49: NOTICE: CREATE TABLE will create implicit sequence "tbl_interact_tbl_interact_id_seq" for serial column "tbl_interact.tbl_interact_id"
psql83:kinki_db.sql:49: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_interact_pkey" for table "tbl_interact"
CREATE TABLE
COPY 19747
COPY 992
psql83:kinki_db.sql:53: ERROR: insert or update on table "tbl_interact" violates foreign key constraint "tbl_interact_drugcd2_fkey"
DETAIL: Key (drugcd2)=(615101101) is not present in table "tbl_yakujyo".
なにやらエラーが出ました。ん〜。どうやら、外部キー制約が破られているらしい。tbl_interact.drugcd2の615101101というレコードがtbl_yakujyo.yakuhincdにないのが原因の様です。実際に両方のテーブルを検索してみて確認したところ間違いなさそうです。ちなみにググって見ると、どうやらいわゆる中止された薬剤のコードにあたるようですね。
ってことで、おそらく他にもたくさんこういったコードが紛れ込んでいる可能性があり、外部キーをつかうならばこの辺を解決しなければならないようです。

解決編は次回へ。