【T6】ケーススタディ

業務管理システム開発の実例にみる
３層スタイルC/Sアプリ作成術
有限会社 シンクソフト
代表取締役
安達 直人

アジェンダ

• ３層スタイルC/Sアプリ開発方法をとった背景• ３層スタイルC/Sアプリとは• ３層スタイルC/Sアプリの応用

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

21

３層スタイルC/Sアプリ開発方法をとった背景

３層スタイルC/Sアプリ開発方法をとった背景（１）• シンクソフト概要• 主として業務システムの受託開発• 要件定義～、外部設計～、内部設計～、製造～ 各種工程から対応。
主として、中小企業向け・大手企業の部門の業務システム、パッケージソフトのカスタマイズなどを受託し、開発を行っています。

• 言語は、基本的に Delphi• データベース、InterBase、FireBird、Oracleなど多岐。
バージョンもいろいろ。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

42

３層スタイルC/Sアプリ開発方法をとった背景（２）• データベースやデータベースコンポーネントの依存を減らしたい• InterBase、FireBird、Oracle、PostGreSQL etc• BDE、ｄｂExpress、IBX etc• Web化への対抗。ブラウザベースのアプリケーションが好きになれない （あくまでも個人的な感想です）• 使い勝手がいまいち• ブラウザーの種類・バージョンに振り回される• ３層 SOAＰ などを検討• Corba３層開発との出会い• Corbaを使った３層アプリの開発案件を受託

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

5３層スタイルC/Sアプリとは

3

３層スタイルC/Sアプリとは（１）• まず３層アプリとはＤＢ
Ｂク
クラライ
イア
アン
ント
トＤ
モジジュ
ュ
ール
ル
モー

• C/S（２層）

サーバー
ドライバ

クライアントGUIアプリ
クライアントGUIアプリ

RDBS
RDBS

• 3層例 （ Corba ）
CORBA
CORBA

CORBA
CORBA

IIOP

ドライバ

サーバーアプリサーバーアプリGUIアプリGUIアプリ

RDB
RDB

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

7３層スタイルC/Sアプリとは（２）• プログラムの構成は （Corbaでの例）
クライアントアプリ

サーバーアプリClientDataSet

ClientDataSet

ＸＭＬＸＭＬＸＭＬＸＭＬスタブ
スタブ

ドライバ
ドライバ

ﾃﾞｰﾀﾍﾞｰｽ

DataSource

Data Control
コンポーネント

Corbaライブラリ
Corbaライブラリ

DBX，IBX,BDE etc･･･
データベース
アクセスコンポーネント

Corbaライブラリ
Corbaライブラリ

IIOP(TCP/IP)
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

84

３層スタイルC/Sアプリとは（３）• クライアントアプリは、ClientDataSetをベースに作成。
• サーバーアプリは、データベースアクセスに特化
データベースやデータベースコンポーネントの依存を減らしたい
この方法だと、依存部分は、サーバーアプリのみである

Ｃ／Ｓのシステムでも、同様に分けることができるのでは1つのプロジェクトの中で、ユニットをそれそれの役割に分けることにより可能では。
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

9３層スタイルC/Sアプリとは（４）• 具体的にはクライアントアプリ

サーバーアプリClientDataSet

データ連携

ﾃﾞｰﾀﾍﾞｰｽ

ClientDataSet

DataSource

Data Control
コンポーネント

ＸＭＬＸＭＬスタブ
Corbaライブラリ

DBX，IBX,BDE etc･･･
データベース
アクセスコンポーネント

ドライバ
1つのEXE
ただし、ソースは完全に分離

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

Corbaライブラリ105

