これやると、つまりグループ化をすると、
フィールドの名前が強制的に初期化されてしまうのです。
気分に余裕のあるときに検証してみたいです。
以前の質問に対して全くレスがつかないままなので
自分は単純に答えがわからなかったんです。odsやodtのときは当該構文で出来るようなんですけどね…
実は一回手元で成功したんですが、その際IDEがクラッシュしてしまい、復元されてきたものに、成功したコードが含まれておらず、かつ、そのコードを再び書き上げることが出来ず、調査が難航しています。
これやると、つまりグループ化をすると、
フィールドの名前が強制的に初期化されてしまうのです。
気分に余裕のあるときに検証してみたいです。
以前の質問に対して全くレスがつかないままなので
自分は単純に答えがわからなかったんです。odsやodtのときは当該構文で出来るようなんですけどね…
実は一回手元で成功したんですが、その際IDEがクラッシュしてしまい、復元されてきたものに、成功したコードが含まれておらず、かつ、そのコードを再び書き上げることが出来ず、調査が難航しています。
あ、これらoField0とかはテキストボックスだと仮定しています。↓↓ ご推察のとおりです。
Dim AaBbCcDd As String ' 型をStringに変更
Dim AaBbCcDdText(3) As StringAaBbCcDdText(0) = oField0.Text
AaBbCcDdText(1) = oField1.Text
AaBbCcDdText(2) = oField2.Text
AaBbCcDdText(3) = oField3.Text
AaBbCcDd = Join(AaBbCcDdText,"")
CtlView.Text = AaBbCcDd '代入する変数を変更
BASIC ランタイムエラー.
'423'
Text
ちなみにエラーメッセージは変わっています。
型が Object のままだと、エラーメッセージは以下です。
BASIC ランタイムエラー.
'380'
プロパティ値が正しくありません。
REM Option VBASupport 1 すると。
正しくありません。→見つかりません。に変わったのです???
BASIC ランタイムエラー.
次のプロパティまたはメソッドが見つかりません: Text。
自分はOption VBASupport 1は外して物事を考えることが多いです。今の実装だとエラーメッセージではなくエラー番号が出てしまいますし、前述のデフォルトプロパティのせいで本来の原因とは違うエラーメッセージが表示されたりして厄介なので。
次のプロパティまたはメソッドが見つかりません: Text
LibreOffice自体のC++のコードを読んだわけではありませんが、このプロパティが見つからないということは、「自分がその変数に代入されているものがテキストボックスだ誤解しているが、実は違うものが入っている」可能性があると考えてます。
自分なら、oField0をウォッチウィンドウに放り込んで中身を確認してみます。SupportedServiceNamesやImplementationNameが何になっているのか確認するわけですね。まぁ文字列とかだったらそのプロパティとかはないわけですが。
また、再現する最小限のファイルが作れ、個人情報等を含まず、俺に見られてもいいファイルを準備できるなら、そのファイルをどこかにアップロードして、「ちょっとhimajin100000さんや、実際のファイル提供するから再現するか、した場合何が原因か調べてくれんかのう?」という風にするのもアリです。まぁ解決できる保証はできないのですが。
深夜遅くのお返事。驚きました。ありがとうございます。
最後、どうしようもなければ、見ていただきたいです。
ですが、上記のコメントを拝見して、はたと気がついました。
oField0
oField1
oField2
oField3
は、テキストボックスを、入力ミスを避けるためにリストボックスに変換したものです。
それぞれ、他に入力用の一覧表として作成してある4つのフォームの1列面を参照します。
oField4 はテキストボックスです。
もしかしたらこれでは駄目なのでしょうか?
実は、oField4がプライマリーキーです。
つまり、
oField0
oField1
oField2
oField3
は、一意のプライマリーキーを生成するための要素として考えています。
ですが、プライマリーキーが無いとテーブルレコードの保存ができません。
ようするに、このマクロを実行する時は
oField0
oField1
oField2
oField3
がまだ保存されていない状態なのです。
これが駄目なら、
このテーブルでの oField4 (プライマリーキー)は、連番で発行し、
その状態でいったん保存して、
oField5をさらに作成しその次の処理で文字をつなげるしかないのかな。。
と気が付きました。
これで合っていますでしょうか?
ちなみにこのフォームは、
この処理で繋げるコードを作成するだけのためのものです。
ここで生成したコードを全てのレコードと紐づけて、操作したいのです。
追伸:
ちなみに、ウォッチウィンドウがわかりません。
これはなんですか?何のためのものですか?どこで見つければいいですか?
↓↓ ご推察のとおりです。
全てテキストボックスです。
リストボックスに変換したものです。
なんとなくそんな気はしてました。後でどんなプロパティがあるか調べておきます。
確かメールで届いたコメントにはウォッチウィンドウがどれかわからないという話が書いてあったのでひとまず図で示しておきます。
やはり、リストボックスにはTextプロパティは無いために起きています。エラーを出したStarBasicの主張は正しいです。
Writerを起動
メインメニューから[フォーム]→[コントロールウィザード]があればチェックを外す
[リストボックス]を選択してから、文書上でドラッグドロップしてリストボックスを配置します
このリストボックスを右クリック→[フォーム]
[名前]をForm1としました。
再びこのリストボックスを右クリック→[コントロール]
[名前]をListBox1にします。
8.さらに[リストの項目]に「a」「b」「c」の3つの項目を追加しました。なお、Shiftを押しながらEnterすると新しい項目を作れます。
さらに[標準選択範囲]に"0"を入力しました。
このような準備を整えてから、以下のコードを実行してみました。サブルーチン内でF8を押していくとステップ実行されます。なお、If文の中のExit Subが実行されたら誤りです
Option Explicit
Sub Main()
Dim lb As Object
lb = ThisComponent.DrawPage.Forms.getByName(“Form1”).getByName(“ListBox1”)
If IsEmpty(lb.SelectedValue) Then
Exit Sub
End If
Msgbox(lb.SelectedValue)
End Sub
そしたら、(この手のやつは0から数えるので) 0番目に相当する「a」がダイアログに表示されました。
ちなみに[標準選択範囲]を"1"にしていたら、「b」が表示されます
うげ、getByNameのメソッド名の途中に開き角括弧が紛れ込んでた。こそこそと編集(汗
暇人さん
ありがとうございます。
もう何度、この言葉を使わせていただいたでしょう。
情けないです。。
でもおかげさまで、少しづつですがわかってきた気がします。
でもまだまだ入口のところですけれど。
先に朗報から。
ここまで悩んでいた部分、すなわち4つのテキストの連結です。
ただおそらく、このフォームでの最後の難関?
にまたぶつかってしまいまいした。それは報告の後に記載します。
=====
①
フォーム上に新しいテキストボックスを、リストボックスと同じ数だけ作成しました。
全てのリストボックスを単にコピペして。それをリストボックスに変換しました。
②
新たなテキストボックスを、リストボックスの後ろ側に配置して、非表示にしました。
最初は単に後ろ側に配置しただけだったのですが、何故か上から透過して下側がダブって見えます。
たぶんそういう仕様なのだろうと判断して、コントロールの設定で非表示にしました。
③
コードを以下のようにしました。
別に理由はないのですが、なんとなく簡単に書きたかったので
JOIN は使用せず、&で繋いでいます。
以下のようになりました。
====
Sub ConcatAABBCCDD()
Dim oForm As Object
Dim oField0 As Object
Dim oField1 As Object
Dim oField2 As Object
Dim oField3 As Object
Dim oField4 As Object
Dim document As Object
Dim dispatcher As Object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:RecRefresh", "", 0, Array())
oForm = ThisComponent.Drawpage.Forms.getByName("ABCDフォーム")
Doc = ThisComponent
DocCtl = Doc.getCurrentController()
oField0 = oForm.getByName("AA")
oField1 = oForm.getByName("BB")
oField2 = oForm.getByName("CC")
oField3 = oForm.getByName("DD")
oField4 = oForm.getByName("EE")
AaBbCcDd = oField0.Text & oField1.Text & oField2.Text & oField3.Text
CtlView = DocCtl.GetControl(oField4)
CtlView.Text = AaBbCcDd
dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:RecRefresh", "", 0, Array())
End Sub
=======
③
フォーム上に、ボタンを1つ作成して、上記のMACROを配置しました。
④
このボタンを押すと。ちゃんと。
oField4に、oField0.Text & oField1.Text & oField2.Text & oField3.Text された表示が出ます。
ところが。。。
保存ボタンを押すと、テーブル側のレコードに、oField4だけ保存されません。
NULLしてしまいます。
oField0.Text
oField1.Text
oField2.Text
oField3.Text
はレコードとして反映されているのにです。
もしかしたらこれかな??
CtlView = DocCtl.GetControl(oField4)
CtlView.Text = AaBbCcDd
oField4 = AaBbCcDd
追伸です
oField4.Text = AaBbCcDd
したらエラーは出なくなりましたが、同じ結果です。
レコード側には反映されません。
DocCtl.GetControl(oField4)
これの意義が自分にはよくわかっていません。確かにネットを検索するとそれらしき情報はヒットするのですが…
コミットしてから、RecSaveでレコードを保存するんじゃないかなと自分は思います。
oField4.commit()
元のodb側を更新したいときはDataSourceをちゃんとflushしてあげてください。
一応3つのテキストボックスを使ってサンプル作って検証しました。(odtとodb)
正直、書いたマクロ、自分の好みに合わせて型を厳密に書いて煩雑にしすぎた気がします。
使い方に関する重要な注意事項
暇人さん。いつもお世話になります。
頂いたファイルですが、ダウンロードしました。で、、開くことができません。
外部データソースへの接続が確立できませんでした。
firebird に接続する SDBC ドライバがありません。
と言われてしまいます。
今、どういう状況かを画像でまとめたPDFを作成しました。以下からダウンロードしてください。
https://yahoo.jp/box/k1LySY
それとやはり私のLIBREにはウォッチリストというのがありません。
画像から見る限り、オブザーバーというものに名称が変更されている気がします。
あー、色々と俺がミスったり説明不足だったりしています。ごめんなさい。
オブザーバー
あ、これで大丈夫です。
「拡張型を使用」がない
うわぉ、これ実験的機能だったんだ。
オプションから「LibreOffice」→「詳細」→「実験的な機能を有効にする」のチェックを入れて再起動すると、多分出てくると思う。「実験的機能」こわくないよー。
SDBC
使っているLibreOfficeのバージョンが知りたいかな。
うまく行けば、上記「実験的機能」の後、読み込めばいけるかもしれない。うまくいかないかもしれないけど。
一応、今RC3の6.2系では実験機能ではなくなっている。
https://wiki.documentfoundation.org/ReleaseNotes/6.2/ja#Base
まぁうまく行かなかったら作り直します。(なお、このエラーにつき「amadaさんに過失は全くない」)
SDBCは多分C++ネイティブで作られているドライバだと思っている。JDBCはJavaに頼ったものだね
暇人さん
1日、間が空いてしまいました。
再び、画像つきで、返信を作成しました。
つまり、、まだ動きません。
以下から、ダウンロードをお願いします。
https://yahoo.jp/box/KB59QC
>オプションから「LibreOffice」→「詳細」→「実験的な機能を有効にする」
は暇人さんの指示通りに行いました。
その結果、ファイルは開くようになりました。
ですが、マクロで2種類のエラーが出ます。
言葉で説明しにくいので、ステップ・バイ・ステップで画像にしました。
よろしくおねがいします。
あ!LIBREのバージョンですが、6.0.7.3(x64) です。
彰子
暇人さん 追伸です。新事実を発見しました。
現在のマクロを実施して、フォーム上のテキストボックスに、連結した文字が表示されることは既にお伝えしました。そしてそれなのに、肝心のテーブルレコード側に反映されないということも、既にお伝えしました。
それはそのままなのです。
なんでかな~と悩みながら、何気なく、ホントに何気なく、
①テキストボックスの中に表示されている文字列を、マウスでカットして、
②同じテキストボックスの中に、再度、ペーストし直してみました。
すると、、
③保存アイコンが変化して「保存しなさいよ~という緑の星」が出現したのです。
④素直に押してみたら、テーブルに反映されました!!??
やはり現状のマクロでは「表示されていただけ」なのですね。
ただどう考えても不思議なのは、
別のフォームに書いたマクロ、単純に、A→Bへとコピーするマクロ
も全く同じ書き方をしている(つまり連結のマクロが無いだけ)のに、
こちらはテーブルにちゃんと反映されます。
ただいずれにしても、このマウスの作業を、マクロでどう書けばよいのかわかりません。
ためしに、テキストボックスをひとつ増やしてみました。
同じテーブルを参照するテキストボックスです。 完璧な素人発想です。
(前略)
oField0 = oForm.getByName(“AA”)
oField1 = oForm.getByName(“BB”)
oField2 = oForm.getByName(“CC”)
oField3 = oForm.getByName(“DD”)
oField4 = oForm.getByName(“EE”)
oField5 = oForm.getByName(“EE”) ←これを増やした
oField4.Text = oField0.Text & oField1.Text & oField2.Text & oField3.Text
oField5.Text = oField4.Text
(後略)
この MACRO ですが、エラーでずに最後まで行きました。
ですが、結果は何も変わりませんでした。(あたり前ですよね。。)
現状、テーブルに反映させる方法は、手によるマウス操作でのコピペだけです。
上記文章の最後の「たぶん出てくると思う」というのがよくわかりませんが
↓これの話です
ツール→オプション LibreOffice→Basic IDE オプションの「拡張型を使用」を有効にする
よく読むと…
使い方ですが、「デザインモード」のチェックが外れた状態で、【下の】二つのテキストボックスに何かを入力してボタンを押してください。
まぁサンプルだし作りは雑でいいかと思って…
このBOXは何ですか?
同時に別質問の実験もしていました。実りませんでしたが。
その消し忘れというか。odtから始めるから消さなくていいや、と思って放置した名残です。
更に追伸です。もっと不可思議な事を発見しました。
上記の方法で「手によるコピペをしなくても反映」されます。
oField4 の中にマクロの結果として表示されているものを、
①いったんマウスで選択して削除します。
②もういちどボタンを押して、マクロをもういちど実行します。
これでテーブルに反映されます。何ででしょう???