みんなで助け合おう!初心者のFileMaker pro Q&A

[ヘッドライン] [使い方] [新規投稿] [記事一覧] [キーワード検索] [過去ログ] [管理用]

 スレッド一覧 

[7670] リレーションについて。

DATE : 2007年12月18日(火) 22時12分
NAME : チャド
EMAIL: - <ON>
U R L:
XPにてfp5を使用している初心者です。

福祉施設にてお客様の個人情報を管理しているのですが、新たに日報のような形のファイルを作成し、リレーションさせたいと思っています。


個人情報を管理しているファイル(Aとします)には

お客様が施設に入所した日を入力するフィールドと、退所した日を入力するフィールドがあります。

新たに作成する日報形式のファイル(Bとします)は、毎日1レコードずつレコードを作成し、ポータルでその日に在籍しているお客様を表示させたいと思っているのですが、この際のリレーションの定義の仕方がわかりません。

ファイルAに、入所した日から退所した日までの在籍している間の日にちを全て入力する繰り返しフィールドを作成すれば可能なのかとは思うのですが、データの格納にも限度があるようですし、何よりそれだと非常に手間がかかってしまうので、何か良い方法があればお知恵をお貸しいただきたいと思っております。


基本的なことなのかもしれませんが、よろしくお願い致します。


[7675] Re: [7670] リレーションについて。
DATE : 07/12/19(水) 00:48
NAME : 旅人
EMAIL:
U R L:
古いバージョンで考える気が起こらないm(_ _)m
8以降にすれば簡単なので・・・
いつまでも5が使えるわけでもないですし、いずれはバージョンアップをとお考えなら5で苦労しない方がいいですし、早い方がいいです。
7以降はファイルメーカーの内容も大きく変わりますから、あとでバージョンアップするにしても、二重三重の手間になります。
言い訳です。


[7678] Re: [7670] リレーションについて。
DATE : 07/12/19(水) 08:58
NAME : Shin
EMAIL:
U R L:
> 新たに作成する日報形式のファイル(Bとします)は、毎日1レコードずつレコードを作成し、ポータルでその日に在籍しているお客様を表示させたい

このポータルで何をしたいのですか?

> ファイルAに、入所した日から退所した日までの在籍している間の日にちを全て入力する繰り返しフィールドを作成すれば可能なのかとは思うのですが、

その日前2週間、後1日位で限定されれば如何ですか。それなら簡単でしょうし、制限もあまり出ませんよ。

全く違う提案を。
 逆転の発想を行いましょう。
個人情報ファイルの中で、今日の入所者のリストは、検索で簡単に表示できますね。
その画面の中で、日報ファイルへリレーションを張り、日報は、個人情報ファイルの中から入力します。


[7733] Re: [7670] リレーションについて。
DATE : 07/12/19(水) 18:47
NAME : チャド
EMAIL:
U R L:
旅人様、Shin様、回答ありがとうございます。

旅人様
>8以降にすれば簡単なので・・・

そうなんですか・・・。それは8以降だとリレーションを張る際の定義に『期間』のような概念も適用できるということなのでしょうか?
お固い職場なため、新しいものを買うのに色々と手間ひまやら時間やらがかかるのですが、簡単にできるなら検討してみたいと思います。

Shin様
>このポータルで何をしたいのですか?
その日ごとに統計を取っておいて、一覧表示したり、必要な日にちだけをピックアップして閲覧したりしたいのです。

ファイルAの『性別』というフィールドに『男』と入力されていたら『1』とカウントする『性別_男』という計算フィールド、同じく『女』と入力されていたら『1』とカウントする『性別_女』という計算フィールド・・・
というように計算フィールドを作成したので、それをファイルBで日にちごとにSum関数で足そうかと思っているのですが・・・(ド素人なもんで、こんな方法しか思いつかなかったんですけど)。
なので、ファイルBは何かを入力するというわけではなく、日にちを入力すると自動的に必要な計算をしてさえくれればOKなんですが・・・。

>その日前2週間、後1日位で限定されれば如何ですか。それなら簡単でしょうし、制限もあまり出ませんよ。
1ヶ月在籍するだけのお客様もいれば、5年以上在籍するお客様まで幅広くいるので、日にちを限定するのはちょっと難しいです・・・。

>個人情報ファイルの中で、今日の入所者のリストは、検索で簡単に表示できますね。その画面の中で、日報ファイルへリレーションを張り、日報は、個人情報ファイルの中から入力します。

上述の通り、日報は日にちの入力だけとし、何年何月何日にどのような人が何人いたのか、というのを計算させるファイルにしたいのですが、このような場合でもこの方法は使えますか?日報の表示も一覧で見たりしたいのですが・・・。


