初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2016-04-29 08:38:42

Horicchii
Member

二重除去の計算

”使用日20150125...20160125(日付式) and ある機器 or ない機器” で検索した結果、次のdataとなりました。
この結果から、標準レイアウト画面の集計欄に
1.使用者数
2.述べ使用者数
3.使用日数
4.述べ使用日数
を求めたいのです。
2項は集計Countで(答え=12)出せますが、
1項が3人 及び 3項が 8日 , 4項が365日(20160125-20150125)
はどの様な関数(計算)を使えば良いのか分かりません。ご指導のほどお願いします。

器具名    使用者名    使用日
ある機器      B          2015/01/25
ない機器      B          2016/01/25
ある機器      A          2016/02/25
ある機器      A          2016/02/28
ない機器      B          2016/02/28
ある機器      C          2016/02/29
ある機器      C          2016/03/02
ある機器      A          2016/03/03
ない機器      C          2016/03/03
ある機器      B          2016/03/05
ない機器      B          2016/03/05
ある機器      A          2016/01/25

Offline

#2 2016-04-29 10:52:56

チポ
Member

Re: 二重除去の計算

検索値をグローバルフィールドに入力して、
リレーションで、求めることはできますが、
検索するのですから、無理に計算でと考えないでも、
検索後にそのスクリプトで続けて各集計値を求めるステップを加えてもいいのでは。

Offline

#3 2016-04-29 16:06:05

Horicchii
Member

Re: 二重除去の計算

チポ  様

いつもお世話になります。早速のご指導ありがとうございます。
>検索値をグローバルフイールト゛に入力して…
>検索後にそのスクリプトで続けて各集計値を求めるステップを加えてもいいのでは。

これは解決策に2案有るとの意味ですね。
いづれも、自分は実行した事のないやり方です。
もう少し(と言うか、もっと)具体的な((^_-)-☆)ご指導願えませんでしょうか?。

Offline

#4 2016-04-29 17:17:39

ガキ
Guest

Re: 二重除去の計算

ExecuteSQL 関数使う方法やカスタム関数使う方法やらいろんな手法あるから自分でもちょっとは考えてね。ファイト(^_-)-☆

#5 2016-04-29 17:52:04

Horicchii
Member

Re: 二重除去の計算

ガキ さん

