http://FMPro.info  FileMaker Pro 関連総合ポータルサイト

CalStack 関数

カテゴリー : 日付
計算結果のデータタイプ : テキスト
対応FileMakerバージョン : 対応 7  対応 8  対応 8.5  対応 9  対応 10  対応 11  未対応 12  未対応 13  未対応 14  未対応 15
作者 : 社本修司 株式会社ジェネコム

概要

指定する月・年から休日が赤で表示されるカレンダーを返します。

構文

CalStack ( 月 ; 年 ; カウンター )

引数

引数名タイプ備考
数字1-125
数字4桁2006
カウンター数字0 のみ0

別のウィンドウで、引数の値を変更してテストすることが出来ます

CalStack ( 5 ; 2006 ; 0 )

結果

Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31         

/*==============================================================

  カスタム関数    CalStack ( 月 ; 年 ; カウンター )

  CopyRight©2004,SHAMOTO Syuji
  <http://www.FMPro.jp>

  カスタム関数の中で、自分自身を再起的に呼び出して計算させることができます。
  再起呼出しを利用した例題的な意味でのカレンダー関数です。
  CalStack ( 1; 2005; 0 ) の形で指定します。
  最後の "0" (引数名:カウンター)は、再起呼出しのカウンターとして使用するので、必須で
  値も必ず "0" を指定する必要があります。
  本来ユーザーが意識しなくてもいいような引数を指定しなければいけないのと
  再起呼出しをせずに作成した関数に比べると動作が多少遅くなるのが難点です。
  
  このカスタム関数を引用するに当たっては、必ずコメントも一緒に引用してください。

=============================================================*/


//-------------------------------------------------------------------------
// 祝日の判定に HolidayJ 関数(カスタム関数)を使用
// HolidayJ 関数は <http://www.FMPro.jp> を参照のこと
//-------------------------------------------------------------------------

