2008年4月アーカイブ

晒したくなる訳

| コメント(2)
以前から OpenOffice.org の日本語訳に ?? な気持ちでいたけれど BASE のイベントの訳にいたっては、
かなり強烈に意味不明なものがあるのでオリジナルと並べておきます。
比べるとイベントの意味や発生するタイミングが見当つけられます。
record が動詞と名詞でこんがらがってるようです。翻訳する人たちも大変だなぁ。

OpenOffice2 Base データベースフォームのイベント
日本語英語
events_of_dataform_jp.png events_of_dataform.png

OpenOffice2 Base ボタンのイベント
日本語英語
events_of_dataform_button_jp.png events_of_dataform_button.png

OpenOffice2 Base リストボックスのイベント
日本語英語
events_of_dataform_listbox_jp.png events_of_dataform_listbox.png

また1ッコ (OOo のバグ)

OOo のデータベースフォームで、フォームのフィルタ(たぶんRowSetのフィルタ)を
設定すると最後の1個のフィルタが無視される。1個だけ設定した場合はその1個が
無視される。

いまのところ調べたのは OR でつないだ場合だけ、AND とかもっとややこしい条件を
指定した場合はしらん。知りたくも無い。

も少し詳細に気がついたので補記
- リストボックスも同様 (つうかこっちメイン)
- (NG) SELECT "NAME","CODE" FORM "TABLE" ORDER BY "KANA" ASC
- (NG) SELECT "NAME","CODE" FORM "TABLE" WHERE "COND"='A' ORDER BY "KANA" ASC
- (OK) SELECT "NAME","CODE" FROM "TABLE" WHERE "COND"='A'
- (OK) SELECT "NAME","CODE" FROM "TABLE" WHERE "COND"='A' OR "COND"='dummy ' ORDER BY "KANA" ASC

WHERE句 無しの ORDER 有りが NG
WHERE句 有りの ORDER 無しが OK
WHERE句 有りの ORDER 有りで Where条件が1件ならNG
WHERE句 有りの ORDER 有りで Where条件が複数なら最後の OR 条件以外で OK

対策
ORDER を こいつらのフィルターに記述しない。

SELECT * FROM "TABLE" ORDER BY "KANA"
のようなクエリーを作って逃げる。

OpenOffice.org 2.4 の BASE で(さらに)見つけたバグ二点

その1
MySQL のリレーションを扱えるようになったみたいだが、リレーションシップ(リレーションデザイン)のウィンドウではテーブル間にリレーションの線が引かれない。だから線を右クリックしてコンテキストメニューで編集ができない。作ることはできても確認、変更は不可能。

その2
内部のDBMSでリレーションを変更しても Modified がセットされないので保存ができない。 Modified をセットするためには、関係ないテーブルを追加したり削除したりする必要がある。

OpenOffice.org の BASE で組み込みの(HSQLDB) テーブルを MySQL に移すときに、
プライマリキーなどに 自動インクリメントの INTEGER を使っているときは注意が必要。

組み込みのDB はインデックスの初期値が 0 に対して MySQL では 1 から始まる。
したがって、

レコードHSQLDBのインデックスMySQLの自動インデックス結果
10自動で 1成功
21元のデータから 1重複キーで失敗
32素直に 2成功

以上、ぱっと見た目の症状のメモ

Sun Report Builder 1.0.2

結論から書く。


やっぱり使い物にならん。


ver1.0.2 がでたので期待したワタシが馬鹿だったのね。
あいかわらず日本語は使えん。


せめて Calc へのエクスポート・ジェネレータくらいには使えないかと思ったが、
項目を隣り合わせたセルに置きたくても勝手に余分なセルを間に入れてしまう。


使い道なし!


あ〜。つまんね。
表題のとおりです。
ツールバーボタンに組み込んで使います。
組み込みかたは追記参照。


global POSSIZE_INDEX as integer

Sub CyclicResizeWindow

	dim window as object
	window = StarDesktop.CurrentComponent.CurrentController.Frame.ContainerWindow
'	window = thisComponent.CurrentController.Frame.ContainerWindow

	dim size() as integer
		size = array( _
		array(640,480), _
		array(800,600), _
		array(1024,768), _
		array(1280,960), _
		array(1400,1050))

	dim possize as object:	possize = window.getPosSize
	dim wh() as integer
	dim i as integer
	for i=0 to UBound(size)
		wh = size(i)
		if (wh(0)>possize.Width(0) OR wh(1)>possize.Height) then exit for
	next
	
	if (i>UBound(size)) then
		i = POSSIZE_INDEX
		POSSIZE_INDEX = POSSIZE_INDEX + 1
		if (POSSIZE_INDEX > UBound(size)) then POSSIZE_INDEX = 0
	end if
	
	wh = size(i)
	window.setPosSize(0,0, wh(0),wh(1), 15)
	
End Sub
OpenOffice.org のフォームを最大化(Maximize window)する方法。
探してたら Windows オンリーだけど見つかった。とりあえずこれで充分。
引数に与えるフレーム・オブジェクトのパターンは他にもありそう。

出典:
http://user.services.openoffice.org/en/forum/viewtopic.php?f=21&t=2309


REM  *****  BASIC  *****

Sub Main

	MaximizeFrame(starDesktop.ActiveFrame)
	MaximizeFrame(starDesktop.CurrentFrame)

End Sub


'
' use the MS Winows API
'
' Add this section to the beginning of
' the basic module where you add
' the actual work procedures
'
Declare Function ShowWindow Lib "user32" (ByVal lHwnd As Long, ByVal lCmdShow As Long) As Boolean


'
' This is procedure that does the actual work
'
sub MaximizeFrame( aFrame as object )

    dim window
    dim handle

    window = aframe.getContainerWindow()
    handle = window.getWindowHandle(dimarray(), 1)  REM 1=WIN32
    ShowWindow( handle, 3 )

end sub
フレームウィンドウのサイズを変えるマクロ。
フレームサイズは画面サイズより大きい値を指定してもエラーにはならない。
最後の引数の flags は以下のURLを参照。

http://api.openoffice.org/docs/common/ref/com/sun/star/awt/PosSize.html

' ------------------------------------------------------------ ' ウィンドウサイズの変更 ' flags ' X 1 flags the x-coordinate. ' Y 2 flags the y-coordinate. ' WIDTH 4 flags the width. ' HEIGHT 8 flags the height. ' POS 3 flags the x- and y-coordinate. ' SIZE 12 flags the width and height. ' POSSIZE 15 flags the x- and y-coordinate, width and height. ' sub SetPosSize(x as long, y as long, w as long, h as long, optional flags as integer) if isMissing(flags) then flags = 15 thisComponent.CurrentController.Frame.ContainerWindow.setPosSize(x, y, w, h, flags) end sub ' ------------------------------------------------------------ ' ウィンドウ外枠の取得 ' function GetPosSize() as object GetPosSize = thisComponent.CurrentController.Frame.ContainerWindow.getPosSize() end function

OOoの ポインタを変える

マウスカーソルが何かのコントロールの上に来たときにポインタの形状を変更するマクロ。
コントロールのプロパティで「マウスを内に入れたとき」イベントに割り当てる。

Pointer.setType の引数は以下のURLを参照。
http://api.openoffice.org/docs/common/ref/com/sun/star/awt/SystemPointer.html

sub OnMouseInside(arg as valiant)

	dim Pointeras object
	Pointer= CreateUnoService("com.sun.star.awt.Pointer")
	Pointer.setType(29)	' = PEN - constants group SystemPointer 
	arg.Source.Peer.setPointer(Pointer)

end sub

連絡先

nakanohito