ありがとうございます。自助努力が必要なのはわかるのですが‥‥。
今、手持ちのマニュアル=秀和システムの「はじめてのFMP13」なのです。
この中の関数一覧を見ますと、
論理関数
ExecuteSQL (SQL クエリー ; フィールド区切り ; 行区切り { ; 引数... }
指定したSQLクエリーステートメントをFMPデーターベース内で実行する。

と記されているだけで、さっぱり理解できません。
フイールド区切り→??、フイールドはどこで区切っているのでしょう?
行区切り→行とは?。
;及び{→何を意味しているの?。(  は{ と、どう違うの?、大かっこ?。
上記マニュアル本にも記載されていないのです。電子マニュアル(FMPヘルプ)は読み難くて‥‥。
勿論、「SQL クエリー ; 」の意味はもっと分からないのですが‥‥

すみません、このサイトは「初心者のFMP Q&A」 となって居ますので頼りにしているのです(-_-;)。
可能な限り自助努力しているつもりなのですが‥‥。

Offline

#6 2016-04-30 04:18:08

Hiro
Member

Re: 二重除去の計算

FMの標準機能だけによる、とても簡便な方法を1つ。

集計結果を書き出すグローバルフィールドを作り、このフィールドに対し、
下式計算値での「フィールド内容の全置換」スクリプトを実行するだけです。
その式は、

Let(
[
   $no1=List($no1; Case(FilterValues($no1;テーブル::使用者名)=""; テーブル::使用者名));
   $no2=$no2+1;
   $no3=List($no3; Case(FilterValues($no3;テーブル::使用日+0)=""; テーブル::使用日+0));
   $no4_max=Max($no4_max; テーブル::使用日);
   $no4_min=Case(IsEmpty($no4_min); テーブル::使用日; Min($no4_min; テーブル::使用日))
];
   Case(Get(レコード番号)=Get(対象レコード数);
      List(
         "1.使用者数: " & ValueCount($no1);
         "2.延べ使用者数: " & $no2;
         "3.使用日数: " & ValueCount($no3);
         "4.延べ使用日数: " & ($no4_max - $no4_min)
      )
   )
)

この方法は、グローバルフィールドに対する全置換が、レコード移動ループ処理と
同じように振舞うことを利用したショートカットです。
またレスポンスを高めるため、各レコード上では集計値を書き込まず変数に入れて次へ繰越し、
最後のレコードで初めて最終集計結果を書き込んで終了します。
ExecuteSQLに比べ圧倒的に高速です。

Last edited by Hiro (2016-04-30 04:23:22)

Offline

#7 2016-04-30 11:06:43

チポ
Member

Re: 二重除去の計算

では、私は計算フィールドによる方法を。

使用日_開始
使用日_終了
器具名g
と三つのグローバルフィールドを作ります。

自己リレーション
  使用日_開始 <= 使用日
  and
  使用日_終了 >= 使用日
  and
  器具名g = 器具名

として、
使用日_開始
使用日_終了
にはそれぞれの日付を

器具名gには
  ある機器
  ない機器
と改行で入力します。

これで
  関連レコードへ移動
とすれば検索と同じ結果が得られますね。


このリレーションの動的値一覧を
使用者

使用日
と二つ作り、
ValueCount ( ValueListItems ( Get ( ファイル名 ) ; "値一覧名" ) )
でそれぞれの項目数を得られます。


4.述べ使用日数

  Max ( 自己リレーション::使用日 ) - Min ( 自己リレーション::使用日 )
で得られます。

Offline

#8 2016-04-30 12:39:34

Horicchii
Member

Re: 二重除去の計算

Hiro 様
チポ 様

いつもありがとうございます。
ご指導内容、試行してみましたが、上手く行きません。
自分にとってはなかなか理解し難く、いろいろ引き続き試行してみますので、お時間ください。

Offline

#9 2016-04-30 14:01:43

Hiro
Member

Re: 二重除去の計算

とても簡単な設定ですが、出来ませんか?

投稿内容の事前動作確認に使用したテストファイルをアップしましたので、ご覧ください。
●サンプル「全置換集計法.fmp12」→ http://yahoo.jp/box/5XFFYo

Offline

#10 2016-04-30 17:42:44

Horicchii
Member

Re: 二重除去の計算

Hiro 様

わ~!。こんなにご指導頂けるのは非常にうれしいです。ありがとうございます。
実DBに組み込む作業で上手く行っていなかった事と、「集計結果」フイールト゛の拡張を忘れていました(-_-;)。
表示できました。

Offline

#11 2016-04-30 23:27:08

Horicchii
Member

Re: 二重除去の計算

Hiro 様

すみません、表示できたと言ったのですが、このレスの頭のdata分で、実DBに持っていくと表示してくれません。
持って行ったはずなのに、Hiro 様作成(3/30 04:18:08投稿)のコート゛、スクリプト管理の「編集」で見ても同コードの内容と違っている様ですが‥‥($no3=list($no3;caseまでしか表示されません)、Full内容は何処に記述されているのでしょうか?。
DB管理での「集計結果」フイールト゛が”テキスト”で計算式がありませんが‥‥。
また、もう一つには集計結果の表示は、縦並びでは無く、横一列にしたいと思うのですが、コート゛内容のどこで決めていらっしゃるのか?、私のSkillでは理解できません。
度々で申し訳ないのですが、この辺り解説頂けないでしょうか?。
よろしくお願いいたします。

Offline

#12 2016-05-01 01:55:33

Hiro
Member

Re: 二重除去の計算

> すみません、表示できたと言ったのですが、このレスの頭のdata分で、実DBに持っていくと表示してくれません。
このレスの頭のdataには、明らかな誤りが有るからです。
使用日「2015/01/25...2016/01/25」で検索した結果のはずに、範囲外の日付が含まれます。
そのため、私のサンプルでは、適当にデータ補正して有りますので、比較ください。

ある機器      B          2015/01/25
ない機器      B          2016/01/25  →  2015/01/25  //範囲内日付へ補正
ある機器      A          2016/02/25  →  2015/02/25  //範囲内日付へ補正
ある機器      A          2016/02/28  →  2015/02/27  //範囲内日付かつ非閏年2月末日の前日へ補正
ない機器      B          2016/02/28  →  2015/02/27  //範囲内日付かつ非閏年2月末日の前日へ補正
ある機器      C          2016/02/29  →  2015/02/28  //範囲内日付かつ非閏年2月末日へ補正
ある機器      C          2016/03/02  →  2015/03/02  //範囲内日付へ補正
ある機器      A          2016/03/03  →  2015/03/03  //範囲内日付へ補正
ない機器      C          2016/03/03  →  2015/03/03  //範囲内日付へ補正
ある機器      B          2016/03/05  →  2015/03/05  //範囲内日付へ補正
ない機器      B          2016/03/05  →  2015/03/05  //範囲内日付へ補正
ある機器      A          2016/01/25

実DBのデータをしっかりと精査確認ください。

> 持って行ったはずなのに、Hiro 様作成(3/30 04:18:08投稿)のコート゛、スクリプト管理の
「編集」で見ても同コードの内容と違っている様ですが‥‥($no3=list($no3;caseまでしか表示されません)、
Full内容は何処に記述されているのでしょうか?。

スクリプト管理の「編集」画面では、内容の一部サンプルを見出し表示してるだけです。
ターゲットフィールドの「指定」ボタンの下に、式指定用の「指定」ボタンがありますから、
そこから計算式の編集画面へ移行するとフル表示され編集などできます。
FMの初歩的基本操作ですから、自己努力で解決するよう願います。

> DB管理での「集計結果」フイールト゛が”テキスト”で計算式がありませんが‥‥。
「集計結果」フィールドは、置換値を書き込むためだから、テキストフィールドで良いのです。
計算式は、「全置換」スクリプトの置換値を算出するためのものだから、「全置換」スクリプト
の設定項目内にあります。余りにも当然のことですけど...

> また、もう一つには集計結果の表示は、縦並びでは無く、横一列にしたいと思うのですが、
コート゛内容のどこで決めていらっしゃるのか?

現状の「改行」区切りを「、」区切りに替えて、1行書きへ変更するとするなら、

Case(Get(レコード番号)=Get(対象レコード数);
      List(
         "1.使用者数: " & ValueCount($no1);
         "2.延べ使用者数: " & $no2;
         "3.使用日数: " & ValueCount($no3);
         "4.延べ使用日数: " & ($no4_max - $no4_min)
      )
)

Case(Get(レコード番号)=Get(対象レコード数);
   Substitute(
      List(
         "1.使用者数: " & ValueCount($no1);
         "2.延べ使用者数: " & $no2;
         "3.使用日数: " & ValueCount($no3);
         "4.延べ使用日数: " & ($no4_max - $no4_min)
      )
   ; [¶; "、"])
)

Last edited by Hiro (2016-05-01 02:13:19)

Offline

#13 2016-05-01 08:24:44

Horicchii
Member

Re: 二重除去の計算

Hiro 様

度々すみません。data抽出ミス→修正頂き誠に申し訳ありませんでした。お手数をお掛けしました。
(仮Data作成時間違えたのですね。....「2015/01/25...2016/01/25」で検索したと言うのは記載ミスで、延べ日数の計算答に366日の算出確認したくて前後に日付data を追加したとき、2015/01/25を2015/03/05にすれば良いのに‥‥。言い訳はダメですね。すみませんでした。)....2016/02はうるう年で29日まであります)

実DBで実行してみます。ありがとうございました。

Offline

#14 2016-05-02 00:37:45

Horicchii
Member

Re: 二重除去の計算

Hiro 様

度々すみません。

>現状の「改行」区切りを「、」区切りに替えて、1行書きへ変更するとするなら‥‥

Hiro様作成のサンプル「全置換集計法.fmp12」→ http://yahoo.jp/box/5XFFYo
で、Substitute( ~  ; [¶; "、"]) )の構文に置換変更したのですが、「(  」 の数が合わないとのエラーが出ます。
(、)数を変えてみたのですがエラー、また引数が足りないとか‥‥。
現在、実DBに落とし込む前に十分理解できるようにしたくて、data追加、削除なども試行しているのですが‥‥。
エラーが出てどうにも先に進めません。

Offline

#15 2016-05-02 01:51:32

Hiro
Member

Re: 二重除去の計算

書き換える部分は末尾カッコ")" 2個までです。3個ではありません。
不用意に3個までを範囲指定して、下蘭の修正式を単純にコピペしてしまったのでは?

【Hiro#12レス: 修正範囲指定】

Case(Get(レコード番号)=Get(対象レコード数);
      List(
         "1.使用者数: " & ValueCount($no1);
         "2.延べ使用者数: " & $no2;
         "3.使用日数: " & ValueCount($no3);
         "4.延べ使用日数: " & ($no4_max - $no4_min)
      )
)

↓ 上の範囲内を下に変更

【Hiro#12レス: 上蘭範囲の修正式】]

Case(Get(レコード番号)=Get(対象レコード数);
   Substitute(
      List(
         "1.使用者数: " & ValueCount($no1);
         "2.延べ使用者数: " & $no2;
         "3.使用日数: " & ValueCount($no3);
         "4.延べ使用日数: " & ($no4_max - $no4_min)
      )
   ; [¶; "、"])
)

ケアレスミスが多いように思います。より慎重なフォローに勤めてください。

Offline

#16 2016-05-03 00:41:59

Horicchii
Member

Re: 二重除去の計算

Hiro 様

度重ねご迷惑、お手数をお掛けし申し訳ありません。
横一列(1行)表示について、いろいろ試行した結果、次の内容(記述)でOKとなりました。

"4).延べ使用日数:" & $no4_max - $no4_min ) 
   ; [¶; "、 "])
))

あと、贅沢な事を言うかと思いますが、
"1).使用者数:" & ValueCount($no1) ; 
"2).延べ使用者数:" & $no2 ; 
"3).使用日数:" & ValueCount($no3) ; 

各項目を右カッコ付き、又は丸数字に、そして項目data(集計結果)次の項目間を空白△△2文字分ほど間隔広くしたいのですが、
※1)使用者数:4、△△②述べ使用者数:14、△△3)使用日数:11、△△④述べ使用日数:366 などの様にしたいのですが‥‥。

