67
第19回 Delphi/400 テクニカルセミナー 3- 【セッションNo.3】 Delphi/400技術セッション チャレンジ!FireDAC接続! 株式会社ミガロ. RAD事業部 営業・営業推進課 尾崎 浩司

チャレンジ!FireDAC接続!¬¬19回 Delphi/400 テクニカルセミナー 3- RセッションNo.3 S Delphi/400技術セッション チャレンジ!FireDAC接続! 株式会社ミガロ

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-

1.Delphi/400 データアクセス手法の変遷

第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-

ファイルメンバー処理

• 実装例(OVRDBF, DLTOVR実行部)

宣言部

実装部

RemoteCmdメソッド CLコマンドを実行。

第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-

BDEからFireDACへの移行デモ

• 移行完了 • FireDACで動作するアプリケーションへの移行が完了。

第19回 Delphi/400 テクニカルセミナー 3-

5.まとめ

第19回 Delphi/400 テクニカルセミナー 3-

まとめ

• FireDAC 開発入門 • TFDConncetion / TFDTable / TFDQuery の使用方法

• データセットの操作方法や、頻出プログラムパターンの紹介

• SQLとデータセットを使用した2つの更新方法

• FireDAC 実践プログラミングテクニック • データマッピングルールによるフィールド型定義

• FireDACモニタによる監視

• データのフェッチによるレスポンス最適化

• 配列DMLによる効率的なデータ登録

• FireDACでのファイルメンバーの使用方法

• 従来のデータベースエンジンからの移行 • BDEやdbExpressからFireDACへの移行手順

• 移行ツールを使った効率的な移行作業

第19回 Delphi/400 テクニカルセミナー 3-

ご清聴ありがとうございました。