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にないのが原因の様です。実際に両方のテーブルを検索してみて確認したところ間違いなさそうです。ちなみにググって見ると、どうやらいわゆる中止された薬剤のコードにあたるようですね。
ってことで、おそらく他にもたくさんこういったコードが紛れ込んでいる可能性があり、外部キーをつかうならばこの辺を解決しなければならないようです。

解決編は次回へ。

2008年8月23日土曜日

データベースのセッティング(2) -厚労省医薬品マスタ-

今回は、厚労省の医薬品マスタデータをPostgreSQLに流し込んでいきます。

厚労省の医薬品マスタデータは、
http://www.iryohoken.ne.jp/こちらのサイトの
「基本マスターに関するページ」 → 「ファイルダウンロード」にあります。テーブル構造(注PDF)についても、同サイトにありますので、そこからダウンロードしてきます。

テーブル構造を参考に、create tableステートメントを適当に作り、今回はCOPY句も同じファイルに書き込んでみました。以下がTBL_YAKUJYO.sqlの中身です。
CREATE TABLE TBL_YAKUJYO (
TBL_YAKUJYO_ID SERIAL PRIMARY KEY,
KUBUN CHAR(1),
MASTER CHAR(1),
YKUHINCD CHAR(9),
KANJI_KETA CHAR(2),
KANJI_NAME VARCHAR(64),
KANA_KETA CHAR(2),
KANA_NAME VARCHAR(20),
TANNICD varchar(3),
TANNI_KETA char(1),
TANNI_NAME varchar(12),
KINNGAKU_SYUBETU char(1),
KINNGAKU char(10),
YOBI1 char(1),
MAYAKU char(1),
SHINKEIHAKAI char(1),
SEIBUTU char(1),
GENERIC char(1),
YOBI2 char(1),
YOBI3 char(1),
ZOUEI char(1),
INJ_YORYOU char(5),
SHIKIBETU char(1),
SYOHIN_NAME varchar(9),
KYU_KINNGAKU_SYUBETU char(1),
KYU_KINNGAKU char(10),
KANNJIMEI_HENNKOU_KUBUNN char(1),
KANAMEI_HENNKOU_KUBUNN char(1),
ZAIKEI char(1),
YOBI4 char(1),
HENKOU_DATE char(8),
HAISHI_DATE char(8),
YAKAKIJYUNCD varchar(12),
KOHYOU_JYUN char(9),
YOBI5 char(8)
);

COPY TBL_YAKUJYO(
KUBUN,
MASTER,
YKUHINCD,
KANJI_KETA,
KANJI_NAME,
KANA_KETA,
KANA_NAME,
TANNICD,
TANNI_KETA,
TANNI_NAME,
KINNGAKU_SYUBETU,
KINNGAKU,
YOBI1,
MAYAKU,
SHINKEIHAKAI,
SEIBUTU,
GENERIC,
YOBI2,
YOBI3,
ZOUEI,
INJ_YORYOU,
SHIKIBETU,
SYOHIN_NAME,
KYU_KINNGAKU_SYUBETU,
KYU_KINNGAKU,
KANNJIMEI_HENNKOU_KUBUNN,
KANAMEI_HENNKOU_KUBUNN,
ZAIKEI,
YOBI4,
HENKOU_DATE,
HAISHI_DATE,
YAKAKIJYUNCD,
KOHYOU_JYUN,
YOBI5
) FROM '/Users/tmiura/kinki/y.csv' WITH csv;

これを、psql83を使ってpostgreSQLに流し込みます。
tmiura:‾/kinki tmiura$ psql83 -d kinki -f TBL_YAKUJYO.sql
psql83:TBL_YAKUJYO.sql:37: NOTICE: CREATE TABLE will create implicit sequence "tbl_yakujyo_tbl_yakujyo_id_seq" for serial column "tbl_yakujyo.tbl_yakujyo_id"
psql83:TBL_YAKUJYO.sql:37: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_yakujyo_pkey" for table "tbl_yakujyo"
CREATE TABLE
COPY 19747
レコード数からしてきちんと読み込めたようです。念のためSELECTで日本語がきちんと表示されるか見てみましたが、大丈夫のようです。

以上で、必要なデータをすべてPostgreSQLに流し込みkinkiデータベースが出来上がりました。

データベースのセッティング(1) -併用禁忌データベース-

PostgreSQLにデータベースを作成し、各マスターデータを流し込んでいきます。

まずは、postgreSQLにtmiuraアカウントを作成しtmiuraアカウントで"kinki"データベースを作成します。
tmiura:/opt/local/lib/postgresql83/bin tmiura$ su postgres
Password:
tmiura:/opt/local/lib/postgresql83/bin postgres$ ./createuser tmiura
Shall the new role be a superuser? (y/n) y
tmiura:/opt/local/lib/postgresql83/bin postgres$ exit
exit
tmiura:/opt/local/lib/postgresql83/bin tmiura$ ./createdb kinki

つぎに、kinkiデータベースに流し込むデータのためのテーブルを作成していきます。
日本医師会が公開しているマスタデータは、2つのファイルからなっています。「症状措置機序マスタ」と「相互作用テーブル」です。それぞれのファイル本体とその構造は、こちらのサイトから入手できます。ちなみに今回使用したファイルは、
  • symptom20060224.tab
  • interaction20060224.tab
