生産性向上のための継承!
こんにちは、サポート部の Yama-chan です。いつもブログを読んでいただき、ありがとうございます。今回のブログでは PowerBuilder の継承機能について、ご紹介します。継承について理解することができれば、新規開発だけではなく、既存の PowerBuilder システムのメンテナンスにも役に立ちますので、ぜひ、理解するようにしましょう。
はじめに
PowerBuilder と言えば、データベースを操作するデータウィンドウが有名ですが、そのほかにもいくつか強力な機能があります。継承はその 1 つです。継承というのは、既存のオブジェクトのすべての機能を派生して、新しいオブジェクトを作成することです。継承できるオブジェクトはウィンドウ、ユーザーオブジェクト、メニューがありますが、今回はウィンドウの継承を例に解説していきます。ウィンドウのプロパティ、ウィンドウ上に配置されたボタン、ボタン内のスクリプト処理も継承されます。また、PowerBuilder では、継承する既存のオブジェクトのことを先祖オブジェクトと呼び、継承で作成されたオブジェクトのことを子孫オブジェクトと呼びます。さらに子孫オブジェクトを継承して、子孫オブジェクトを作成することも可能です。このように先祖と子孫オブジェクトは複数の階層で、作成することができます。
継承のメリット
たとえば、顧客テーブル、商品テーブル、取引先テーブルがあるとします。この 3 つのテーブルをメンテナンスできるように、テーブルデータの一覧を表示する機能、またデータの追加、削除、保存機能を実装するとしたら、継承機能を利用しない場合はそれぞれウィンドウ、データウィンドウを新規に作成し、データの一覧表示、追加、削除、および保存機能を実装する必要があります。継承を利用する場合は、先祖となるウィンドウとデータウィンドウを作成し、各機能を実装してから、継承で子孫ウィンドウを作成するだけで、データの一覧表示、追加、削除、保存の機能が継承され、利用できるようになります。
先祖オブジェクトの作成
では、さっそく順を追って作成していきましょう。
まずウィンドウを新規作成し、ウィンドウ上に dw_master という名前でデータウィンドウコントロールを配置します。このウィンドウを w_base として保存し、のちほど作成するウィンドウの先祖とします。なお、この時点ではデータウィンドウコントロールに対して、まだ データオブジェクトを指定していません。
つぎに、ウィンドウの Open イベントにトランザクションオブジェクトの指定および検索処理を下記のように記述します。
dw_master.SetTransObject(SQLCA) dw_master.Retrieve()
3 つのボタン [追加] [削除] [保存] のスクリプト処理はそれぞれ、以下のように記述します。
追加 :
// 現行行変数の定義 long ll_CurrentRow // データウィンドウの最後に新規に行を追加する ll_CurrentRow = dw_master.InsertRow(0) // 現行行を新規に追加した行へ移動する dw_master.ScrollToRow(ll_CurrentRow)
削除 :
// 現行行変数の定義 long ll_CurrentRow // 選択されている行を取得する ll_CurrentRow = dw_master.GetSelectedRow(0) // 選択されている行を削除する dw_master.DeleteRow(ll_CurrentRow)
保存 :
// 入力内容をデータウィンドウに適用する dw_master.AcceptText() // データウィンドウの内容をデータベースに反映する dw_master.Update()
このように先祖で実装された上記のスクリプト処理は子孫ウィンドウに継承され、そのまま利用できるので、子孫ウィンドウでは新たに実装する必要はありません。これぞ、PowerBuilder の生産性が高い、ポイントの 1 つです。
以上で、先祖オブジェクトとしてのウィンドウが作成されました。
子孫オブジェクトの作成
先祖オブジェクトを継承して、子孫オブジェクトを作成するには、[ファイル] – [継承] メニューを選択すると、下記のウィンドウが表示されます。
今回はウィンドウを継承するので、ウィンドウの下のほうにあるオブジェクトの種類を [ウィンドウ] に変えてから表示されているウィンドウの一覧から継承する先祖オブジェクトのウィンドウ [w_base] を選択し、[OK] ボタンをクリックすると子孫オブジェクトのウィンドウが作成されます。さらにデータウィンドウコントロール [dw_master] のデータオブジェクトとして、[d_customer] を指定したあと、継承で作成された子孫オブジェクトのウィンドウを [w_customer] として保存します。
継承で作成されたということで、データウィンドウコントロールの名前が [w_base::dw_master] になっていることが上の図で確認することができます。
また、継承の方法として、システムツリーやライブラリペインタでオブジェクトの右クリックメニューの [継承] を選択することで、すばやく選択されているオブジェクトを継承して子孫オブジェクトを作成できるので、覚えておくとよいでしょう!
以上で、先祖オブジェクトのウィンドウを継承して子孫オブジェクトのウィンドウが作成されました。では、アプリケーションの [Open] イベントで下記のようにアプリケーションが実行された時に開くウィンドウを [w_customer] にして、IDE 上で実行してみましょう。
open(w_customer)
ここで、気づいた方もいらっしゃるかもしれませんが、[w_customer] の [Open] イベントではデータの検索処理などを記述していません。これは先祖オブジェクトのウィンドウから継承されて、そのまま利用できるようになっているからです。これがまさに継承の最大の強みでもあります。システムにたくさんのテーブルがあり、それぞれをメンテナンスするための機能を実装しようとしたら、同じ処理を何回も書かなくてはなりません。さらに変更があった場合、すべての処理を同様に修正する必要があります。継承を利用すると、先祖オブジェクトのウィンドウを修正するだけで、変更内容が子孫オブジェクトのウィンドウにも反映されますので、メンテナンスも楽になります。
継承で作成されたオブジェクトは先祖オブジェクトのすべての内容が継承されるので、上では [Open] イベント内のスクリプトの継承を紹介しましたが、そのほかにも、ウィンドウのプロパティ、イベント、関数、変数、コントロールも継承されます。なお、先祖オブジェクトのウィンドウで変更をおこなった場合、子孫オブジェクトにも反映されますが、子孫オブジェクトで変更を行った場合は、先祖オブジェクトに反映されません。継承で作成されたウィンドウはただのコピーではなく、さらにコントロールなどを追加して機能を拡張することができます。
チェックポイント:
先祖オブジェクトの変更はすべての子孫オブジェクトに反映されるため便利ですが、言い方を変えればすべての子孫オブジェクトに影響するので、先祖オブジェクトに対して変更を行う場合は、慎重に行う必要があります。
また、先祖オブジェクトに対して以下の変更をおこなった場合、子孫オブジェクトの再生成が必要な場合があるので、留意する必要があります。
- 先祖オブジェクトのインスタンス変数の削除または変数名の変更
- 先祖オブジェクトのユーザ定義関数の修正
- 先祖オブジェクトのユーザ イベントの削除
- 先祖オブジェクトのコントロールの削除または名前の変更
まとめ
以上、ウィンドウオブジェクトを例に継承について紹介しました。注意点もありますが、使いこなせると生産性の向上にもつながり、さらにシステムのメンテナンスコストも削減することができます。継承を理解するためになるべくシンプルな構成で説明してきましたが、実はかなり奥が深いです。これからたくさんの経験を積んで、継承をマスターして、よりよいシステムの構築ができるよう頑張っていきましょう。
以上、Yama-chan でした。