Top > OOobbs3 > 103

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

*** 質問 [#pe023f49]
はじめて質問させていただきます、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で使われる可能性があり、
データソースのファイルパスが限定できないため、
①のカレントディレクトリを元にデータソースのファイルパスを指定したいと考えております。



よろしくお願いいたします。
*** 回答 [#hc617339]
- 相対パスでは動きませんねぇ。以下のようにします。

 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]] やオンラインヘルプなどにあります。

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

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

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

-- はにゃ? &new{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 &new{2013-02-24 (日) 21:47:46};
- すみません、enter押したら送信されてしまいました。 -- nari &new{2013-02-24 (日) 21:48:50};
- 上記のコードで当面の問題は解決しましたが、DataSourceNameを指定しただけではDatabaseとの接続ができていない状態のようなので、Databaseとの接続方法を現在調べております。とりあえず、表題の課題は解決しました。ありがとうございました。 -- nari &new{2013-02-24 (日) 21:50:57};
- フォームを再接続させる簡単な方法は、デザインモードを一度オンにして、オフにします。

  oController = ThisComponent.getCurrentController()
  oController.setFormDesignMode(True)
  oObj1.DataSourceName = "file:///....odb"
  oController.setFormDesignMode(False)

-- はにゃ? &new{2013-02-25 (月) 01:03:47};
- はにゃさん、ありがとうございます!僕の書いたコードに一部意図と違う部分があったせいもあって、確認に時間がかかってしまいました。コードは後ほど掲載しますが、まずは取り急ぎ連絡まで失礼します。 -- nari &new{2013-02-26 (火) 13:29:13};
- すみません、もう少々お待ち下さい -- nari &new{2013-03-05 (火) 20:25:45};
- 私は急いでいないのでごゆっくりどうぞ。 -- はにゃ? &new{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 &new{2013-03-20 (水) 18:58:22};

#comment
*** 感想,コメント,メモ [#ld157cdf]

#comment

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