DBGridで複数テーブルの場合に更新するには?

解決


ぺんぺんたろう  2011-06-05 06:30:37  No: 40613

はじめまして。

タイトルの通り、DBGridを複数テーブルのときにUpdateする方法について質問させてください。

一つのテーブルをUpdateするときには問題なく動作しているのですが、SQLでテーブルをJoinした後に、更新しようとするとうまくいきません。
SQLに関してシロウトなので,Updateを指定するSQLが間違っているかもしれないという予想はつくのですが・・。
そもそも、複数テーブルを一気にUpdateさせることが間違いで、テーブル一つ一つアップデートさせて、それをもう一度Joinさせればよろしいのでしょうか??
一応下記にソースコードを載せておきます。

テーブルをつなげているソース

select test01."StudentName",test02."Class"
from test01,test02
Where test01."Studentid" = test02."Student_ID"

UpdateSQLには、以下のようなソースコードを書いています。

update test01,test02
set
  test01."StudentName" = :"StudentName",
  test02."Class" = :"Class"
where
  test01."StudentName" = :"OLD_StudentName" and
  test02."Class" = :"OLD_Class"

よろしくお願いします。


HOta  2011-06-05 16:58:59  No: 40614

テーブルが2つならUpdateSQLも2つ必要です。それぞれのテーブルに対して作成します。
Ex)
UpdateSQL1
Update Test01
Set
StudentName = :StudentName
where StudentName = :OLD_StudentName

UpdateSQL2

Update Test02
Set
Class = :Class
where Class = :OLD_Class

Query1.UpdateSQLにUpdateSQL1;UpdateSQL2
などとします。
ただ、このテーブルの作り方は、もっと考えたほうがいいのではと思います。
キーとデーターは分けたほうがあとあと使いやすくなります。
また、BDEは開発が停止していますの。


ぺんぺんたろう  2011-06-06 00:38:41  No: 40615

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

>ただ、このテーブルの作り方は、もっと考えたほうがいいのではと思います。
>キーとデーターは分けたほうがあとあと使いやすくなります。

テーブルを作る際に、キーとデータは分けたほうがいいんですね・・。
ありがとうございます。

>また、BDEは開発が停止していますの

そうなんですね。。
学校での宿題で複数テーブルで操作できるような課題を課されました。。

早速回答してもらった通り試したところ、一度目はうまくUpdateすることができたのですが、2度目以降うまく「アップデート失敗」というエラーがでて、Updateすることができません・・・。

また、色々と試したところ、名前が置いてあるテーブルはUpdateできますが、Classが置いてあるテーブルではUpdateできませんでした。

下記に関係ありそうなソースを書いてておきます。。

◯データモジュールのQueryのソース