[7745] Re: [7670] リレーションについて。
DATE : 07/12/20(木) 09:30
NAME : Shin
EMAIL:
U R L:
日報のテーブルは、1日1レコードで無限(1年で365レコード程度)に増えていってもいいのでしたら、

レコードを作った時に統計を取るように処理を行い、その結果をそのレコードに保存していかれたら如何ですか。新しい統計が必要になれば、その時に考える、ということで。

必要な項目を挙げて頂けませんか>取りあえず、入所者人数が必要なんですね。


[7754] Re: [7670] リレーションについて。
DATE : 07/12/20(木) 12:16
NAME : チャド
EMAIL:
U R L:
Shin様
>日報のテーブルは、1日1レコードで無限(1年で365レコード程度)に増えていってもいいのでしたら
まさしくその通りです。

>レコードを作った時に統計を取るように処理を行い、その結果をそのレコードに保存していかれたら如何ですか。
レコードを作った時にというのは、日報の方でレコードを作ったときにということですか?具体的にはどのように処理を行わせて、どのように保存していったらいいのでしょうか?(基本的なことでホントにすいません・・・)

>必要な項目
ファイルA(フィールドは『名』『入所日』『退所日』『性別』の4つのみ)に以下の5レコードがあったとします。現在も入所中(退所日に入力が無い場合)は退所日は常にToday+1になるように設定しておきます。

 1、太郎(H18/1/1入所、H18/12/31退所、男)
 2、花子(H18/2/1入所、H18/4/30退所、女)
 3、次郎(H18/3/1入所、入所中、男)
 4、三郎(H18/4/1入所、入所中、男)
 5、洋子(H18/4/1入所、H19/12/20退所、女)

ファイルBで統計を取りたいのは、『入所者』『在籍者』『退所者』『性別』です。入所者とはその日に入所した人、在籍者とは入所日から退所日までの期間がその日に該当する人です。
ファイルBで
『H18/1/1』のレコードを作成した場合
 入所者-1、在籍者-1、退所者-0、男-1、女-0
 太郎は入所者、在籍者両方でカウントします。

『H18/2/2』のレコードを作成した場合
 入所者-0、在籍者-2、退所者-0、男-1、女-1

『H19/12/20(今日)』のレコードを作成した場合
 入所者-0、在籍者-3、退所者-1、男-2、女-1
 洋子は在籍者、退所者両方でカウントします。

他にも統計を取る項目はたくさんあるのですが、簡潔に説明するとこのような感じになります。何か良い方法はありますでしょうか?


[7764] Re: [7670] リレーションについて。
DATE : 07/12/20(木) 16:03
NAME : Shin
EMAIL:
U R L:
FM6ですと、別々に求めていくしかないですね。

『入所者』『退所者』
 これは、FM6でも簡単です。
 日報の日付けと、入所日、または、退所日をリレーションします。そのカウントを行いましょう。

『在籍者』
 個人ファイルの中で、
  入所日 <= 日付け
  退所日 < 日付け を除外
 という検索を行います。これの対象レコード数が在籍者数です。

『性別』
 在籍者の中の性別でしょうか。
 男なら1、女なら0(逆でもいいですが)というフィールドを作り、上の検索状態でそのフィールドの合計( Sum() 関数が使えます。)が男、在籍者数 - 男 が女数です。

これを、スクリプトとしてしてしまえばいいでしょう。

ちょっと気になるのは、退所日に Today + 1 を設定しておく意味が有るのかな?空白では駄目でしょうか。


[7779] Re: [7670] リレーションについて。
DATE : 07/12/20(木) 19:24
NAME : チャド
EMAIL:
U R L:
Shin様
なるほど。やはり旅人様がおっしゃってるようにバージョンが古いのが一番の問題というわけですね・・・
ちなみに8以降だと上記のデータベースを作成する際のリレーションの張りかたは簡単なのでしょうか?9の評価版をダウンロードして試しに作成してみようかと思うんですが、何しろ30日しか使えないようなので、あらかじめアドバイス等がありましたら教えていただけると非常に嬉しいです。


[7783] Re: [7670] リレーションについて。
DATE : 07/12/20(木) 20:17
NAME : Hiro
EMAIL:
U R L: http://briefcase.yahoo.co.jp/bc/brghspr/lst?&.dir=/352b/3433&.src=bc&.view=l
fp.5ファンとして何とか簡素に攻略したく、サンプルを作ってみました。
元ファイル1つだけで、自己リレーションを工夫して、お求めの集計結果が計算式でダイナミックに得られるように考えてみました。
最初にファイルセットしてしまえば、あとの処理はほぼ自動で運用も楽に思います。
宜しかったら「施設管理.fp5」名の.zipファイルをダウンロードしてみてご参考になさって下さい。


