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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:1621
現在:5


マクロ(OOo Basic)を用いたBase fileのOpen方法

ページOpenOffice.org FAQの登録ページ
投稿者new_OOo3
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-03-12 00:11:34 (金)
OSWindowsXP
依存するページ
バージョン
edit/refer

メッセージ

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

お世話になります。
連続投稿をする失礼をお許し下さい。

現在Baseに関するマクロと「格闘中」ですが、新規及び既存のBase fileのOpen方法をご教示頂けます様お願いします。
Calc等は以下のコードにて新規fileや所定fileをOpen出来ますが、Baseに関しては不明です。
直接にTable編集、Query編集、Form編集を行うコードは分かるのですが、BaseをOpenさせた上で上記3つのDataを編集しないとBase file自体がCrashする可能性があると思います。
本件は以下のサイトでも指摘されています。
URL : http://www.oooforum.org/forum/viewtopic.phtml?t=5252

******* サイト抜粋 ***********

' WARNING!!!
' This one crashes OOo 1.1.
'   oDoc = StarDesktop.loadComponentFromURL( ".component:DB/QueryDesign", "_blank", 0, Array() )

' This one flashes up a window that quickly disappears again.   
oDoc = StarDesktop.loadComponentFromURL( ".component:DB/TableDesign", "_blank", 0, Array() )

' This one flashes up a window, then an error message "Connection Lost".
oDoc = StarDesktop.loadComponentFromURL( ".component:DB/RelationDesign", "_blank", 0, Array() )

***************************
つきましては、Base fileを安全に取り扱う為にBase fileのOpen及びsaveの方法をご教示頂けます様お願いします。


質問の確認

M.Kamataki (2010-03-12 00:27:55 (金))

Baseファイル(HSQLDBエンジンを使ったテーブルも含んだファイル形式)を新規に作成したいということではなく、新規にテーブル、クエリー、フォームを作成したいということでしょうか。

Table、Queryを含めた新規Baseファイルを作成したいです。

new_OOo3 (2010-03-12 20:30:55 (金))

お世話になります。
質問文が理解しづらく申し訳ございません。
当方の希望は以下の1〜3Stepをマクロにて実現する事です。
Step1:新規tableを作成する。
Step2:新規Queryを作成する。
Step3:上記TableとQueryを含めた新規Baseファイルを作成

手順をご教示頂けます様、宜しくお願いします。

まずBaseファイルが必要です

M.Kamataki (2010-03-12 22:27:00 (金))

データベースを利用する場合、まずテーブルを格納するための箱としてBaseファイルを用意する必要があります。

したがって、Step3を最後にすることはできません。

ODBファイルの作成

はにゃ? (2010-03-13 03:09:53 (土))

既存の ODB ファイルを開く方法は他のファイルを開く時と同じです。

sub openodb
 StarDesktop.loadComponentFromURL("file:///home/asuka/Desktop/test.odb", "_blank", 0, Array())
end sub


以下のコードで新規に ODB ファイルを作成します。Step 3 -> 1 -> 2 の順で大体こんな感じになります。

