Top > OOobbs3 > 103

OOobbs3/103 Edit

  • サマリ: 【BASE】フォームのデータソースの値をBasicで動的に設定したい
  • 環境: Basic
  • 状態: 解決
  • 投稿者: nari?
  • 投稿日: 2013-02-24 (日) 14:56:07

質問 Edit

はじめて質問させていただきます、nariと申します。 よろしくおねがいいたします。

質問の内容は、「フォームのデータソースの値をBasicで動的に設定したい」ということです。

【デザインモード】

ウィンドウ【フォームの属性】
↓
タブ【データ】
↓
項目【データソース】←この値をマクロで設定したい!

http://blog.tokachi-lab.com/archives/2006/03/openofficeorg_b.html

↓の『DataSourceName』というプロパティがまさにこの件で設定したい値なのですが、  このプロパティを持つオブジェクトの取得方法などがわかりません。

http://wiki.openoffice.org/wiki/JA/Documentation/BASIC_Guide/Database_Forms

なぜこのようにしたいかと申しますと、 下記のようなディレクトリ構造を持つファイル群を設けます。

[あるディレクトリ]
 └①起動ファイル.odt
 └bin[フォルダ]
  └②データベースファイル.odb
 └forms[フォルダ]
  └③様々なフォーム.odt
 └backup[フォルダ]
  └④データベースファイルのコピー.odb

①には、

  • ②を④にバックアップするマクロ
  • ③を②と接続させ、③を起動させるためのマクロ を埋め込みたいです。

これらのファイルは、複数台のWindowsやMacで使われる可能性があり、 データソースのファイルパスが限定できないため、 ①のカレントディレクトリを元にデータソースのファイルパスを指定したいと考えております。

よろしくお願いいたします。

回答 Edit

  • 相対パスでは動きませんねぇ。以下のようにします。
Sub DataSourceName
 oDrawPage = ThisComponent.getDrawPage()
 oForms = oDrawPage.getForms()
 oForm = oForms.getByName("MainForm")
 
 oForm.DataSourceName = ConvertToURL("file_path")
End Sub

各オブジェクトのプロパティやメソッドを知るには、拡張機能などを試してみてください。http://extensions.services.openoffice.org/en/project/MRI 使い方は OOoBasic/Macros/MRI/Documentation やオンラインヘルプなどにあります。

慣れるまでは分かりにくいですが、手順としては以下のような感じになります。

  1. サイトなどでオブジェクトを取得するコードを見る
  2. MRI 拡張機能でそのオブジェクトを表示させる
  3. プロパティ、メソッドなどを見る (UNO への理解が深まれば、サービスやインターフェースを見るのと同じ事です)
  4. 該当するプロパティやメソッドについて、API リファレンスを参照する

慣れれば、調べまわったり、質問して回答を待ったりする面倒も減ると思います。

  • はにゃ? 2013-02-24 (日) 16:19:38
  • はにゃさん、ありがとうございます。 
    sub Main
      	dbPath = getParentDirectory(CurrentDirectory()) & "bin/db.odb"
      	oDrawPage = ThisComponent.getDrawPage()
     	oForms = oDrawPage.getForms()
     	oForm = oForms.getByName("MainForm")
       	oForm.DataSourceName = dbPath
     	oForm.DataField = "出力"
      end sub   'カレントディレクトリのパスを/なしで返す
     Function CurrentDirectory()
     	oDoc = ThisComponent
     	sPath = ConvertFromURL(oDoc.getLocation())
     	sPath2 = left(sPath,instr(sPath,dir(sPath))-2)
     	CurrentDirectory = ConvertToURL(sPath2)
      End Function
      Function getParentDirectory(Path)
     	Dim Start As Integer
     	Start = 0
     	Res = 0
     	Flag = true
     	Do While Flag
     		Start = InStr(Start+1,Path,"/")
     		If Start <= 0 Then
     			Flag = false
     		Else
     			Res = Start
     		End If
     	Loop  	getParentDirectory = Left(Path,Res)
     End Function
    • nari 2013-02-24 (日) 21:47:46
  • すみません、enter押したら送信されてしまいました。 -- nari 2013-02-24 (日) 21:48:50
  • 上記のコードで当面の問題は解決しましたが、DataSourceNameを指定しただけではDatabaseとの接続ができていない状態のようなので、Databaseとの接続方法を現在調べております。とりあえず、表題の課題は解決しました。ありがとうございました。 -- nari 2013-02-24 (日) 21:50:57
  • フォームを再接続させる簡単な方法は、デザインモードを一度オンにして、オフにします。
 oController = ThisComponent.getCurrentController()
 oController.setFormDesignMode(True)
 oObj1.DataSourceName = "file:///....odb"
 oController.setFormDesignMode(False)
  • はにゃ? 2013-02-25 (月) 01:03:47
  • はにゃさん、ありがとうございます!僕の書いたコードに一部意図と違う部分があったせいもあって、確認に時間がかかってしまいました。コードは後ほど掲載しますが、まずは取り急ぎ連絡まで失礼します。 -- nari 2013-02-26 (火) 13:29:13
  • すみません、もう少々お待ち下さい -- nari 2013-03-05 (火) 20:25:45
  • 私は急いでいないのでごゆっくりどうぞ。 -- はにゃ? 2013-03-05 (火) 22:47:58
  • できたので、コード掲載します。

上のコードの、 oForm.DataField = "出力" として、フィールド名を指定しようとしていたのが 一番大きな間違いの原因だったようです。

sub Main
	dbPath = getParentDirectory(CurrentDirectory()) & "bin/db" & ".odb"
	oDrawPage = ThisComponent.getDrawPage()
	oForms = oDrawPage.getForms()
	'データベース接続
	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	DataSource = DatabaseContext.getByName(dbPath)
	Connection = DataSource.getConnection("", "")
	oController = ThisComponent.getCurrentController()	
	'デザインモードオン
	oController.setFormDesignMode(True)	
	oForm = oForms.getByName("MainForm")		'フォーム名を指定
	oForm.DataSourceName = dbPath					'DBのディレクトリを指定
	oForm.CommandType = com.sun.star.sdb.CommandType.TABLE
	oForm.Command  = "出力"							'テーブル名を指定	
	'デザインモードオフ
	oController.setFormDesignMode(False)
end sub
  • nari 2013-03-20 (水) 18:58:22

感想,コメント,メモ Edit



Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes