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

Q&A集[?]

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

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

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

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:1
昨日:0
総数:2184
現在:2


Querie.Command 後に更新できない!

ページOpenOffice.org FAQの登録ページ
投稿者yuki
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2009-09-18 12:52:37 (金)
OSWindows XP
依存するページ
バージョン
edit/refer

メッセージ

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

ご無沙汰いたしております。yuki です。
どうしても解決できない問題が発生しております。どうぞ宜しくお願いいたします。

内容と致しましては2件あるのですが、どうも関連がありそうな気がしますので、まとめて質問をさせて頂きますことをお許し下さい。

サンプルとして、TestDataBase.odb と TestForm.odt をアップします。
TestForm.odt は、TestDataBase.odb をデータソースで接続してあります。

● 説明
TestDataBase.odb には、"TestTable" と "TestQuery" が存在します。
"TestTable" には、"TestA" と "TestB" の2つのフィールドがあります。
"TestQuery" の内容は、TestForm.odt のボタンにより変更されます。

TestForm.odt には、"Query1"ボタンと "Query2"ボタンがあります。
"Query1"ボタンには、"TestQuery"を変更して、テーブルの全件表示を行うマクロが登録されています。
"Query2"ボタンには、"TestQuery"を変更して、A = “A1” のみ表示を行うマクロが登録されています。

"TestQuery" の初期クエリは、全件表示となっています。("Query1"ボタンと同じです。)

■ 質問−1(クエリが更新されない)
TestForm.odt を起動して "Query2"ボタン により表示内容を変更します。
 (この時、"TestQuery" のクエリは変更されているはず!)
TestForm.odt を一度終了し、再度起動します。
先に変更した表示内容が元に戻っています。
予定としては、再起動後は、変更した内容で表示を行いたかったのですが。
これは、"TestQuery"の変更された内容が更新されないためかと思うのですが、どのようにしたら良いのか不明です?

■ 質問−2(レコードの変更が更新されない)
TestForm.odt を起動して "Query1" "Query2"ボタンを操作して表示内容を変更します。
TestForm.odt の"結果表示"テーブルコントロールで、フィールドの変更やレコードの追加を行います。
TestForm.odt を一度終了し、再度起動します。
先に変更した表示内容が元に戻っています。

これは、何れも Querie.Command によるクエリの変更後に発生しており、これ以外の操作では発生しないと思います。
上記操作の途中、特に、"Query1" "Query2"ボタンの操作後に TestDataBase.odb を開くと、上記結果が異なる場合があります。

以上、申し訳ありませんが、宜しくお願いいたします。


無題

ike@九州 (2009-09-18 15:05:22 (金))

Base ドキュメントの内容を変更した場合、上書き保存しなければ変更内容は反映されません
適切な場所で以下の記述をする必要があります

'フォームの親 Baseドキュメントを取得
oDBDoc = TestForm.ActiveConnection.Parent.DatabaseDocument
'親Base ドキュメントの上書き保存
oDBDoc.Store()

早々にご返信有難うございます。

yuki (2009-09-18 15:43:41 (金))

DatabaseDocument.Store() を、マクロ内の Querie.Command の後に追加したところ、質問−1(クエリが更新されない)に関しましては、対応することが出来ました。
有難うございました。
但し、質問−2(レコードの変更が更新されない)に関しましては、問題は別なのでしょうか?
ボタンを押した後のフィールドやテーブルに対する更新は反映されませんでした。

無題

ike@九州 (2009-09-18 17:09:26 (金))

確実にする為には
フォームのナビゲーションを表示して、更新ボタンを押すか又は
フォームのイベント(レコードのアクション実行後)に上記の上書き保存の割り当てが必要のようです。

確認します

M.Kamataki (2009-09-18 18:26:32 (金))

念のため、クイック起動の利用を確認します。クイック起動は利用されていますか。それとお使いのOpenOffice.orgは3.1.1ですね。

このあたり、3.0.0、3.0.1と3.1.0、3.1.1では挙動が変わったりしているので確認したいと思います。

3.1.0、クイック起動なしで試した限りでは、TestForm.odt ファイルの下にはフォームナビゲーターバーが表示されていましたし、レコードの変更、保存は問題ないようでした。

より確実にするには、TestDataBase.odb に対して明示的にコミットしたほうが良いかもしれません。

正しく更新できました!

yuki (2009-09-18 22:56:48 (金))

ike@九州 さま。

フォームのイベント(レコードのアクション実行後)に上記の上書き保存の割り当てで、値は正しく更新できました。

ただ、一つ気になるのが、イベントがレコードのアクション実行後に発生すると、レコードが変更されると、ドキュメントの上書き保存が発生してしまい、少し不安が残ります。
そこで、イベントをアンロードする時にしたのですが、上手くいきませんでした。
このあたり、上手い手は無いものでしょうか?

クイック起動は使用していません。

yuki (2009-09-18 23:02:34 (金))