procedure TDataModule1.Query2UpdateRecord(DataSet: TDataSet;
  UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
begin
  DataModule1.UpdateSQL2.Apply(UpdateKind);
  DataModule1.UpdateSQL3.Apply(UpdateKind);
  UpdateAction := uaApplied ;
end;

procedure TDataModule1.Query2UpdateError(DataSet: TDataSet;
  E: EDatabaseError; UpdateKind: TUpdateKind;
  var UpdateAction: TUpdateAction);
begin
  Query2.CancelUpdates ;
end;

◯Unitでのソース

procedure TForm3.FormCreate(Sender: TObject);
begin
  DataModule1.UpdateSQL2.DataSet := DataModule1.Query2 ;
  DataModule1.UpdateSQL3.DataSet := DataModule1.Query2 ;
end;

procedure TForm3.Button2Click(Sender: TObject);
begin
   with DataModule1.Query2 do begin
    ApplyUpdates ;
    CommitUpdates ;
    Close ;
    Active := True ;
   end;
end;

お手数ですが、よろしくお願いします。


HOta  2011-06-06 05:03:52  No: 40616

宿題を自分で考えないのは、考えものです。

Updateはテーブルの項目を更新するためで、Classのデーターとは別です。
理解が足りません。


HOta  2011-06-06 14:18:21  No: 40617

TUpdateSQLの各プロパティと、対象テーブルの構造を書いてください。
動作だけでは判りません。


ぺんぺんたろう  2011-06-07 08:20:29  No: 40618

返信遅れてごめんなさい。
自力でできる限り頑張ってみてました。
が、やはりわかりませんでした。。

確か、Updateの項目は上記で上げられたとおり、書いていたと思うので、下記の通りになっています。

UpdateSQL2
update test01
set
  test01."StudentName" = :"StudentName"
where
  test01."StudentName" = :"OLD_StudentName"

UpdateSQL3
update test02
set
  test02."class" = :"class"
where
  test02."class" = :"OLD_class"

対象テーブルの構造というのが、よくわかりませんが、Paradox7を使っています。テーブルはすべて文字列だったと思います。

また、QueryのUpdateObjectにUpdateSQL1;UpdateSQL2としても、不正なプロパディと出て、Updateできませんでしたので、QueryのUpdateObjectは空のままにしています。これは、図書館で本を調べてきてやっていたところ、上記のようなコードが見つかったので真似してやってみたんですが、うまくできませんでした。。

また、「Classのデーターとは別」という意味もイマイチ理解できていません。。
Classのテーブルデータをデータベース上に書きこみ更新するためには、もっと違う手続きを踏まないといけないということでしょうか??


HOta  2011-06-07 17:39:46  No: 40619

TUpdateSQLはTQueryで作成したSQL文が複数のテーブルから選択している場合などに、対して適用し、どのテーブルのどのフィールドに対して更新するかを指定します。

TQueryのRequestLiveはTrueにします。UpdateObjectに対象の複数のTUpdateSQLを;で区切って指定してください。

また、TUpdateSQLは一つずつTQueryのUpdateObjectに指定すると、TUpdateSQLにマウスを置いて、右ボタンから「UpdateSQLの設定」で対象テーブル・キーField,更新Fieldの設定をすると、ModifySQL・InsertSQL・DeleteSQLが生成されます。1つのテーブル毎に作って、あとでUpdateObjectに複数設定すれば良いでしょう。

もう少し詳しく説明してもらわないと、意味がわかりにくいのです。
テーブルの構造とは、データーベースを扱う上で、最低限知らないと何も出来ません。テーブルの構造とは、どのような名称のFieldが有って、その型は文字なのか、文字列なのかSmallIntなのかを決めている者です。Paradox7なら、DataBaseDesktopで確認できるはずです。
本のまねをしたとのことですが、この様に極一部だけを見せられても何処が悪いのかは、かなりの推測でしか判りません。
特に、勉強されているのですから、ここのところは大事にしないと駄目です。


ぺんぺんたろう  2011-06-08 06:45:26  No: 40620

ご返信ありがとうございます。

TQueryのUpdateObjectを;で区切ると、「プロパディ不正です」というエラーがやはり出てきました。
もともと、UpdateObjectでTUpdateSQL1を指定して、test01のデータを選んで、SQL文を生成して、またUpdateObjectでTUpdateSQL2を指定して、といったように使っていました。

Queryのプロパディなどは過去ログを参照にしながら、TQueryのRequestLiveやCachedUpdateなどをいじってはいたので、大丈夫だと思います。

しかし、書き込み禁止のエラーがでるものの、うまくUpdateできる時もあるので、一応解決したということにさせていただきます。

後はもう少し自力で頑張ってみます。。

テーブルの構造は、Field型、Type、Size、Keyのことなどを指していたのですね。こちらも、文字列や数字以外にも、まだ分からない倍数型とかがあったので、もう少し勉強したいと思います。失礼いたしました。

詳しい説明ありがとうございました。


HOta  2011-06-08 20:57:28  No: 40621

TQueryのUpdateObjectプロパティに複数のテーブルを設定するのは、FormのOnCreate等で
  UpdateSQL1.DataSet=Query1;
  UpdateSQL2.DataSet=Query1;
とします。


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

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






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