データモデュールでのTIBDatabaseのDBファイル指定について

解決


maru03  2019-06-12 16:24:32  No: 49786  IP: 192.*.*.*

データモデュールでのTIBDatabaseのDBファイル指定について

Delphiにてデータベースアプリを作成しています。
RDMSは(Firebied) Interbase  を使い  IBX  にて接続しています。

設計時  TIBDatabase  の  ”Database"プロパティで目的のDBファイルを指定します。

設計時は直接    X:\ZZZZ\AAAAA.FDB  などと指定すればよいのですが、  
大きく内容を変更したいときなど、元のファイルをすべて残すために新たにフォルダーを作り、
新しいフォルダーにファイルをコピーしてそれを読み込み新バージョンとして作成しています。

ここまでは履歴を残すうえで必須の手法であると思いますが、
ここで履歴管理のためフォルダーに追番を付けて管理しています。
例===X:\ZZZZ0001\
  ===X:\ZZZZ0002\  などです。
また、PCも複数使い管理手法の違いからフォルダー名が統一できていない状況です。

このようにフォルダー名を変えていった場合に、
上記のDBファイルの直接指定のつじつまが合わなくなることがあります。
(違うフォルダーのファイルを見ているような感じです)

実行時はカレントフォルダーのDBファイルを指定するのは下記のようにできますが、

procedure DM1.TIBDatabase1BeforeConnect(Sender: TObject);
begin
  DM1.TIBDatabase1.DatabaseName := GetCurrentDir + '\AAAAA.FDB';
end;

設計時に自動でカレントフォルダーのDBファイルをセットできるような手法はどうすればいいのでしょうか?

Windows  Delphi  firebird  のバージョンには依存していませんので一般的な手法として考えていただければいいと思います。
ちなみに現在の開発環境は  Win10Pro Delphi10_Seattle Firebird3  です

編集 削除
通りすがり  2019-06-12 16:50:05  No: 49787  IP: 192.*.*.*

普通はバックアップのほうを連番とかでgbakするようにも思いますが、このような場合はデータベースエイリアスを使ったらどうでしょう?
http://firebirdwiki.jp/webroot/?%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%28aliases.conf%2Ffirebird.conf%29%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9
https://firebirdsql.org/rlsnotesh/config-db-alias.html
エイリアスを使って接続していれば、Aliases.confを書き換えるだけです。

