Page 433 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼ADOXで… toku 03/9/5(金) 20:55 ┣Re:ADOXで… YU-TANG 03/9/10(水) 11:49 ┃ ┗Re:ADOXで… toku 03/9/10(水) 19:58 ┗ADOX toku 03/9/11(木) 17:30 ┗Re:ADOX YU-TANG 03/9/11(木) 21:26 ┗感動しました toku 03/9/16(火) 15:48 ┗Re:感動しました YU-TANG 03/9/16(火) 22:22 ┗解決編 YU-TANG 03/11/17(月) 23:05 ─────────────────────────────────────── ■題名 : ADOXで… ■名前 : toku ■日付 : 03/9/5(金) 20:55 -------------------------------------------------------------------------
ADOXでクエリを作成するとデータベースに表示されないそうなのですが何とかして表示させる方法ってないものでしょうか? こんな感じでVBAを書いてあります。 ↓ Private Sub クエリ作成_click() Dim cl As New ADOX.Catalog Dim cm As New ADODB.Command Dim rs As New ADODB.Recordset cl.ActiveConnection = CurrentProject.Connection cm.CommandText = "select tb_A.*, tb_B.* " _ & "from テーブルA, テーブルB;" cl.Views.Append "クエリテーブルAB", cm rs.Open "クエリテーブルAB", CurrentProject.Connection End If |
> ADOXでクエリを作成するとデータベースに表示されないそうなのですが > 何とかして表示させる方法ってないものでしょうか? View を作成してもデータベース ウィンドウのクエリ タブに表示されない ということですね。 私見ですが、おそらく不可能だと思います。 Access のクエリは、ADOX 上の分類では(というか ANSI SQL92 的には) テーブルに当たります。 Type プロパティが "VIEW" という値の特殊なテーブルです。 したがって、View を作成してデータベースウィンドウにクエリとして 表示させたいというのは、おそらくストアドプロシージャを作成して データベースウィンドウにマクロとして表示させたい、ということと 同程度に困難ではないかと想像します。 私は ADO に詳しくないので、何か抜け道が有って私がそれを知らない だけかもしれませんが、私だったらそれを探すより、素直に DAO で クエリを作成してしまうと思います。 |
YU-TANG さん> なんだか難しい説明でしたが…(^^; 不可能ということで了解しました。 ありがとうございました。m(_ _)m |
なんとなく悩んでいたらこんな感じで表示できてしまいました。 なんだか意味無いことをやってるような…。 無理やりなとこもあるし。 ずばっとご意見もらえたらうれしい限りであります。 'ADOXでクエリを作ってテーブルにしてさっきのADOXで '作成したクエリを削除しました。 'テーブル k_m.名前 'テーブル c.電話番号 'テーブル k_m.電話番号 'クエリ Q_C Private Sub クエリ作成_click() Dim QCtestCL As New ADOX.Catalog Dim QCtestCM As New ADODB.Command Dim QCtestRS As New ADODB.Recordset Dim QCtestCT As ADODB.Connection Dim V_name As String On Error GoTo err1 '作成するテーブルをチェックする DoCmd.OpenTable "C_kai" DoCmd.Close acTable, "C_kai", acSaveNo MsgBox "作成しようとしているテーブル名がかぶってます。" Exit Sub err1: On Error GoTo err2 QCtestCL.ActiveConnection = CurrentProject.Connection QCtestCM.CommandText = "select c.*, k_m.名前 " & _ "from clamp inner join k_m on c.電話番号 = k_m.電話番号;" QCtestCL.Views.Append "Q_C", QCtestCM 'SQLステートメントの結果でテーブル作成 'クエリQ_Cをクエリして そのクエリをテーブルC_kaiとして作成 Set QCtestCT = Application.CurrentProject.Connection Set QCtestCM = New ADODB.Command QCtestCM.ActiveConnection = QCtestCT QCtestCM.CommandText = " SELECT * INTO C_kai FROM Q_C;" Set QCtestRS = New ADODB.Recordset Set QCtestRS = QCtestCM.Execute QCtestCL.ActiveConnection = CurrentProject.Connection QCtestCL.Views.Delete "Q_C" Exit Sub err2: MsgBox (Error) End Sub |
あれ...... 私はてっきり ADOX でクエリ オブジェクトを作成したいというのが ご質問の趣旨かと思っていたのですが、ぜんぜん違ったみたいですね。 単に ADO で Select Into を実行したいだけということでしたら、 下記でもいいんでしょうか。 Private Sub クエリ作成_Click() On Error Resume Next Const ERR_TABLE_ALREADY_EXISTS = &H80040e14 CurrentProject.Connection.Execute _ "SELECT * INTO C_kai FROM (SELECT c.*, k_m.名前 " & _ "FROM clamp INNER JOIN k_m ON c.電話番号 = k_m.電話番号);" If (Err.Number = ERR_TABLE_ALREADY_EXISTS) Then MsgBox "作成しようとしているテーブル名がかぶってます。" Else MsgBox Err.Description End If End Sub |
結構悩んでふとした瞬間にできたー!と思ったものがこんなにあっさり解決してしまうなんて…。 ありがとうございます! でもこれの Dim なんとか connection の ADO の宣言とかはいらなくてもいいもんですか? |
> でもこれの > Dim なんとか connection の ADO の宣言とかはいらなくてもいいもんですか? いいです。 CurrentProject.Connection が宣言済みの Connection オブジェクトに 相当します。 何度も使いまわすなら、変数に Set した方がいいですが、1 回きりの Execute なら構わない...と思うんですが、どうなんでしょ?>諸氏 余談ですが、View がクエリタブに表示されない理由は、以前の私のレス とは無関係かもしれません。 興味が有ったので、その後いろいろ調べてみたのですが、今のところ 明確な根拠が示されている文書は見ていません。 Access のクエリが ADOX.Tables にも出てくるのは事実ですが、それと データベースウィンドウに表示されないこととの関連性は、ちょっと 根拠薄弱かも、です。 試しに SaveAsText メソッドで View とクエリを書き出して比較して みたのですが、内容に大きく差が有ります。 現状ではクエリとして表示するために必要な情報が欠落しているので 表示できない可能性もありますし、MSysObjects テーブルを見ると Type もぜんぜん違います。案外この辺が原因なのかもしれません。 現時点では私も???です。 |
自己レスです。 > 余談ですが、View がクエリタブに表示されない理由は、以前の私の > レスとは無関係かもしれません。 > 興味が有ったので、その後いろいろ調べてみたのですが、今のところ > 明確な根拠が示されている文書は見ていません。 ようやく見つけました。 Creating and Modifying Stored Queries in Microsoft Access Databases with ADOX http://www.msdn.microsoft.com/library/default.asp?url=/library/en-us/dnacc2k/html/acintsql.asp これによると Jet 4.0 は Jet SQL と ANSI SQL-92 標準の 2 つの モードをサポートしていて、ADOX は後者によるクエリを作成しますが、 Access のユーザーインターフェイスは前者によるオブジェクトしか 表示できないので、ADOX で作成したクエリはデータベース ウィンドウ に表示されない、ということになるようです。 ユーザーに見せたかったら DAO.CreateQueryDef メソッドを使うように、 とのお達しでした。 以上、後始末レスでした。 |