みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
はじめまして、どうぞよろしくお願いいたします。
過去ログを検索し、それをヒントに開発を進めてまいりましたが、解決できないため質問させていただきます。
環境:FM Pro14 Win版64bit
クロス集計タイプのカレンダー構築について質問があります。
カレンダーは月間カレンダーですが一般的なカレンダーではなく、1から31まで横方向へ並べたカレンダーです。
縦方向には社員名を並べたいと思っています。こんな感じです。
------------------------------
5月 |1|2|3|・・・|31
------------------------------
社員A|◇|◇|●|・・・|◇
社員B|◇|◇|◇|・・・|●
・
・
・
社員Z|◇|◇|◇|・・・|◇
------------------------------
※●=作業ID
※◇=作業内容テーブルにデータなし
社員マスタテーブルと作業内容テーブルがあり、それぞれを社員IDでリレーションしています。
作業内容テーブルには日ラベル[31]、作業日[31]があり、これを元にカレンダーを構築すると下記の二つの問題が発生します。
問題1.作業内容テーブルにデータがない社員Zの行が出てこない。
問題2.例えば社員Aに、3、4、5日の作業内容がある場合は下記のようになってしまいます。
--------------------------
5月 |1|2|3|4|5
--------------------------
社員A|◇|◇|●|◇|◇
社員A|◇|◇|◇|●|◇
社員A|◇|◇|◇|◇|●
社員B|◇|◇|◇|◇|◇
--------------------------
↓
◎理想形
--------------------------------------
5月 |1|2|3|4|5|・・・|31
--------------------------------------
社員A|◇|◇|●|●|●|・・・|◇
社員B|◇|◇|◇|◇|◇|・・・|●
・
・
・
社員Z|◇|◇|◇|◇|◇|・・・|◇
---------------------------------------
このような形にするには、どうすればよろしいでしょうか?
【社員マスタテーブル構造】
・社員ID
・社員名
・TEL
【作業内容テーブル】
・作業ID
・社員ID
・日ラベル(日付を振るため)
計算[31] 計算式:Month(Date(Month(Extend(作業日));Get(計算式繰り返し位置番号);Year(Extend(作業日))))&"/"&Day(Date(Month(Extend(作業日));Get(計算式繰り返し位置番号);Year(Extend(作業日))))&"("&Left(DayNameJ(Day(Date(Month(Extend(作業日));Get(計算式繰り返し位置番号);Year(Extend(作業日)))));1)&")"
・作業日[31]
計算[31] 計算式:If(Extend(作業日)=Date(Extend(g月);Get(計算式繰り返し位置番号);Extend(g年));Extend(作業ID);"◇")
・作業内容
g年(グローバル:カレンダー抽出用)
g月(グローバル:カレンダー抽出用)
以上となります。よろしくお願いいたします。
Offline
カレンダーは社員マスタテーブル側に設定すれば良いのでは?
Offline
>Hiroさま
ご回答ありがとうございます。
申し遅れましたが、私はファイルメーカーを触り始めて1か月弱の初心者です。
社員マスタテーブルの方に、繰り返しフィールドを作成し下記のとおり設定しましたが、
計算[31] 計算式:If(Extend(作業内容テーブル::作業日)=Date(Extend(g月);Get(計算式繰り返し位置番号);Extend(g年));Extend(作業内容テーブル::作業ID);"◇")
作業IDがまったく表示されず◇表示だけの表が作成されました。
社員の行方向については全件表示するようになりましたが、日付も滅茶苦茶です。
思うのですが、このカレンダーを表示するレイアウト元から「カレンダー」に切り替えた場合、
テーブルとレイアウトが一対であるので、正しく作業内容テーブルから抽出できないのが原因のように思います。
【テーブル構成】
メイン:メインテーブル(メニューボタン設置用)
カレンダー:社員マスタテーブル
作業内容:作業内容テーブル
【リレーション】
作業内容テーブル::社員ID=社員マスタテーブル::ID
メインレイアウトにボタンを貼り、下記のスクリプトでカレンダーに切り替えています。
エラー処理[オン]
レイアウト切り替え[「作業内容」(作業内容テーブル)]
検索モードに切り替え[]
フィールド設定[作業内容テーブル::作業日; date(month(get(日付));1;year(get(日付))) & ".." & date(month(get(日付))+1;0;year(get(日付)))]
検索実行[]
レイアウト切り替え[「カレンダー」(社員マスタテーブル)]
まず、1日から末日までの日付範囲指定の記述方法は合っていますでしょうか?
抽出したいデータがある作業内容テーブルから、社員マスタテーブルを縦軸としたレイアウトと関連性を持たせることができていないように思います。
あと、リレーションを貼る際、左側に置いたテーブルと右側に置いたテーブルとの位置関係はあるのでしょうか?(SQLでいうLEFT JOINやRIGHT JOINです。)
以上、よろしくお願いいたします。
Offline
初心者で基本事項が解っていないと少し高度かもしれませんネ。
かなり近い事案が過去ログにあります。
サンプルも添付してありますので、先ずは、
それをじっくり解読されるのが良いかなと思います。
●過去レス#49番「シフト表のポータルレコードに、1か月分の複数日のレコードの内容を取得したい」
サンプル「月次シフト表.fmp12」
↓
●過去レス#2988番「Hiroさんへ 月次シフト表について」
サンプル「月次シフト表_II.fmp12」
Offline
>Hiroさん
ご指南誠にありがとうございます。
サンプルを確認後、結果を後日お知らせします。
あと・・・厚かましくも、いくつか質問をさせてください。
1.スクリプトで検索する際の条件式で、日付や数値を範囲指定する際、フィールド設定で、日付A & ".." & 日付B または 0 & ".." & 9 でよろしかったでしょうか?
2.開発したシステムをサーバーで共有して運用する場合、グローバルフィールドは排他処理されるのでしょうか?
3.リレーションを貼る際、左側に置いたテーブルと右側に置いたテーブルとの位置関係はあるのでしょうか?
4.ファイルメーカーは、プロジェクト内(レイアウト内のオブジェクトやテーブル定義、スクリプト内)に対して、任意の文字列で検索することは可能でしょうか?
不要なスクリプトやフィールドを削除する前に、使用箇所がないか調べたいのです。
私にとってファイルメーカーは非常に混乱しやすいです。
どうぞ、よろしくお願いいたします。
Offline
疑問は ヘルプ を活用しましょう。
> 1.スクリプトで検索する際の条件式で、日付や数値を範囲指定する際、フィールド設定で、日付A & ".." & 日付B または 0 & ".." & 9 でよろしかったでしょうか?
疑問に思ったら、自己検証してみるのが良いのに! 気楽に試せるところがFMの良い所です。
関連ヘルプ参照 : http://www.filemaker.com/help … t.5.8.html
> 2.開発したシステムをサーバーで共有して運用する場合、グローバルフィールドは排他処理されるのでしょうか?
共有環境でのグローバルフィールドは、各クライアント(セッション)毎の一時変数置き場として個別(排他的)に機能します。
各クライアントのグローバルフィールドの利用はセッション期限内で有効で、セッションの終了で自動的に揮発消滅します。
また、デフォルト初期値は、サーバアップ前の開発FMPで設定した値が、各クライアントの始動時のグローバルフィールドの初期値に反映します。
> 3.リレーションを貼る際、左側に置いたテーブルと右側に置いたテーブルとの位置関係はあるのでしょうか?
基本的にリレーションは双方向で有効ですのでどちらへ置いても構いませんが、混乱しないよう通常はマスタを左に、サブを右に置くのが一般的かな?
> 4.ファイルメーカーは、プロジェクト内(レイアウト内のオブジェクトやテーブル定義、スクリプト内)に対して、任意の文字列で検索することは可能でしょうか?
出来ません。データベースソフトですから、基本的にデータのみが対象です。
Last edited by Hiro (2016-05-12 02:48:58)
Offline
>Hiroさん
重ね重ねご丁寧に回答いただき、ありがとうございます。
ご提示いただいた、サンプルを改良したりして希望通りの動きができないか、ただいま検証中です。
現在、日付クリックで"勤"た"○"をいれるのではなく、別レイアウトで編集された情報表示用にカレンダーが必要だったわけです。
サンプルを改良しました。
シフトログに、シフトログ::作業内容のフィールドを作り、シフトログ::出勤フラグ配列には、=作業内容[1] としました。
シフトログのレイアウトを表形式で開き、任意の文字列を登録後、従業員マスタレイアウトをみると、希望通りの表示をしています。
しかし同じテクニックを開発中のものに適用すると、社員Aの右横列が、すべて同じ内容になってしまいます。
Accessからインポートした作業内容データに問題があるのか、リレーションに問題があるのか分かりません。
インポート時に、作業内容フィールドは計算させて生成しました。
実は作業内容テーブルにはもう一つ社員IDがあり、社員ID2としています。補佐って意味です。リレーションで社員名を引っ張るのに、
作業内容テーブル::社員ID=社員マスタ::ID、作業内容テーブル::社員マスタID2=社員マスタ::ID としています。
サンプルのシフトログに作業員ID2を作り、同様にしてみましたが、こちらは問題がありません。
なにかお気づきな点があれば、ご教示ください。
Offline
>Hiroさん!!!!
できました!
こちらで定義ミスがありました。落ち着いてサンプルを見直し、改めてフィールド名をサンプルのまま改変せずとし定義し直したら、希望通りの表示をするようになりました!
本当にありがとうございました!
Offline
> ご提示いただいた、サンプルを改良したりして希望通りの動きができないか、ただいま検証中です。
いきなり改造ですか? サンプルファイルを一から自力複製できる位に十分内容解析できてからでよいでしょう。
そうすれば、後のツブシは如何様にも!
> 現在、日付クリックで"勤"た"○"をいれるのではなく、別レイアウトで編集された情報表示用にカレンダーが必要だったわけです。サンプルを改良しました。
> シフトログに、シフトログ::作業内容のフィールドを作り、シフトログ::出勤フラグ配列には、=作業内容[1] としました。
シフトログのレイアウトを表形式で開き、任意の文字列を登録後、従業員マスタレイアウトをみると、希望通りの表示をしています。しかし同じテクニックを開発中のものに適用すると、社員Aの右横列が、すべて同じ内容になってしまいます。
カレンダー日付ごとの関連レコード参照を通常31本必要のところ1本のリレーションで済ませる手法(画期的?)が、サンプルの肝です。ポイントは、繰り返しフィールドのLookup特性の応用です。
何のために何をしているか、サンプルを今一度熟読くださいネ。
> Accessからインポートした作業内容データに問題があるのか、リレーションに問題があるのか分かりません。
インポート時に、作業内容フィールドは計算させて生成しました。
実は作業内容テーブルにはもう一つ社員IDがあり、社員ID2としています。補佐って意味です。リレーションで社員名を引っ張るのに、作業内容テーブル::社員ID=社員マスタ::ID、作業内容テーブル::社員マスタID2=社員マスタ::ID としています。
サンプルのシフトログに作業員ID2を作り、同様にしてみましたが、こちらは問題がありません。
DB構成が分かりませんが、マルチ照合キーによるOR照合リレーションのことかな?
複数キーフィールドを改行リストにまとめて、そのフィールドを照合フィールドに充てます。
Last edited by Hiro (2016-05-12 12:06:16)
Offline
>Hiroさん
ご丁寧な解説ありがとうございます。本当に助かりました。
初心者に荷が思いですが頑張ります!
Offline
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 557.25 KiB (Peak: 578.16 KiB) ]