* 前回のデータ値をフォームで入力設定するには [#i630b58b]
 -ページ:[[OpenOffice.org FAQの登録ページ]]
 -投稿者: Hiro
 -分類: Q&A
 -優先順位: 低
 -状態: 完了
 -カテゴリー: Base データベース
 -投稿日: 2006-08-07 16:04:53 (月)
 -OS: all
 -バージョン: 2.0
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#r0400f01]
 只今、フォームを作成しているのですが、データを入力する際に~
 一つ前に入れた値と同じ場合、入力の手間を省きたいのですが~
 コントロールの中にその様な項目が無い様に思うのですが~
 何か方法があれば、教えて頂きたい~
 当方まだ初心者なもので、マクロ等の知識がないので~
 まだ、作成するまで至っておりません~
 マクロで組めば何か簡単に出来そうにも思うのですが~
 
 ----
 -似た機能であれば
 >M.Kamataki (2006-08-07 18:42:44 (月))~
 ~
 コントロールの「コンボボックス」に、似た機能があります。この場合、同一フィールドに入力された値がプルダウンメニューに表示され、その中から選択したり、新しい値を入力できたりします。コンボボックスは、ウィザードの起動をオンにし、マウスで設置したい場所をドラッグすれば、コンボボックスウィザードが起動します。ダイアログボックスでステップごとに応えていけば、設定できます。~
 ~
 今春のOSC2006で作成した資料がありますので、こちらをご覧ください。コンボボックスの項は、ちょうど今回の目的にあった設定を紹介しています。~
 -OSC2006 Tokyo/Spring「グラス片手にフォーム設計」プレゼン資料~
 http://nstage.ddo.jp/~kamataki/tmp/HowToForm.zip~
 
 //
 - やってみました
 >Hiro (2006-08-07 20:35:11 (月))~
 ~
 早速の回答ありがとうございます。~
 ただ、この方法だと、リストボックスと変わらないのではないかと思われます。~~
 リストボックスの値も、同じ様に一つ前のデータが入ると良いと思っています。~~
 これは別件ですが、リストボックスもかならず選択しないとデータが入らず面倒に思われます。~~
 これに関しては、私の知識不足で設定すればリストボックスのトップの値は~~
 何もしなくてもデータとして入力されるのかもしれません~~
 ただただ、データ入力の手間を省きたいのです。 大量に有るとクリックするのも辛いのです。(^^;~
 
 //
 -プルダウンメニューを1つにするには
 >M.Kamataki (2006-08-07 23:08:33 (月))~
 ~
 「属性:コンボボックス」ダイアログで「行数」を「1」にしてください。これで1つ前のデータだけを表示します。また、「属性:コンボボックス」ダイアログで「オートフィル」が「はい」になっていれば、1文字入力時に、すでに入力されたデータがあれば補完されます。この機能のほうが便利ではないでしょうか。~
 今のところ、コンボボックスで1つ前のデータの自動入力はできないと思います。これは、わたしが知らないだけかもしれませんが。~
 
 //
 -再度やってみました
 >Hiro (2006-08-08 09:00:05 (火))~
 ~
 ありがとうございます~
 早速、試してみましたが、状況としてはあまり変わらないですね~
 (見栄えが1行になっただけ)~
 要望として、テキスト、リスト等のコントロールプロパティーに「前回の値」と~
 「自動入力」追加して欲しいとした方が良いかもしれませんね~
 ~
 当分はリストボックスで対応します。~
 ~
 また別件です。 試している時ですが、行数を0としたら、枠だけになかと~
 期待して試したら、2行出てきました。 私のところだけですかね?~
 
 //
 -Fedora5でためしました
 >Hiro (2006-08-08 09:25:37 (火))~
 ~
 前回の試したOSはXPだったのですが~
 FEDORA5で試したところ、コンボボックス部に~
 直前のデータが表示されない場合がある様です。~
 前のデータの履歴により変化する様です。~
 原因は?~
 ~
 0行の件は同じように2行プルダウン行が出てきます。~
 以上報告~
 
 //
 -今のBASEでは無理かも
 >KAITO (2006-08-08 10:12:44 (火))~
 ~
 「前回入力したデータを残したい」と言うのは入力の手間を省略するためによくある話です。ただ、「一つ前に入れたデータと同じ場合・・」とは入力しないと同じ場合と決められませんので比較できない。あくまで人が判断する。考え方ですが前回入力した値を活用したいというのであればACCESSでよく使った方法があります。テーブルを2つ用意します。一つはフォームと連動aテーブル。もう一つはデータを蓄積するbテーブル。~
 フォームにデータを入力します。終了したら登録を行うイベントを発生させて、aテーブルのデータをbテーブルに追加します。aテーブルのデータは残します。こうすることでフォームを開いたとき、前回登録したデータが残っています。人の判断でデータが同じ場合は残し、違う場合は書き換える操作をします。また、決まったIDや記号が有る場合は、関数を使用して入力の手間を省きました。~
 ただし、BASEは情報が不足していて上記のような事出来ないようです(私の範囲で)。~
 
 //
 -てめしてみます
 >Hiro (2006-08-08 11:06:05 (火))~
 ~
 KAITO様ありがとうございます~
 まだ内容が理解出来ないので、良く考えて試して見ます。~
 なにしろ、始めたばかりで、BASEの情報があまりないので~
 カットアンドトライ状態です。(−−;~
 ~
 実は、私はロータスのアプローチを使っています。~
 このカード型データベースである程度の仕事をこなして~
 いるのですが、BASEの方に移せないかと考えていたのです~
 そこで壁に突き当たったのが一つ前のデータの自動入力なんです。~
 青色申告等で一気に伝票入力する時に便利に使っているのです。~
 アプローチもどきを誰か作ってくれると良いのですがね~
 
 //
 -Basicで1つ前のデータを自動入力する方法
 >M.Kamataki (2006-08-08 11:35:28 (火))~
 ~
 今のBaseでは、Basicは期待通りに動いてくれません。また、「マクロの記録」もありません。BaseのBasic対応に関しては、[[Issues>http://www.openoffice.org/issues/buglist.cgi?issue_type=DEFECT&issue_type=ENHANCEMENT&issue_type=FEATURE&issue_type=PATCH&component=Database+access&issue_status=UNCONFIRMED&issue_status=NEW&issue_status=STARTED&issue_status=REOPENED&issue_status=RESOLVED&email1=&emailtype1=exact&emailassigned_to1=1&email2=&emailtype2=exact&emailreporter2=1&issueidtype=include&issue_id=&changedin=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&short_desc=&short_desc_type=allwords&long_desc=basic&long_desc_type=allwords&issue_file_loc=&issue_file_loc_type=substring&status_whiteboard=&status_whiteboard_type=substring&keywords=&keywords_type=anytokens&field0-0-0=noop&type0-0-0=noop&value0-0-0=&cmdtype=doit&order=Issue+Number&%E3%82%B5%E3%83%96%E3%83%9F%E3%83%83%E3%83%88=%E3%82%B5%E3%83%96%E3%83%9F%E3%83%83%E3%83%88]]を見ていただければ、要望やバグ登録がいっぱい上がっています。~
 ~
 ただ、Baseでは動かないのですが、Writerで作成したフォームなら動きます。まず、Writerにフォームを移植する方法を以下で紹介していますので、ご覧ください。~
 「Baseのフォームを直接表示したい」~
 http://oooug.jp/faq/index.php?faq%2F1%2F146~
 ~
 そして「マクロの記録」を利用して作成した「1つ前のデータを自動入力する」Basicは以下のようになります。~
  sub PrevRecordCopy
  rem ----------------------------------------------------------------------
  rem define variables
  dim document   as object
  dim dispatcher as object
  rem ----------------------------------------------------------------------
  rem get access to the document
  document   = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
  
  rem ----------------------------------------------------------------------
  dispatcher.executeDispatch(document, ".uno:PrevRecord", "", 0, Array())
  
  rem ----------------------------------------------------------------------
  dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())
  
  rem ----------------------------------------------------------------------
  dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
  
  rem ----------------------------------------------------------------------
  dispatcher.executeDispatch(document, ".uno:NextRecord", "", 0, Array())
  
  rem ----------------------------------------------------------------------
  dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
  
  
  end sub
 このBasicをShift+F3などのショートカットキーに割り当てたり、コンボボックスのイベント「フォーカスを得た時」に割り当てると良いのではないでしょうか。ただし、イベントに割り当てる方法は、すでに入力済みのレコードを開いた際も、「フォーカスを得た時」にBasicが実行されてしまうので注意が必要です。~
 ~
 なぜ、Writerかというと、Ver1.1までの仕様で、それまではWriter、Calcでフォームを作成していたのです。~
 ~
 ;; コンボボックスの「オートフィル」はリストボックスにない機能で、便利だと思うのですけど。~
 
 //
 -ちょっと試しました
 >Hiro (2006-08-08 16:17:24 (火))~
 ~
 まず、KAITO様の方法は初心者の私には難しそうなのでもう少し~
 マクロ等の勉強をしてから試してみます。~
 ~
 M.K様のWriter にフォームを移して、加工する方法をリンクサイトの~
 方法でやってみたんですけど、どうも画面通りには行きませんでした~
 只今中断してます。(フォームナビゲータが出てこない)~
 やればやるほど、問題が出てきています。(^^;~
 マクロが出来ないと、どうにもならない様なので少し勉強してみます。~
 時間かかりそうです~
 ~
 現在作っている、フォームに時刻を入力するところが有るのですが~
 確定時刻ボタンを用意して、ボタンをクリックすることで、現在の~
 時刻を入力したいので、そのためにもマクロが必要になりそうです。~
 でもBASEのマクロを何処からとっついたら良いか皆目判らずにいます(−−;~
 
 //
 -フォームナビゲータは
 >M.Kamataki (2006-08-08 17:23:19 (火))~
 ~
 フォームデザインバーの[フォームナビゲータ]ボタン(方位磁石の絵が付いたもの)をクリックすると表示されます。ただし、フォームコントロールバーの[デザインモード オン/オフ]ボタンで、デザインモードに切り替えないと、上記ボタンを選べません。~
 ~
 BaseとBasicの関係ですが、補足します。BasicはあくまでもWriterの機能です。さて、BaseではWriterの機能はどのように使われるのかというと、フォーム表示時には「読み取り専用」で開きますね。つまりBasicを利用して、値を入力しようと思っても、Writer的には、「読み取り専用」なのでBasicの中でコピーはできるが、ペーストはできないという状態になってます。その証拠といっては何ですが、フォームを編集中なら、「読み取り専用」ではないのでBasicは動きます。(何とかしてほしいのですが、Issuesでは開発担当が「募集中」になっている...)~
 
 //
 -やはり出ない
 >Hiro (2006-08-08 18:54:23 (火))~
 ~
 再度挑戦しましたが、フォームナビゲータは表示されませんでした~
 ボタンの横にチェックが入っているのですが、表示されません~
 もっと根本的間違っているのかもしれません~
 もう少しやってから、また結果を報告します。~
 ~
 データベースのマクロですけど~
 http://codesnippets.services.openoffice.org/Database/oobasic.xml~
 この辺りからとっつけば良いのですか?~
 
 //
 -Re: やはり出ない
 >M.Kamataki (2006-08-09 10:59:10 (水))~
 ~
 >ボタンの横にチェックが入っているのですが、表示されません~
 これは、どういう状況なのでしょうか? 躓いたところの画面キャプチャをみせていただければ、アドバイスできるかもしれません。~
 ~
 なお、BaseとBasicについてのドキュメントですが、英語でよければ以下をすすめます。ただ、Baseで利用するBasicというよりは、Basicでのデータベース制御の解説のほうが多いようです。また、ちゃんとこのドキュメントを読んでいれば、もっと的確なアドバイスをできるかも、と思います。反省。~
 「Andrew Learns OOo Base」~
 http://www.pitonyak.org/database/AndrewBase.pdf~
 
 //
 -出ました
 >Hiro (2006-08-09 12:51:26 (水))~
 ~
 操作を間違っていました、すいません~
 只今、SUNのstarsuite8 のデータベースアクセスに関するドキュメント見つけて~
 読んでいます。 UNOコンポーネントをいじくり回せば良いようですね~
 ~
 課題を解決する方法として、次のデータの入力に移る前に、前のデータと~
 同じ部分をコピーしたデータを先に作ってしまえば良いのではないかと~
 考えているのですが、可能かどうかはこれからマクロを勉強してから~
 ですけど、紹介されたドキュメントも参考にします。ありがとうございました~
 
 //
 -途中経過
 >Hiro (2006-08-11 17:59:56 (金))~
 ~
 資料をいろいろ読んで、前回のデータと同じ値を入れる事できる様になったのですが、カットアンドトライでマクロを組んだためどうして上手く行くのか~
 良く判っていません、新規入力画面の同じデータ以外を空白にしたいのですが~
 上手くいっていません 以下に現在のマクロを添付します。~
 ~
 以上報告~
 ~
 REM  *****  BASIC  *****~
 sub save_data <−−−−マクロ記録のデータより~
 rem ----------------------------------------------------------------------~
 rem define variables~
 dim document   as object~
 dim dispatcher as object~
 rem ----------------------------------------------------------------------~
 rem get access to the document~
 document   = ThisComponent.CurrentController.Frame~
 dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")~
 rem ----------------------------------------------------------------------~
 dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array())~
 end sub~
 ~
 sub zenngo  <−−−−これもマクロ記録から~
 rem ----------------------------------------------------------------------~
 rem define variables~
 dim document   as object~
 dim dispatcher as object~
 rem ----------------------------------------------------------------------~
 rem get access to the document~
 document   = ThisComponent.CurrentController.Frame~
 dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")~
 rem ----------------------------------------------------------------------~
 dispatcher.executeDispatch(document, ".uno:PrevRecord", "", 0, Array())~
 rem ----------------------------------------------------------------------~
 dispatcher.executeDispatch(document, ".uno:NextRecord", "", 0, Array())~
 end sub~
 ここから、メインのマクロ~
 Sub same_data(oEvent)~
   Dim oForm     ' フォームオブジェクト
   Dim lNameCol(n)  ' カラム位置
   Dim sf_d(n) as string  ' フィールドデータ 必要な数nだけ配列を取るsf_d()でも良いかも
   rem nは関数で調べておくと良いかもしれない
   rem フォームオブジェクトを得る 
   oForm = oEvent.Source.getModel().getParent()
 ~
   REM フォームのカラムネームフィールドを探す.
   lNameCol(0) = oForm.findColumn("フィールド名0番目")
        、~
        、~
        、~
    全てのフィールド名を探す~
   lNameCol(n) = oForm.findColumn("フィールド名n番目")
  
 ここから ~
   REM Not likely to happen, but check for it anyway.
    If oForm.isAfterLast() Then
     Print "Hey, you are after the last element"
     Exit Sub
   End If
    REM Not likely to happen, but check for it anyway.
    If oForm.isBeforeFirst() Then
     Print "Hey, you are before the first element"
     Exit Sub
   End If
 ここまでは、良く判らない~
 ~
   REM 現在のデータ読み取る
   for i=0 to n個 <−−−数が判らない場合は関数で調べておく
   sf_d(i) = oForm.getString(lNameCol(i))
   next i
   
   REM  ここで、データを移す
   oForm.moveToInsertRow()
   
   REM 
   for i=0 to n
   oForm.updateString(lNameCol(i), sf_d(i))
    next i
   save_data() <−−−−データを保存する
   zenngo() <−−−ページを一つ戻し更に、一つ前に進める
  
 End Sub~
 
 //
 -続き
 >Hiro (2006-08-11 21:13:07 (金))~
 ~
 用事が出来て、詳しくかけませんでした~
 BASEのフォーム画面にボタンを用意して~
 クリックするとマクロを実行して次のデータ入力~
 画面になり、一つ前のデータが全て表示されます。~
 最初、同じで良いフィールド名部分だけを表示する~
 様にしたのですが、そうするとその部分だけ、データと~
 して記録され、他の部分は入力してもデータに反映されませんでし~
 結局、現在最後の方のfor文で全部再表示させています~
 zenngo()を実行しないと、データが増えていかない状況です~
 以上 報告~
 
 //
 -問題続出
 >Hiro (2006-08-14 18:45:43 (月))~
 ~
 BASEでの、フォームでの入力の件は前述の方法かリストボックスで~
 対処することにします。 もう少し使い勝手が良くなったらまたフォームを~
 改造しようと思います。 ~
 ~
 少し実用的な物を作ろうとアマチュア無線の交信記録(LOG)と~
 メールでのPDFによる交信証(QSLカード)発行するシステムを~
 作ったのですが問題(不具合?)が続出しています。~
 (OS: XP)~
 私の勉強不足の様な感じもするのでが、箇条書きにしてみます~
 不具合なのか仕様なのか? 苦戦中です~
 ~
 1) イメージコントロールの整列を最背面にしても、文字が下になる~
 2) ボタンは表示されるがクリックに反応しない、はみ出し部分は~
    クリックに反応する~
 3) エディット中は、各種フォームコントロール表示されているが~
    エディットモードを切り替えると、イメージの下になってしまい~
    画像だけが表示される事が多々ある、再表示した時に正常に~
    なる場合がある~
 4) テキストボックスとラベルフィールドに表示される文字が画面上と~
    PDF、印刷で違う(画面上は正常でも印刷すると文字が欠ける)~
 5) コントロールプロパティーのテキストタイプの1行の時と複数行の~
    時に、ボックス内の表示位置が変化する()~
 6) コントロールプロパティーのテキストタイプを1行設定したとき~
    リターンを押すと、次のデータ入力に移ってしまう~
 7) 表示、グリッド設定が保存されない、スナップしない事がある ~
 ~
 上記問題を乗り越えて、使えるところまで来ていますが、画面を~
 構成するのはかなり苦労します。~
 ~
 以上 報告~
 
 //
 -追加情報
 >Hiro (2006-08-14 19:02:37 (月))~
 ~
 上記システムを作るときに頻繁にクラッシュしたのですが~
 そのとき、回復処理不能になったのですが、フォームは~
 残っていて、ライトのデータとして記録できました。~
 そのデータを開くと、何の操作も無く直接表示が可能に~
 なっていました。 何かのヒントになりそうなので報告します~
 
 //
 -Re: 問題続出
 >M.Kamataki (2006-08-14 21:25:03 (月))~
 ~
 たぶんOpenOffice.orgで、ここまでのフォームを作成された方は記憶にありません。ここまでくると実物を見たくなってくるほど、OOoを活用されているのではないでしょうか。~
 ~
 さて、当初のご質問と離れているように思いますし、問題を一つ一つに分けていただけないと、対応できそうもありません。ごめんなさい。m(__)m~
 
 //
 -大問題発生
 >Hiro (2006-08-15 13:46:15 (火))~
 ~
 問題を一つ一つ分けて質問するために~
 サンプルを作っていたら、大問題が発生してしまいした~
 1)の問題のサンプルを作ってセーブして、今日朝~
 再び、再開しようとフォームの編集をしようと思ったら~
 編集画面までは表示されたのですが、応答がなくなりました。~
 以降、全ての編集が出来なくなる状態になっています。~
 いままで作って来たフォームにもアクセスできませんし~
 新しくフォームを作る際、ページ設定をしようとすると~
 同じ様に、応答がなくなる状態で、お手上げです。~
 データをFEDORA5に移しても同じ状況になる様です。~
 原因不明です。~
 テーブルの編集は出来ます。 ~
 最終報告です。 今後、再度トライして個別に質問します。~
 
 //
 -Re: 大問題発生
 >M.Kamataki (2006-08-16 00:43:41 (水))~
 ~
 HSQLDBには、蓄積したデータの最適化用のSQLコマンドがあります。効果があるかわかりませんが、ためしてみてはどうでしょう。~
 ~
 最適化については、以下のページをどうぞ。~
 「HSQLDB形式データベースの最適化」~
 http://nstage.dth.jp/pukiwiki/pukiwiki.php?OpenOffice.org%2FBase#content_1_3~
 ~
 また、気になる点がひとつ。OpenOffice.orgのバージョンはいくつでしょう。Baseの場合、2.0、2.0.1あたりは不具合が多いので。~
 
 //
 -トライしてみます
 >Hiro (2006-08-16 10:25:59 (水))~
 ~
 トライしてみます。~
 バージョンは最新版(2.0.3)です。~
 もろもろの件、用事ができて明日以降になりそうです。~
 
 //
 -バックアップ
 >M.Kamataki (2006-08-16 10:36:23 (水))~
 ~
 データベースの最適化の前に、odbファイルのコピーをとって作業してくださいね。念のため。~
 
 //
 -最終手段
 >Hiro (2006-08-17 00:06:21 (木))~
 ~
 最適化をトライしてみましたが、解決しませんでした。~
 そこで、最終手段として、オープンオフィスをアンインストールして~
 インストールし直したところ、データはそのままで、回復しました。~
 原因は判りませ、ちょっと不安がありますが今は正常に動作しています。~
 いろいろアドバイスありがとうございました。~
 
 //
 -大問題再現
 >Hiro (2006-08-18 09:21:17 (金))~
 ~
 大問題が再現しました。~
 1日経って、翌日フォームを編集しようとしたら~
 編集出来ずに、応答がなくなりました。~
 テーブルの編集画面は立ち上がります。~
 テーブルには、日付、時刻のフィールドがあります。~
 旧バージョンでは何か問題が有った様ですが~
 最新の2.0.3でも何か問題があるのでしょうか~
 
 //
 -Re:大問題再現
 >Hiro (2006-08-18 09:51:33 (金))~
 ~
 今回も再インストールを試みましたが~
 回復しません~
 ただ、4つほどあるフォームの1つだけが~
 編集可能状態です~
 ただ、以前はマクロの実行の警告が出たと思うのですが~
 警告が出ずにいきなり、編集画面になりました~
 ~
 以上 追加報告~
 
 //
 -RE:大問題再現
 >Hiro (2006-08-18 10:42:42 (金))~
 ~
 データをFedora5に移す事で、フォームの~
 編集画面を開く事が出来ました。~
 XPでは開けませんでしたので~
 OSの問題なのかも知れません?~
 ~
 以上 再追加情報~
 
 //
 -RE:大問題再現
 >M.Kamataki (2006-08-18 11:09:23 (金))~
 ~
 Fedoraでは大丈夫ということは、XPのOpenOffice.orgの問題ですね。「OOoの画面や設定がおかしくなってしまいました。」([[faq/1/202]])の対処法も試してみてください。~
 
 //
 -RE:大問題再現 
 >Hiro (2006-08-18 17:55:27 (金))~
 ~
 faq/1/202を適応してみましたが~
 上手くいきませんでした。~
 今度はXPをダウングレードしW2Kにし~
 OOoをインストールしている最中です。~
 ここ数日は用事があってレポートできません~
 
 //
 -W2Kに移行
 >Hiro (2006-08-22 22:10:14 (火))~
 ~
 W2Kに移行後は大問題は発生していません~
 当初の課題と離れてしまったので、このQ&Aは~
 ここで終了してください~
 ~
 個別に投稿していきます。~
 細かい部分では問題は有りますが、ある程度~
 問題を回避しながら使っています。~
 
 //
 -完了にします
 >M.Kamataki (2006-08-23 09:56:46 (水))~
 ~
 当初の質問に対しては、いろいろな考え方が提示されたかと思います。完全に解決しているわけではありませんが、コメントがありましたので、完了にします。~
 
 //
 #article
 //#comment