[7784] Re: [7670] リレーションについて。
DATE : 07/12/20(木) 20:33
NAME : Shin
EMAIL:
U R L: http://homepage.mac.com/hiramatsu/.Public/FileMaker/FMTips/stepbbs/stepbbs7670.zip
FM7以降ですと、

『入所者』『退所者』
 これは、FM6と同じです。

『在籍者』
 日報ファイルから、
  入所日 <= 日付け
  退所日 < 日付け を除外
 というリレーションを張ります。この対象レコード数が在籍者数です。

『性別』
 在籍者リレーションの中で、上を同じ様に合計を計算すればいいです。

と書いてしまうと、上と同じように見えますが、FM6 では、それらをスクリプトで検索し計算させて、その結果をフィールドに格納していく、という方法です。在籍者等のリストに修正が生じると、かなりの再計算が必要になることがあり得ます。
FM7 以降の方法は、スクリプト等は不要で、常に現在のリストから計算されます。


[7813] Re: [7670] リレーションについて。
DATE : 07/12/21(金) 17:51
NAME : チャド
EMAIL:
U R L:
Hiro様、Shin様
サンプルありがとうございます。とてもわかりやすくて勉強になりました。参考にさせていただいてとりあえずチャレンジしてみます。

Hiro様
在籍期間中の総日付番号のリストを自動更新させるスクリプトはどのように定義していますか?


[7817] Re: [7813] [7670] リレーションについて。
DATE : 07/12/21(金) 18:18
NAME : Hiro
EMAIL:
U R L:
> 在籍期間中の総日付番号のリストを自動更新させるスクリプトはどのように定義していますか?
ヘッダメニューバー>>スクリプト>>スクリプトの定義で、
 「開く時の初期設定」
 「在所期間リスト」
の2つのスクリプトをご参照下さい。難しい事はやっておりません。
双方共通して、ポイントの式は
Case(
WordCount( 在所期間一覧 ) > 0 , 在所期間一覧 & "¶" & (入所日番号 + WordCount( 在所期間一覧 )) ,
入所日番号
)
です。


[7850] Re: [7670] リレーションについて。
DATE : 07/12/22(土) 22:05
NAME : チャド
EMAIL:
U R L:
Hiro様
すいません。最初何故かロックみたいなのがかかってて見れなかったんですが、何回か開いてたら何故か突然ロックが外れました。
拝見させていただきました。
在所期間一覧は繰り返しフィールドにしなくても、"¶"を使うことで改行して表示できるんですね。とても勉強になりました。ありがとうございます。


[8267] Re: [7670] リレーションについて。
DATE : 08/01/15(火) 05:52
NAME : チャド
EMAIL:
U R L:
いただいたサンプルを元に作成しているところなんですが、つまづいてしまったので再度相談させてください。

現在の作成状況を簡潔に説明します。

A.個人ファイル
  生年月日
  年齢
  10代カウント(年齢が10代の人のみ、1とカウントします。計算式はCase(年齢 >= 10 and 年齢 < 20,1)です。)
  20代カウント(年齢が20代の人のみ、1とカウントします。)
  在所期間番号(入所日から退所日までの在所期間全てを数字に変換するフィールド。入所日が2008/1/1、退所日が2008/1/3だとすると733042、733043、733044が全て入力されます。)

ちなみに年令は
(Year(Today) - Year(生年月日)) - (((Month(Today) = Month(生年月日)) and (Day(Today) < Day(生年月日))) or (Month(Today) < Month(生年月日)))
という計算式を使用しています。

B.日報ファイル
  参照日(毎日の日付を入力するフィールド。)
  参照日番号(参照日を数字に変換するフィールド。)
  10代集計(sum関数を使って10代カウントを集計するフィールド。)
  20代集計(sum関数を使って20代カウントを集計するフィールド。)
  報告事項(その日の出来事を入力します。)

2つのファイルは在所期間番号と参照日番号を使ってリレーションを定義しています。日報ファイルを開くと、その日に在籍していた方の情報の一覧や、カウントを取ったものの集計が表示されるようにしています。


悩んでいるところを簡潔に説明します。

個人ファイルに1988/1/1生まれ、2008/1/1に在籍している方のレコードがあるとします。計算式を使用すると年齢は20歳になります。

日報ファイルで2007/12/31のレコードを作ったときに、こちらのファイルでのみ年齢を19歳と表示させ、10代で集計を取るにはどうしたらよいでしょうか?もちろん2008/1/1のレコードを作ったときには20代で集計を取りたいのですが…。

いろいろと試してみてもうまくいきません。

Hiroさんからいただいたサンプルのように、個人ファイル内にグローバルフィールドで参照日を作成して、自己リレーションを使ってだとできるのですが、この場合だと1日分しか表示できず報告事項の入力も出来ないので、自分なりにアレンジしてみたんですが…。


宜しくお願いいたします。


