MSDataShepeでの親子コマンドのあるSQLに対する親へのFilter処理

解決


IMA  2010-04-27 09:35:58  No: 102369  IP: [192.*.*.*]

VB6 で Access2000形式のMDBを対象にしています。

DataEnvironment(deMain)を使用して

    cn.ConnectionString = _
    "Provider=MSDataShape;Persist Security Info=False;User ID=Admin;" & _
    "Data Source=" & App.Path & "\hoge.mdb;" & _
    "Data Provider=MICROSOFT.JET.OLEDB.4.0"

コマンド例
SHAPE {SELECT Tbl_Main.* FROM Tbl_Main}  AS cmd親DATA 
APPEND 
({SELECT Tbl_社員名.* FROM Tbl_社員名}  AS cmd社員名 RELATE 'ID' TO 'ID') AS cmd社員名,
({SELECT Tbl_所属部署名.* FROM Tbl_所属部署名}  AS cmd所属部署名 RELATE 'ID' TO 'ID') AS cmd所属部署名
等としています

この際に、cmd社員名でフィルター処理しようとしてエラーで困っています。

例えば簡単な

deMain.rscmd親DATA.Filter = "ID > 500" ではOK
deMain.rscmd親DATA.Filter = "ID BETWEEN 300 AND 500" ではNG
deMain.rscmd親DATA.Filter = "ID >= 300 AND ID <= 500" ではOK

deMain.rscmd親DATA.Filter = "ID IN (SELECT ID FROM Tbl_社員名 WHERE 姓名 LIKE '%太郎')" ではNG
deMain.rscmd親DATA.Filter = "ID IN (SELECT ID FROM Tbl_社員名)" でもNG

実行時エラー '3001':
引数が間違った型、許容範囲外、または競合しています。

となります。

MSDataShepeでの親コマンドへのFilter処理にサブクエリを発行する際に制限など有るのでしょうか?

編集 削除
魔界の仮面弁士  2010-04-27 21:26:59  No: 102370  IP: [192.*.*.*]

MDAC SDK を見る限り、Filter プロパティに BEWEEN や IN が使えるという記述は見当たらなかったのですが、それらの演算子が使用可能であるという情報は、どこから得たものなのでしょうか?
http://msdn.microsoft.com/ja-jp/library/cc426691.aspx
http://msdn.microsoft.com/ja-jp/library/cc407934.aspx

> MSDataShepeでの親コマンドへのFilter処理にサブクエリを発行する際に制限など有るのでしょうか?
BETWEEN の代わりに AND 構文で代用できているので、この部分は問題無いですよね。
また、Tbl_社員名 との結合については、リシェイプを試してみては如何でしょう。

あるいは単純な列挙処理でBookmarkを集め、その配列をFilterに渡すとか。

編集 削除
IMA  2010-04-28 06:42:26  No: 102371  IP: [192.*.*.*]

魔界の仮面弁士さんのコメントを戴くと、判断に確信ができます。

> MDAC SDK を見る限り、Filter プロパティに BEWEEN や IN が使える
> という記述は見当たらなかったのですが、それらの演算子が使用可能
> であるという情報は、どこから得たものなのでしょうか?

久しぶりにSQLをいじったのが、今回のShapeコマンド?でしたので、
Filterプロパティでも、サブクエリーなどが使えるかなと単純に考えて
いました。(汗
→仕様的に無理なのですね!

適切なコメント有り難うございました。

速度的には新規SQL発行で、問題かも知れませんが、
deMain.Commands!cmdMain.CommandText 等と全体のSQLを取得し、
その中の
SHAPE {SELECT Tbl_Main.* FROM Tbl_Main} を
SHAPE {SELECT Tbl_Main.* FROM Tbl_Main
        WHERE Tbl_Main.ID IN (SELECT ID FROM Tbl_社員名
                               WHERE 姓名 LIKE '%太郎')} ・・・
などと書き直し、rs を閉じて、再読込を行うことで
サブクエリーを使うことができました。

とりあえずご報告まで。

編集 削除