Let
(

    [  // === Let_Start ==================================

    HOLIDAY_COLOR = RGB ( 255 ; 0 ; 0 ) ;            // 休日の色(赤)
    TODAY_COLOR = RGB ( 0 ; 128 ; 0 ) ;            // 今日の色(緑)

    COUNTER = カウンター ;                     // 再起呼出し用のカウンター
    Y = 年 ;                             // 指定年(4桁数字)
    M = 月 ;                             // 指定月(1-12)

    FIRST_DATE = Date ( M ; 1 ; Y ) ;                  // 朔日の日付
    LAST_DATE = Date ( M + 1 ; 0 ; Y ) ;             // 晦日の日付

    //----------------------------------------------------------------------
    // カレンダーの最初に表示すべき日の1日前
    // 2005年1月だったら1日が土曜日なので前月の26日
    // の1日前である前月の25日
    //(COUNTERが実質+1から始まるので1日前の日付がいる)
    //----------------------------------------------------------------------

    START_DATE = FIRST_DATE - DayOfWeek ( FIRST_DATE ) ;

    //----------------------------------------------------------------------
    // カレンダーの最後に表示すべき日
    // 2005年1月だったら31日が月曜日なので翌月の5日
    //----------------------------------------------------------------------

    END_DATE = LAST_DATE + 7 - DayOfWeek ( LAST_DATE ) ;

    //----------------------------------------------------------------------
    // カレンダーに表示すべく日数(空白含む)
    // 再起呼出しを抜けるトリガーになる
    // 7日 * 6週 =42 の決めうちでもいい
    //----------------------------------------------------------------------

    END_NUM = END_DATE - START_DATE ;

    //----------------------------------------------------------------------
    // 後に再起呼出しでカウンターを1増させ
    // カレンダーの最初の日に足していく
    // この日を実行日とする
    //----------------------------------------------------------------------

    CARENDAR_DATE = START_DATE + COUNTER ;

    //----------------------------------------------------------------------
    // 実行日の日(Day)を2桁に揃えておく
    //----------------------------------------------------------------------

    CARENDAR_DAY_TEMP =
   Case (
       Month ( CARENDAR_DATE ) = M ;
           Right ( " " & Day ( CARENDAR_DATE ) ; 2 ) ;
            "  "                    // 実行日の月と指定月が違う場合は空白2つ
    ) ;

    //----------------------------------------------------------------------
    // 実行日の日に装飾(色付・下線)
    //----------------------------------------------------------------------

    CARENDAR_DAY =
   Case (
       Month ( CARENDAR_DATE ) = M and
        CARENDAR_DATE = Get ( 日付 ) ;                 // 今日
           TextColor ( TextStyleAdd ( CARENDAR_DAY_TEMP ; 下線 ) ; TODAY_COLOR ) ;
       DayOfWeek ( CARENDAR_DATE ) = 1 or
        not IsEmpty ( HolidayJ ( CARENDAR_DATE ) ) ;         // 休日
           TextColor ( CARENDAR_DAY_TEMP ; HOLIDAY_COLOR ) ;
            CARENDAR_DAY_TEMP                // それ以外はそのまま
    ) ;

    //----------------------------------------------------------------------
    // 曜日ラベル
    //----------------------------------------------------------------------

    LABEL =
   TextColor ( "Su" ; HOLIDAY_COLOR ) & " Mo Tu We Th Fr Sa"

    ] ; // === Let_End ==================================


    //----------------------------------------------------------------------
    // 等幅Fontを指定;"Courier New";"Osaka−等幅"
    // Mac,Win共通で利用できる"Courier New"を指定
    //----------------------------------------------------------------------

   TextStyleAdd ( TextFont (

       Case (
            //===========================================
            // Caseの条件
            //===========================================

            //---------------------------------------------------------------
            // COUNTER が END_NUM に達していなかった時のみ計算
            // COUNTER をどこで止めるか指定しないと無限に呼び出されてしまう
            // (無限といってもFileMakerの仕様上10,000回の上限ありなので無限ループにはならないが)
            // ついでに年・月ともに指定されていない時も計算しないようにしている
            //---------------------------------------------------------------

            not ( IsEmpty ( M ) or IsEmpty ( Y ) ) and
            ( COUNTER ≤ END_NUM ) ;
            
                //========================================
                // Caseの結果1
                //========================================

                //------------------------------------------------------------
                // 最初のみ曜日ラベルを それ以外は CARENDAR_DAY(2桁の数字ないし空白)
                //------------------------------------------------------------

               Case ( COUNTER = 0 ; LABEL ; CARENDAR_DAY )

                //------------------------------------------------------------
                // COUNTERが7で割切れる時は改行をそれ以外の時はブランクを & で結ぶ
                //------------------------------------------------------------

                 & Case ( Mod ( COUNTER ; 7 ) ; " " ; "¶" )

                //------------------------------------------------------------
                // COUNTERを1増しながら自分自身の関数を呼び出したものを & で結ぶ
                // 2回目以降の呼び出し時にはCOUNTERが "0" 以上になっているので
                // CARENDAR_DAY(2桁の数字ないし空白) のみが & で結ばれる
                // 関数名を変更する場合ここも変更する必要があるので注意
                //------------------------------------------------------------

                & CalStack ( M ; Y ; COUNTER + 1 ) ;

                //========================================
                // Caseの結果2
                //========================================

                //------------------------------------------------------------
                // 最初の条件(COUNTERが指定数以内か)に合わない場合は
                // CalStack 関数を呼び出さないことでループを抜ける
                // Case関数の結果2はいらないが、読みやすいように明示
                //------------------------------------------------------------

                ""

        ) ;

    "Courier New" ; 英語 ) ; 太字
    )
)

// ©2004,SHAMOTO Syuji <http://www.FMPro.jp>

エンコードは Unicode (UTF-8)、改行タイプは LF (Unix) 形式のテキストとして保存します。
テキストエディタで正常に開かない場合は、エンコードを指定してファイルを開くようにしてください。

詳細説明

カスタム関数の中で、自分自身を再起的に呼び出して計算させることができます。
再起呼出しを利用した例題的な意味でのカレンダー関数です。
祝日の判定にHolidayJ関数(カスタム関数)を使用しています。
CalStack ( 1; 2005; 0 ) の形で指定します。
最後の "0" (引数名:カウンター)は、再起呼出しのカウンターとして使用するので、必須で
値も必ず "0" を指定する必要があります。
本来ユーザーが意識しなくてもいいような引数を指定しなければいけないのと
再起呼出しをせずに作成した関数に比べると動作が多少遅くなるのが難点です。

この関数が使用する他のカスタム関数

この関数を使用する他のカスタム関数

注意:ここで紹介されているカスタム関数をご自分のシステムに組み込んだ場合に発生した問題についてはFMPro.infoは責任を負いません。

Copyright © 2004-2009 FMPro.info All Rights Reserved.