※コードを上述の様に記しても、また[¶; "、 "])に空白(△△)文字を入れても変化無しです。
使用OSはWin8.1/FMP13です。

Offline

#17 2016-05-03 02:09:18

Hiro
Member

Re: 二重除去の計算

部分式の変更指定はトラブったので、修正後の全体式を示します。


Let(
[
   $no1=List($no1; Case(FilterValues($no1;テーブル::使用者名)=""; テーブル::使用者名));
   $no2=$no2+1;
   $no3=List($no3; Case(FilterValues($no3;テーブル::使用日+0)=""; テーブル::使用日+0));
   $no4_max=Max($no4_max; テーブル::使用日);
   $no4_min=Case(IsEmpty($no4_min); テーブル::使用日; Min($no4_min; テーブル::使用日))
];
   Case(Get(レコード番号)=Get(対象レコード数);
      Substitute(
         List(
            "①使用者数:" & ValueCount($no1);   //①は環境依存文字、マルチプラットフォーム使用には不向き
            "②延べ使用者数:" & $no2;
            "③使用日数:" & ValueCount($no3);
            "④延べ使用日数:" & ($no4_max - $no4_min)
         )
      ; [¶; "、"&"△"&"△"])   //△は全角スペースに変更して下さい
   )
)

Offline

#18 2016-05-03 07:33:07

Horicchii
Member

Re: 二重除去の計算

Hiro 様

いつも本当にありがとうございます。
上手く行きました。

[¶; "、"&"△"&"△"])   
そっかぁ!、&で繋げば良かったのか→Skillが足りないなぁ!

①は環境依存文字、マルチプラットフォーム使用には不向き
承知しております。

パーフェクトに完了です。ありがとうございました。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 624.05 KiB (Peak: 656.96 KiB) ]