３層スタイルC/Sアプリとは（５）クライアント側コード
CdsKokyaku.Data:= DMSvrKokyaku.GetKokyakuList( Shimei, Addr, Post, FlgDel, StDay, EdDay );サーバー側コードクライアント側 ClientDatasteのCdsKokyaku にサーバー側でデータベースより取得したデータを設定する
処理のサンプルfunction TDMSvrKokyaku.GetKokyakuList(ASimei, AAddr, APostCode:string;
ADelRead:Boolean=False; AStDay:TDate=-1; AEdDay:TDate=-1): OleVariant;var qryAdd: String;
QryWk: TIBQuery;
DspWk: TDataSetProvider;begin
DspWk := TDataSetProvider.Create(Self);
QryWk := TIBQuery.Create(Self);
QryWk.Database := DMSvrDataBase.DB;try
try
if not DMSvrDataBase.InTrn then
DMSvrDataBase.TrnStart;
DMSvrDataBase.TrnCommit;
qryAdd := '';//////
ここで、qryAd に検索条件を設定
QryWk.SQL.text := 'select * from "顧客マスタ" where ' + qryAdd;
QryWk.Open;//// テーブルオープン
DspWork.DataSet := QryWk; //// TDataSetProviderのDatSetプロパティに//// 上記テーブルコンポーネントを設定
Result := DspWork.Data;//// クエリーの結果をDataSetProvider経由で//// OleVarianto型で返す
exceptraise;
end;
finally
QryWk.Close;
QryWk.Free;
DspWk.Free;
end;end;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

11３層スタイルC/Sアプリとは（６）• 効果は• ＤＢ移植時、サーバー側ユニットのみの変更対象となる• コードが標準化できる（他プロジェクトへの流用度が高くなった）• クライアント側ClientDataSet と DataContorolコンポネントなどを使ったクラス/ライブラリの開発。特に、DataContorolコンポネントを多用しても、データベースの変更時に問題とならない。
• サーバー側ClientDataSet と各種DBアクセスコンポーネントの組み合わせでのクラス/ライブラリの開発。 （DBアクセスコンポーネント：dbExpress、IBX など)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

126

３層スタイルC/Sアプリとは（７）• クライアント側 クラス/ライブラリの例• ＣｌｉｅｎｔＤａｔａＳｅｔを機能を使ったＤＢＧｒｉｄの拡張• ＣＳＶ出力クラス• 帳票出力クラス

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

13

３層スタイルC/Sアプリとは（8）• サーバー側 クラス/ライブラリの例• ＤＢ登録クラス• ClientDataSetから、各種クエリコンポーネントを使った処理を、Overloadを使って、同一インターフェイスで作成。
//ClientDataSetのデータを、各クエリコンポーネントを使って登録するメソッドの宣言例
procedure Cds2Touroku( aCdsSrc:TClientDataSet; aChkQry,aInsQry,aUpdQry:TSQLQuery); overload;
procedure Cds2Touroku( aCdsSrc:TClientDataSet; aChkQry,aInsQry,aUpdQry:TIBQuery); overload;

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

147

３層スタイルC/Sアプリの応用

３層スタイルC/Sアプリの応用（１）• ３層スタイルC/Sアプリの応用例• ３層化への展開 当然！
• 画面設計・帳票設計への応用と、実装への展開

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

168

３層スタイルC/Sアプリの応用（２）• ３層化
クライアントアプリ

サーバーアプリClientDataSet

ClientDataSet

ＸＭＬＸＭＬＸＭＬＸＭＬ

スタブ
スタブ

ドライバ
ドライバ

ライブラリ
ライブラリ

ライブラリ
ライブラリ

ﾃﾞｰﾀﾍﾞｰｽ

DataSource

Data Control
コンポーネント

DBX，IBX,BDE etc･･･
データベース
アクセスコンポーネント

各３層化対応のモジュールを組み込み

Network
本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

17