Sub CreateODBashsqldb
 sODBURL = ConvertToURL("/home/asuka/Desktop/test.odb")
 sTableName = "Contents"
 sIDName = "ID"
 sTitleName = "TITLE"
 sDateName = "DATE"
 sBodyName = "BODY"
 
 ' create new odb document
 oDoc = StarDesktop.loadComponentFromURL( _
     "private:factory/sdatabase", "_blank", 0, Array())
 oDataSource = oDoc.DataSource
 ' set to use hsqldb
 oDataSource.URL = "sdbc:embedded:hsqldb"
 
 oDoc.storeAsURL(sODBURL, Array())
 
 ' with controller
 'oController = oDoc.getCurrentController()
 ' connect to db and get connection
 'If NOT oController.isConnected() Then
 '  oController.connect()
 'End If
 'oConnection = oController.ActiveConnection
 
 ' with css.sdbc.XDataSource interface
 oConnection = oDataSource.getConnection("", "")
 
 oTables = oConnection.getTables()
 ' create new table
 oTable = oTables.createDataDescriptor()
 oColumns = oTable.getColumns()
 
 ' set table name
 oTable.Name = sTableName
 
 oDataTypes = com.sun.star.sdbc.DataType
 
 oDesc = oColumns.createDataDescriptor()
 oDesc.setPropertyValues( _
     Array("Name", "Type"), _
     Array(sIDName, oDataTypes.INTEGER))
 oDesc.IsNullable = 0
 oDesc.IsAutoIncrement = True
 'oDesc.FormatKey = 5001
 oColumns.appendByDescriptor(oDesc)
 
 AddNewDescriptor(oColumns, _
     Array("Name", "Precision", "Type"), _
     Array(sTitleName, 100, oDataTypes.VARCHAR))
 
 AddNewDescriptor(oColumns, _
     Array("Name", "Type"), _
     Array(sDateName, oDataTypes.DATE))
 
 AddNewDescriptor(oColumns, _
     Array("Name", "Precision", "Type"), _
     Array(sBodyName, &Hffff, oDataTypes.VARCHAR))
 
 oKeys = oTable.getKeys()
 oKey = oKeys.createDataDescriptor()
 oKey.Type = 4
 oKey.Name = "SYS_PK_47"
 oKeys.appendByDescriptor(oKey)
 
 ' add table to the container
 oTables.appendByDescriptor(oTable)
 
 
 ' create query
 sQueryStr = "SELECT * FROM """ & sTableName & """"
 oQueryDefs = oDataSource.getQueryDefinitions()
 ' new query
 oQueryDef = oQueryDefs.createInstance()
 oQueryDef.Command = sQueryStr 
 oQueryDefs.insertByName("NewQuery",oQueryDef)  
 
 ' set ui specific properties of columns
 oTable = oTables.getByName(sTableName)
 oColumns = oTable.getColumns()
 
 oColumn = oColumns.getByName(sIDName)
 oColumn.FormatKey = 5001
 
 ' format key for date
 oColumn = oColumns.getByName(sDateName)
 oColumn.FormatKey = 5036
 
 ' overwrite the file
 oDoc.store()
 'exit sub
 
 ' data
 sBodies = Array("Not specified.", "Not to be.", "Did nothing.")
 sTitles = Array("Today is another day.", "To be or not to be.", "To do something..")
 aDates = Array(makeDate(3, 10, 2010), makeDate(3, 11, 2010), makeDate(3, 12, 2010))
 
 ' add elements to the table
 'oConnection = oDataSource.getConnection("", "")
 oStatement = oConnection.createStatement()
 oRowSet = CreateUnoService("com.sun.star.sdb.RowSet")
 oRowSet.ActiveConnection = oConnection
 oRowSet.CommandType = com.sun.star.sdb.CommandType.TABLE
 oRowSet.Command = sTableName
 oRowSet.execute()
 
 If NOT oRowSet.CanUpdateInsertedRows Then Exit sub
 
 nId_title = oRowSet.findColumn(sTitleName)
 nId_date = oRowSet.findColumn(sDateName)
 nId_body = oRowSet.findColumn(sBodyName)
 
 oRowSet.first()
 For i = 0 To UBound(sBodies) step 1
   oRowSet.moveToInsertRow()
   oRowSet.updateString(nId_title, sTitles(i))
   oRowSet.updateDate(nId_date, aDates(i))
   oRowSet.updateString(nId_body, sBodies(i))
   oRowSet.insertRow()
 Next
 
 ' auto commit
 oRowSet.close()
 
 'oDoc.store()
 oDoc.close(True)
 oConnection.close()
End Sub


Function AddNewDescriptor( oColumns As Object, sNames As Object, vValues As Object ) _
   As Object
 oDesc = oColumns.createDataDescriptor()
 oDesc.setPropertyValues(sNames, vValues)
 oColumns.appendByDescriptor(oDesc)
 AddNewDescriptor = oDesc
End Function


Function makeDate( nDay As Long, nMonth As Long, nYear As Long ) As com.sun.star.util.Date
 Dim aDate As New com.sun.star.util.Date
 With aDate
   .Day = nDay
   .Month = nMonth
   .Year = nYear
 End With
 makeDate = aDate
End Function

ご回答ありがとうございます。

new_OOo3 (2010-03-13 16:13:30 (土))

M.Kamataki 様、はにゃ? 様

お世話になっています。
ご回答ありがとうございます。
Openoffice.Org Macros Explained [Illustrated](著 者 : Andrew Pitonyak)を参考にしてMacroを勉強していましたが、内容が古い為に「private:factory/sdatabase」が出てこずに試行錯誤しておりました。
詳細なマクロまで記載頂きまして本当にありがとうございます。

私事ですが下記URLのHPをリニューアルしております。
URL : http://openoffice3.web.fc2.com/
上記サイトはいつもお世話になっているOpenOffice.org関係の皆様に対して少しでも役に立ちたいとの考えて更新しております。
つきましては、厚かましいお願いですがご回答頂きましたマクロコードを上記HPの「マクロの杜」ページに記載する事を許可頂けます様お願いします。
宜しくご検討をお願いします。

Andrew Pitonyak氏のドキュメント

M.Kamataki (2010-03-13 23:03:25 (土))

「Openoffice.org Macros Explained」のPDF版、AndrewBase.pdfはたびたび更新されています。以下で配布されているもののタイムスタンプは「July 28, 2009」になっていますね。

http://www.pitonyak.org/database/

完了にします

M.Kamataki (2010-03-14 09:42:48 (日))

十分な回答が揃っているので完了にします。

お名前:
題名: