* テーブル名の取得方法 [#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