ちなみにカレントディレクトリはいろいろあるのであまり使わないことをお勧めします(異論は認めます

編集 削除
maru_03  2019-06-12 20:54:48  No: 49788  IP: 192.*.*.*

エリアスですが、数種類のDBアプリを並行して開発していますので、
固定できません。

と、共に、"GetCurrentDir"  ですが出来上がったアプリを配布しますので、
その環境(アプリを置くフォルダーが固定できないので)によって変ってくるので
使用しています、。他の対処方法はあるでしょうか???

編集 削除
Mr.XRAY  2019-06-12 21:42:29  No: 49789  IP: 192.*.*.*

> 使用しています、。他の対処方法はあるでしょうか??? 

ガイドラインというのはあります.
必ずこれに従わなければいけないというものではありません.
しかし,ガイドラインがあるということを知っておくことは大切でしょう.

[ アプリケーション固有のデータの置き場所 ]
http://mrxray.on.coocan.jp/Delphi/Others/Windows_Guidelines.htm

編集 削除
maru_03  2019-06-12 22:19:15  No: 49790  IP: 192.*.*.*

ガイドラインも理解していますが、
使用される方によりそれぞれの考え方があるようなので、
フォルダーやドライブも一定していません。
当然、環境変数などといっても理解できないような方も含まれますので、
EXEファイルとデータファイルを同一フォルダーに置き簡単に使えるようなコンセプトで開発しています。

一般的な例えですが「アドレス帳」の様な誰でも使えるような感じのアプリです。

それだけにレジストリーも使用せずに、バカチョン!で使用できるような感じに作成しています。

追伸:配布時にはembededでDBファイルにアクセスするような構成としています。

編集 削除
au  2019-06-13 08:53:48  No: 49791  IP: 192.*.*.*

EXEファイルと同じ場所を取得したいならGetCurrentDirよりも
Application.ExeNameからパスを取得した方が安全だし確実だと思います

編集 削除
maru_03  2019-06-13 11:11:14  No: 49792  IP: 192.*.*.*

実行時のパスの設定のアドバイスには感謝いたします。

このスレッドの問い合わせは「設計時」のDBファイルの場所設定です。

設計時のソースファイルがあるフォルダーの自動入手はどうすれば可能でしょうか。
それとも、都度都度プロパティでDBファイルを指定しなければならないのでしょうか。

編集 削除
通りすがり  2019-06-13 11:32:36  No: 49793  IP: 192.*.*.*

> 都度都度プロパティでDBファイルを指定しなければならないのでしょうか。
そのとおりです。

編集 削除
AAA  2019-06-15 11:25:52  No: 49794  IP: 192.*.*.*

設計時の動作を変えるにはコンポーネントを作るしかない

編集 削除
AAA  2019-06-15 11:34:38  No: 49795  IP: 192.*.*.*

type

  TIBDatabaseEX = class(TIBDatabase)
  private
  protected
  public
    constructor Create(AOwner: TComponent); override;
    property BeforeConnect;
  end;


constructor TIBDatabaseEX.Create(AOwner: TComponent);
begin
    inherited Create(AOwner);
    DatabaseName := 'XXXXXX';
end;

これで
貼り付けたとき  DatabaseName  は  XXXXXX  になる

編集 削除
maru_03  2019-06-15 12:47:17  No: 49796  IP: 192.*.*.*

AAA様
ありがとうございます。
まだ、確認はしていませんが、Create時にDatabaseNameを指定しているわけですので、
実行時と同じような動きをさせていると理解しています、

この方法では、設計時にフォルダー及びファイル名をそれぞれ指定していますので、
プロパティを都度変えているのと変わりないと思います。

上に書いたように、開発がうまくいかなかった場合に、履歴管理している過去のフォルダーに戻ったりしていますので、
このようなときに最新の使用フォルダーであることを明確にするため、フォルダー名を変更したりしています。
追番の2桁目や3桁目を変えていっています。

このように、フォルダー名が急に変った場合でも、設計時にカレントフォルダーを何とか取ってこれないのかなと思ったわけです。

通りすがりさんのアドバイスのように
>> 都度都度プロパティでDBファイルを指定しなければならないのでしょうか。 
>そのとおりです。 
で、開発を進めていきたいと思います。

皆様、ありがとうございました。

編集 削除
AAA  2019-06-15 14:54:47  No: 49797  IP: 192.*.*.*

本番環境では
X:\ZZZZ\AAAAA.FDB
X:\ZZZZ\AAAAA.EXE 
のようになっていて カレントディレクトリィの AAAAAA.FDB を使っている

>このように、フォルダー名が急に変った場合でも、設計時にカレントフォルダーを何とか取ってこれないのかなと思ったわけです。 

開発環境では
X:\ZZZZ0001\AAAAA.FDB
X:\ZZZZ0002\AAAAA.FDB
X:\ZZZZ0003\AAAAA.FDB
のようになっていて最新の X:\ZZZZ0003\AAAAA.FDB を自動で設定したいって事
だと思うんだけど

設計時に自動に設定する方法ではなく

X:\ZZZZ0003\AAAAA.FDB の探し方を知りたいって言ってる?

単純に  AAAAAA.FDB を探して、日付が一番新しいやつ
を databaseName に設定すれば良いだけでは?
設計時に設定する必要はないけどね

編集 削除
maru_03  2019-06-15 21:04:25  No: 49798  IP: 192.*.*.*

AAA様
申し訳ありませんが、フィールドの追加などDBの基本構造も変わっていたりしていますので、
最新のものを指定するだけでは、元に戻ってフィールドが追加されていないDBファイルから、
もう一度考え直すような設計ができにくいです。

(追加されたフィールドは無視すればいいのですが)

また、DBファイルはアクセスすると最新の日付になるので「日付が一番新しいやつ」ではだめだと思います。
やはり、「自動的に設計時にカレントフォルダーのDBファイルのセット」は無理なのでしょう。

編集 削除