３層スタイルC/Sアプリの応用（３）• 画面設計・帳票設計への応用と、実装への展開• ClientDataSetは、XML形式のファイルの読み込みができる。
• XML形式のダミーデータを持つファイルを作ることで、画面等に表示イメージを出力することが可能• XML形式ファイルは、エディタで簡単に編集が可能。
• Delphiのライブコネクト機能のより有効な活用が可能• それまでは、Paradoxなどを使って行うこともあった⇒BDEやツールのインストールが手間で、なかなか有効に使えない。
⇒DBアクセスコンポの変更も必要。（BDEから、IBXやDBX）• この方法では、⇒ツール不要。ドライバーなども不要。
⇒クライアントソースは、そのまま活用することが可能。
ClientDataSetのデータ取得を、XML形式のファイルの読み込み からサーバーモジュールメソッドの取得値を設定するように変えればよい

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

189３層スタイルC/Sアプリの応用（４）ClientDataSetにXMLデータを取り込んで表示させた例

XMLデータ<?xml version="1.0" standalone="yes"?> <DATAPACKET Version="2.0"><METADATA><FIELDS><FIELD fieldname="顧客マスタＩＤ" attrname="xF0" fieldtype="i4"/><FIELD fieldname="氏名" attrname="xF1" fieldtype="string" WIDTH="50"/><FIELD fieldname="フリガナ" attrname="xF2" fieldtype="string" WIDTH="100"/><FIELD fieldname="郵便番号" attrname="xF3" fieldtype="string" WIDTH="7"/><FIELD fieldname="住所１" attrname="xF4" fieldtype="string" WIDTH="10"/><FIELD fieldname="住所２" attrname="xF5" fieldtype="string" WIDTH="50"/><FIELD fieldname="住所３" attrname="xF6" fieldtype="string" WIDTH="50"/><FIELD fieldname="住所４" attrname="xF7" fieldtype="string" WIDTH="50"/><FIELD fieldname="住所５" attrname="xF8" fieldtype="string" WIDTH="50"/><FIELD fieldname="電話１" attrname="xF9" fieldtype="string" WIDTH="15"/><FIELD fieldname="電話２" attrname="xF10" fieldtype="string" WIDTH="15"/><FIELD fieldname="登録日時" attrname="xF11" fieldtype="dateTime"/><FIELD fieldname="更新日時" attrname="xF12" fieldtype="dateTime"/><FIELD fieldname="削除日時" attrname="xF13" fieldtype="dateTime"/></FIELDS><PARAMS/></METADATA><ROWDATA><ROW xF0="1"
xF1="XXXXXXXXXXXXXXXX"
xF2="XXXXXXXXXXXXXXXXXXXX"
xF3="9999999"
xF4="XXXXXXXX"
xF5="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
xF6="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
xF7="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
xF8="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
xF9="XXXXXXXXXXXXXXX"
xF10="XXXXXXXXXXXXXXX"/></ROWDATA></DATAPACKET>

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

19

３層スタイルC/Sアプリの応用（５）P.11の例では、// 設計時CdsKokyaku.LoadFromFile('..¥Cds¥顧客検索リスト.xml');//実装
CdsKokyaku.Data := DMSvrKokyaku.GetKokyakuList( Shimei, Addr, Post, FlgDel, StDay, EdDay );・画面・帳票設計および実装と、テーブル設計・データアクセス部の設計・実装作業を分けて開発を進められる。
・平行開発も可能。

詳しくは、デモをご覧ください。

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

20

10• 参考資料• 第２回デベロッパ－キャンプ『オープンソースを利用した３層C/Sシステムの構築方法』資料

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

21

ありがとうございました

ご意見・ご感想などいただければ幸いです。

メール： adachi@thinksoft.co.jp(件名は、日本語でお願いします)

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

2211• 宣伝のページ• 有限会社 シンクソフト では、 Delphi を使ったシステム開発の受託開発を行っています。
• 新規開発、既存システムのメンテナンス・機能追加など各種対応をいたします。既存システムのメンテナンスは仕様をがなくても対応可能です。Delphiのバージョンも不問です。
• 詳細はhttp://www.thinksoft.co.jp/

本文書の一部または全部の転載を禁止します。本文書の著作権は、著作者に帰属します。

23

12