12 返信 最新の回答 日時: Jul 2, 2013 1:31 PM ユーザー:ishib

    スケジュールをカレンダー状に表示したい

    ishib

      タイトル

      スケジュールをカレンダー状に表示したい

      フォーラムに投稿

            

           スケジュールをカレンダー状に表示させる為に、[カレンダー年月]ー[カレンダー日]ー[予定]とリレーションを2つつないでいるのですが、[カレンダー年月]からみて2つ先の[予定]が思うように取得できません。テーブル内容は以下の通りです。

            

           テーブル[カレンダー年月]

           フィールド「年」「月」・・・グローバルフィールド

           フィールド「表示開始日」「表示最終日」・・・計算フィールドで「年」「月」より算出

            

           テーブル[カレンダー日]にはあらかじめ表示する42日分のレコードを作成してあり、カレンダーの表示年月が設定されると各レコードのフィールド「日付」にカレンダーで表示する第1日目から42日目までがスクリプトで自動的に入力されるようになっています。

            

           テーブル[カレンダー年月]と[カレンダー日]はリレーションで 表示開始日≦日付≦表示最終日 と設定し、ポータルを42個(第一日目はポータル開始行を一行目、二日目は同じく2行目、...、最終日は42行目)を横7日×縦6日にレイアウトしてカレンダーを表示させています。

            

           ここで各日付の中にさらにポータルを置いて、日付と一致する予定を該当する日付の部分に表示させたいのですが上手くいきません。各予定を各日付の部分に展開して表示させたいのですが、実際には全ての日付に全て同じ予定が表示されてしまいます。例えば2013年6月のカレンダー(表示日は5/26~7/6)が表示されているとすると、どの日付の部分にも5/26~7/6の全ての予定が同じように表示されてしまいます。解決策、アドバイスなどありましたらご教示のほどよろしくお願いいたします。

        • 1. Re: スケジュールをカレンダー状に表示したい
          hiro_

               環境を明記ください。

               【引用】他のQ&Aから→ http://www.russ.jp/stepbbs/step.cgi?mode=view&no=50195&key=50255
          > 説明代わりにサンプルを作りアップしましたので、宜しかったらご参考ください。「ToDoカレンダー.fp7」.zipファイルです。
               > 環境説明がありませんが、トリガーが使えるFM10以降に対応しています。
               > 恐らく、以前の解法に比べかなりシンプルかつ簡潔な解法では無いか?と思います。
               > ●サンプル「ToDoカレンダー.fp7」→
           http://yahoo.jp/box/6TEK45

               サンプル事例では、繰り返しフィールドのLookup特性を効果的に利用することで、極少ないフィールド設定数[8]とリレーション設定数[2]、予定カレンダレコード作成数[予定実入力数]、で実現しています。

               もし、非トリガーバージョンなら、繰り返しフィールド[42]を1コマごと分離配置してそれぞれに個別スクリプト引数付きのスクリプトボタンを貼り付ければ、トリガーに代わりボタンでも実装できます。

          • 2. Re: スケジュールをカレンダー状に表示したい
            ishib

                 Hiroさん、お返事ありがとうございます。環境記入漏れ失礼いたしました。

                 環境はMacOSX10.8 FM Advance ver12.04ですのでスクリプトリガー対応しています。

                 教えていただいたサンプルで一つの日付に対して一件のテキストデータをカレンダー状に表示する事は可能なのですが、私が実際に行いた事は、別テーブル[予定]にフィールド「日付」「予定内容」がありこれをカレンダー状に表示させる事、つまり同じ日付に対して複数の予定レコードが存在するデータをカレンダー状に表示させる事です。このサンプルを改造して複数レコードのテキストフィールドを表示させるようにする事は可能でしょうか?自分でも少し考えたのですがまだサンプルの内容を全て把握していないので方法が思いつきません。よろしくお願いいたします。

            • 3. Re: スケジュールをカレンダー状に表示したい
              hiro_

                   このカレンダーの基本部分が解っていれば、あとの見え方の点の改造はそう難しくないと思います。
                   2テーブル分けと、複数関連予定レコードをポータルに一覧表示するように修正した新規サンプルをアップしました。

                   ●新サンプル「ToDoカレンダv2.fp7」→ http://yahoo.jp/box/rOzZyZ

              • 4. Re: スケジュールをカレンダー状に表示したい
                ishib

                     Hiroさん、再度サンプルご提供いただきありがとうございました。

                     なるほど、List関数という便利なものがあるのですね。これで私のやりたい事が実現しそうです。

                     ToDoサンプルv2でいくつか分からない事があるので、お時間のあるときに教えていただければ幸いです。

                     1)記入欄(ToDo予定2のToDo)に予定を記入しても、カレンダーの欄(ToDoカレンダーのToDo一覧)に反映されるタイミングにばらつきがある。すぐに変更が反映される場合もあれば、カレンダーを他の月に変更して元に戻してようやく反映されたり、それでも変更が反映されないなど。

                     2)ToDoカレンダーのToDo一覧Lookup(ToDo予定::日別ToDo集計; "-")  & Left(キー日付;0)の「Left(キー日付;0)の」部分の働きがわかりませんでした。この部分を消しても今のところ動作に差は見られなかったのですが、なにか不都合が生じる可能性はあるでしょうか。

                3)・トリガースクリプトの一行目の"OnExit"はどこから来た引数なのでしょうか。

                • 5. Re: スケジュールをカレンダー状に表示したい
                  hiro_

                  > 1)記入欄(ToDo予定2のToDo)に予定を記入しても、カレンダーの欄(ToDoカレンダーのToDo一覧)に反映されるタイミングにばらつきがある。すぐに変更が反映される場合もあれば、カレンダーを他の月に変更して元に戻してようやく反映されたり、それでも変更が反映されないなど。
                  ●こちらでは問題を再現できません。
                            ポータルToDo予定 2::ToDoフィールドにOnExitトリガが組み込まれていて、ToDoカレンダー::ToDo一覧の表示内容が自動更新される仕組みです。
                            なお、通常更新処理は「ウインドウ内容の再表示」ですが、画面がチラ付くので再Lookup処理(キー値を再入力)で代替処理しています。
                            こちら問題ありませんが、もしそちらの環境でどうしても不安定なら、「ウインドウ内容の再表示」へ差替えてお試し下さい。

                  > 2)ToDoカレンダーのToDo一覧Lookup(ToDo予定::日別ToDo集計; "-")  & Left(キー日付;0)の「Left(キー日付;0)の」部分の働きがわかりませんでした。この部分を消しても今のところ動作に差は見られなかったのですが、なにか不都合が生じる可能性はあるでしょうか。
                  ●Lookup式の自動更新のトリガ要素としてです。
                            外部テーブルとグローバル計算フィールドに変更した事で、関連フィールドが再計算のトリガ要素に使えなくなったので、自己テーブルのフィールドを、式の結果に影響を与えない形でトリガ要素だけを導入する苦肉の策です。
                            式「Lookup(ToDo予定::日別ToDo集計; "-")  & Left(キー日付;0)」は、「Evaluate("Lookup(ToDo予定::日別ToDo集計; \"-\")"; [ToDoカレンダー::開始日;ToDoカレンダー::キー日付])」と等価で、より簡潔な式です。
                            自動更新の控え要素ですので、外しても問題ないかと思いますが、保険として残しておきました。(計算グローバルフィールドは自動更新し難いので)

                  > 3)・トリガースクリプトの一行目の"OnExit"はどこから来た引数なのでしょうか。
                  ●1)でも書きましたが、ポータルToDo予定 2::ToDoフィールドのObjectOnExitトリガの起動スクリプトに添付してあります。
                            「ToDo予定 2::ToDo」フィールドへの入力・編集結果が「ToDoカレンダー::ToDo一覧」へ即時反映するために重要です。

                        

                  • 6. Re: スケジュールをカレンダー状に表示したい
                    ishib

                         Hiroさん、解説ありがとうございます。

                         トリガースクリプト1、2行目の

                         if[Get(スクリプト引数) = "OnExit"]

                          フィールド設定[ToDoカレンダー::開始日;ToDoカレンダー::開始日]

                         の次に

                          ウィンド内容の再表示

                         を入れてみましたがやはりダメでした。色々いじっていて分かったのですが、既存するToDo予定の内容を変更・上書きする場合はその変更が即座に日別ToDo集計に反映されて、つまりカレンダー上でもデーターの変更がすぐに行われます。しかし、新規にToDoが作成されて、そこに予定を記入した場合は日別ToDo集計に反映されるタイミングが遅れているようです。公開していただいたサンプルの〜.fp7を〜.fmp12に変換する際になにか問題が起こっているのでしょうか?

                    • 7. Re: スケジュールをカレンダー状に表示したい
                      hiro_

                           おお、新規作成時に再現しました。甘い検証ですみませんでした。

                           どうも2テーブル別けのとき「ToDoカレンダー::ToDo一覧」もグローバルフィールドに変更したのが原因、悪かったようです。
                           非グローバルへ戻し、計算結果を非保存にしてください。
                           v2サンプルを修正して再アップしましたので、ご覧下さい。
                           お詫びに、既存ToDo予定レコードの削除機能を補足しておきます。

                           ●アップデイトサンプル「ToDoカレンダv2.fp7」→ http://yahoo.jp/box/rOzZyZ

                      • 8. Re: スケジュールをカレンダー状に表示したい
                        ishib

                             Hiroさん、お詫びだなんてとんでもないです。今回のサンプルで色々勉強する事ができました。削除機能もありがとうございます。

                             「ToDoカレンダー::ToDo一覧」を非グローバル、計算結果非保存で期待通りに動作しました。ただ「ToDo予定2::ToDo」に新規の予定を記入した直後に(1)「ToDo予定2::ToDo」(2)「ToDoカレンダー::ToDo一覧」(3)「ToDoカレンダー::開始日」をクリックするとやはりカレンダー上の「ToDoカレンダー::ToDo一覧」に変更が反映されるタイミングにズレが生じました。(1)〜(3)いずれの場合もその後に画面上のその他の部分をクリックすればその時点で変更が反映されるので実用上は問題なく使えそうです。

                        ただこのズレが発生する理由がよくわかりません。トリガースクリプトが"OnExit"で呼び出された際にカスタムダイアログを発生させてみると(1)〜(3)のいずれの場合もちゃんとスクリプトは発生しているようでした。(1)のケースは新規の予定を記入した後連続して2件目を記入する為にポータルの次の行をクリックする操作で頻発するためなんとか改善できないかと思い以下の2つのことを試しました。

                        A)次の行のポータルに予定を記入する=次の行がアクティブになったタイミング、と考えOnObjectEnterでもトリーガースクリプトを"OnExit"で呼び出せば何とかなるかと思い試しましたがダメでした。

                        B)ToDoカレンダー::ToDo一覧のLookupのタイミングに問題があるのかもしれないと考えて、計算式Lookup(ToDo予定::日別ToDo集計; "-") & Left(開始日;0) & Left(キー日付;0)に&Left(ToDo予定2::ToDo;0)や&Left(ToDo予定2::日別ToDo集計;0)などを追加しましたがやはりダメでした。

                        • 9. Re: スケジュールをカレンダー状に表示したい
                          hiro_

                          > ただ「ToDo予定2::ToDo」に新規の予定を記入した直後に(1)「ToDo予定2::ToDo」(2)「ToDoカレンダー::ToDo一覧」(3)「ToDoカレンダー::開始日」をクリックするとやはりカレンダー上の「ToDoカレンダー::ToDo一覧」に変更が反映されるタイミングにズレが生じました。(1)〜(3)いずれの場合もその後に画面上のその他の部分をクリックすればその時点で変更が反映されるので実用上は問題なく使えそうです。
                          ●OnExitイベントはレコード確定と同意語でないのに安易に省略代用しているのが原因ですね。
                               対策はOnExitトリガスクリプトに「レコード確定」ステップを明示的に追加すると即時反映(確定内容表示)します。

                          > 計算式Lookup(ToDo予定::日別ToDo集計; "-") & Left(開始日;0) & Left(キー日付;0)
                               ●トリガ要素はなくても問題無い様なので計算式はLookup(ToDo予定::日別ToDo集計; "-")にしてください。

                          別件ですが、表示月が移動しても前指定の日付予定ポータル内容が残っているのは不自然なので、
                               指定月と表示月が相違する場合、キー日付をクリアリセットするようフィールド設定を変更しました。
                               なお、このクリアリセット変更に伴い、(3)は開始日ボタンスクリプトにも「レコード確定」ステップを追加する必要があります。

                          上記修正したサンプルを再アップしましたので修正内容をご確認下さい。
                               ●UpDateサンプル「ToDoカレンダv2.fp7」→ http://yahoo.jp/box/rOzZyZ

                          • 10. Re: スケジュールをカレンダー状に表示したい
                            ishib

                                 Hiroさん、新しいサンプル確認いたしました。先述の(1)〜(3)、月表示の切り替えも問題なく動作しました。まだ私の理解が未消化な部分もありますが、今回のサンプルを通じて色々勉強することができました。ありがとうございました。

                            • 11. Re: スケジュールをカレンダー状に表示したい
                              sago350@未来Switch

                                   ファイルメーカー社のWebセミナーで下記テーマのものがありますよ。

                                   「ExecuteSQL関数とWebビューアで作るカレンダー」
                                   http://www.filemaker.co.jp/support/webinars/filemaker.html#02_09

                                    

                                   サンプルファイルも下記からダウンロードできます。
                                   ※TechNetの登録が必要です(無料)
                                   https://fmdev.filemaker.com/thread/66725

                              • 12. Re: スケジュールをカレンダー状に表示したい
                                ishib

                                     sago35さん、お返事送れて申し訳ありません。

                                     Webセミナー拝見しました。ExcecuteSQLを覚えるとリレーションを複雑に設定することなく目的のレコードを表示する事ができそうです。まだ時間が取れずセミナーやサンプルに全て目を通せていないのですが週末に色々試してみたいと思います。情報ありがとうございました。