DBGridのTQuery.SQLについて

解決


小雪  2004-12-10 23:48:47  No: 12222

DBGridのTQuery.SQLのSQLについて、
このSQLにフィールドを連結したものを表示させたいのですが、
演算子のエラーと表示されます

ex.  SELECT TbAAA & TbBBB & TbCCC As ABC

TbAAA,TbBBB,TbCCC : テーブル名

「&」は、いけないみたいなのですが、この代わりになるものは何なのでしょうか?


Basser  2004-12-11 00:01:22  No: 12223

「||」です。


HOta  2004-12-11 06:35:38  No: 12224

もしくは、計算項目を作りOnCulcイベントで作る方法もあります。


Mr.XRAY  URL  2004-12-11 07:47:53  No: 12225

それと,文字列以外の連結では,CASTで変換といったところでしょうか.


小雪  2004-12-13 19:16:20  No: 12226

ex.  SELECT TbAAA & TbBBB & TbCCC As ABC

↑これだとAccess上では起動するんです

Basser様
「||」は駄目でした


通りすがり  2004-12-13 20:47:01  No: 12227

Accessのことは知らないんですけど、

> SELECT TbAAA & TbBBB & TbCCC As ABC
これが、実行させようとしているSQL文のすべてなのでしょうか?
たいてい、SELECT ..... FROM ..... ってなるような気がするのですが。。。

あと、
> TbAAA,TbBBB,TbCCC : テーブル名
って文章がなんかひっかかるんですけど。
どんなもんなんでしょ!?


小雪  2004-12-13 22:15:18  No: 12228

通りすがり様
SQL全文は以下の様に記載しています
******************************************************************
TQuery.SQL = 
SELECT 
TbH.ACode,(略)…,
TbA.AName & TbB.BName & TbCName & … & TbGName As ABCDEFGName

FROM ((((((TbHist LEFT JOIN TbA ON TbH.ACode = TbA.ACode) 
                  LEFT JOIN TbB ON TbH.BCode = TbB.BCode) 
                  LEFT JOIN TbC ON TbH.CCode = TbC.CCode) 
                  LEFT JOIN TbD ON TbH.DCode = TbD.DCode) 
                  LEFT JOIN TbE ON TbH.ECode = TbE.ECode) 
                  LEFT JOIN TbF ON TbH.FCode = TbF.FCode) 
                  LEFT JOIN TbG ON TbH.GCode = TbG.GCode
**************************************************************

> って文章がなんかひっかかるんですけど。

  仮のテーブル名です、  実際は違いますよ
  紛らわしくてすいませんでした


通りすがり  2004-12-13 22:56:17  No: 12229

AccessではなくParadoxでなんの役にも立たず申し訳ありませんが、
試しにやってみました。

TbHist
| ACode | BCode |
+-------+-------+
|    10 |    11 |
|    11 |    10 |

TbA
| ACode | AName |
+-------+-------+
|    10 | A10   |
|    11 | A11   |

TbB
| BCode | BName |
+-------+-------+
|    10 | B10   |
|    11 | B11   |

SELECT
  TbHist.ACode, TbHist.BCode,
  TbA.AName || TbB.BName AS ABName
FROM
  ((TbHist
    LEFT JOIN TbA ON TbHist.ACode=TbA.ACode)
    LEFT JOIN TbB ON TbHist.BCode=TbB.BCode)

結果は
| ACode | BCode | ABName |
+-------+-------+--------+
|    10 |    11 | A10B11 |
|    11 |    10 | A11B10 |

となります。

> 仮のテーブル名です、  実際は違いますよ
> 紛らわしくてすいませんでした
テーブルそのものを'&'でつないでいるように見えたものですから。


小雪  2004-12-13 23:05:29  No: 12230

> SELECT
>   TbHist.ACode, TbHist.BCode,
>   TbA.AName || TbB.BName AS ABName

Basser様のおっしゃる通り「||」は使えるんですね
Access97、Delphi5でもエラーが出たのですけどね…
他が悪かったかもしれないのでもう一度チャレンジしてみます


Basser  2004-12-13 23:08:26  No: 12231

すみません。安易に答えてしまいました。

データベースはAccessなのでしょうか?
そうであれば「&」で結合できるようですが...