です。最新版の様ですが、日付が2年以上前なのが気になりますが、あまり深い事は考えず、すすんでいきたいと思います。
ただし、同ページには詳しいテーブルの情報が載っていません。例えば、「症状措置機序マスタ」の「症状・措置」および「作用機序」フィールドにどの程度varcharで割り当てれば良いか分かりません。で、いろいろ調べてみたところ、じつはこれらの情報はORCAのマスタに含まれているようでして、ORCAのデータベース構造は、こちらのサイトで公開されています。ここにある、「日医標準レセプトデータベース仕様書第15版(速報版)」のpp.172-174を参考(というかそのまま)にテーブルを作成する事にしました。
ORCAをインストールされている方は、そのデータベースを利用すれば、この辺りの作業は必要ない事になります。てか、ORCAに併用禁忌薬検索の機能は実装されてるのかな?

という事で、以下の内容のファイル"kinki_db.sql"を作成します。
CREATE TABLE TBL_INTERACT (
TBL_INTERACT_ID SERIAL PRIMARY KEY,
DRUGCD CHAR(9),
DRUGCD2 CHAR(9),
SYOJYOUCD CHAR(7)
);

CREATE TABLE TBL_SSKIJYO (
TBL_SSKIJYO_ID SERIAL PRIMARY KEY,
SYOJYOUCD CHAR(7),
SYOJYOU VARCHAR(2048),
SAYOKIJYO VARCHAR(2048)
);
そして、psqlを実行しCOPY句を用いてデータを流し込みます。
tmiura:‾/kinki tmiura$ psql83 -d kinki -f kinki_db.sql
psql83:kinki_db.sql:6: 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:6: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_interact_pkey" for table "tbl_interact"
CREATE TABLE
psql83:kinki_db.sql:13: NOTICE: CREATE TABLE will create implicit sequence "tbl_sskijyo_tbl_sskijyo_id_seq" for serial column "tbl_sskijyo.tbl_sskijyo_id"
psql83:kinki_db.sql:13: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_sskijyo_pkey" for table "tbl_sskijyo"
CREATE TABLE
ということで、無事テーブルができたようです。
次にデータを流し込んでいきます。
まず、psqlを起動し、COPYコマンドでTABファイルからデータを読み込みます。
tmiura:‾/kinki tmiura$ psql83 kinki
Welcome to psql83 8.3.3, the PostgreSQL interactive terminal.

Type: ¥copyright for distribution terms
¥h for help with SQL commands
¥? for help with psql commands
¥g or terminate with semicolon to execute query
¥q to quit

kinki=# ¥d
List of relations
Schema | Name | Type | Owner
--------+----------------------------------+----------+--------
public | tbl_interact | table | tmiura
public | tbl_interact_tbl_interact_id_seq | sequence | tmiura
public | tbl_sskijyo | table | tmiura
public | tbl_sskijyo_tbl_sskijyo_id_seq | sequence | tmiura
(4 rows)

kinki=# COPY tbl_interact(DRUGCD, DRUGCD2, SYOJYOUCD) FROM '/Users/tmiura/kinki/interaction20060224.TAB';
COPY 56040
kinki=# SELECT * FROM tbl_interact limit 10;
tbl_interact_id | drugcd | drugcd2 | syojyoucd
-----------------+-----------+-----------+-----------
1 | 611140322 | 610432038 | S000723
2 | 611140322 | 610421337 | S000723
3 | 611140323 | 610432038 | S000723
4 | 611140323 | 610421337 | S000723
5 | 611140764 | 610432038 | S000723
6 | 611140764 | 610421337 | S000723
7 | 611140838 | 610432038 | S000723
8 | 611140838 | 610421337 | S000723
9 | 611140762 | 610432038 | S000077
10 | 611140762 | 610421337 | S000077
(10 rows)

kinki=# COPY tbl_sskijyo(SYOJYOUCD, SYOJYOU, SAYOKIJYO) FROM '/Users/tmiura/kinki/symptom20060224.TAB';
COPY 992

日本医師会から提供されているファイルはShift_JISらしいのですが、この辺あまり考えずに流し込んでしまいました。一応psql上でSELECTしてみましたが、ターミナル上では日本語も文字化けしていないようですので、このまますすんでみます。以前にMacOSXのターミナル文字コードをShift_JISに変更していたためだと思いますが、問題が出た時点でここまで戻れば良いでしょう。

薬剤併用禁忌検索システムの作成

NetBeans6.1を利用してGlassfish, Visual JSFをもちいたWebアプリケーション作成の練習に、日本医師会が公開している「併用禁忌データベース」を用いた薬剤併用禁忌検索システムを作成してみたいと思います。

環境:
MacBook 2GHz Intel Core Duo
Mac OS X (10.4.11) Tiger

NetBeans-6.1
PostgreSQL-8.3.3 (日本ユーザー会)

マスタデータ
併用禁忌データベース
厚生労働省薬剤マスタ

参考にするサイト
NetBeansチュートリアル(Webアプリケーションの学習)

準備
  1. まずはNetBeans-6.1をダウンロード、インストールしてください。
    NetBeansにはさまざまなパックがありますが、「WebおよびJava EE」もしくは「すべて」を選択してください。
  2. 次に、MacPortを用いてPostgreSQL-8.3.3をインストールします。
    具体的な手順は、別のブログで紹介しましたので、そちらをご覧ください。
    OpenDolphin:MacPortsのインストール
    OpenDolphin:MacPortsを利用したPostgreSQLのインストール