[delphi-users:4965] FDQueryで取得するtableのupdate方法

228 views
Skip to first unread message

じゃぺ

unread,
Sep 5, 2018, 2:04:47 AM9/5/18
to delphi...@freeml.com
こんにちは
川上です

Delphiというより、データベースの扱い方になると思いますが、
ご教示いただければ幸いです。

Win10 64bit、Delphi 10.2 VCL+SQLiteで
アプリケーションを作成しています。

複数のテーブルから取得した情報に対してUpdateを
行うにはどうすればいいのでしょうか。

以下は説明のため一部簡略化したサンプルの構成です。

テーブルcompanyの構造とデータ(ID INTEGER ,NAME STRING);
1,Boland
2,CodeGear
3,Embarcadero

テーブルuserの構造とデータ(ID INTEGER ,CLIENTID INTEGER, NAME STRING);
1,1,Tom
2,1,Bob
3,2,Alice
4,3,Marco

DBGridには
Boland,Tom
Boland,Bob
CodeGear,Alice
Embarcadero,Marco
のように表示したいので、
FDQueryのSQLに
select company.name as cname, user.name as uname
       from company, user
       where company.id=user.clientid;
をセットしました。
(DBGrid.datasource=DataSource1
DataSource1.DataSet=FDQuery です)

これでDBGridに希望の情報が表示されますが、上記のuname
(元々はuser.name)を直接編集してDBNavigatorでコミットすると、
[FireDAC][Phys][SQLite] ERROR: no such column: UNAME.
という例外が出てしまいます。

対象がtableじゃないので当然っちゃ当然なのですが
それではどのように編集するべきなのでしょうか。
tableを単純に表示すればもちろん可能ですが、それでは
参照先の情報(ここではcompany.name)が表示されず、
正しい行の認識ができなくなってしまいます。

どうぞよろしくお願いいたします。

あだち

unread,
Sep 5, 2018, 2:34:54 AM9/5/18
to delphi...@freeml.com
あだちです。

結合クエリの更新は、制限やFDQueryに諸々設定が必要になります。
以前ブログに纏めましたのでこちらを参考にしていただければと思います。


http://thinksoft.sblo.jp/article/175341763.html




On Wed, 5 Sep 2018 15:04:43 +0900 (JST)
じゃぺ <delphi...@freeml.com> さんは書きました。:
> ?????? from company, user
> ?????? where company.id=user.clientid;
> をセットしました。
> (DBGrid.datasource=DataSource1
> DataSource1.DataSet=FDQuery です)
>
> これでDBGridに希望の情報が表示されますが、上記のuname
> (元々はuser.name)を直接編集してDBNavigatorでコミットすると、
> [FireDAC][Phys][SQLite] ERROR: no such column: UNAME.
> という例外が出てしまいます。
>
> 対象がtableじゃないので当然っちゃ当然なのですが
> それではどのように編集するべきなのでしょうか。
> tableを単純に表示すればもちろん可能ですが、それでは
> 参照先の情報(ここではcompany.name)が表示されず、
> 正しい行の認識ができなくなってしまいます。
>
> どうぞよろしくお願いいたします。

--
https://www.thinksoft.co.jp
ML用 <adac...@thinksoft.co.jp>


MLホームページ: https://www.freeml.com/delphi-users

----------------------------------------------------------------------
GMOあおぞらネット銀行からキャンペーンのお知らせ!
7月より事業を開始したGMOあおぞらネット銀行では
事業開始のいまだけのお得なキャンペーンを実施中です!
口座開設するならいま!
↓↓↓ キャンペーン詳細はこちら ↓↓↓
https://ad.atown.jp/adserver/cp?sid=88342&did=638b&u1=
------------------------------------------------------[freeml byGMO]--

あなたの街のチラシがいつでも無料で見放題!
チラシをクリックしてチラシが拡大されたらポイントゲット♪
まずはかんたん登録♪ -ポイントタウン-
https://www.pointtown.com/ptu/rd.cgi?cid=8912
----------------------------------------------------------------------

じゃぺ

unread,
Sep 5, 2018, 3:45:02 AM9/5/18
to delphi...@freeml.com
あだち様

情報ありがとうございます。
ブログの内容を読んで試してみます。

取り急ぎ御礼まで

かわかみ

hota1868

unread,
Sep 5, 2018, 4:53:25 AM9/5/18
to delphi...@freeml.com
太田です。

以前のBDEにあったTUpdateSQLと同じように
TFDUpsateSQLを使えば簡単にできますよ。



MLホームページ: https://www.freeml.com/delphi-users

----------------------------------------------------------------------
\GMOクリック証券のバイナリーオプションって?/
操作はたったの3ステップ。初心者でも迷わずお取引!
スマホでもPCでも、どこでもお取引が可能。
日本の企業だから入金・出金も安心。
https://ad.atown.jp/adserver/cp?sid=876ad&did=6240&emid=&u1=

じゃぺ

unread,
Sep 28, 2018, 5:22:43 AM9/28/18
to delphi...@freeml.com
みなさま

ちょっと試してみたのですが、うまくいかず、
結局時間がなくてDBGrid、FDtable、lookupComboboxを
組み合わせて解決しました。あまりきれいじゃないのですが、
自分が使うものなのでまあいいや、と…、

またDB関係の仕事がありそうなので次はトライしてみます。

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

取り急ぎ報告まで


のべ

unread,
Sep 28, 2018, 5:31:05 PM9/28/18
to delphi...@freeml.com

渡辺です。

解決されていらっしゃるので、お役に立たないかもしれませんが、ご参考まで。
私がTokyo10.2.3、データベースはFireBirdで試したところ、
うまく行く方法もあります。

FDQuery.updateOptions.UpdateTableNameに「user」を設定し、
FDQuery.updateOptions.KeyFieldsに「id」を設定します。
そして、SQLを少し変更する必要があります。


select company.name as cname, user.name as uname
from company, user
where company.id=user.clientid;
では上手くいきませんが、

select user.name uname,company.name cname,user.id
from company,user
where company.id=user.id
ならうまくいきます。

ポイントはxuserのidもとりだすことと、
selectの最初のフィールドをxuserのフィールドにすることです。

idをとりだしても、
select company.name cname,user.name uname,user.id
from company,user
where company.id=user.id
だと、自動生成するSQLがなぜかupdate companyになってしまうらしく、失敗します。

http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/更新のポスト処理のオーバーライド(FireDAC)
に、色々な設定の仕方が書いてありますが、同時に、
メモ: 上記が絶対必要というわけではありません。それどころか、実際に何が起こるかをまず確かめてください。 」
とも書いてあるので、色々試したら上手くいきました。

というより、ふだんTFDUpdateSQLはほぼ使わずにDBGridでの編集をできてるので、
これが特別変わった方法では無いのかも知れません。
-- 
/////ノベルット///////////////////////////////////////////////
 株式会社 ノベルット ソフトウェア インダストリー
  代表取締役 渡辺 伸雄
 〒144-0043 東京都 大田区 羽田2-12-3
 Tel:03-5705-2595
 Fax:03-6423-9505
 mobile-phone:080-3430-2595 070-5582-6540
  Email:wata...@noveltte.jp
///////////////////////////////////////////////ノベルット/////
Reply all
Reply to author
Forward
0 new messages