はじめまして。
タイトルの通り、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"
よろしくお願いします。
テーブルが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は開発が停止していますの。
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;
お手数ですが、よろしくお願いします。
宿題を自分で考えないのは、考えものです。
Updateはテーブルの項目を更新するためで、Classのデーターとは別です。
理解が足りません。
TUpdateSQLの各プロパティと、対象テーブルの構造を書いてください。
動作だけでは判りません。
返信遅れてごめんなさい。
自力でできる限り頑張ってみてました。
が、やはりわかりませんでした。。
確か、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のテーブルデータをデータベース上に書きこみ更新するためには、もっと違う手続きを踏まないといけないということでしょうか??
TUpdateSQLはTQueryで作成したSQL文が複数のテーブルから選択している場合などに、対して適用し、どのテーブルのどのフィールドに対して更新するかを指定します。
TQueryのRequestLiveはTrueにします。UpdateObjectに対象の複数のTUpdateSQLを;で区切って指定してください。
また、TUpdateSQLは一つずつTQueryのUpdateObjectに指定すると、TUpdateSQLにマウスを置いて、右ボタンから「UpdateSQLの設定」で対象テーブル・キーField,更新Fieldの設定をすると、ModifySQL・InsertSQL・DeleteSQLが生成されます。1つのテーブル毎に作って、あとでUpdateObjectに複数設定すれば良いでしょう。
もう少し詳しく説明してもらわないと、意味がわかりにくいのです。
テーブルの構造とは、データーベースを扱う上で、最低限知らないと何も出来ません。テーブルの構造とは、どのような名称のFieldが有って、その型は文字なのか、文字列なのかSmallIntなのかを決めている者です。Paradox7なら、DataBaseDesktopで確認できるはずです。
本のまねをしたとのことですが、この様に極一部だけを見せられても何処が悪いのかは、かなりの推測でしか判りません。
特に、勉強されているのですから、ここのところは大事にしないと駄目です。
ご返信ありがとうございます。
TQueryのUpdateObjectを;で区切ると、「プロパディ不正です」というエラーがやはり出てきました。
もともと、UpdateObjectでTUpdateSQL1を指定して、test01のデータを選んで、SQL文を生成して、またUpdateObjectでTUpdateSQL2を指定して、といったように使っていました。
Queryのプロパディなどは過去ログを参照にしながら、TQueryのRequestLiveやCachedUpdateなどをいじってはいたので、大丈夫だと思います。
しかし、書き込み禁止のエラーがでるものの、うまくUpdateできる時もあるので、一応解決したということにさせていただきます。
後はもう少し自力で頑張ってみます。。
テーブルの構造は、Field型、Type、Size、Keyのことなどを指していたのですね。こちらも、文字列や数字以外にも、まだ分からない倍数型とかがあったので、もう少し勉強したいと思います。失礼いたしました。
詳しい説明ありがとうございました。
TQueryのUpdateObjectプロパティに複数のテーブルを設定するのは、FormのOnCreate等で
UpdateSQL1.DataSet=Query1;
UpdateSQL2.DataSet=Query1;
とします。
ツイート | ![]() |