>FROM ((((((TbHist LEFT JOIN TbA ON TbH.ACode = TbA.ACode) 

あとTbHistの相関名がTbHだと思うのですが、
上記ではエラーとなるのでは?


小雪  2004-12-13 23:29:52  No: 12232

Basser様

> あとTbHistの相関名がTbHだと思うのですが、

あ、うっかり…その通りでした

> データベースはAccessなのでしょうか?

Access97のハズです
先輩のPC(Windows98)だと「&」で結合できてるみたいなのですけど…
私のはWindows2000です


通りすがり  2004-12-14 00:32:23  No: 12233

ディスクにころがっていた NWIND.mdb で試してみました。

SELECT Address || City AS Place FROM Cutomers
とすると、「クエリー式 'Address || City' の垂直バーの使い方が無効です。」のエラーになります。

SELECT Address & City AS Place FROM Customers
とすると、正しく結果が出ます。

D6/W2Kです。


通りすがり  2004-12-14 00:39:58  No: 12234

あ、タイプミスしました。
SELECT Address || City AS Place FROM Cutomers
でなく
SELECT Address || City AS Place FROM Customers
でした。


小雪  2004-12-14 00:55:56  No: 12235

やはりOSの違いかなにかなのでしょうね

そこで(許されるのなら)ついでに質問しますが、
TQuery.SQL文の中身のWHERE節をフォーム上にあるTLabelなどで条件文を作成したいのですが、これもエラーが出ます
これはどういったエラーなのでしょうか?

EX.  
WHERE ACode = :ACode
とACodeは変数扱いできるのですが、
WHERE ACode = ****.Caption
とはできませんよね?


Basser  2004-12-14 01:49:40  No: 12236

>EX.  
>WHERE ACode = :ACode
>とACodeは変数扱いできるのですが、
>WHERE ACode = ****.Caption
>とはできませんよね?

ACodeの型が何かわからないのですが、
文字列型(テキスト型)として考えると、

  Query1.SQL.Add(
    'WHERE ACode = ' + AnsiQuotedStr(Lable1.Caption, '''')
  );

のように引用符が必要となります。そのあたりはどうなんでしょうか?


小雪  2004-12-14 02:08:30  No: 12237

> WHERE ACode = :ACode

ACode : 日付時刻型(TDateTime)ですね

「AnsiQuotedStr関数」を使ってみます、初めて見ましたっ


小雪  2004-12-14 02:11:46  No: 12238

> WHERE ACode = ****.Caption
ACode : TDateTimeと****.Captionではもともと型が違いますね(笑


Basser  2004-12-14 02:25:55  No: 12239

>ACode : TDateTimeと****.Captionではもともと型が違いますね(笑

TLabelのCaptionに適切な日付書式が用いられていれば可能ですが、
日付フォーマットを気にしなくてはいけないので、
パラメータを用いたほうが無難だと思います。


小雪  2004-12-14 02:37:42  No: 12240

「ParamByName('(パラメータ名)').AsString」という関数を使えという事なのでしょうか

因みにエラーの内容は、
「QryHist(TQuery名):パラメータ'PostDt(パラメータ名?)'が見つかりません」というエラーなのですけど…
いい加減この質問も面倒ですよね…
素人過ぎてすいません…


Basser  2004-12-14 03:11:10  No: 12241

>因みにエラーの内容は、
>「QryHist(TQuery名):パラメータ'PostDt(パラメータ名?)'が見つかりません」>というエラーなのですけど…

パラメータの設定はどのようにしているのでしょうか?

・ParamByNameで直接指定
・TQueryのDatasourceプロパティに設定されたデータセットの値を用いる

等が、今浮かぶのですが、考えられることは
前者なら、問い合わせ文の中に PostDt というパラメータが存在しない。
後者なら、Datasourceプロパティに設定されたデータセットがアクティブでない又はPostDtというフィールドが存在しないと思われます。


小雪  2004-12-14 03:25:16  No: 12242

QryHist(TQuery)をダブルクリックした時に表示される小ウィンドウには'PostDt'をしっかりと定義してます。

QryHist.DataSource = ''

となってますが、これがいけないのでしょうか…(いけないのでしょうね)


HOta  2004-12-14 03:33:23  No: 12243

DataSorceは指定してください。

TQueryのSQLに
Select hoge1,hoge2
From TblHoge
WHERE hoge3 = :hogehoge
と書いて、パラメターで文字列型と設定しておくと、
ParamByName('hogehoge').asString = 'aaaaa';
Open
で選択できます。


小雪  2004-12-14 03:58:05  No: 12244

HOta様

「hogehoge」はTQueryを右クリック(かダブルクリック)で表示される「項目の設定」で定義するのですよね?

「'DBQry:項目 'hogehoge'が見つかりません'」というエラーが出てしまいます
因みにこの「DBQry」というのは今まで使用しているのと違うTQueryなのですけど…(一応DBQryにも同じ様に定義しました)


小雪  2004-12-14 18:31:50  No: 12245

何とか解決できました(でもまた質問してしまうかも)

HOta様、Basser様、通りすがり様、Mr.XRAY様
本当にありがとうございました


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

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






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