[8275] Re: [7670] リレーションについて。
DATE : 08/01/15(火) 12:10
NAME : Hiro
EMAIL:
U R L:
年齢計算の引数にToday関数を使っているからではないでしょうか?
本日での年齢を出してしまう。^^;; 
参照日の時点に於ける年齢計算をしなくては、! 
なので、
 Year(参照日) - Year(生年月日)) - (((Month(参照日) = Month(生年月日)) and (Day(参照日) < Day(生年月日))) or (Month(参照日) < Month(生年月日)))
として試してみて下さい。


[8288] Re: [7670] リレーションについて。
DATE : 08/01/15(火) 16:46
NAME : チャド
EMAIL:
U R L:
Hiro様
度々のアドバイス、ありがとうございます。そのようにしたいと思い、いろいろとあがいてみたのですが、その際のリレーションの定義の仕方がわからないのです。
日報ファイルの「参照日」を個人ファイルの計算フィールドで使う為にはリレーションを定義しなければならないと思うのですが…。


個人ファイルで日報ファイルと以下のようなリレーションを定義した場合

現在のファイルの照合フィールドを「在籍期間番号」、関連ファイルの照合フィールドを「参照日番号」とします。

個人ファイルに以下の計算フィールド(参照日年齢)を作成します。

If(IsEmpty(日報::参照日) or IsEmpty(生年月日),"",(Year(日報::参照日) - Year(生年月日)) - (((Month(日報::参照日) = Month(生年月日)) and (Day(日報::参照日) < Day(生年月日))) or (Month(日報::参照日) < Month(生年月日))))

作成した「参照日年齢」を日報ファイルのポータル内に配置すると、誕生日を過ぎても年齢が変わらないままになってしまいます。

もしかしてこれが多対多のリレーションってヤツなんでしょうか?ヘルプを見ても全然わからないもので…。


[8294] Re: [7670] リレーションについて。
DATE : 08/01/15(火) 18:45
NAME : Hiro
EMAIL:
U R L:
日報::リレーションが「多対1」になっていますから、
「日報::参照日」は、「在籍期間番号」リストにピットする全レコードのうちから常に一番小さい先頭参照日が日報ファイルより返されます。これでは、その人の入所日の年齢しか得られませんよね。
なので、日報ファイルのカレントレコードの参照日データをなんとか個人ファイルに取得して年齢計算を立てる以外無いでしょう。
う〜む、その方法ですが、ちょっと今思い付かないので少し時間を下さい。またレスしますね。


[8298] Re: [7670] リレーションについて。
DATE : 08/01/15(火) 19:59
NAME : チャド
EMAIL:
U R L:
Hiro様
やはりそうなんですね。ご面倒をおかけして申し訳ありませんが、何か名案がありましたら宜しくお願い致します。


[8313] Re: [7670] リレーションについて。
DATE : 08/01/16(水) 12:44
NAME : Hiro
EMAIL:
U R L:
考えてみましたが、妙案が思い付きません。

参照機能であるリレーション越しに、参照先実体レコードのカレント状態を知る関数、カレントレコード値を得る関数は無いので、発想自体無理そうです。

そこで、発送を切替えて、当方サンプルのやり方に戻してはどうでしょう。
個人ファイル側グローバルG参照日をヒントに必要とする全ての集計計算を自己ファイル内で整えておきます。
(日報::リレーションに照合レコードが無く、Count関数で自動判別)日報データ作成が必要なら、日報ボタンで「フィールド設定:日報::参照日:G参照日」指定して新規参考日レコードを自動作成します。
また日報ファイル側に、その集計結果も静的保存したいのであれば、参照日でルックアップして各々対応フィールドに自動転記入力するのが楽でしょう。


[8317] Re: [8267] [7670] リレーションについて。
DATE : 08/01/16(水) 15:24
NAME : Shin
EMAIL:
U R L:
> 日報ファイルで2007/12/31のレコードを作ったときに、こちらのファイルでのみ年齢を19歳と表示させ、10代で集計を取るにはどうしたらよいでしょうか?もちろん2008/1/1のレコードを作ったときには20代で集計を取りたいのですが…。

2008/1/1 時点での20台の人は、生年月日が、1978/1/2...1998/1/1 の人ですね。これがヒントになりませんか。


[8339] Re: [7670] リレーションについて。
DATE : 08/01/17(木) 02:10
NAME : チャド
EMAIL:
U R L:
Hiro様
やはり無茶なことをやろうとしてたんですね。早めに教えてもらえて良かったです。ありがとうございました。教えていただいた方法でやってみます。

Shin様
それは新たに生年月日のファイルを作成してリレーションさせるということですか?



No Pass


引用なし返信はこちら

お名前  
E-mail   非表示
タイトル
Pass (修正・削除に使用)   Pre(図表モード)   Link(リンク有効)
アドレス

       レスをあげない


- Step Bank -