みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
FMpro13、Win8です
先日はありがとうございました。
Macminiがまだ納品されないのでもうしばらくこの環境です
さて現在、カレンダーから予約受付をするアプリを作っています。
Hiroさんのサンプルを参考に完成に近づいているのですが
ちょっと悩んでおります。
カレンダー画面で予約詳細のポータルを表示させていています
ポータル内には開始時間フィールド、終了フィールド、名前があり
開始時間は9:00から23:00まで1時間おきの値一覧で入力してもらう仕組みにしてあります
終了時間も10:00から24:00までの値一覧です。
開始時間で14:00を選択したら終了時間の値一覧は15:00から表示させたいのですが
いろいろ調べてやってみたのですがなかなかうまくいきません。
世にある予約サイトでは当たり前のように行われていることだと感じていて
簡単にできると思ったのですが・・・
どなたかお知恵をお貸しいただけないでしょうか?
よろしくお願いいたします
Offline
目的の終了時間候補の一覧リストを計算フィールドに算出して、
これから(レコードIDの自己リレーションで)動的値一覧を作れば、
良いでしょう。
・「終了時間一覧」計算フィールド(式:ループ式で※下記)を作る。
・「レコードID」計算フィールド(式: Get(レコード ID))を作る。
・「レコードID」で自己リレーションを張る。
・自己リレーションの関連フィールド「::終了時間一覧」で動的値一覧を設定して完成。
※ループ計算式は、
Let([
$t=開始時間フィールド;
$res="";
$fnc="Case(IsEmpty($t) or $t=Time(24;0;0); $res;
Let([$t=$t+60*60; $res=List($res; $t)]; Evaluate($fnc))
)"
];
Evaluate($fnc)
)
Offline
もう少し簡単な思考で、、
別テーブルを作り、1レコードごと、
時刻フィールドに
10:00、11:00、・・・23:00、24:00
と入力します。
元のテーブルとリレーションを
開始時間 < 時刻
として、
このリレーションの動的値一覧を時刻フィールドで作ります。
Offline
Hiroさん、チポさんいつもありがとうございます
初心者でも簡単にできそうだったチポさんのを参考に早速やってみたのですが
予約時間は9時から翌朝8時までが一日の計算だったことをすっかり忘れておりました。
慌てて作り直していたのですが、時刻フィールドの値は9:00~32:00にしないと
うまく動的値一覧が働かないことが判明しました。
でも、値一覧の表示は25:00を1:00と表記させたいのですが
可能でしょうか?引き続きお知恵をお貸しいただけたら助かります・・・
Offline
値一覧の表示はできますが、
表示順がソートされ、
1:00
から並んでしまいますね。
それをさける方法は、、
別テーブルで計算フィールド1を作り、
24:00まではそのまま
25:00以降は1:00からとなる様に
計算入力。
もう一つ値一覧のソート用に計算フィールド2をつくり、
その計算式
Substitute ( 10 ^ Hour ( 時刻 ) - 1 ; "9" ; Char ( 8203 ) )
とします。
Char ( 8203 )
これは
ゼロワイズスペース
といって、不可視のスペースで、
時刻の「時」の数だけ並びます。
動的値一覧の第一フィールドを
計算フィールド1
第2フィールドを計算フィールド2
として、第2フィールドでソート指定します。
これでいいかな。。
Offline
私も >#5チポさん回答が、唯一解と思います。
ただ、
入力される値自体も補正値「1:00」の方になりますが、
この制約については宜しいですか?
Last edited by Hiro (2017-10-26 18:22:53)
Offline
チポさん、Hiroさんありがとうございます
チポさんに教わった通り
24:00まではそのまま
25:00以降は1:00からとなる様に
計算入力。
は時間2フィールドとし、
If ( Time ( 8 ; 0 ; 0 ) + 60 * 60 * Get ( レコード番号 ) > Time ( 24 ; 0 ; 0 ) ; Time ( 8 ; 0 ; 0 ) + 60 * 60 * Get ( レコード番号 ) - Time ( 24 ; 0 ; 0 ) ; Time ( 8 ; 0 ; 0 ) + 60 * 60 * Get ( レコード番号 ) )
としました。これしか思いつかなかったのですが
他にすっきりする計算式があれば教えてください・・・
次に、
もう一つ値一覧のソート用に時間3フィールドをつくり、
その計算式
Substitute ( 10 ^ Hour ( 時間2フィールド ) - 1 ; "9" ; Char ( 8203 ) )として値一覧を設定してみたのですが
うまくならびません。1:00から24:00まできれいに整列してしまいます。
しかも開始時間<時間2でリレーションしているのに
開始時間を14:00としても1:00から表示されてしまいます
時間2,3ともにunicordにもしました。あと、何処を直せばよいでしょうか?
Hiroさん。確かに料金計算をするときに困るかもしれません。
この問題を解決させてからじっくり考えてみます
Offline
25時以上の時刻の補正は
時刻 - Case ( 時刻 > Time ( 24 ; 0 ; 0 ) ; Time ( 24 ; 0 ; 0 ) )
でいいのですが、、
提示された計算式の
Get ( レコード番号 )
は何をしているのでしょうか?
まったく理解できません。
まずこれが分からないと前に進めないですね。。
Offline
チポさん
すみません・・・
新しいテーブルに9時から32時までを計算で表示させる
と、いう計算がどうも思いつかなくて
8時+レコード番号1×60分=9時
8時+レコード番号2×60分=10時と表示させてなんとか思い通りの答えを出させたのですが・・・
値一覧を作るときって、1レコードに1つ値を登録して作ると思って計算式を作ってみたのですが(認識不足ですみません)
もっと、すっきりした計算方法あるんだろうなぁと思いつつも
これが私の今日の精一杯でした
Offline
ああ、理解できたような。。
もう少し簡単な方法を、
時刻フィールドの入力値の自動化・計算式・既存値置き換えで、
Self + 3600
として、
最初にレコードを作り
8:00:00
と入力します。
後は、32時になるまでレコードコピーを繰り替えせばいいですね。
レコードコピーは
Ctrl+D
を押しっぱなしにすればどんどん作ってくれます。
最初から補正した時刻ではなく、
32時までのフィールドが必ず必要です。
それを補正したフィールドが私の前レスの計算フィールド1です。
その計算式は
時刻 - Case ( 時刻 > Time ( 24 ; 0 ; 0 ) ; Time ( 24 ; 0 ; 0 ) )
でいいですね。
リレーションは、補正した計算フィールド1ではなく、
元の時刻フィールドと照合させます。
ソート用のフィールドも
Substitute ( 10 ^ Hour ( 時刻 ) - 1 ; "9" ; Char ( 8203 ) )
と、計算フィールド1ではなく、時刻フィールドを使います。
Offline
https://fm-aid.com/bbs2/viewtopic.php?id=4030
の私のサンプルは参考になりませんか。UI は違いますが、動きはわかりやすいはず。
Offline
遅らばせながら、忘れ物です。
もう一つ値一覧のソート用に計算フィールド2をつくり、
その計算式
Substitute ( 10 ^ Hour ( 時刻 ) - 1 ; "9" ; Char ( 8203 ) )
とします。
この計算フィールド2の設定説明で、もう一つ重要な設定を忘れています。
この計算結果の索引言語を「unicode」へ設定変更してください。
この「ゼロ幅文字」によるソート運用には、unicodeが必須条件です。
Offline
そのフィールドのソートには索引がUnicodeで或る必要がありますが、
なぜか!
値一覧のソートには必然ではないようですよ。
索引が日本語、
値一覧のソート設定も日本語で
大丈夫のようです。
Offline
#12の説明通り、
unicode索引変更は、計算フィールド2に必須と申しています。
値一覧については言及しておりません。(変更必要ないので)
Offline
んん、
言われていることが理解できません。
計算フィールド2は
値一覧のソートのためだけに必要なもので、
そのソートに索引がUnicodeであることは必須ではないです。
ですから、
Hiroさんの#12の真意が理解できかねます。
Offline
チポさん
私は勘違いをしておりました。ベースとなる9時から32時までの時刻フィールドデータは必要で
それを元に補正値計算させるのですね
ベースの時刻フィールドと補正計算とソートのための計算フィールドは
力不足で別テーブルで作れなかったので(リレーションが必要なんですか?)
同じテーブルに作りました。
今朝からうまくいかず、悩みに悩んでいたところの
Hiroさんの助言でなんとか9時からソートされました!
開始時間を14時にしても9時からになってしまいます・・・くやしい・・・
リレーションなど考えられるところはいじってみたのですが・・・力不足ですみません
Offline
この手法のソートに必要な言語関連個所は2か所あり、
「値一覧」自体とその「ソート指定フィールド」の索引設定です。
その内、「ソート指定フィールド」のゼロ幅文字列には、unicode言語変更が必須、
という意味です。
Offline
Hiroさん
#13でも書きましたが、
どちらにもUnicodeが必須ではないようですよ。
jun1さん
別テーブルでの設定が必須です。
その別テーブルとのリレーションも必須です。
元のテーブルではメチャメチャになってしまいますよ。
Offline
チポさん、ありがとうございます
やっぱりそうでしたか・・・
別テーブルにしてベースの時刻フィールドと補正計算フィールドで
リレーションしたらフリーズしてしまったのですが
この場合は各レコードにIDをつけてIDでリレーションになるのでしょうか?
結局のところ何でリレーションしてよいのかわからず・・・
Offline
最初に書きましたが、
リレーションは
元テーブル::開始時刻 < 別テーブル::時刻
↑
補正前の10:00〜32:00までの時刻です
とします。
照合は「=」ではないですよ「<」としなければダメです。
フリーズ!
原因は分かりません ;;;;
Last edited by チポ (2017-10-31 16:42:32)
Offline
チポさん。すみません、話を整理させてください。
予約詳細テーブル::開始時間フィールド、終了時間フィールド、名前フィールド
値一覧用の時間テーブル::時刻フィールド
予約詳細テーブル::開始時間フィールド<値一覧用の時間テーブル:時刻フィールド
となっていました。
さらにここに
時間補正テーブル::補正フィールド、ソート用フィールド
を作ろうと思って頑張っています。
時間補正テーブルと値一覧用の時間テーブルをリレーションで結ばないと
値を引っ張ってこられないと思うのですが
私は何をどう、勘違いしているのでしょうか・・・
Offline
> 時間補正テーブルと値一覧用の時間テーブルをリレーションで結ばないと
> 値を引っ張ってこられないと思うのですが
リレーションで照合された関連レコードの全てのフィールドを参照できます。
ですから、私が書いたリレーションだけで他は必要ないです。
> 時間補正テーブルと値一覧用の時間テーブル
これが間違いです。
別テーブルは一つのみ必要で、そのフィールドは
時刻 (10:00〜32:00)
時刻補正 (前記の計算フィールド1)
値一覧ソート用(前記の計算フィールド2)
これが必要です。
値一覧は
第一フィールド 時刻補正
第二フィールド 値一覧ソート用(このフィールドでソート指定)
と設定します。
補正された時刻を元に戻すのは予約詳細テーブルで計算できます。
Offline
チポさん、Hiroさん、Shinさん
できましたーーー
長いことお付き合いいただきましてありがとうございました。
おかげで思い通りに動くようになりました!!感激です
今回も大変お世話になりまして本当にありがとうございました
Offline
Pages: 1
[ Generated in 0.007 seconds, 10 queries executed - Memory usage: 637.84 KiB (Peak: 670.75 KiB) ]