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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2004
現在:6


インポートしたデータベース範囲を自動更新したい

ページOpenOffice.org FAQの登録ページ
投稿者jui
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2006-12-24 12:59:01 (日)
OSWinXP
依存するページ
バージョン
edit/refer

メッセージ

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

Base で作成したデータベースの内容を、データソース経由で Calc に インポートして利用しています。

データベースの内容を更新したときに、Calc のほうも更新したいのです。 現時点では、データベースを更新するたびに、 データソースからドラッグアンドドロップで、毎回 インポートを更新していますが、自動更新できるようにするか、 あるいは、ボタンを設置してそれを押すと更新するようにできないかと 考えています。

ただ、Basic に関しては初心者ですので、マクロで実現できる場合は、 参考となる文献などを示していただけると助かります。

よろしくおねがいします。


データパイロットを利用する方法

M.Kamataki (2006-12-24 16:23:39 (日))

Calcでの利用方法にもよりますし、登録できるフィールド数に限度があるので、ご質問内容にマッチするかわかりませんが、データパイロットでCalcにインポートするのはどうでしょうか。

インポート方法は、Calcのデータメニューから[データパイロット]−[呼び出す]を選んで、ソースの選択画面で「OpenOffice.orgに登録したデータソース」をチェックして[OK]。データソースの選択画面で目的のデータベースのテーブルかクエリーを選びます。データパイロット画面で表示したいフィールドを選びます。

データパイロットでインポートした表は、[データ]−[データパイロット]−[更新]を選ぶと、データベースが更新されている場合は、Calc上の表も更新されます。

faq4_164_01.png

データパイロットで登録できるレイアウトフィールドは各カテゴリとも8つが限度です。なお、サンプル画像のデータはダミーです。

長所、短所の比較

jui (2006-12-25 01:26:06 (月))

データパイロットの更新が容易なのは知ってましたが、クロス集計表を作るためのものと思っておりましたので、行フィールドだけを使うというのは、目からうろこです。^_^

また、この方法だと、base でクエリを作らなくても、「データソースの選択」時に「種類」を「sql」にして、「データソース」にクエリを直接書くこともできる点は柔軟性が高いかもしれません。

データソースからのインポートと比較した場合の、この方法の欠点としては、

  • (前述のように)フィールドが8つまでであること
  • クエリで指定した order by 句が無効になること(指定した第一フィールドで並び替えられてしまう)
  • ナビゲータに範囲が表示されないこと(データパイロット範囲がどこなのかわからず、どこを更新したらよいかわからない。)

    ことが考えられます。第一の欠点については、複数のデータパイロットを並べれば解決可能ですが、これが多くなると、(第三の欠点と合わせて)逆に更新が面倒になってしまうことが問題かもしれません。あとは、複数のデータパイロットを一度に更新できる手段があれば、完璧ですね。

    私の場合、かなり大量のデータを一気にインポートして、利用しており、8つのフィールドでは終わりそうにありませんので、私の場合は素直にドラッグアンドドロップでインポートしたほうが結果的に手間は少ないかもしれません。。。

    これらの長所、短所を比較して、目的に応じて使い分けるのがよさそうですね。

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

マクロによる解決

jui (2006-12-25 08:35:16 (月))

データパイロットによる解決を提案いただきましたが、これはすなわち、マクロを避けては通れないということだ、と理解し :-) 、とりあえず動くマクロを作ってみました。

それほど長くもありませんし、データベース名、クエリ名、挿入位置を指定すれば、あとはボタンに割り当てるだけでいいので、他の人にも使ってもらえるかと思いますので、ここに貼り付けておきます。

ただし、ResultSet を、一気にワークシートに張り込む方法がわからなかったので、1セルごと、(varcharとdateと数値だけですが、)型を気にしながら貼り付けてます。これ以外の型を含むデータベースの場合は、修正する必要があるかと思います。

もっと良い方法があれば、ご提案いただければ幸いです。(が、この質問の範囲を超えるので、その場合は、別に質問を挙げるか、タイトルを変えたほうがいいかもしれませんね。。。)

自己完結してしまって恐縮ですが、「解決」ということでよいかと思います。ありがとうございます。

sub ReadDatabase
dim databaseContext as object
dim dataSource as object
dim connection as object
dim resultSet as object
dim sheet as object
dim cell as object
dim i as integer
dim j as integer
dim data as string
dim metadata as object
dim columnCount as integer
dim typeName as string
dim queryDefinition as object
dim col as integer
dim row as integer 

databaseContext =  createUnoService("com.sun.star.sdb.DatabaseContext")
dataSource = databaseContext.getByName("データベースの名前") 
queryDefinition = dataSource.getQueryDefinitions.getByName("クエリの名前")
col=1 ' 挿入位置 この場合は、 B3
row=2 

connection = dataSource.getConnection("","")
resultSet =  connection.createStatement().executeQuery(queryDefinition.command)

sheet = thisComponent.currentController.ActiveSheet
j=0
metadata = resultSet.getMetaData
columnCount = metadata.getColumnCount
while resultSet.next
	for i=1 to columnCount
		typeName=metadata.getColumnTypeName(i)
		cell = sheet.getCellByPosition(col+i-1,row+j)		
		data=resultSet.getString(i)
		if typeName="VARCHAR" then
			cell.string=data
		elseif typeName="DATE" then
			cell.formula=cdate(data)
		else
			cell.value=data
		endif
	next i
	j=j+1 
wend
end sub

Re: 長所、短所の比較

M.Kamataki (2006-12-25 11:05:32 (月))

>base でクエリを作らなくても、「データソースの選択」時に「種類」を
>「sql」にして、「データソース」にクエリを直接書くこともできる

>複数のデータパイロットを並べれば
このふたつは、わたしのほうも「目からうろこ」です。 :p

なお、ご存知かもしれませんが、Calcに挿入されたフィールド名(上の図の「生徒番号」「名前」などの部分)をマウスでクリックすると、データパイロットの更新になります。

Re: マクロによる解決

M.Kamataki (2006-12-25 11:32:27 (月))

すばらしいです。わたしも動作を確認しました。

SUNのドキュメント「StarSuite 8 Basic プログラミングガイド」の12章にある「データベースアクセス」部分
http://docs.sun.com/app/docs/doc/819-1332/6n3mrfoc0?l=ja&q=starsuite+8&a=view
を見て、「MsgBox」ではなくCalcのセルにどうしたらResultSet を渡せるのかわからなかったもので...。

なお、英語では以下のドキュメントがBaseのBasicについて取り扱っています。
「Andrew Learns OOo Base」
http://www.pitonyak.org/database/AndrewBase.pdf

また、今日見つけたページですが、
「OpenOffice Calcのマクロプログラミング講座」
http://srvhat09.anaheim-eng.com/modules/tinyd5/
でデータベースとの連携について触れられています。

当ページは、完了にしますね。

お名前:
題名:


添付ファイル: filefaq4_164_01.png 756件 [詳細]