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処理にサブクエリを発行する際に制限など有るのでしょうか?
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に渡すとか。
魔界の仮面弁士さんのコメントを戴くと、判断に確信ができます。
> 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 を閉じて、再読込を行うことで
サブクエリーを使うことができました。
とりあえずご報告まで。
ツイート | ![]() |