DBGridのTQuery.SQLについて

解決


小雪  2004-12-10 14:48:47  No: 12222  IP: 192.*.*.*

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

ex.  SELECT TbAAA & TbBBB & TbCCC As ABC

TbAAA,TbBBB,TbCCC : テーブル名

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

編集 削除
Basser  2004-12-10 15:01:22  No: 12223  IP: 192.*.*.*

「||」です。

編集 削除
HOta  2004-12-10 21:35:38  No: 12224  IP: 192.*.*.*

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

編集 削除
Mr.XRAY  URL  2004-12-10 22:47:53  No: 12225  IP: 192.*.*.*

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

編集 削除
小雪  2004-12-13 10:16:20  No: 12226  IP: 192.*.*.*

ex.  SELECT TbAAA & TbBBB & TbCCC As ABC

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


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

編集 削除
通りすがり  2004-12-13 11:47:01  No: 12227  IP: 192.*.*.*

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

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

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

編集 削除
小雪  2004-12-13 13:15:18  No: 12228  IP: 192.*.*.*

通りすがり様
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 13:56:17  No: 12229  IP: 192.*.*.*

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 14:05:29  No: 12230  IP: 192.*.*.*

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

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

編集 削除
Basser  2004-12-13 14:08:26  No: 12231  IP: 192.*.*.*

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

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

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

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

編集 削除
小雪  2004-12-13 14:29:52  No: 12232  IP: 192.*.*.*

Basser様

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

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

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

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

編集 削除
通りすがり  2004-12-13 15:32:23  No: 12233  IP: 192.*.*.*

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

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

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

D6/W2Kです。

編集 削除
通りすがり  2004-12-13 15:39:58  No: 12234  IP: 192.*.*.*

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

編集 削除
小雪  2004-12-13 15:55:56  No: 12235  IP: 192.*.*.*

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

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


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

編集 削除
Basser  2004-12-13 16:49:40  No: 12236  IP: 192.*.*.*

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

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

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

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

編集 削除
小雪  2004-12-13 17:08:30  No: 12237  IP: 192.*.*.*

> WHERE ACode = :ACode

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

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

編集 削除
小雪  2004-12-13 17:11:46  No: 12238  IP: 192.*.*.*

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

編集 削除
Basser  2004-12-13 17:25:55  No: 12239  IP: 192.*.*.*

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

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

編集 削除
小雪  2004-12-13 17:37:42  No: 12240  IP: 192.*.*.*

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

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

編集 削除
Basser  2004-12-13 18:11:10  No: 12241  IP: 192.*.*.*

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

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

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

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

編集 削除
小雪  2004-12-13 18:25:16  No: 12242  IP: 192.*.*.*

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

QryHist.DataSource = ''

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

編集 削除
HOta  2004-12-13 18:33:23  No: 12243  IP: 192.*.*.*

DataSorceは指定してください。

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

編集 削除
小雪  2004-12-13 18:58:05  No: 12244  IP: 192.*.*.*

HOta様

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

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

編集 削除
小雪  2004-12-14 09:31:50  No: 12245  IP: 192.*.*.*

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

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

編集 削除