M.Kamataki さま。

OpenOffice.orgは 3.1.1 です。3.1.0 でも同じ問題は発生していました。
それ以前のバージョンでは不明です。

フォームの"Query1" 又は "Query2"ボタンを押した後に、レコードを追加し一度フォームを終了します。
フォームを再度起動すると、追加したレコードが表示されないと思うのですが?

TestDataBase.odb に対して明示的にコミットするとは、実際には、どのようにするのでしょうか?

"Query2"ボタンを押した状態だと

M.Kamataki (2009-09-18 23:59:42 (金))

とりあえず、
>レコードの変更、保存は問題ないようでした。
と書いた環境のままです。ike@九州さんの最初のコメントによる修正は入れてあります。Querie.Command の後に追加しただけなので、たぶんyukiさんが「更新されない」と書かれた環境と同じはずです。

Aフィールドに「A1」と入力したレコードしか、"Query2"ボタンを押した状態だと表示されませんよね。"Query1"ボタンを押すと全件表示されるので、入力されたレコードが表示されると思いますが、どうでしょうか。

やはり問題ないようです。問題なければ、「明示的なコミット」は必要ないかも。

こちらでは問題は発生します。

yuki (2009-09-19 00:42:10 (土))

M.Kamataki さま。

何か条件が異なるような気がします。
TestDataBase.odb を開いていませんか?開いている場合は閉じてください。
また、OpenOffice.org Basic を起動している状態では現象が異なったような気がします。
ike@九州さんの最初のコメントによる修正は入れてあります。

1) TestForm.odt を起動します。
2) フォームの"Query1" ボタンを押します。→4件のレコードが表示されます。
3) フォームの"Query2" ボタンを押します。→2件のレコードが表示されます。
4) 再度フォームの"Query1" ボタンを押します。→4件のレコードが表示されます。
5) この状態で、"結果表示"テーブルコントロールによりレコードを追加します。値は適当です。
6) レコードを更新します。
7) TestForm.odt を閉じます。
8) TestForm.odt を起動します。
9) クエリは全権表示なので、5) で追加したレコードも表示されるはずですが、
  多分、表示されていないと思います。

サンプルとして、TestForm2.odt をもう一度アップします。

無題

ike@九州 (2009-09-19 08:44:13 (土))

クエリボタン操作後の
レコードの削除、新規追加でナビゲーションツールバーでの上書き保存ボタンは動作しているのですが、実際には保存されていないようです。
その後、クエリボタンを押す操作は上書き保存のコードを入れていれば保存されますね。(更新ボタンを押しても上書き保存されました)

クエリボタンの操作を一切しないで、
レコードの削除、新規追加を行った場合は自動で上書き保存されているので、クエリボタンのマクロ内容で自動保存が効かなくなっている挙動ですね。

クエリを元にするフォームでクエリの書き換えが起因かもしれません。

イベントがどのタイミングで起きるのか不安な場合、私はいつもイベント用のコード、条件分岐のコード先頭に
print "適切な分"
のメッセージ文をいれ、どの操作で各種発生が起きるのか調べています。(多数の場合、後で置換から一斉にコメントアウトすれば良いのですから)

途中の表示は問題ないのでクエリボタン内での上書き保存も止めて TestForm.odtを閉じるイベント1回のみが向いているかもしれませんね。

利用者の方はイベントについて必ずメッセージ文を入れて調べる必要がありますね。
他に適切なイベントが無く意図しないタイミングが含まれる場合は回避するコードの追加等対策の必要が生じると思います。

Re: こちらでは問題は発生します。

M.Kamataki (2009-09-19 12:15:24 (土))

何度か試しているうちに TestDataBase.odb を開いていたかもしれません。確かにデータベースを開いていると、テーブルカテゴリを開いたタイミングでテーブルの更新が行われる可能性があるのでうまくいくように見えたりします。この動作をマクロで行ってもいいんですが、結局 TestDataBase.odb を起動することになります。(AndrewBase.pdfの「2.2.4. Refresh the tables」)

TestForm2.odt のマクロ「DatabaseDocumentStoreMacro」も同じ効果がありますし、TestDataBase.odb を呼ばないのでスマートだと思います。とりあえずボタンに割り付けてみて、テーブルの保存が可能なことを確認しました。

ike@九州さんの提案のように、「閉じるイベントへの割り当て」が良いかもしれません。

閉じるイベントへの割り当て?

yuki (2009-09-19 18:12:05 (土))

閉じるイベントへの割り当ては、どこで行えば良いのでしょうか?
フォームの属性のイベントにもありませんし・・・・。
勉強不足ですみません!宜しくお願いします。

Re: 閉じるイベントへの割り当て?

M.Kamataki (2009-09-19 23:26:05 (土))

「ツール」−「カスタマイズ」でダイアログを表示し、「イベント」タブの「ドキュメントを閉じる」に割り当てます。「DatabaseDocumentStoreMacro」で試した限りでは、テーブルの保存は可能でした。

