「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:1
総数:2260
現在:6


テーブル名の取得方法

ページOpenOffice.org FAQの登録ページ
投稿者質問
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-11-18 13:00:49 (木)
OSWin XP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

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 ファイルに接続が良いようです

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
sql.png


なので、 Access にて権限の変更等出来ない場合は
Baseドキュメントの新規作成から mdb ファイルに接続設定した Base ドキュメントを通して OOO Basic よりテーブル等のアクセスをした方がスムーズに行くのではないかと思いますけれど…

Baseドキュメントの作成〜全て OOO Basicで作成したいのですが

質問 (2010-11-19 17:19:17 (金))

質問

早速、有難うございます。

じつは、このmdbファイルはエクセルVBAで作成したファイルです
ですので、アクセスファイル自体は、PCには存在しない場合がありますので、
アクセス側で設定を変えるより事よりike@九州さんが言われる
『Baseドキュメントの新規作成から mdb ファイルに接続設定した
Baseドキュメントを通してOOO Basic よりテーブル等のアクセスをした方がスムーズに行くのではないかと思いますけれど』の方だと思いますが、

Baseドキュメントの作成〜全て OOO Basicで作成したいのですが、
この方法のやり方を教えて頂きたいのですが、宜しくお願い致します。

Baseドキュメントの作成

M.Kamataki (2010-11-19 22:55:13 (金))

もう少し説明してください。

Accessのない環境でVBAでmdbファイルを作成するというのは、コストをかけないでデータベースを扱う、という目的で利用されていますよね。それをBaseでもということでしょうか。

コストには時間的なものもあります(わからないことを調べるなど)。Accessとは違いOpenOffice.orgは金銭的なコストはかからないので、テーブルやクエリーのないBaseファイルをテンプレートとして用意しておけば、OpenOffice.org Basicでは、テーブル作成やクエリー(SQL)操作だけでいろいろ扱えるようになるとは思います。

また、mdbファイルのように、テーブル、クエリー、フォーム、レポートは1つのファイルにまとまっていないといけないのか、なども重要です。

帳票作成なら、Calcに吐き出すなどの方法もサンプル例がありますので、Basicを利用する場合には比較的簡単にオートメーション化できると思います。

こんな感じで入力、出力のイメージを整理してください。そうすると具体的な回答が期待できると思います。

説明致します

質問 (2010-11-20 09:46:23 (土))

ご回答有難うございます。
実際にやりたい事は、こんな形です。

まず、Accessで使っているのはテーブル、クエリーのみで、フォームやレポートは不要です。
データ量が多いので、一旦Accessにデータを入れクエリで集計した結果をエクセルに返す様にしている。

エクセルをやめ、オープンオフィスで処理をする様にしなければいけなくなり、
まずは既存にAccessのデータが大量にあるのでそれをカルクに吐き出す様にしたい。

Basicからmdbファイルにアクセスして、▲董璽屮襪あるかチェックをして、
クエリーを実施して(新しいテーブルに作成)、きで作成したテーブルのデータをカルクに吐き出す様に持っていきたいのですが、△僚蠅濃澆泙辰討い訃態です。

取りあえず…

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

有難う御座いました

質問 (2010-11-20 13:38:59 (土))

上手くテーブル名が取得できました
有難う御座います。

完了にします

M.Kamataki (2010-11-22 11:59:49 (月))

ike@九州さん、ありがとうございました。

Base ドキュメントを作成しないでも済む方法

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 限定ではありますが
読み取り権限を回避して取得できました。

お名前:
題名:


添付ファイル: filesql.png 681件 [詳細]