* マクロ(OOo Basic)を用いたBase fileのOpen方法 [#pf8b7f3c]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|new_OOo3|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(普通,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Base データベース,faq03,category)|
 |~投稿日|2010-03-12 00:11:34 (金)|
 |~OS|WindowsXP|
 |~依存するページ||
 |~バージョン|#listbox3(3.2.0,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#z2ff837d]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 #contents
 
 お世話になります。~
 連続投稿をする失礼をお許し下さい。~
 ~
 現在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の方法をご教示頂けます様お願いします。
 #clear
 
 ----
 ***質問の確認 [#oc1492e7]
 >M.Kamataki (2010-03-12 00:27:55 (金))~
 ~
 Baseファイル(HSQLDBエンジンを使ったテーブルも含んだファイル形式)を新規に作成したいということではなく、新規にテーブル、クエリー、フォームを作成したいということでしょうか。~
 
 //
 ***Table、Queryを含めた新規Baseファイルを作成したいです。 [#f22b0acd]
 >new_OOo3 (2010-03-12 20:30:55 (金))~
 ~
 お世話になります。~
 質問文が理解しづらく申し訳ございません。~
 当方の希望は以下の1〜3Stepをマクロにて実現する事です。~
 Step1:新規tableを作成する。~
 Step2:新規Queryを作成する。~
 Step3:上記TableとQueryを含めた新規Baseファイルを作成~
 ~
 手順をご教示頂けます様、宜しくお願いします。~
 
 //
 ***まずBaseファイルが必要です [#m3068726]
 >M.Kamataki (2010-03-12 22:27:00 (金))~
 ~
 データベースを利用する場合、まずテーブルを格納するための箱としてBaseファイルを用意する必要があります。~
 ~
 したがって、Step3を最後にすることはできません。~
 
 //
 ***ODBファイルの作成 [#h3fc68ed]
 >はにゃ? (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
 
 //
 ***ご回答ありがとうございます。 [#m73f87f4]
 >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氏のドキュメント [#e31be268]
 >M.Kamataki (2010-03-13 23:03:25 (土))~
 ~
 「Openoffice.org Macros Explained」のPDF版、AndrewBase.pdfはたびたび更新されています。以下で配布されているもののタイムスタンプは「July 28, 2009」になっていますね。~
 ~
 http://www.pitonyak.org/database/~
 
 //
 ***完了にします [#v96987dc]
 >M.Kamataki (2010-03-14 09:42:48 (日))~
 ~
 十分な回答が揃っているので完了にします。~
 
 //
 #article