明示的なコミット

M.Kamataki (2009-09-19 23:48:14 (土))

いちおうマクロ例ができましたので公開します。odbファイルを呼び出し、テーブルカテゴリを表示、テーブル更新、「COMMIT;」SQLを発行、odbファイルを閉じる、といった操作を記述したものですね。この操作を踏まないと、COMMITコマンドを使った保存はできませんでした。なお、odbファイルを非表示で呼び出しているところが、AndrewBase.pdf とは違うところ。(非表示だったので閉じるのを忘れてあせりました)

Sub CommitDB
' Adrew Base本 PDF 「2.2.4. Refresh the tables」より
Dim oDoc 'Document to refresh.
Dim oDisp 'Dispatch helper.
Dim oFrame 'Current frame.
'**** データベースを開く
sBaseFile = ConvertToURL("C:\OOo\TestDataBase.odb") ' データベースファイルをフルパスで指定
Dim args(0) As New com.sun.star.beans.PropertyValue 
args(0).name = "Hidden"
args(0).value = True
oDoc = starDesktop.loadComponentFromURL(sBaseFile,"_blank",0,args()) 
 If NOT IsNULL(oDOC) AND NOT IsEmpty(oDoc) Then
 oDisp = createUnoService("com.sun.star.frame.DispatchHelper")
 oFrame = oDoc.getCurrentController().getFrame()
 oDisp.executeDispatch(oFrame,".uno:DBViewTables", "", 0, Array())
 oDisp.executeDispatch(oFrame,".uno:DBRefreshTables", "", 0, Array())
 End If		
MsgBox "テーブルを更新しました!!"
' データベースのコミット
sSQL = "COMMIT;"
Execute_SQL(sBaseFile, sSQL)
MsgBox "コミット完了!!"
' odbファイルのクローズ
oDisp.executeDispatch(oFrame, ".uno:CloseDoc", "", 0, Array())
End Sub

Function Execute_SQL(sBaseFile, sSQL)
' データベースに接続する
oStatement = CreateUnoService("com.sun.star.sdb.DatabaseContext")._
 getByName(ConvertToURL(sBaseFile)).getConnection("", "").CreateStatement()
' SQL文を実行する。実行結果を関数の戻り値として返す
Execute_SQL = oStatement.executeQuery(sSQL)
End Function

ボタンに割り付けて動作を確認しました。こちらのほうがデータベース的には正攻法かと思いますが、かなり面倒です。 ;( oDBDoc.Store() というのは眼からうろこだったので、他にも方法があるかもしれません。

しばらく留守にします!

yuki (2009-09-20 06:06:42 (日))

只今から山ごもりに入るため3日程留守に致します。
23日には戻りますので、宜しくお願い致します。

テーブルは正しく保存されました。

yuki (2009-09-24 15:02:27 (木))

「ツール」−「カスタマイズ」の、「イベント」タブの「ドキュメントを閉じる」に「DatabaseDocumentStoreMacro」割り当てたところ、テーブルが正しく保存されたことを確認しました。
実際に使用しているフォームに「DatabaseDocumentStoreMacro」を割り当てても、正しく動作していることを確認しました。
今回の対応としましては、ike@九州 さまから教えて頂きました『眼からうろこ』の oDBDoc.Store() を使わせて頂くこととします。
明示的なコミットに関しましては、かなり複雑なため、今回は見送らさせて頂きたいと思います。
M.Kamataki さま、ike@九州 さま、有難う御座いました。

ところで、今回の件は、
『質問−1(クエリが更新されない)』に関しましては仕様なのかなとも思えるのですが、
『質問−2(レコードの変更が更新されない)』に関しては、仕様としては少し厳しいかなと思うのですが、如何なものでしょうか?

この辺りのご意見を頂き、本件を完了にしたいと思います。

マクロで呼び出したDBはマクロで保存

M.Kamataki (2009-09-24 16:27:47 (木))

>『質問−2(レコードの変更が更新されない)』に関しては、仕様としては少し厳しいかなと思うのですが、如何なものでしょうか?

実はよくAndrewBase.pdfを眺めてみたら(英語なので咀嚼はできてません)、いくつものサンプルコードで、〜.Store()は当然のごとく使われていました。

マクロでDBを呼び出した際は、制御がマクロに移るので、マクロで後始末をしないといけないということだと思います。「マクロで呼び出したDBはマクロで保存」を徹底させることが必要かと思います。

マクロはマクロ!

yuki (2009-09-24 16:56:52 (木))

「マクロで呼び出したDBはマクロで保存」
なるほど。一言で納得できる名文ですね。
何かモヤモヤしていたのが、晴れた様な気がします。

本件、完了にします。有難う御座いました。

お名前:
題名:


添付ファイル: fileTestForm2.odt 640件 [詳細] fileTestForm.odt 633件 [詳細] fileTestDataBase.odb 666件 [詳細]