日付フィールドでない、単純なテキストで日時を受け取った際にFileMakerに日付や時刻、タイムスタンプタイプのフィールドにデータをセットする際の動きについて、改めて整理してみました。
これをまとめておこうと思ったのは、よくある(?)Webサイトからのお問い合わせなどで日時が「2020年1月10日(金) 10時20分」というような形でインポートしたデータが、そのまま日付やタイムスタンプタイプのフィールドにセットできなかったからです。
FileMaker バージョン
今回のサンプルは、GetAsTimeStampを利用、また、カスタム関数を利用しているので、FileMaker Pro 7.0以上を対象としています。
動き
ここの動きでは、「2019年9月1日(日) 14時00分」と入力されたら、タイムスタンプタイプのフィールド:予約日時にタイムスタンプとして「2019/09/01 14:00」が設定されること、です。
仮に”/”で区切られた日時テキストの場合の変換もついでに出しています。
「え、これ、FileMakerでタイムスタンプタイプのフィールドに入れたらそのまま入るんじゃないの?」と思うでしょ?
レイアウト設定で設定しようにも、単なるテキストフィールドなので表示自体もタイムスタンプとして理解されません。
そしてこのテキストに入ったタイムスタンプっぽいデータを単純にタイムスタンプフィールドに設定すると、
こんな感じで「あんた誰?」的に受け付けてくれません。
「単純にセット」ボタンは、本当に単純にフィールド設定しているだけです。
もちろん、「年月日」のようなものではなく、”/”で区切られたタイムスタンプっぽいデータは、単純にフィールド設定してもタイムスタンプとして認識されます。
試しに下にあるボタン:GetAsTimestamp関数でもやってみましたが、「年月日」では認識されませんでした。
“/”区切りは、もちろん大丈夫です。
つまり、敵は日本語。
時間や時刻を区切る記号以外全般かもしれませんが、とにかくそういうルールに則っていない形式のタイムスタンプっぽい表記は変換が必要、ということになります。
テーブル設計
何も計算など設定していません。
単純にテキストフィールドやタイムスタンプフィールドを実装しています。
年月日のサンプルだけであれば、青枠部分の2フィールドのみの実装です。
スクリプト
3つの書き方を提示しますが、全て同じ内容を様々な方法で実装できますよ、ということをここではご紹介します。
(1) 変数を使いながら構築する
良い悪いは別として、一番何も考えずに実装するケースです。
キモになる部分は、赤ワクで囲ったテキストデータの変換です。
最初に曜日から変換します。
「年月日」から変換してしまうと、仮に曜日が月曜日である「(月)」の場合、変換されてしまうからです。
「(月)」は「(月)」として変換したいので、先に変換して置換の候補にならないようにしておきます。
曜日文字列を消し、年月日文字列を”/”に置換、時間区切りは”:”に置換します。
ここまでやれば、タイムスタンプタイプに変換しても大丈夫です。
(2) Let関数で短く実装する
Let関数を利用すれば、1行で済みます。
(1)の内容で変数マークを”$”から”%”に置き換えて実装しただけです。
1行で済むなんて!
(3) カスタム関数にして利用する
こんな便利なやり方、ここだけの話にしてはもったいないですよね!?
カスタム関数として、このファイル内どのスクリプトからも利用できるようにしておきましょう。
かっちょえぇ。
内容は今までのスクリプトと同様ですが、ローカル変数である”$”ではなく、”%”を使いたいので、そこだけ修正します。
と、書いているけれど
他にも方法があったら、ぜひおしらせください。
関数とかみて、”年”,”月”,”日”にテキスト変換するのはあるけれど、年月日曜日などのテキストから日付関連タイプに変換するのって無いなぁと思って書いてみましたが、実はこれ使えます、というのもよろしくお願いします。
数字部分を抽出してDate関数で、、、というのも考えたのですが、数字を抽出するよりも、FileMakerの日付関連タイプとして扱える形にした方が他にも応用が効くかな?と思った次第でした。
サンプルファイル
Githubにサンプルを公開しています。
timestampTest.fmp12
ダウンロードして実際に触ってみてください。
このサンプルファイルではテキストデータとして5件のサンプルが入っています。
FileMaker Pro Advanced 18で作成しましたが、最初に書いた通り特に最新バージョンの関数などは使用していません。
FileMaker Pro 12以上で実行してみてください。