TQueryにセットするSQLでサブクエリ

解決


hosi  2010-05-29 00:23:04  No: 38567

はじめまして。よろしくおねがいします。
Delphi7で開発してます。
TQueryでAccessからデータを取得してCSVデータに取得するプログラムを作っているのですが、サブクエリを使用するとエラーになります。
「この機能は使用できません。」
いくつかのマスタを見て名称を取得したいのですが、使えないのでしょうか?


hosi  2010-05-29 00:24:38  No: 38568


ごめんなさい、CSVファイルとして出力するプログラムです。


HOta  2010-05-29 00:51:37  No: 38569

サブクエリーはTQueryのSQLの中で使っていますか?
SQL文にAccseeで定義したサブクエリーは使えないので、
全文を書かないと動かないのではないですか?
どのようなSQL文か上げてみてください。


hosi  2010-05-29 01:15:17  No: 38570

HOtaさん、ありがとうございます。
SQL文はTQuery.SQL.Addでセットしています。
Accessでサブクエリは定義していません。

SELECT 
TNYM, //年月
SPCD, //仕入先コード  
(SELECT SRSRN1 FROM SIREMP WHERE SPCD=SRSRCD) AS SRSRN1, //仕入先名
TNNO, //棚番
SCD1, //商品コード
SHSHNM,//商品名
ONUM, //数量
SHHTKK, //本体価格
(SELECT SKKR FROM SKKRT WHERE SBCD=SHNSHC) AS SKKR, //掛率
FROM TINVTL INNER JOIN SYHNMP ON NSHC = SHNSHC 
WHERE TNYM = '201005'


Mr.XRAY  2010-05-29 03:23:28  No: 38571

こんにちは.Mr.XRAYといいます.

興味があり,ちょっとおききしたいのですが,
その今テストしているプログラムでは,
つまり,CSVテキストファイルに出力するコードは,
サブクエリーを使用しなければうまくいくのでしょうか?


Mr.XRAY  2010-05-29 03:45:52  No: 38572

大変失礼しました.
BDEの設定で可能なんですね.


nobukoshi802  2010-05-29 03:58:42  No: 38573

サブクエリーを使用しないで
そのサブクエリー自体をクエリーにする方法はダメですか?
つまり、新たにクエリーを作成して
Delphiからは、上記で作成したクエリーを単純に出力する方法です。


Mr.XRAY  2010-05-29 22:40:14  No: 38574

こんにちは.

>TQueryでAccessからデータを取得してCSVデータに取得する

Accessということは,JETデータベースですよね.
以下のような方法も考えられと思いますが.サブクエリも使用可能です.

>いくつかのマスタを見て名称を取得したいのですが

「名称」の意味も分かりませんし(スミマセン),TQueryでサブクエリということなので,
質問の趣旨をよく理解していないレスです.
目的の動作と違っていたらゴメンナさい.
(最近,ハズレが多いからな〜)

02_カンマ区切りテキストファイルへのエクスポート(スキーマ設定なし)
http://mrxray.on.coocan.jp/Delphi/plSamples/623_ADO_mdbExport.htm#02


HOta  2010-05-29 23:00:00  No: 38575

ちょっと、テーブルの項目がわかりませんが、このサブクエリーなら、そのままInner Joinで抽出出来そうですよ。
もとのままのクエリーで出てくるエラーはどんな内容でしょうか?
テーブルの定義がわかればお答え出来そうです。


hosi  2010-06-01 09:23:36  No: 38576

皆様、返信が遅れすみませんでした。
Accessだと思っていたのですが、パラドックスというDBでした。
Accessで開いていたのでてっきりAccessだと思っていました。

仕入先名は別のマスタが持っているので副問い合わせで取得したかったのです。
パラドックスというDBでは使えないのでしょうか。。


HOta  2010-06-01 19:18:02  No: 38577

テーブルや項目が判りませんが、これでいかがですか?
SELECT 
A.TNYM, //年月
A.SPCD, //仕入先コード  
C.SRSRN1 AS SRSRN1, //仕入先名
A.TNNO, //棚番
A.SCD1, //商品コード
A.SHSHNM,//商品名
A.ONUM, //数量
A.SHHTKK, //本体価格
D.SKKR AS SKKR, //掛率
FROM TINVTL A
 INNER JOIN SYHNM B ON B.NSHC = A.SHNSHC 
 Left Outer JOIN SIREMP C WHERE A.SPCD = C.SRSRCD
 Left Outer JOIN SKKRT D WHERE A.SBCD = D.SHNSHC
WHERE A.TNYM = '201005'


hosi  2010-06-01 21:05:01  No: 38578

HOtaさん、

Left Outer Join の Whereを'On'に変えてできました!
Whereだとエラーだったので・・。

Hotaさん、皆さん本当にありがとうございました。


Quest  2010-06-02 19:50:59  No: 38579

LEFT OUTER JOINで解決したようですが、パラドックスなら下記の方法で
サブクエリー(もどき)が使えますので、参考までに。

テキストファイルにサブクエリーの内容を記述する。
例えば SUBQUERY.SQL というファイルを作って
SELECT FIELD_A + FIELD_B AS CALC_FIELD FROM TABLE1
と記述し、テーブルがあるフォルダに保存します。
TQueryのSQLに
SELECT MAX(CALC_FIELD) FROM "SUBQUERY.SQL"
と記述するとSUBQUERY.SQLの内容がサブクエリと同じ扱いになります。


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

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






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