皆さん教えて頂きたいことがあります。
Delphi6でFirebirdを利用してシステム構築されたもので
TClientDataSetやTDataSourceを配置して動かしているのですが
IBConsoleでテーブルのフィールドを追加してから
Delphi側でTClientDataSetの「項目の設定」で確認しても
追加したフィールドが現れません。
そこで、以下の事をやってみました。
(1) 一応、「項目の設定」の中で「全てを選択」してから「全項目削除」して
「すべての項目の追加」をしても、追加したフィールドが現れません。
(2) 更に、「項目の新規作成」を使って "作成済のフィールド" 追加しますと、
見かけ上項目が作成できますが、オブジェクトインスペクタで TClientDataSet.Active=true
にしますとエラーになりますので、データベースのフィールドとして接続されて無いのでしょう。
追加したフィールドを認識〜接続させたいのですが、方法が分かりません。
何方かお分かりになられる方よろしくお願いします。
Delphi6以降のデータベースに関しましては少し疎い知識で
操作していますので、チンプンカンプンなところがあるかも
知れませんが、よろしくお願いします。
尚、環境は以下の通りです。
Delphi6.0 / Firebird2.0 / WindowsXP-SP2
※今回の操作は今まで動いているものに、追加・変更しようとしているものです。
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;
順番が逆です・・すみません
procedure *****ButtonClickなど******
var
SQL_St,SQL_St_1:String;
begin
maru3さんありがとうございます。
教えて頂いたのは、PGでフィールドを追加作成する方法でしょうか。
フィールドは、先に IBConsole で追加作成していますので
データベースをTClientDataSetに反映させる方法が知りたいのです。
(フィールドを認識しないものですから)
すみません、表現が分かり難いかも知れませんが
よろしくお願いします。
「項目の設定」で右クリックのメニューから項目の追加をしてみてください。
たぶん追加したFieldが表示されると思います。
HOtaさん、ありがとうございます。
> 「項目の設定」で右クリックのメニューから項目の追加をしてみてください。
私もそれは確認しましたが、追加分は表示されませんでした。
表示されないと言うことは、やはり何か同期を取る為の更新処理が
出来てない事と思いますが、その設定がわかりません。
追加フィールド以外の今までのデータは問題なく表示されるのですが・・・
よろしくお願いいたします。
取り合えず、こんなかんじで実行時に作って見ては?
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とか外部の定義情報が問題だと思うけど。
いけさん、アドバイスありがとうございます。
実は今回のシステムは、別な人が作ったもののメンテを
しているのですが、良く見ると同一のformの中に
TSQLDataSet が使われており、見てみますとその中の「項目の設定」と
並びが同じになっている事が分かりました。
改めて、TSQLDataSetの「項目の設定」に追加分のフィールドを設定して
再度、TClientDataSetの「項目の設定」にて「すべての項目の追加」を
行いましたら出来ました。
DelphiのDB用コンポは良く出来ているのですが、組合せもいろんな状態が
出来るので状況を把握するのに手間取ってしまいました。
いろいろお騒がせしましたが、解決となりました。
みなさま、ありがとうございました。m(__)m
ツイート | ![]() |