みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっています。
初心者です。
検索をかけると同じところでつまづく方が多いのかな、と思いましたが、
リレーションシップを貼り、関連するテーブルにレコードが自動でできるようにしたい場合の方法について質問したいです。
●以下のことはわかりました。
キーになるフィールドでリレーションシップを貼り、
このリレーションによって関連レコードの作成を許可するにチェックをつけただけではレコードが作成されない。
方法としては、スクリプトや、スクリプトトリガを使用する。
検索したところ、この記事が使えそうでした。
https://memo.poo.tokyo/関連レコードへ移動する際に、関連レコードが無/
ここに下記のような式が載っていたのですが、
これを、どこに設定するべきのでしょうか…。
■式
If[IsEmpty(テーブルB:フィールドB)]
フィールド設定[テーブルB::フィールドB.テーブルA:フィールドA]
End If
関連レコードへ移動[テーブル:「テーブルB」;使用するレイアウト「テーブルB」(テーブルB)]■動作
テーブルAのフィールドAに関連したテーブルBのフィールドBに関連レコードが無い場合は、新規の関連レコードを作成する。
その際、フィールドAに入力されている価をフィールドBに自動入力されるようにする。
思いついたのは、関連レコードを作成したいフィールドの、入力値の自動化の【計算式】なのですが…
これでは、スクリプトじゃないな…と思い…。
試してみようとも思ったのですが、
初心者で、常識的なことがよくわかっていないまま触っているので、
ある程度検討をつけてからでないと泥沼にはまってしまい、
どんどんファイルがおかしくなっていくという経験をしたので、
いじる前に知恵をお借りしたいと思いました。
どなたか教えていただけないでしょうか。
よろしくお願いいたします、
Hiroさん
ありがとうございます!
チポさん
どうしてもうまくいかないので、
出社と退社の区別を持たせるためのフィールド:種別フィールドへの入力は、
出社ボタン>スクリブトで打刻フィールドに時刻を、種別フィールドに「出社」と
退社ボタン>スクリプトで打刻フィールドに時刻を、種別フィールドに「退社」と入力することにしました。
計算式色々教えていただいたのに、済みません。
リレーションの確認のためにポータルを置いてみます。
打刻管理テーブルのレコードに社員IDと日付が入力されていますか?
いえ、入力がされません....
レコードの作成を許可、には管理テーブルの方にチェックがついています。
> 上記の計算式を打刻テーブルの、打刻時間(フィールドタイプは時刻)に設定しました
「出社」「退社」を表示するのですから、
フィールドタイプはテキストですよ。
済みません、打刻種別と間違えました。今後種別とすることにします。
> レコードが一切ない状態で、新規レコードを追加をクリックした直後は「出社」と表示されています。
> しかし社員IDを入力すると、退社に切り替わってしまうのです
ああ、ごめんなさい
Case ( IsEmpty ( 打刻テーブル2::社員ID ) or 打刻テーブル2::打刻種別 = "退社" ; "出社" ; "退社" )
これ、間違えています
Case ( IsEmpty ( 打刻テーブル2::社員ID ) or 打刻テーブル2::打刻種別 = "退社" ; "出社" ;
打刻テーブル2::打刻種別 = "出社" ; "退社" )
こうしないとダメです。
お詫びして訂正お願いいたします-_-
さらに、社員IDが入力されるまで自動入力されない様に
Case ( IsEmpty ( 社員ID ) ; "" ;
IsEmpty ( 打刻テーブル2::社員ID ) or 打刻テーブル2::打刻種別 = "退社" ; "出社" ;
打刻テーブル2::打刻種別 = "出社" ; "退社" )
こうした方がいいかもですね。
上記、ありがとうございます、
しかし、やはり、社員IDと社員名が入力された途端に、勝手に切り替わって全部退社になってしまいます。
なぜ切り替わってしまうのか、全くわかりません…。
社員IDをプルダウンから選んで入力すると、確認のために社員名が自動入力されるように別なオカレンスでリレーションを組んであります。
これが原因でしょうか???
別なリレーションにしてあるのですが…
色々いじっていてどんどん壊れていきます。。。。。
チポさん
おはようございます
打刻管理テーブルと打刻テーブルとのリレーション
打刻管理テーブル 打刻テーブル
社員ID = 社員ID
and
日付 = 日付
ここまではできました!
打刻管理のレイアウトに
このリレーションのポータルを置いて2行に設定、
各フィールドを配置
ポータルを置かなくてはいけない理由がよくわからず…
まだ、打刻のレイアウトがうまく機能していないせいか、test中に入力した打刻テーブルのデータから反映されてできるはずのレコードもできていません。
表示もされません。
状況は下記です…。
・打刻管理のレイアウトが表示するテーブルには打刻管理テーブルを設定しました
・ポータルを置き、ポータル設定の最初の行は一のまま、行を2に設定しました。
・関連レコードを表示には打刻テーブルを設定してあります。
・ポータルの中には、housekeepingのために使うフィールド以外のフィールド全部を置きました。
>>社員ID・日付・打刻種別(出社か退社か)・打刻時間・休憩有無・区分(遅刻早退など)
済みません、
アドバイスいただけますでしょうか。
区分の入力値の自動化・計算値の計算式を
Case ( IsEmpty ( 打刻テーブル2::社員ID ) or 打刻テーブル2::打刻種別 = "退社" ; "出社" ; "退社" )
上記の計算式を打刻テーブルの、打刻時間(フィールドタイプは時刻)に設定しました。
試しに打刻をしてみたのですが、一番最初のレコードを作るときには確かに打刻種別に「出社」と自動入力されていました。
しかし動きがおかしいです。
レコードが一切ない状態で、新規レコードを追加をクリックした直後は「出社」と表示されています。
しかし社員IDを入力すると、退社に切り替わってしまうのです。
どうしようと思い、こんな式も試してみましたが今度は自動入力がされず…w改悪でした。
Case ( 打刻_2::打刻種別 = “退社” ; “出社” ; 打刻_2::打刻種別 = “出社” ; “退社” )
何が原因か思い当たることはありますでしょうか?
それから、リレーションでソートはしてあるものの、なぜ、この設定で、直前の同一社員IDのレコードを参照して、反映させることができるのかが、リファレンスを読んでもよくわからないのです。直前のレコードを参照できている(この言い方にも実感がわきません)というのは、なんの設定によるのでしょうか。式は参照のフィールドを設定しただけのように見えます。レコードまで指定ができているのでしょうか。特定のレコードの、特定のフィールドの値を参照して新規レコードの入力値に反映している仕組み=設定がよくわからないのです。
チポさん
ありがとうございます。
ソート指定は打刻テーブル2だけです。
>対応しました。
ありがとうございます。
区分の入力値の自動化・計算値の計算式を
Case ( IsEmpty ( 打刻テーブル2::社員ID ) or 打刻テーブル2::区分 = "退社" ; "出社" ; "退社" )
でいいでしょう。
上記についてなのですが、区分は、遅刻早退、通常出勤か、などのデータをもたせています。
打刻テーブルに、出勤なのか、退社なのかを示すデータを持つフィールドを作って、対応すれば同じことができますか?
例えば、(種別="退社" ; "出社" ; "退社")です。
チポさん
shinさん
色々とありがとうございます。
出勤と退勤の時間を入力するテーブルとレイアウトは出来上がったので、
2日ぶんほどレコードを作り、
打刻管理テーブルにレコードが反映されるか試しています。
しかし、反映はされません。
打刻管理(参照テーブルは打刻管理)、という名称のレイアウトを作り、リスト形式でデータが見られるようにしようと思い、
フィールドは並べたのですが、全くデータが反映されません。
テーブルオカレンスを通して、レイアウトにデータが反映される、
という抽象的なことしか本には書いてなくて、
実際にどうすればいいのか書いてなくて全く見当がつきません。
リレーションはつくったはずなのに何故なのか、
全くわからないです。
「このリレーションを利用してレコードを作る」のチェックは打刻管理テーブルの方についています。
「=」以外のリレーションは作っていません。
何がいけないのか見当がつきません。
そもそも、打刻管理というテーブルは必要ないのでしょうか?
リレーションの線がうまく引けず、エラーが出て、オカレンスがどんどん増えていってしまいます。
レイアウトに対応させるべきオカレンスがどれかよくわからなくなってしまいました。
打刻管理、というレイアウトだけ作り、
打刻テーブルのデータをリレーションシップでどうにかして、見せる。
そういうことでしょうか
打刻管理テーブルという一覧のデータを持つテーブルは、
作るとしたら最後に作った方がいいのでしょうか。
センスがなさすぎて何から手をつけていいのかわかりません。
> 直前のレコードが対応する社員の出勤レコードである保証はない
言葉足らずでしたか・・
同一従業員の直前のレコード
と言ったつもりでした。
そのレコードを参照する自己リレーション(Shinさんの考えとほぼ同じですが、、)
打刻テーブル 打刻テーブル2
従業員ID = 従業員ID
and
レコード順 > レコード順 (レコード固有のシリアル番号等、作成順が分かるフィールド)
レコード順の降順でソート指定
この参照レコードがないか、退社ならば出社とし、
出社ならば退社と考えられますね。
上記の、丁寧にありがとうございます。とてもわかりやすいです。
チポさんに頂いた通りに一つテーブルオカレンスを作って見たのです。
3点質問があります。
レコード順(record_idを作ってありましたのでそれでやっています)でのソートはどちらのオカレンスにつければ良いのでしょうか?
両方ですか?
出勤時間を表示するためのTOのほうだけで良いのでしょうか?
(ソートをするのは同一社員の直前レコードを見つけるためですよね…??)
この参照レコードがないか、退社ならば出社とし、
出社ならば退社と考えられますね。
というのは、直前の出社レコードがない、
もしくは、退社であったなら、これから入力しようとしているレコードは退社時間のレコードとして扱う、ということですよね?
この設定をしたことによって、どこにこれが反映されて何が起きるのかが、わかりません。
試せば良いのでしょうが、基準になる動きもよくわからないため、試してもよくわからない、でおわってしまいます。
またそれを、どのようにしてしかるべきテーブルのしかるべきフィールド(フィールド名は退社時間でしょうか)に反映させることができれば良いのか…。
まとまりもなくなってきてしまい申し訳無いです。
すみませんがよろしくお願いいたします。
チポさん
遅い時間にもかかわらずありがとうございます。
連続24時間以上の勤務は発生しません。
ラジオボタンの方が良いのですね。
変更して試してみます。
> 区分をまたプルダウンで選択し
直前のレコードが退社なら出社、出社なら退社。
と判断できるなら自動入力できますね。
直前のレコードが対応する社員の出勤レコードである保証はないのです。。
そうなると自動化は難しいのでしょうか。
> 退勤時間だけ、48時間制で入力する、というようなことが可能なのでしょうか
前の出社レコードが前日なら、
日付を -1
時刻を +24時間
計算入力できますね。
日付をまたぐ時だけ上記のような処理ができるボタンか何かを設定すれば良いでしょうか。
Shinさん
ありがとうございます。
日をまたぐ勤務は、しょっちゅうあるわけではないのですが、発生することがあります。
打刻については、要求されている仕様が、手入力ではなく、ボタン入力です。
ボタンクリックなどで取得するのでしたら、48時間制での入力は不可能で、何らかの修正が必要です。
修正が必要なものならば、タイムスタンプで取得しておいて、直近の出勤時刻との関連をみて出勤との関連付けをしたほうが簡単かも。
とのことですが、直近の出勤時間との関連を見て出勤との関連づける、
というのを目視で行うという意味でしょうか?
ただ、自分はかなりの初心者なので、あまり凝ったことは考えず、まずは記録ができるようにリレーションをしっかり作りたいです。
今もFileMaker触っているのですが、思うようにデータが反映されないです。
リレーションの設定で、
『このリレーションを利用しれレコードを作成する』にチェックをつけているにもかかわらず、
レコードが作成されません。
原因がよくわかりません。
何から見直すべきでしょうか
チポさん
ありがとうございます。
打刻記録用テーブルはできましたか?
打刻(管理者)テーブルはできましたか?
このテーブルに打刻記録用テーブルのレコードの表示はできましたか?
(テーブルの命名がしっくりこないな!)
まず、これをクリアしてから次に進むべきですよ。
今日少し作業を進められました。
テーブルの名称ですが、
打刻(管理者)テーブル >>> 打刻管理テーブル
打刻記録用テーブル >>> 打刻テーブル
としてみました…
どうでしょうか
今日は、打刻テーブルのレイアウトで入力ができるようにしました。
新規レコード作成すると年月日と打刻時間が自動入力され、
従業員コードをプルダウンで選択すると対応する社員名が出てくるのでそれで確認、
区分をまたプルダウンで選択し、
休憩有無もプルダウンで選択できるように設定しました。
とりあえず思った通りに動くようにできましたが、
管理者テーブルとの兼ね合いで変更の可能性もありそうですね。
まだ自分にはうまく思い描けませんが…。
先に管理者用のテーブルに取り組む方が良かったのですね…
次の作業はそれにします!
タイムスタンプだとかえって面倒なのですね。
退勤時間だけ、48時間制で入力する、というようなことが可能なのでしょうか。
それは、やはり出勤時間テーブルと退勤時間テーブルを設けてそれぞれで管理するということでしょうか…
色々考えすぎても進まないので、まずは管理者用の打刻管理テーブルに、打刻テーブルのデータが表示できるレイアウトを作ることに専念します。
連日、ありがとうございます。
Shinさん
ありがとうございます。
打刻用テーブルでは、タイムスタンプで日時を持たせておいたほうが、後々便利でしょう。
休息は、1日分を集計するテーブルで持たせたほうがいいと思います。
●上記について、タイムスタンプとは、スクリプトのtimestampのことですか?
それともフィールドタイプのことですか?
フィールドタイプをタイムスタンプにするということかな、と理解したのですが、
調べていたらスクリプトにもありましたので、確認させていただきたいと思い…。
●また、1日分を集計するテーブル、ということですが、
上司からもらった仕様にはそのようなことは書かれておらず、
ひと月ぶんまとめて集計ができれば良いとのことでした。
それに関して、
上記のようにひと月ぶんの集計をしたい場合、
それを可能にするには、1日ぶんの勤務時間を集計するためのテーブルが必要、ということでしょうか?
簡単な少し複雑になってくると、
どこを出発点にすれば良いのかが定められず、
しつこく聞いてしまって申し訳ないです。
ご回答いただけましたら大変ありがたいです。
チポさん
諸々、ありがとうございます。
まず打刻記録用テーブルを作ってみます。
休憩有無についてですが、
休憩をとったかとっていないか、という記録を持たせたいとのことです。
あれば、一律で勤務時間から60分を引く計算です。
休憩有無は、打刻用テーブルでデータを持たせるとして、
入力は退勤時にすれば良いか、と考えています。
Hiroさん
度々すみません
Let (
[
#D=Get(日付);
#PreM= Date( Month ( D )-1 ; 1 ; Year ( D ) )
];
Year(#PreM) &"/"& Month(#PreM) & "/*"
)
ということでしょうか?
これは、自動的に先月の1日の日付を得るための計算式、ということになりますか?
Hiroさん
ご丁寧にありがとうございます!
>>>>>>例示された式内に誤りが在るようです。
>>>>>>誤り修正と見易くした補正式は、
Let (
[
#D=Get(日付);
#PreM=Date(Month(#D)-2; 1; Year(#D)) //月初日でないと、不当末日の翌月繰越し補正の恐れアリ
];
Year(#PreM) &"/"& Month(#PreM) & "/*"
)
>>>>>>>>>>>>>>
の項について、質問させていただいても良いでしょうか?
引用元https://fm-aid.com/bbs2/viewtopic.php?id=7011
に下記のような記述があります。
対策としては下記なのでしょうか?
関数のリファレンスを見ながら、手計算をして見たら、
年については正しく数値が出てきました。
しかし、月については、余剰が少数になってしまうのです…
これは、下記の式に何か間違いがあるのでしょうか?
それとも私がMod関数に関して誤解しているのか…
もしも何かお分かりでしたら、教えていただけませんでしょうか?
よろしくお願いいたします。
Year ( Get ( 日付 ) ) * 12 + Month ( Get ( 日付 ) ) - 1
は、仮想の西暦0年1月からの満の月数が求められます。
月は1月からはじまりますのでその補正のために1を減じます。
(この数字を計算するフィールドを作っておくと、○ヶ月前の検索など楽ですよ)ですから、前月は、さらに1を減じます。
この数字を年月に戻すためには、Div ( YM ; 12 ) で年が求められ、Mod ( YM ; 12 ) で0から始まる月になりますので1を加えます。2ヶ月前は、
Let (
YM = Year ( Get ( 日付 ) ) * 12 + Month ( Get ( 日付 ) ) - 3 ;
Div ( YM ; 12 ) & "/" & ( Mod ( YM ; 12 ) + 1 ) & "/*"
)
です。qb_dpさんの式でも概ねはいいのですが、3月31日や4月30日などで誤計算になりますので、
PreM= Date( Month ( D )-1 ; 1 ; Year ( D ) )
としておいた方が無難でしょう。
ちなみに、前月ならば、
Year ( Get ( 日付 ) - Day ( Get ( 日付 ) ) & "/" & Month ( Get ( 日付 ) - Day ( Get ( 日付 ) ) & "/*"
だけでも OK です。
チポさん
先ほどに引き続きありがとうございます。
アドバイスをもとにまた考え直そうと思っているので、
重ねて質問をさせてください。
>>>打刻はそれ専用のテーブル一つに
その区分フィールドで打刻の区分を特定
ということは。。。
仮にこの画面を打刻記録用テーブルとして、ここに打刻時間と区分が何かの記録をする
打刻記録用テーブルのフィールド
・社員ID
・社員氏名
・年月日
・打刻時間
・区分
・休憩有無
という感じでしょうか?
>>>>>説明に有る「打刻テーブル」
とは従業員と日付でリレーションしてポータル表示すれば、
時刻、区分のフィールドは不要になりますね。
については、最初の投稿に書いた打刻テーブルは管理者目線のものですので、
仮に名前を打刻テーブル(管理者)とします。
また、区分テーブルは、区分を管理するために作ろうと思っています。
打刻テーブル(管理者)のフィールド
・社員ID リレーションする
・社員氏名
・年月日 リレーションする
・出勤時間 ポータルを使って打刻記録用テーブルから表示
・退社時間 ポータルを使って打刻記録用テーブルから表示
・]区分 ポータルを使って打刻記録用テーブルから表示
・休憩有無
・勤務時間 (集計して表示)
・休日勤務時間(集計して表示)
・残業時間 (集計して表示)
・深夜勤務時間(集計して表示)
・欠勤時間 (集計して表示)
このような形でしょうか?
リレーションについても質問させて頂きたいのですが、
リレーションをする場合は主キーとそれに従属するキーを使うと、書籍で読みました。
この場合、社員については社員IDがすでにあるので、それを使いますが、
年月日についてもidを設けた方が良いのでしょうか?
打刻テーブル(管理者)のフィールドに対して、
出社時と退社時の二つの打刻記録用テーブルのレコードがひもづく…という考えで良いでしょうか
細かいところまで聞いてしまい申し訳無いのですが、
わからないことだらけなので、教えて頂けたらありがたいです。
よろしくお願いいたします。
チポさん
最後まで丁寧にありがとうございました!
スッキリしてきました。
また頑張れそうです。
勤怠管理用のファイルを作ろうとしています。
非常に素朴な疑問なのですが、
出勤時間と退勤時間をひとつのレコードにまとめるというのはどういう方法があるのでしょうか。
出勤時間と退勤時間を入力するということは、1日のうちに、別な時間(言い換えると2回に分けて)入力したレコードを一つにまとめる(ある特定の日の出勤退勤時間として)ということ、だと思うのですが…。
リレーションでどうにかなるのかな?
と思い、下記の方法で一度簡単に作ってみたのですが、うまく動かず、エラーになってしまいました。
テーブル
打刻
出勤時間
退勤時間
社員マスタ
従業員IDを入力してから打刻ボタンを押して、時刻が挿入されるようにしました。
従業員IDを入力したら、氏名が反映されて、その後で出勤ボタンを押す。
という形です。
リレーションを組んで、入力するときのレイアウトには、
出勤時間テーブルの出勤時刻フィールド
退勤時間テーブルの退勤時刻フィールド
が表示されるようにして、記録もそこで持つようにし、
同時にリレーションによって、打刻テーブルに全ての情報が揃って一覧で見られるようにレコードが作成されるようにしたかったです。
何が違っているのかがわからず、一度このやり方は捨てて、
どういった方法がスタンダードなのか伺いたいとおもいました。
知恵を貸していただけましたら大変ありがたいです。
仕様は下記です
・従業員コードを入力して打刻
・時刻を入力しなくても操作時の時刻を取得して打刻できる
・出勤区分と休憩の有無も同時に選択できる。
・勤務時間、休日勤務時間、残業時間、深夜勤務時間、欠勤時間は自動計算する
・各従業員は自身の過去60日分の出退勤時間、休憩の有無を閲覧できる。
打刻テーブルのフィールド
従業員ID
従業員名
年月日
出勤時間
退勤時間
区分>>>>通常・遅刻早退・休日出勤・出張・時差出勤(区分テーブルを作成)
休憩有無
勤務時間
休日勤務時間
残業時間
深夜勤務時間
欠勤時間
チポさん
大変失礼しました。
正しいリンクはこちらです。
https://fm-aid.com/bbs2/viewtopic.php?id=7011
最新の関数リファレンスのリンク、ありがとうございます!
http://www.filemaker.com/help/16/fmp/ja … 2Flet.html
実は古いバージョンのリファレンスを読んだことは読んだのですが、
恥ずかしながら理解ができていないようで…
初歩的な質問で大変恐縮ですが、今後のために重ねて質問をさせていただければと思います。
Let 関数を使用すると、式の結果を変数に割り当て、その変数を使用できる結果を返すことができます
とあり、リスト構文というものの説明がありました。
Let関数の中で、いくつかの変数(チポさんのいう引数ということでしょうか)を設定することができ、
その区切りが「;」セミコロン。
先の例だと、『D』『 PreM』が、Let関数の中で設定された変数だ、ということでしょうか。
ワイルドカードについては、下記の説明で、
http://www.filemaker.com/help/12/fmp/jp … t.5.6.html
どのような文字が挿入されても構わない位置にワイルドカード文字(*)を入力します。
という表記を見つけました。
「/*」をつけてあったのは『2017/11/*』というような意味合いにするためだったのですね。
整理すると
Let ([ ←『[ 』はリスト構文で変数を書き始める印
D = Get ( 日付 ) ← 一つ目の変数
;PreM= Date( Month ( D )-1 ; Day ( D ) ; Year ( D ) ) ←二つ目の変数(一つ目の変数を計算の中で使っている)
]; ← 変数の記述はここまで
Year ( PreM ) & "/" & Month ( PreM ) & "/*" ←二つ目の変数を使用して、年月を求めた(これが最終的に求めたかった値)
)
こういうことでいいのでしょうか?
長々済みません。
なかなか専門用語やFileMakerの常識がわからず、何を読んでも理解が進まず困っています。
例えば、下記のリンク先にある質問の式ですが
https://fm-aid.com/bbs2/viewtopic.php?id=4050
回答として、下記のような式が載っています。
Let ([
D = Get ( 日付 )
;PreM= Date( Month ( D )-1 ; Day ( D ) ; Year ( D ) )
];
Year ( PreM ) & "/" & Month ( PreM ) & "/*"
)
2ヶ月前
Let ([
D = Get ( 日付 )
;PreM= Date( Month ( D )-2 ; Day ( D ) ; Year ( D ) )
];
Year ( PreM ) & "/" & Month ( PreM ) & "/*"
)
_____
1. 「;」の意味:複数の式を区切っている(これは調べたらわかりました)
2. D=Get(日付)というのは、後から記述する式を簡潔にするための定義、ということでいいのか?
3. PreMというのはなぜいきなり現れたのか、これも定義?
4. "/*" を調べたらスタイルコメントの演算子だった。頭と末尾があるはずなのに、一つしかない。なぜか??
以上のようなことが、あっているのか、どうか、わからず不安なまま作業をしています。
答え合わせをさせていただけたら非常にありがたいです
Pages: 1
[ Generated in 0.008 seconds, 6 queries executed - Memory usage: 765.53 KiB (Peak: 819.06 KiB) ]