* テーブル名の取得方法 [#b948c526]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|質問|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(重要,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Base データベース,faq03,category)|
 |~投稿日|2010-11-18 13:00:49 (木)|
 |~OS|Win XP|
 |~依存するページ||
 |~バージョン|#listbox3(3.2.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#u38bea28]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 Base Basic で以下の様にmdbファイルをオープンする所までは、
 わかりましたが、次にrsでTest.mdbにある
 テーブル名を全て取得したいのですが
 どうしたら良いのでしょうか?
 ご存知の方おられましたら、アドバイスお願いいたします。
 
 
  Sub ADO
     Dim cn As Object
     Dim rs As Object
     dim Conn as object
     Dim sql As String
     Dim i As Integer
     dim m_path as string	
     m_path ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.mdb;"
     Set cn = New ADODB.Connection
     Set rs = New ADODB.Recordset
     cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=C:\test.mdb;"
 
 ----
 ***Base から mdb ファイルに接続が良いようです [#l7095cc9]
 >ike@九州 (2010-11-19 10:22:06 (金))~
 ~
 サンプルコードは VBA であって OOo.Basic ではありません。~
 ~
 http://q.hatena.ne.jp/1177202738~
 ~
 上記で書かれているように、予め Access から MsysObjects に読み取り権限を与えていると~
 以下のコードで取得できました~
  Sub Main
   Dim aProps(1) as new com.sun.star.beans.PropertyValue
   sURL = "sdbc:ado:access:PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=E:\db1.mdb"
   aProps(0).Name = "user"
   aProps(0).value = ""
   aProps(1).Name = "password"
   aProps(1).value = ""
   DatabaseContext = createUnoService("com.sun.star.sdbc.DriverManager")
   oCon = DatabaseContext.getConnectionWithInfo(sURL,aProps())
   If IsEmpty(oCon) then
    Msgbox("接続不可です")
    Exit sub
   End if
   oState = oCon.createstatement
   oResultSet= oState.executeQuery("SELECT Name FROM MSysObjects WHERE TYPE = 1")
   While oResultSet.next()
   msgbox(oResultSet.getstring(1))
   Wend
   oCon.close()
  End Sub
 #ref(sql.png)~
 ~
 なので、 Access にて権限の変更等出来ない場合は~
 Baseドキュメントの新規作成から mdb ファイルに接続設定した Base ドキュメントを通して OOO Basic よりテーブル等のアクセスをした方がスムーズに行くのではないかと思いますけれど…~
 
 //
 ***Baseドキュメントの作成〜全て OOO Basicで作成したいのですが [#l2b00b5a]
 >質問 (2010-11-19 17:19:17 (金))~
 ~
 質問~
 ~
 早速、有難うございます。~
 ~
 じつは、このmdbファイルはエクセルVBAで作成したファイルです~
 ですので、アクセスファイル自体は、PCには存在しない場合がありますので、~
 アクセス側で設定を変えるより事よりike@九州さんが言われる~
 『Baseドキュメントの新規作成から mdb ファイルに接続設定した~
 Baseドキュメントを通してOOO Basic よりテーブル等のアクセスをした方がスムーズに行くのではないかと思いますけれど』の方だと思いますが、~
 ~
 Baseドキュメントの作成〜全て OOO Basicで作成したいのですが、~
 この方法のやり方を教えて頂きたいのですが、宜しくお願い致します。~
 
 //
 ***Baseドキュメントの作成 [#w559e20a]
 >M.Kamataki (2010-11-19 22:55:13 (金))~
 ~
 もう少し説明してください。~
 ~
 Accessのない環境でVBAでmdbファイルを作成するというのは、コストをかけないでデータベースを扱う、という目的で利用されていますよね。それをBaseでもということでしょうか。~
 ~
 コストには時間的なものもあります(わからないことを調べるなど)。Accessとは違いOpenOffice.orgは金銭的なコストはかからないので、テーブルやクエリーのないBaseファイルをテンプレートとして用意しておけば、OpenOffice.org Basicでは、テーブル作成やクエリー(SQL)操作だけでいろいろ扱えるようになるとは思います。~
 ~
 また、mdbファイルのように、テーブル、クエリー、フォーム、レポートは1つのファイルにまとまっていないといけないのか、なども重要です。~
 ~
 帳票作成なら、Calcに吐き出すなどの方法もサンプル例がありますので、Basicを利用する場合には比較的簡単にオートメーション化できると思います。~
 ~
 こんな感じで入力、出力のイメージを整理してください。そうすると具体的な回答が期待できると思います。~
 
 //
 ***説明致します [#v1e974e8]
 >質問 (2010-11-20 09:46:23 (土))~
 ~
 ご回答有難うございます。~
 実際にやりたい事は、こんな形です。~
 ~
 まず、Accessで使っているのはテーブル、クエリーのみで、フォームやレポートは不要です。~
 データ量が多いので、一旦Accessにデータを入れクエリで集計した結果をエクセルに返す様にしている。~
 ~
 エクセルをやめ、オープンオフィスで処理をする様にしなければいけなくなり、~
 まずは既存にAccessのデータが大量にあるのでそれをカルクに吐き出す様にしたい。~
 ~
 Basicからmdbファイルにアクセスして、▲董璽屮襪あるかチェックをして、~
 クエリーを実施して(新しいテーブルに作成)、きで作成したテーブルのデータをカルクに吐き出す様に持っていきたいのですが、△僚蠅濃澆泙辰討い訃態です。~
 
 //
 ***取りあえず… [#b445d705]
 >ike@九州 (2010-11-20 12:44:42 (土))~
 ~
 必要なもの全てではありませんが~
  Sub CreateODBfromMDB
   'Base 新規ドキュメントのURL
   sFileURL = "E:\TESTmdb.odb"
   oSimpleFileAccess = createUnoService( _
     "com.sun.star.ucb.SimpleFileAccess" )
   'Baseドキュメントの既存確認
   If oSimpleFileAccess.exists( sFileURL ) Then
    '既存のファイルを開く
    oDoc = StarDesktop.loadComponentFromURL( _
      ConvertToURL(sFileURL), "_blank", 0, Array())
    bRegister = False
   Else
    'create new odb document
    oDoc = StarDesktop.loadComponentFromURL( _
      "private:factory/sdatabase", "_blank", 0, Array())
    bRegister = True  
   End IF
  
   sMDBURL = "E:\TEST.mdb"
  
   If Not oSimpleFileAccess.exists( sMDBURL ) Then
    Msgbox(sMDBURL & " がありません")
    Exit Sub
   End IF
   
   ' set to use mdb
   oDataSource = oDoc.DataSource 
   oDataSource.URL = "sdbc:ado:access:PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" & sMDBURL
   oDoc.storeAsURL(ConvertToURL(sFileURL), Array())
   
   'OOo へのデータベースの登録
   If bRegister Then 
    oDBCtx = CreateUnoService("com.sun.star.sdb.DatabaseContext")
    oDBCtx.registerObject("登録したいデータベース名",oDataSource)
   End  If
   
   ' with controller
   oController = oDoc.getCurrentController()
   ' connect to db and get connection
   If NOT oController.isConnected() Then
    oController.connect()
   End If
   oCon = oController.ActiveConnection
  
   'テーブルの取得
   oTables = oCon.getTables()
   If oTables.Count > 0 then
    For n = 0 to oTables.Count - 1
     MsgBox(oTables(n).Name)
    Next
    sQt = oCon.getMetaData().getIdentifierQuoteString()
    'クエリの実行
    oState = oCon.createstatement()
    'oState.executeUpdate("CREATE 〜")
    oResultSet= oState.executeQuery("Select * From " & sQt & oTables(0).Name & sQt)
    While oResultSet.next()
     '〜Calc 等への処理
    Wend 
   End If
   oDoc.close(true)
  End Sub
 
 //
 ***有難う御座いました [#y9d623e4]
 >質問 (2010-11-20 13:38:59 (土))~
 ~
 上手くテーブル名が取得できました~
 有難う御座います。~
 
 //
 ***完了にします [#g85cdc6d]
 >M.Kamataki (2010-11-22 11:59:49 (月))~
 ~
 ike@九州さん、ありがとうございました。~
 
 //
 ***Base ドキュメントを作成しないでも済む方法 [#h080c86b]
 >ike@九州 (2010-11-23 14:57:09 (火))~
 ~
 色々調べていましたら~
 OOo Basic から Base ドキュメントを介さないで mdb ファイルのテーブル一覧を取得する方法もありました。~
 ~
 参考サイト~
 http://winofsql.jp/VA003334/aspSample011109153805.htm~
 ~
  Const adSchemaTables = 20
  Sub Test
   sTableNames = getMDBTableNames("E:\Test.mdb") 
   For c = 0 to uBound(sTableNames)
    Msgbox(sTableNames(c))
   Next
  End Sub
  
  Function getMDBTableNames(sFileName As String) As Variant
   oCon = CreateObject("ADODB.Connection")
   sURL = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sFileName & ";"
   oCon.Open(sURL)
   Rs = oCon.OpenSchema(adSchemaTables, Array(,,,"TABLE"))
   n = 0
   Do While NOT Rs.EOF
     ReDim Preserve sNames(n) As string 
 	sNames(n) = Rs.Fields.Item("TABLE_NAME").value
     Rs.MoveNext
     n = n + 1
   Loop
   getMDBTableNames = sNames  
   Rs.close
   oCon.close
  End Function
 ~
 やはり Windows 限定ではありますが~
 読み取り権限を回避して取得できました。~
 
 //
 #article