Upload
dangthuan
View
319
Download
1
Embed Size (px)
Citation preview
第19回 Delphi/400 テクニカルセミナー 3-
【セッションNo.3】
Delphi/400技術セッション
チャレンジ!FireDAC接続!
株式会社ミガロ.
RAD事業部 営業・営業推進課
尾崎 浩司
第19回 Delphi/400 テクニカルセミナー 3-
【アジェンダ】
1. Delphi/400 データアクセス手法の変遷
2. FireDAC 開発入門
3. FireDAC 実践プログラミングテクニック
4. 従来のデータベースエンジンからの移行
5. まとめ
第19回 Delphi/400 テクニカルセミナー 3-
Delphi/400 データアクセス手法の変遷
Delphi 5 Delphi 2009
Delphi XE3 Delphi 6
Delphi XE5 Delphi 10 Delphi 7
Delphi 2007
32ビット Windows 64ビット Windows
Shift-JIS Unicode
マルチデバイス開発(FireMonkey)
Windows10対応
BDE接続 BDE接続(後方互換)
Delphi XE7
BDE接続(オプション)
dbExpress接続
FireDAC接続
ネイティブ接続
• Delphi/400の進化とIBM i データアクセス手法の遷移 • ネイティブ接続(Call400, Cmd400等) は、すべてのバージョンで使用可能。
• BDE接続は、Ver.7にて更新終了し、以降は後方互換の為搭載。
• dbExpress接続は、Ver.6よりBDE後継として登場。現在もサポート。
• XE3で登場したFireDACは、10 Seattleより IBM i 用ドライバが登場。
IBM i データアクセス手法
Delphi/400の進化
FireDAC接続
データべースエンジン
第19回 Delphi/400 テクニカルセミナー 3-
データベースエンジン
• BDE接続 (Borland Database Engine)
• TTable/TQueryは双方向データセットの為、複数レコードを一括表示するような コンポーネント(DBGrid等)を直接関連付けることが可能。
• IBM i 用SQL-Linkドライバ(IDCO400)は、V7R3対応版を提供。
• 利用者の端末にアプリケーションとは別にBDEミドルウェアのインストールが必須。 (Delphi/400運用版とは、別にセットアップをしなければならない)
• Delphi/400 Ver.7までの正式サポートの為、現在は後方互換として使用可能。
TDBEdit
TDBGrid
[BDE]カテゴリ [DataAccess]カテゴリ [DataControls]カテゴリ
第19回 Delphi/400 テクニカルセミナー 3-
データベースエンジン
• dbExpress接続 • TSQLTable/TSQLQueryは単方向データセットの為、カレントレコードの情報しか
保持しておらず、データをキャッシュ(保持)しないので、複数レコードを一括表示 するようなコンポーネントは、直接関連付けることができない。 → データキャッシュの為、TDataSetProvider – TClientDataSet を組合せて使用。
• IBM i 用 CO400Connectionドライバは、V7R3対応版を提供。
• BDEと異なり、データベースエンジンミドルウェアの事前インストールは不要。 (Delphi/400運用版のみ導入すれば実行可能。)
TDBEdit
TDBGrid
[dbExpress]カテゴリ [DataAccess]カテゴリ [DataControls]カテゴリ
第19回 Delphi/400 テクニカルセミナー 3-
データベースエンジン
• FireDAC接続 • BDEに似たアーキテクチャのデータベースエンジンとして登場。
→ Fireとつくが、FireMonkey専用ではなく VCLでも使用可能。
• TFDTable/TFDQueryは双方向データセットの為、BDE同様に複数レコードを一括 表示するようなコンポーネント(DBGrid等)を直接関連付けることが可能。
• IBM i 用 FDCO400ドライバーは、V7R3対応版を提供。
• BDEと異なり、データベースエンジンミドルウェアの事前インストールは不要。 (Delphi/400運用版のみ導入すれば実行可能)
TDBEdit
TDBGrid
[FireDAC]カテゴリ [DataAccess]カテゴリ [DataControls]カテゴリ
第19回 Delphi/400 テクニカルセミナー 3-
今回のポイント
• 新データベースエンジンFireDAC に関する3つのトピックスをご紹介!
• FireDAC 開発入門
• FireDACアプリケーションの作成手順
• FireDACコンポーネントの使用方法
• データセットの操作方法
• 2つのデータ更新方法
• FireDAC 実践プログラミングテクニック
• データマッピングルールによるフィールド型定義
• FireDACモニタによる監視
• データのフェッチによるレスポンス最適化
• 配列DMLによる効率的なデータ登録
• FireDACでのファイルメンバーの使用方法
• 従来のデータベースエンジンからの移行
• BDEからFireDACへの移行
• dbExpressからFireDACへの移行
• 移行手順
• 移行ツールを使った効率的な移行作業
第19回 Delphi/400 テクニカルセミナー 3-
2.FireDAC 開発入門
• FireDACアプリケーションの作成手順
• FireDACコンポーネントの使用方法
• データセットの操作方法
• 2つのデータ更新方法
第19回 Delphi/400 テクニカルセミナー 3-
簡単なFireDACアプリ作成
• 完成イメージ
D400PA00 (音楽CDマスター) IBM i
クライアントPC
[Active]ボタンクリック毎に ファイルがオープン/クローズする。
第19回 Delphi/400 テクニカルセミナー 3-
簡単なFireDACアプリ作成
• 作成手順1 • フォーム上にFireDAC固有の2つのコンポーネントを貼り付け
• TFDGUIxWaitCursor (FireDAC UIカテゴリ)
• FireDACでデータベースアクセスする際の待機 カーソルを制御。
• TFDPhysXXDriverLink (FireDAC Linksカテゴリ)
• FireDACで使用するドライバーの種類を選択
• IBM i の場合、TFDPhysCO400DriverLinkを使用。
ScreenCursorプロパティ 待機時のカーソル種類を指定。 Providerプロパティ Forms : VCLフォームアプリ FMX: FireMonkeyアプリ Console: コンソールアプリ
FireDAC Linkカテゴリ 使用するDBのドライバーを 選択する。
第19回 Delphi/400 テクニカルセミナー 3-
簡単なFireDACアプリ作成
• 作成手順2 • フォーム上にデータベースコンポーネントを貼り付けて、関連付けを行う。
• TFDConnection (FireDACカテゴリ)
• データベースへの接続情報を定義。
• TFDTable (FireDACカテゴリ)
• アクセスするファイル(テーブル)を定義。
• TDataSource (DataAccessカテゴリ)
• TDBGrid (DataControlsカテゴリ)
DataSourceプロパティ 接続するDataSourceを 指定。
DBGrid1
DataSetプロパティ DB対応コンポーネントに 関連付けるDataSetを指定。
Conncetionプロパティ 接続先のFDConnectionコンポーネント を指定。 ※FDConnection1を配置してから、 FDTableを配置した場合、初期値が 自動設定される。
第19回 Delphi/400 テクニカルセミナー 3-
簡単なFireDACアプリ作成
• 作成手順3 • FDConnection1にホストへ接続する為の定義を行う。
• ダブルクリック(あるいは、右クリック→接続エディタ)
• FireDAC接続エディタ上で接続パラメータを定義する。
• LoginPromptプロパティ
• FireDACデフォルトのログオン画面を表示しない場合Falseにする。
ドライバID ドライバIDを指定。 (IBM i の場合、CO400)
パラメータ DataBase: Configration 接続名 User_Name:ユーザー Password: パスワード
パラメータ ODBCAdvanced:接続オプション (ライブラリ名を指定する場合、 LibraryOption=[ライブラリ] )
第19回 Delphi/400 テクニカルセミナー 3-
簡単なFireDACアプリ作成
• 作成手順4 • FDTable1にアクセスするファイル(テーブル)
の定義を行う。
• TableNameプロパティ
• ファイル名(テーブル)を指定する。
• 作成手順5 • イベント(処理)を定義する。
• FormのOnCreate
• Button1のOnClick
Buttom1
frmMain
第19回 Delphi/400 テクニカルセミナー 3-
FDコンポーネント
• TFDConnection • データベース接続やトランザクション管理を行う。
• 主なプロパティ
• コンポーネントをダブルクリックすると [FireDAC接続エディタ]が起動。
プロパティ 機能
Connected データベースへの接続を行う(True/False)。
LoginDialog TFDGUIxLoginDialogコンポーネントを関連づけることで、独自の ログオン画面を表示。
LoginPrompt FireDACログオン画面を表示するかどうか?Falseの場合、暗黙ログオン。
Params データベース接続パラメータ。通常はFireDAC接続エディタで設定。
FormatOptions データのマッピングを定義。通常はFireDAC接続エディタで設定。
UpdateOptions 更新処理の制御を行う。
第19回 Delphi/400 テクニカルセミナー 3-
FDコンポーネント
• TFDConnection • FireDAC接続エディタ
• 指定したドライバID毎に接続に必要なパラメータが一覧表示される。
• よく使用する設定を接続エリアスとして、IDEのデータエクプローラに登録しておくと、[接続定義名]より選択することも可能。
• CO400ドライバに必要な設定パラメータ
パラメータ 機能
DataBase Configrationの接続名を指定。
User_Name サインオンユーザーを指定。
Password サインオンパスワードを指定。
MonitorBy FireDAC監視機能の設定。
ODBCAdvanced 接続オプションを設定。 (オプションを複数指定の場合、; で区切る)
・LibraryOption=[ライブラリ名] ライブラリ名の指定 ・BUFFERCOUNT=[バッファ数] 一度に読み込むデータ量 (20~100) ・Commitment=[トランザクションレベル] トランザクション指定 (*NONE,*CHG,*CS,*ALL ) ・Namingconvention=[区切文字] SQLにおける区切文字の基準を指定 ( . or / ) ※ 未指定の場合は /
第19回 Delphi/400 テクニカルセミナー 3-
FDコンポーネント
• TFDConnection • 接続処理
• Paramsプロパティにより、ソースコードでパラメータを指定可能。
• ソースコード例
ソースコードで、接続パラメータを指定可能。
第19回 Delphi/400 テクニカルセミナー 3-
FDコンポーネント
• TFDConnection • トランザクション処理
• 更新対象のファイルがジャーナル対象になっていることが条件。
• ODBCAdvancedパラメータにCommitment=*CHG, *CS, *ALL いづれか指定。
• StartTransactionメソッドでトランザクションを開始し、Commitメソッドで変更を確定(コミット)あるいは、RollBackメソッドで破棄(ロールバック)する。
• トランザクション実行中かどうかは、InTransactionプロパティで判定する。
• ソースコード例
第19回 Delphi/400 テクニカルセミナー 3-
FDコンポーネント • TFDTable
• 指定したファイル(テーブル)へのアクセスを行う。
• 主なプロパティ
• TFDQuery • 抽出SQL文(SELECT)でのデータアクセス、更新SQL文でのデータ更新を行う。
プロパティ 機能
Active データセットを開く/閉じる。(True/False) (Open/Closeも可)
Connection 接続先のFDConnectionを指定。 (同じユニット内にFDConnectionがある場合、自動セット。)
TableName ファイル(テーブル)名を指定。 ・LibraryOptionでライブラリ指定されている場合、リストから選択可能。 ・ファイル名のみでもよい。(ライブラリリストに基づき実行) ・プロパティにライブラリ名を記述する場合、”D4TEC19LIB.D400PA00” のようにライブラリ名とファイル名の間は、”.”で定義。(”/”は使用不可)
プロパティ 機能
Active 抽出SQLを開く/閉じる。(True/False) (Open/Closeも可)
SQL SQL文を記述 ・SQL文は、ファイル名のみでもよい。(ライブラリリストに基づき実行) ・ライブラリ名を記述する場合、”D4TEC19LIB/D400PA00” のようにライブラリ名とファイル名の間は、”/”で定義。
第19回 Delphi/400 テクニカルセミナー 3-
• データセット(TDataSet) • TFDTableやTFDQueryでアクセスするデータの集合体。
• データセットの考え方は、BDEと同じ。
• データセットには、現在の行(カレントレコード)があり、フィールドへの アクセス操作はカレントレコードに対して行う。
• フィールドへのアクセスは、FieldByNameメソッドを使用する。 フィールドの属性にあわせたキャスト(型変換)を行う。 (As~)
データセットの操作
データセット
カレントレコード
第19回 Delphi/400 テクニカルセミナー 3-
データセットの操作
• データセットの移動
• ソースコード例
• 先頭レコードから最終 レコードまで順番に読込む。
メソッド/プロパティ 機能
First カレントレコードを先頭へ移動。
Prior カレントレコードを1つ前へ移動。
Next カレントレコードを1つ後ろへ移動。
Last カレントレコードを最終へ移動。
MoveBy 引数に指定したレコード数前後に移動。
Bof カレントレコードが先頭になった場合True。
Eof カレントレコードが最終になった場合True。
DBNavigator データセット操作用部品
第19回 Delphi/400 テクニカルセミナー 3-
データセットの操作
• データセットの検索 メソッド 機能
Locate 指定したフィールドの値が合致するレコードへ 移動。 対象データがない場合、Falseとなる。
• データセットの絞り込み プロパティ 機能
Filter 絞り込み(フィルタ)条件を文字列で指定。
Filtered フィルタの有効/無効。 (True時有効)
第19回 Delphi/400 テクニカルセミナー 3-
データの更新 • 2つの更新方法
• 更新SQLを使用したデータの更新
• 直接データ更新 / 一括データ更新
• データセットを使用したデータの更新
• SELECTで選択したデータセットを使用して更新
• QTEMP等のワークファイルのデータセットを使用して更新
直接データベースに更新条件を指示
IBM i クライアントPC
トランザクション (TRN)
データセット
UPDATE TRN SET FLD = ‘1’
WHERE KEY = 1
TableName= QTEMP.WKFILE
RPG
ワークファイル (QTEMP/WKFILE)
データセット SELECT * FROM TRN
WHERE KEY = 1
データセットの変更を反映
ワークファイル全レコードを取得
追加・編集・削除
追加・編集・削除
CALL RPGPGM
更新SQL使用
データセット使用
第19回 Delphi/400 テクニカルセミナー 3-
データの更新
• 更新SQLを使用したデータの更新 • TFDQueryを使用する。
• SQLプロパティに更新SQLを記述する。
→コンポーネントをダブルクリックして、FireDAC
クエリーエディタを使用することも可能。
• TFDQueryのExecSQLメソッドで更新が実行。
• パラメータクエリーも使用可能。
→ SQL文中に :[変数名] で定義
→ ParamByNameメソッドで変数に値をセット。 (パラメータの属性に合わせてキャスト)
更新SQL
パラメータ
パラメータへ値をセットする。
第19回 Delphi/400 テクニカルセミナー 3-
データの更新
• データセットを使用したデータの更新 • データセットを更新可能なモードに設定する。
• TFDConnectionのUpdateOptionsプロパティ
→ 個々のTFDQueryやTFDTableでも UpdateOptionsプロパティで設定可能。 → TFDConnectionで設定をしておくと、 各TFDQueryやTFDTableに自動反映 される。
• FDCO400ドライバーの場合、次のとおり 設定を行う。 CheckReadOnly :False CheckRequired :False CheckUpdatable :False LockWait :True RefreshMode :rmManual UpdateMode :upWhereChanged UpdateNonBaseFields :True
UpdateOptionsプロパティ 展開してサブプロパティを変更。
第19回 Delphi/400 テクニカルセミナー 3-
データの更新
• データセットを使用したデータの更新 • 開いているデータセットに対して操作を行う。
• カレントレコードに対して、メソッドを実行。
メソッド 機能
Append データセットに新規レコードを作成し、挿入状態とする。
Edit カレントレコードを編集状態とする。
Post データセットに変更を登録して、参照状態に戻る。
Cancel データセットの変更を破棄して、参照状態に戻る。
Delete カレントレコードを削除する。
第19回 Delphi/400 テクニカルセミナー 3-
データの更新
• データセットを使用したデータの更新 • 通常は、データセットに対し、Postした時点で即時データベースに反映される。
• CachedUpdates プロパティをTrue にすると 遅延更新が可能になる。 Post時点では、データセットのみが変更され、ApplyUpdatesメソッド実行時に 追加/変更/削除されたデータセットの変更が一度に反映される。
メソッド 機能
ApplyUpdates データセットの変更内容をすべてデータベースに反映する。 引数は、許容される更新エラー数
CancelUpdates データセットの変更内容をすべて破棄する。
データセット
Post (クライアント上のみ反映)
IBM i
ApplyUpdates(変更箇所が反映)
DB
クライアントPC
第19回 Delphi/400 テクニカルセミナー 3-
3.FireDAC 実践プログラミングテクニック
• データマッピングルールによるフィールド型定義
• FireDACモニタによる監視
• データのフェッチによるレスポンス最適化
• 配列DMLによる効率的なデータ登録
• FireDACでのファイルメンバーの使用方法
第19回 Delphi/400 テクニカルセミナー 3-
データマッピングルール
• データセット 項目コンポーネント • TFDTable/TFDQuery に定義されたデータセットより作成可能なフィールド単位の
コンポーネント。
• TField型を起点としたフィールドの属性にあわせた項目コンポーネントが作成される。
• フィールド単位の表示や入力の制御が可能。
DisplayLabel DBGrid等に表示する列タイトルを指定。
第19回 Delphi/400 テクニカルセミナー 3-
データマッピングルール
• データセット 項目コンポーネント • 項目コンポーネントは、BDE接続/dbExpress接続のデータセットでも使用される。
• FireDAC接続の場合、数値項目のデータ属性がこれまでと異なっている。 (整数項目) BDE/dbExpress: TIntegerField, TSmallintField FireDAC: TBCDField (2進化10進数項目)
(小数項目) BDE/dbExpress: TFloatField FireDAC: TFMTBCDField(2進化10進数項目)
データ型の不一致を防ぐことはできないか?
第19回 Delphi/400 テクニカルセミナー 3-
データマッピングルール
• データマッピングルールの設定 • FireDACには、データ型のマッピング(変換)を行う仕組みが用意されている。
• TFDConncectionコンポーネントのFormatOptionsプロパティにて設定可能。 → 通常は、 [FireDAC接続エディタ]上で設定する。
• 設定例
形式オプション FormatOptionsプロパティに相当
データマッピングルール SourceDataType : 変換前のデータ型 TargetDataType : 変換後のデータ型 PrecMin : 最小桁数 PrecMax : 最大桁数 ※BDEの場合、通常TSmallIntは使用されない為 (0-9)桁をdtInt32(Integer)として定義する。
【設定後に項目を作成】
第19回 Delphi/400 テクニカルセミナー 3-
• FireDACモニタ • FireDACには、FireDACとデータベースとの間で実行しているSQLコマンドや処理
件数等をロギングする仕組みが用意されている。
• アプリケーションに組み込めば、障害発生時等にどのようなSQL処理が行われたかを確認することができる。
FireDACモニタ
想定通りの結果がでない⁉
IBM i
ログファイルを見れば どんなSQLが実行されたか 確認可能!
第19回 Delphi/400 テクニカルセミナー 3-
FireDACモニタ
• TFDMoniXXClientLinkコンポーネント • FireDACのログ情報を出力するためのコンポーネント。
• FDConnectionコンポーネントと同じユニットに配置。
• 配置したコンポーネントにあわせて、FDConnecition のMoniterByパラメータを定義。
種類 機能
TFDMoniFlatFileClientLink 指定したログファイルにFireDAC ログ情報を出力。
TFDMoniCustomClientLink イベントを使用して独自のログ出力 を実装。
TFDMoniRemoteClientLink FireDACモニターにログ情報を出力。
MonitorByパラメータ FlatFile / Custom / Remote より 選択する。
第19回 Delphi/400 テクニカルセミナー 3-
FireDACモニタ
• TFDMoniXXClientLinkコンポーネント • ログ出力を行う場合、Tracingプロパティ=Trueを指定。
• 常にログ出力を行うと、大量のログファイルが生成され、 レスポンスにも影響の可能性があるため、トラブル発生時 のみモードを切り替えれば効果的。
• ソースコード例
デバッグ用 アプリケーションのショートカット
実行時引数 /DEBUG オプションを付けた ショートカットを作成。
第19回 Delphi/400 テクニカルセミナー 3-
• TFDMoniFlatFlieClientLinkコンポーネント • 任意のログファイルにログを出力。
FireDACモニタ
プロパティ 機能
FileName ログファイル名をフルパスで指定。 デフォルト:C:¥Users¥<LoginName>¥AppData¥Local¥Temp¥Trace1.txt
FileEncoding ログファイル出力形式。 (ecUTF8)
FileAppend ログファイルに追記するかどうか?(False:新しいファイル作成)
ShowTraces ログトレースをしている場合にメッセージを表示する。 (False)
FDQueryを実行
ログファイルが生成。
実行されたSQLが出力。
第19回 Delphi/400 テクニカルセミナー 3-
• TFDMoniRemoteClientLinkコンポーネント • FireDACモニタ(FDMonitor.exe)にログを出力。
• IDEの[ツール]→[FireDACモニタ]で起動可能。
• ローカルだけでなく、リモート監視もできる。
FireDACモニタ
プロパティ 機能
Host FireDACモニタの稼働端末のIPアドレスを指定。 デフォルト:127.0.0.1
FDQueryを実行
リアルタイムなログ確認が可能。
コンポーネント毎の状況も把握できる。
第19回 Delphi/400 テクニカルセミナー 3-
• データのフェッチ • データベースから値を取得して、クライアントのデータセットに保持することを
フェッチという。
• 一般的に大量のデータをフェッチしようとすると、Openに時間がかかる。
• FireDACで、1,000件のデータと、500,000件のデータの開く時間を比較。
→ 処理時間が変わらない!
データのフェッチ
IBM i
得意先マスタ (MTOKUP)
売上ファイル (FURDTP)
500,000件
1,000件
データセット
データセット
FDQuery1
FDQuery2
FDQuery1を実行
FDQuery2を実行
平均Open 時間:317ms
平均Open 時間:307ms
件数にかかわらず高速にオープンできるのはなぜか?
第19回 Delphi/400 テクニカルセミナー 3-
• オンデマンドなフェッチ • FireDACでは、データセットを作成する際、一度に全レコードをフェッチするのでは
なく、予め設定された件数までフェッチし、その後フェッチされたカレントレコードのカーソル位置にあわせて、必要になったときに都度、次のデータを取得する。
• 初期設定では、50件ずつレコードがフェッチされる。
データのフェッチ
カレントレコードが50行目。
スクロールバーが最下部に きている。
次の行へ移動
次の50件が読み込まれ、 スクロールバーが中央に移動。
第19回 Delphi/400 テクニカルセミナー 3-
• FetchOptionsプロパティ • FDConnectionのFetchOptions.RowSetSizeに全体の
フェッチ件数が指定可能。
• FDTable、FDQuery単位でも個別に上書き指定できる。
→ 実行するSQLやテーブルにあわせて、フェッチする件数を 調整することで、よりパフォーマンスの向上が可能。
• IBM i 用のFDCO400ドライバでは、さらに一度に 読込むバッファ数を調整可能。(BEFFERCOUNT)
データのフェッチ
ODBCAdvancedパラメータに BUFFERCOUNT=[バッファ数] の指定が可能。(20~100)
データセット
RowSetSize 一度にデータを フェッチして 保持する件数。
BUFFERCOUNT 一回当たりの読取り バッファサイズ。
第19回 Delphi/400 テクニカルセミナー 3-
配列DML
• 更新SQLを使用したデータの大量登録 • 更新SQLを使用して、1つのワークファイルに大量のレコードを登録するような場合、
通常パラメータクエリーを使用することが多い。
• IBM i に対して、同じSQL文を何度も実行することになる。
パラメータをもつSQL文。 (INSERT)
1件ずつパラメータに値をセット しながら、SQL(INSERT)を実行。
第19回 Delphi/400 テクニカルセミナー 3-
配列DML
• 配列DML • パラメータ配列を作成することで、
1回のSQL実行で複数登録を可能に する仕組み。
• 通信回数を減らすことができ、処理 効率化が可能。 (DBサーバー側で配列DMLをサポートしているもの(SQLServer, Oracle等)であれば、さらに 効率があがり処理速度の向上が期待できる。)
プロパティ/メソッド 機能
Params.ArraySize パラメータの配列要素数を指定。
Execute 配列DMLの実行。
パラメータの配列要素数を指定。
SQLを一括実行する。
パラメータ配列の 各要素に値をセット。
型キャストメソッドに複数形の”s”がつく。
第19回 Delphi/400 テクニカルセミナー 3-
ファイルメンバー処理
• ファイルメンバー処理 • IBM i 独自の考え方。一つの物理ファイルに対して複数のメンバーを指定できる。
• ジョブ(セッション)毎に同じファイルに異なる内容がセットできる。 (ワークファイル等の目的に多用)
• BDEの場合 • TTableコンポーネントのTableNameプロパティに
直接メンバー指定が可能。
ワークファイル(WTEC19P)
メンバー (M168001121)
メンバー (WTEC19P)
ファイルレイアウトは共通
データはメンバー 単位に独立して保持
• FireDACの場合 • TFDTableコンポーネントのTableNameプロパティに
メンバー指定ができない。
FireDACでファイルメンバーを扱うことはできないか?
第19回 Delphi/400 テクニカルセミナー 3-
ファイルメンバー処理
• ネイティブ接続との併用 • Delphi/400では、データベースエンジン以外にネイティブ接続が利用できるが、
データベースエンジンと、ネイティブ接続は同時使用が可能。
• デフォルト設定の場合、2つの接続は同一ジョブとなる。
• FDTableでファイルをオープンする前に OVRDBFコマンドでファイル名を一時変更しFDTableでファイルをクローズした後に、DLTOVRコマンドで一時変更を削除する。
OVRDBF FILE(WTEC19P) TOFILE(WTEC19P) MBR(M168001121) OVRSCOPE(*JOB)
RemoteCmd メソッド
DLTOVR FILE(WTEC19P) LVL(*JOB) RemoteCmd
メソッド
オープン
クローズ
指定した メンバーにアクセス
第19回 Delphi/400 テクニカルセミナー 3-
ファイルメンバー処理
• 実装例(TFDTableイベント) AfterCloseイベント テーブルを閉じた後に 発生するイベント。
BeforeOpenイベント テーブルを開く前に 発生するイベント。
• 実行例
テーブルをオープンする だけで、指定したメンバー にアクセスできる。
Button1
Edit1.Text:メンバー名
第19回 Delphi/400 テクニカルセミナー 3-
ファイルメンバー処理
• Multiple Channel設定 • Configrationの [Multiple Channel]をONにすると、全ての接続が異なるジョブとして
実行される。
• WebアプリやDataSnapアプリの場合、複数クライアントからアクセスされる為、 ジョブを分けないといけない。
• ネイティブ接続とFireDAC接続とでジョブが分かれるため、TAS400コンポーネントで 発行したコマンドが、TFDTableでのアクセスに反映されない。
Multiple Channel 接続ごとにジョブを分割。 Delphi/400
アプリ
ネイティブ接続と FireDACとでジョブが 異なる。
FireDACのみでファイルメンバーを扱うことはできないか?
Configration
活動ジョブの処理(WRKACTJOB)
第19回 Delphi/400 テクニカルセミナー 3-
ファイルメンバー処理
• FireDACのみで実現するメンバー処理 • SQLベースで実行できる CREATE ALIAS / DROP ALIAS でメンバーに対して
別名を作成。
• 作成した別名を TableNameプロパティに設定すればよい。
• FDQueryを別途配置しなくても、FDConnection で直接SQLが実行可能。(ExecSQL)
※OVRDBFと異なり、CREATE ALIASは別名で実体を作成する為、複数端末から同じメンバー名のエリアスを 作成しようとすると、エラーになるので注意。
CREATE ALIAS WTEC19P_M168001121 FOR WTEC19P(M168001121)
DROP ALIAS WTEC19P_M168001121
エリアス(別名)作成
エリアス(別名)削除
TableNameプロパティ WTEC19P_M168001121 実行時にエリアス名に変更
第19回 Delphi/400 テクニカルセミナー 3-
ファイルメンバー処理
• 実装例(CREATE ALIAS, DROP ALIAS実行部)
宣言部
実装部
ExecSQLメソッド SQLを実行。
エリアス名を返却。 (ファイル名_メンバー名)
ファイル名を返却。 (エリアス名の左部分)
第19回 Delphi/400 テクニカルセミナー 3-
ファイルメンバー処理
• 実装例(TFDTableイベント)
TableNameプロパティに 元のファイル名をセット。
TableNameプロパティに エリアス名をセット。
• 実行例
FireDAC接続のみで、 メンバーにアクセスできる。
Button1
第19回 Delphi/400 テクニカルセミナー 3-
4.従来のデータベースエンジンからの移行
• BDEからFireDACへの移行
• dbExpressからFireDACへの移行
• 移行手順
• 移行ツールを使った効率的な移行作業
第19回 Delphi/400 テクニカルセミナー 3-
従来のデータベースエンジンからの移行
• BDEからFireDACへの移行 • FireDACは、BDE同様双方向データセットの為、コンポーネントの置き換えで移行可能。
• [DataAccess]カテゴリ、[DataControls]カテゴリは同じものを使用可能。
TDBEdit
TDBGrid
[BDE]カテゴリ
[DataAccess]カテゴリ [DataControls]カテゴリ
[FireDAC]カテゴリ
第19回 Delphi/400 テクニカルセミナー 3-
従来のデータベースエンジンからの移行
• dbExpressからFireDACへの移行 • dbExpressは単方向データセットの為、通常TClientDataSet(ローカルキャッシュ)と
併用して利用。
• FireDACでも、TClientDataSetはそのまま使用できる為、コンポーネントの置き換え で移行可能。
• 。
[FireDAC]カテゴリ
TDBEdit
TDBGrid
[dbExpress]カテゴリ
[DataAccess]カテゴリ [DataControls]カテゴリ
第19回 Delphi/400 テクニカルセミナー 3-
従来のデータベースエンジンからの移行
• BDE自体の開発・保守が既に終了済 • 動作保証は、WindowsXPまで。
→ Windows Vista以降でも稼働はさせられるが、動作保証なくPTFも提供されない。 → UACの考慮がない。(Cドライブ直下への書込みが発生することがある。) → BDE初期化エラー等が発生する場合がある。
• 32bitのみで、UNICODEに非対応。 → IBM i での利用においても、CCSID=1399(JP-4)の文字が一部使用できない。
• VCL専用でFireMonkeyでは使用できない。 → マルチデバイスアプリ開発に対応できない。 → 3層アプリ作成時に使用するDataSnapでも使用不可。
BDEアプリは、FireDACに移行することで 上記課題を解決可能!
第19回 Delphi/400 テクニカルセミナー 3-
従来のデータベースエンジンからの移行
• 移行手順
従来のデータベースエンジンコンポーネントより、FireDACコンポーネントを追加。
FireDAC固有コンポーネント(カーソル、ドライバー)の追加。
FDConnection ドライバ、接続パラメータ、マッピングルール等の指定。
従来のデータベースエンジンコンポーネントのプロパティやイベントを移行。
従来のデータベースエンジンコンポーネントを削除。
従来のデータべースエンジン固有のソースコードを修正。
第19回 Delphi/400 テクニカルセミナー 3-
従来のデータベースエンジンからの移行
• 移行手順の具体例 • ミガロ.テクニカルレポート No.9 2016年秋
『新データベースエンジンFireDACを使ってみよう!』 にて、BDE、dbExpressからFireDACへの具体的な 移行手順を紹介!
FireDAC関連の コンポーネントを追加。
FireDACアプリの完成。
第19回 Delphi/400 テクニカルセミナー 3-
従来のデータベースエンジンからの移行
• 実際の移行作業時の懸念点 • 大量のデータベース関連コンポーネントの置き換えが発生
• コード修正量を減らすには、元のコンポーネントと同じ名前にしたほうが良い。
→ いったん元のコンポーネントをリネームして、新しいコンポーネントを貼り付け て、元の名前を付与したうえで、元のコンポーネントを削除する必要がある。
• usesリストの修正が必要
• FireDAC関連のusesリストは、FireDACコンポーネントの配置で自動的にセット されるが、元のデータベースエンジンのusesリストは、コンポーネントを削除しても クリアされない。 → 手でリストを修正しなければいけない。
FireDAC関連のユニットは コンポーネント配置で 自動的に追加される。
BDE関連のユニットは、 コンポーネント削除後に 手で削除しなければいけない。
BDE (TTable) TFDTableに置き換え、プロパティ移行 TTable(BDE)削除
効率よく置き換え作業を実施することができないか?
第19回 Delphi/400 テクニカルセミナー 3-
従来のデータベースエンジンからの移行
• 移行ツールの活用 • reFind (テキスト置換ユーティリティ)
• 変換ルールの定義のもとづき、テキストを 一括置換できるツール。
• Delphi/400 10 Seattle に標準で付属。 C:¥Program Files¥Embarcadero¥Studio¥17.0¥bin¥reFind.exe
• 変換ルールをテキストファイルで作成可能。 詳細は、エンバカデロDocWikiに記載。 http://docwiki.embarcadero.com/RADStudio/Seattle/ja/Refind
• Delphiのソースファイル(*.pas) 及び フォームファイル(*.dfm/*.fmx)は、 テキスト形式で保管されている為、テキスト一括置換でコンポーネントの置き換えが できる。
• BDE、dbExpress 関連のそれぞれの文字列をFireDAC関連の文字列に置換する変換 ルールファイルも用意されているので、reFindは、容易に使用可能。
BDE → FireFAC C:¥Users¥Public¥Documents¥Embarcadero¥Studio¥17.0¥Samples¥Object Pascal ¥Database¥FireDAC¥Tool¥reFind¥BDE2FDMigration¥FireDAC_Migrate_BDE.txt
dbExpress → FireDAC C:¥Users¥Public¥Documents¥Embarcadero¥Studio¥17.0¥Samples¥Object Pascal ¥Database¥FireDAC¥Tool¥reFind¥DBX2FDMigration¥FireDAC_Migrate_DBX.txt
第19回 Delphi/400 テクニカルセミナー 3-
BDEからFireDACへの移行デモ
• サンプルプログラム • ネイティブ接続(Call400)でRPGをCALLして、ワークファイルを作成。
• 処理結果のワークファイルをBDE接続で取得して、DBGridに出力。
BDEコンポーネント
ネイティブ コンポーネント
第19回 Delphi/400 テクニカルセミナー 3-
BDEからFireDACへの移行デモ
• サンプルプログラム • プログラムソース
FormのOnCreateイベント
CL(RPG)をCALL。
BDE Tableをオープン。
ネイティブ、BDEの 接続パラメータ指定。
ライブラリリスト の追加。
Button1のOnClickイベント
第19回 Delphi/400 テクニカルセミナー 3-
BDEからFireDACへの移行デモ
• reFindによる変換 • コマンドプロンプト上でreFindを実行する
• カレンドディレクトリをソースフォルダに移動する。
cd [ソースフォルダ]
• reFindツールを実行する。
reFind.exe [変換対象ファイル名] /X:[変換ルールファイル名]
"C:¥Program Files¥Embarcadero¥Studio¥17.0¥bin¥reFind.exe" *.pas *.dfm *.fmx /X:"C:¥Users¥Public¥Documents¥Embarcadero¥Studio¥17.0¥Samples¥Object Pascal¥Database¥FireDAC¥Tool¥reFind¥BDE2FDMigration¥FireDAC_Migrate_BDE.txt"
カレントディレクトリを 移動する。
reFindを実行する。
処理結果が出力される。
第19回 Delphi/400 テクニカルセミナー 3-
BDEからFireDACへの移行デモ
• プロジェクトを開く • FireDACコンポーネントに置換
• 全てのBDEコンポーネントがFireDACコンポーネントに変換される。
• uses のBDE関連エントリーもすべてクリアされる。
FireDACコンポーネントに 変換されている!
第19回 Delphi/400 テクニカルセミナー 3-
BDEからFireDACへの移行デモ
• FireDAC関連の追加作業 • FireDAC固有コンポーネントの追加
• TFDGUIxWaitCursor (カーソル制御)
• TFDPhysCO400DriverLink(ドライバー)
• TFDConncectionの個別設定追加
• ドライバIDの指定。
• パラメータの追加。
• データマッピングルールの追加。
FireDACコンポーネントの追加
ドライバIDの指定
パラメータの追加
データマッピング ルールの追加 数値項目をBDEと 同じデータ型に変換
第19回 Delphi/400 テクニカルセミナー 3-
BDEからFireDACへの移行デモ
• FireDAC関連の追加作業 • TFDConncectionに関するプログラムの修正
• パラメータの違いに起因する箇所を修正する。
FireDACの接続パラメータにあわせて Paramsプロパティのセット項目を 修正。
第19回 Delphi/400 テクニカルセミナー 3-
まとめ
• FireDAC 開発入門 • TFDConncetion / TFDTable / TFDQuery の使用方法
• データセットの操作方法や、頻出プログラムパターンの紹介
• SQLとデータセットを使用した2つの更新方法
• FireDAC 実践プログラミングテクニック • データマッピングルールによるフィールド型定義
• FireDACモニタによる監視
• データのフェッチによるレスポンス最適化
• 配列DMLによる効率的なデータ登録
• FireDACでのファイルメンバーの使用方法
• 従来のデータベースエンジンからの移行 • BDEやdbExpressからFireDACへの移行手順
• 移行ツールを使った効率的な移行作業