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

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

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

You are not logged in.

Announcement

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


#1 2017-08-04 20:47:13

mezashix
Member

レコードを比較して差分を取得したい

ポータルでデータを生成した時に、指定したフィールドの今回と前回の差分を取得したいと考えています。

環境は以下になります。

FileMakerPRO 14
Windows

テーブルA と テーブルB があります。
テーブルB にあるフィールドで、今回と前回を比較して差分(+でも-でも)を取得したいと
考えていますが、いまいちやり方がわかりません。

色々調べてみましたが、検索して集計、などの言葉がいまいち理解できていないので
もしかすると、Filemakerの機能を知るだけで解決できる内容であれば申し訳ないのですが
ご享受お願いします。

例えばですが
テーブルA : 在庫商品の情報データベース
テーブルB : 毎月の在庫処理のデータ(ポータルにしています)
というイメージで考えてください。

テーブルBはテーブルAの商品名に紐付く形で、毎月毎月データが作成されます。
テーブルBは毎月月末に月末時点の在庫数が入るものとします。

その際に、前月の在庫数と今月の在庫数の差分を取得できればと考えています。

以下のような感じで、レコードが生成されるように作ります。

【テーブルA】
IDa  | 商品名
001 | りんご
002 | みかん
003 | バナナ

【テーブルB】(IDa は テーブルAのIDでリレーションしているフィールド)
IDb  | IDa  | 年月 | 在庫数 | 差分
001 | 001 | 1702 | 100 | 0  ← 1月目は "りんご" だけ
002 | 001 | 1703 | 90 | -10  ←  2月目は "りんご" には差分が出来る
003 | 002 | 1703 | 50 | 0  ← 2月目に "みかん" が追加
004 | 001 | 1704 | 101 | 11  ← 3月目の "りんご"
005 | 002 | 1704 | 65 | 15  ← 3月目の ”みかん”
006 | 003 | 1704 | 20 | 0  ← 3月目に "バナナ" 追加
007 | 001 | 1705 | 80 | -21
008 | 002 | 1705 | 0  | -65
009 | 003 | 1705 | 40 | 40

こういう感じで [ 差分 ]フィールドを求めていきたいです。

この時に、たとえば IDb:007 からみて 前月のデータは ID:004のデータになります。
単順位 IDa:001 (りんご)で集計すると考えると

IDb  | IDa  | 年月 | 在庫数 | 差分
001 | 001 | 1702 | 100 | 0
002 | 001 | 1703 | 90 | -10
004 | 001 | 1704 | 101 | 11
007 | 001 | 1705 | 80 | -21

式のように書けば

IDb:007 の 差分フィールド を 「計算」と設定して

( IDb:007 の 在庫数 ) - ( IDb:004 の 在庫数 )

だと思うのですが、引く前(IDb:007)の在庫数フィールドは自分なのでいいとして
IDb:004 が一つ前の計算対象の在庫数を有するレコードであると、どうやって認識させればいいかがわかりません。

初歩的な事なのかもしれませんが、よろしくお願いいたします。

Offline

#2 2017-08-04 22:49:00

Shin
Member

Re: レコードを比較して差分を取得したい

IDa = IDa
IDb > IDb
という自己リレーションを張り、IDb で降べきにソートします。関連先のフィールドと比較すれば良いでしょう。

Last edited by Shin (2017-08-04 22:49:35)

Offline

#3 2017-08-04 23:11:02

Hiro
Member

Re: レコードを比較して差分を取得したい

自己と同種で一つ前のレコードを参照する自己リレーションを作り、差分計算を立てます。

・自己リレーション「テーブルB 2」(かつ 年月の降順ソート)
      「テーブルB::IDa」 = 「テーブルB::IDa」
         AND
      「テーブルB::年月」 > 「テーブルB::年月」  →  かつ この「::年月」で「降順ソート」

・計算フィールド「差分」に、下式を設定。
      在庫数 * Sign(テーブルB 2::在庫数) - テーブルB 2::在庫数

Offline

#4 2017-08-05 12:21:38

チポ
Member

Re: レコードを比較して差分を取得したい

そもそもの順番が違うような。。

現レコードの在庫はどのように求めているのでしょうか?

普通は
  前在庫 + 入庫数 - 出庫数
で求めるもので、
  入庫数 - 出庫数
これが差分になりますね。

Offline

#5 2017-08-09 14:13:29

mezashix
Member

Re: レコードを比較して差分を取得したい

> Hiroさん

Hiro wrote:

自己と同種で一つ前のレコードを参照する自己リレーションを作り、差分計算を立てます。

・自己リレーション「テーブルB 2」(かつ 年月の降順ソート)
      「テーブルB::IDa」 = 「テーブルB::IDa」
         AND
      「テーブルB::年月」 > 「テーブルB::年月」  →  かつ この「::年月」で「降順ソート」

・計算フィールド「差分」に、下式を設定。
      在庫数 * Sign(テーブルB 2::在庫数) - テーブルB 2::在庫数

細かい説明ありがとうございます。
享受いただいた内容を元に考えてみます。

ただ、こちら
      在庫数 * Sign(テーブルB 2::在庫数) - テーブルB 2::在庫数
ですが
      在庫数 - テーブルB 2::在庫数
でいいかと思ったのですが、Sign(テーブルB 2::在庫数) を乗じているのは何か意図がありますでしょうか?


>Shinさん
ありがとうございます。
ただ、必ずしもIDbが増加方向とは限らないので、リレーションでの IDb > IDb では、意図した内容にならない気がしましたが…いかがでしょうか?

>チポさん
ありがとうございます。
情報元からは、「今月の在庫はコレだけだよ!」という情報しか来ないので
入庫数、出庫数は情報として取得できないのです。
質問は判りやすいように在庫と表現していますが、逆にややこしくなってしまったようで申しわけありません。

Offline

#6 2017-08-09 15:19:03

Hiro
Member

Re: レコードを比較して差分を取得したい

> Sign(テーブルB 2::在庫数) を乗じているのは何か意図がありますでしょうか?
テーブルB 2::在庫数が空欄の場合、つまりグループ先頭レコードの差分計算を考えてみて下さい。
検証は、*Sign(テーブルB 2::在庫数)をとって、グループ先頭レコードの計算結果を確かめてみて下さい。

Offline

#7 2017-08-09 15:20:51

チポ
Member

Re: レコードを比較して差分を取得したい

そういうことですか、、

ならば差分は単に、
  在庫 - 前在庫
でいいですよね。

前在庫はHiroさんの提示されたリレーションで求められます。

しかし、
これを計算フィールドとすると、
以前のレコードを全て計算することになりますから、
入力値の自動化とか、前在庫をルックアップするとかで、
固定値とした方がいいですね。

Offline

#8 2018-03-23 16:46:06

mezashix
Member

Re: レコードを比較して差分を取得したい

気が付いたらURLが変わってて迷子になっていました。
無事、希望した物が作成できました。

Shinさん、Hiroさん、チポさん、ありがとうございます。

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: 565.54 KiB (Peak: 581.32 KiB) ]