データベースにフィールド追加しての反映について

解決


はるはる  2010-06-16 01:17:30  No: 38660

皆さん教えて頂きたいことがあります。

Delphi6でFirebirdを利用してシステム構築されたもので
TClientDataSetやTDataSourceを配置して動かしているのですが
IBConsoleでテーブルのフィールドを追加してから
Delphi側でTClientDataSetの「項目の設定」で確認しても
追加したフィールドが現れません。

そこで、以下の事をやってみました。

(1) 一応、「項目の設定」の中で「全てを選択」してから「全項目削除」して
「すべての項目の追加」をしても、追加したフィールドが現れません。

(2) 更に、「項目の新規作成」を使って "作成済のフィールド" 追加しますと、
見かけ上項目が作成できますが、オブジェクトインスペクタで TClientDataSet.Active=true
にしますとエラーになりますので、データベースのフィールドとして接続されて無いのでしょう。

追加したフィールドを認識〜接続させたいのですが、方法が分かりません。
何方かお分かりになられる方よろしくお願いします。

Delphi6以降のデータベースに関しましては少し疎い知識で
操作していますので、チンプンカンプンなところがあるかも
知れませんが、よろしくお願いします。

尚、環境は以下の通りです。
Delphi6.0 / Firebird2.0 / WindowsXP-SP2

※今回の操作は今まで動いているものに、追加・変更しようとしているものです。


maru3  2010-06-16 01:57:02  No: 38661

D7 の IBX にて行っていますが、
一旦、DBを作成して後に、フィールドを追加したいことが多々あります。
このような場合、最も初めに作成されるFormにて、
1.そのフィールドがあるか?
2.無ければ作成
という風に行っています。
結果オーライということで試作中には便利です。
具体的には

var
  SQL_St,SQL_St_1:String;
procedure *****ButtonClickなど******
begin
  //フィールドの有無をチェックして無ければ挿入します

    SQL_St := ' select <挿入したいフィールド名> from <DB名>  ';
  try
    with IBSQL1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add(SQL_St);
      Open;//フィールドが無ければエラーが発生
    end;
  except  //エラーの場合フィールドを追加
    SQL_St1 := ' alter table <DB名> add <挿入したいフィールド名> VARCHAR(30)';
    with IBSQL2 do
    begin
      Close;
      SQL.Clear;
      SQL.Add(SQL_St1);
      ExecSQL;
      IBTr1.CommitRetaining;
    end;
  end;
end;


maru3  2010-06-16 01:58:16  No: 38662

順番が逆です・・すみません
procedure *****ButtonClickなど******
var
  SQL_St,SQL_St_1:String;
begin


はるはる  2010-06-16 02:27:47  No: 38663

maru3さんありがとうございます。

教えて頂いたのは、PGでフィールドを追加作成する方法でしょうか。

フィールドは、先に IBConsole で追加作成していますので
データベースをTClientDataSetに反映させる方法が知りたいのです。
(フィールドを認識しないものですから)

すみません、表現が分かり難いかも知れませんが
よろしくお願いします。


HOta  2010-06-16 02:40:46  No: 38664

「項目の設定」で右クリックのメニューから項目の追加をしてみてください。
たぶん追加したFieldが表示されると思います。


はるはる  2010-06-16 03:15:17  No: 38665

HOtaさん、ありがとうございます。

> 「項目の設定」で右クリックのメニューから項目の追加をしてみてください。
私もそれは確認しましたが、追加分は表示されませんでした。

表示されないと言うことは、やはり何か同期を取る為の更新処理が
出来てない事と思いますが、その設定がわかりません。

追加フィールド以外の今までのデータは問題なく表示されるのですが・・・

よろしくお願いいたします。


いけ  2010-06-16 07:49:15  No: 38666

取り合えず、こんなかんじで実行時に作って見ては?
ClientDataSet.Active := False;
ClientDataSet.FieldDefs.Clear;
ClientDataSet.FieldDefs.Add('ITEM1', ftInteger );    
ClientDataSet.FieldDefs.Add('ITEM2', ftString, 255);  
ClientDataSet.CreateDataSet();                             

TClientDataSetを使っているから、BDEとか使ってないんだよね。
dfmファイルとかに定義が残ってないか、全てのファイルに
追加フィールド以外の項目名称でGrepかけてみたら。

追加フィールド以外のフィールド情報が取れているから
どこかには、その情報が残っているとおもうけど。

Delphi側に定義情報がなかったら、Firebirdとか外部の定義情報が問題だと思うけど。


はるはる  2010-06-16 18:14:11  No: 38667

いけさん、アドバイスありがとうございます。

実は今回のシステムは、別な人が作ったもののメンテを
しているのですが、良く見ると同一のformの中に
TSQLDataSet が使われており、見てみますとその中の「項目の設定」と
並びが同じになっている事が分かりました。

改めて、TSQLDataSetの「項目の設定」に追加分のフィールドを設定して
再度、TClientDataSetの「項目の設定」にて「すべての項目の追加」を
行いましたら出来ました。

DelphiのDB用コンポは良く出来ているのですが、組合せもいろんな状態が
出来るので状況を把握するのに手間取ってしまいました。

いろいろお騒がせしましたが、解決となりました。

みなさま、ありがとうございました。m(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加