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

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

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

You are not logged in.

Announcement

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


#1 2020-01-29 09:38:53

ケロケロ
Guest

001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

いつも皆様に感謝しております。ありがとう御座います。
こちらのサイトを参考にして日々やっておりますが、今回は出来なくて、書き込みしてみました。
Mac10.12 FM16
レコードを複製して、Rev.1とかRev.2のようにしたいと思っております。

フィールド1 フィールド2  フィールド3(計算)
番号       Rev      番号&"-"&Rev
001                   Rev.0                001
001                   Rev.1                001-Rev.1
001                   Rev.2                001-Rev.2
001                   Rev.3                001-Rev.3
002                   Rev.0                002
003                   Rev.0                003
004                   Rev.0                004
004                   Rev.1                004-Rev.1

の様にしたいのですが、説明が下手くそで申し訳在りませんが、どなたかご教示お願い致します。

#2 2020-01-29 11:15:46

チポ
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

Revを入力するのは

レコード作成順にRevを振って行くことを前提として、
レコードIDのフィールドを作り、自己リレーション
      番号      =      番号
  and
  レコードID > レコードID
                     レコードIDの降順でソート指定

として、
Revの入力値の自動化・計算値.既存値置き換えで
  Case ( IsValid ( 自己リレーション::番号 ) ; SerialIncrement ( 自己リレーション::Rev ; 1 ) ; "Rev.0" )
でいいでしょう。


番号&"-"&Rev
これは、
Rev.0なら空白
以外ならそのRevを連結
と考えればできますね。

Offline

#3 2020-01-29 12:07:16

koeda
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

スクリプトでやる方法の一例です。
https://www.dropbox.com/s/9sozd22mld3og … fmp12?dl=0

(追記)
しまった、Revのフィールドは"Rev."を付記したいのですね。見落としてました。
そこは関数等をうまく使って補ってください(^^ゞ

Last edited by koeda (2020-01-29 12:14:25)

Offline

#4 2020-01-31 00:54:15

ケロケロ
Guest

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

チポ様 koeda様

ありがとう御座います、実装出来ました。
また、壁にぶつかりました。
全ての合計が出てしまいます。
フィールド1 フィールド2  フィールド3(計算)
番号              Rev             番号&"-"&Rev 金額
001                   Rev.0                001             100
001                   Rev.1                001-Rev.1   100
001                   Rev.2                001-Rev.2   100
001                   Rev.3                001-Rev.3   100
002                   Rev.0                002            100
003                   Rev.0                003            100
004                   Rev.0                004            100
004                   Rev.1                004-Rev.1   100
合計800と出てしまいます。
やりたいことは、下記の様に
フィールド1 フィールド2  フィールド3(計算)
番号              Rev             番号&"-"&Rev  金額
001                   Rev.3                001-Rev.3     100
002                   Rev.0                002          100
003                   Rev.0                003               100
004                   Rev.1                004-Rev.1      100
合計400
この様にRevが最新のものだけの合計を出したいのですが。。。。
お手数をおかけしますが、教えていただけたら嬉しいです。
説明が下手くそで申し訳ないですが、何卒よろしくお願い致します。

#5 2020-01-31 08:01:45

koeda
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

金額集計用の計算フィールドを追加して、最新Rev.ならその金額を、最新でないなら0円をセットし、それを集計すれば良いでしょう。

チポさんの回答のようにリレーションで解決されたのであれば、リレーション先から最新のRevを取得して自レコードのRevと比較し、
最新ならその金額を、最新でないなら0円をセットします。

リレーションを使っていないならば、
ExecuteSQL ( "SELECT MAX(Rev) FROM \"テーブル\" WHERE \"番号\"=?" ; "" ; ""  ; 番号 )
を利用して最新Revかどうかを判定し、あとは同様に金額をセットします。
(上記SQLは数字を返すのでご注意を。たとえば"Rev.11"だと11を返します。)

(追記)
私は原則として管理番号のようなものはなるべく数値型のデータで管理し、ゼロ埋めやプレフィックス/サフィックスなど
画面表示や印字に必要なテキスト書式は別に計算で加工し利用するのが良いのでは、と考えています。
テキストで管理すると、ソートした時に意図した順番にならなかったり、単純な大小比較ができなかったりするので。
Rev.0
Rev.1
Rev.11
Rev.2…
もちろん入力のしやすさなどを踏まえて、ケースバイケースで判断すべきですが。

Last edited by koeda (2020-01-31 08:19:10)

Offline

#6 2020-01-31 09:00:59

Shin
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

> 最新ならその金額を、最新でないなら0円をセットします。
デフォルトの入力から考えると、ちょっと面倒では。
ちょっと特殊な集計を行なったサンプルです。
https://www.dropbox.com/s/r1yaahpq83zxh … 2.zip?dl=0

Last edited by Shin (2020-01-31 15:01:04)

Offline

#7 2020-01-31 09:26:24

koeda
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

>Shinさん
ありがとうございます。なるほど、ですね。
以前にも同趣の回答を寄せられていたように思うのですが、この「金額をレコード数で割っておき再集計する」という発想は
私にはなかなか湧かないんですよねえ…。

Offline

#8 2020-01-31 12:14:56

ケロケロ
Guest

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

koedaさん Shinさん
ありがとう御座います。
私には、思いつかない発想でした。
頭が上がりません!!!
ですが、金額が100にしていましたが、いろんな金額になるので上手くいきませんでした。
何か、スマートにやる方法はないでしょうか?
皆様に頼ってばかりでも仕分けないですが、何卒宜しくお願い致します!

#9 2020-01-31 14:23:21

Shin
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

revによって価格が変わる、という事ですか。

Offline

#10 2020-01-31 15:54:26

チポ
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

kordaさんの方法でいいんですが、
もう少し詳細を。。


計算フィールドを作り、
私の自己リレーションを使い、
  Case ( レコードID = 自己リレーション::レコードID ; 金額 )
とすると、
Rev最新のレコードのみにその金額、他はnullとなります。

さらに、
集計フィールドを作り、上記の計算フィールドの合計とします。

レイアウトモードで
後部小計パートを作り、ソート対象を番号フィールドとし、
表示したいボディのフィールドを全てそこへ移動、
ボディパートを削除。
後部総計パートを作り、上記の集計フィールドを配置。

これで番号フィールドでソートして、
結果を見てください。

Offline

#11 2020-02-01 08:32:36

koeda
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

ケロケロ wrote:

ですが、金額が100にしていましたが、いろんな金額になるので上手くいきませんでした。
何か、スマートにやる方法はないでしょうか?

単に上手くいかない、ではなく、こういう実装にしてみたけれど、ここが上手くいかない、という具体的な問題点を書かないと回答は得られないでしょう。
例えば
・このようなリレーションにしてみたが、金額が0になる…
・こういうスクリプトを組んでみたが、最新の金額で合計されない/2重計上される…
など。
リレーションや関数、スクリプトを活用する以外に、ケロケロさんの必要とする機能をスマートに実現する方法はありません。

Last edited by koeda (2020-02-01 08:34:01)

Offline

#12 2020-02-01 14:06:01

ケロケロ
Guest

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

shinさん チポさん koedaさん
ありがとう御座いました。 出来ました!!!

koedaさんのおっしゃる通りですね! もっと勉強して頑張っていきますので、これからも宜しくお願い致します。

本当にありがとう御座いました。

#13 2020-02-09 03:24:21

ケロケロ
Guest

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

解決のつもりだったのですが、削除すると欠番が出てしまいます。自分なりにMaxを使ったりやってみましたが、上手くいきません。REVもあって欠番にならない方法がないかと思い再投稿いたします。皆様にお知恵をお貸しください、よろしくおねがいいたします。

#14 2020-02-09 08:48:29

Shin
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

提示しているサンプルでは、削除しても欠番はでませんよ。

Offline

#15 2020-02-09 12:12:56

koeda
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

親番号000、001、002…が抜ける、という意味ですかね?

Offline

#16 2020-02-09 16:17:05

ケロケロ
Guest

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

koeda wrote:

親番号000、001、002…が抜ける、という意味ですかね?

はい、そうなんですよ。削除したら必ず連番になって欲しいのですが。。。
なんか、本当に奥が深く楽しいのですが、やり方が見つからなくて。。。

#17 2020-02-09 18:54:21

koeda
Member

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

Rev.が抜けないように「最大値を取得して+1する」と同じ考え方を親番号にも適用すれば良いのでは?
親番号に単純にシリアル値を自動入力するだけだと、抜けが発生することはどうしても避けられないでしょう。

まず採番ルールを明確にしないと、実装のあるべき姿が決まりません。
1)001、002、003の002を削除したのちに、新規レコードを作成したら次は何番?(002?or004?)
2)002、002、003の003を削除したのちに、新規レコードを作成したら次は何番?(003?)
1)が002で2)が003だとすると、途中で抜けた002は再利用できないが、最後に抜けた003は再利用できる、
という、(考え方によっては)一貫しない仕様になります。
1)が004だとすると、002は抜けても良いということなので、2)も004で良いのでは?とも思われます。

そもそも論として、削除するから抜けが発生します。
つまり、通常の運用の中でユーザが手動でレコードを物理的に削除できる仕様はどうなのか?という議論もありうるのでは?
「削除」と言っても、それなりの目的、意味があるはずです。
単に操作ミスで新規作成したレコードを削除したいのかもしれないし、注文キャンセル等の理由で不要になったからという理由かもしれない。
いずれにしても「なぜその番号が抜けているのか?」の理由を履歴として残すようにしないと、もしかすると決してはいけない
レコードを消した時にそれに気づかない危険が残りますし、物理削除してしまったレコードは復活できません。

というわけで、「基本的にレコードは物理削除しない、ミスによるレコードの新規作成が発生しないよう操作手順を工夫する」
などの仕様を検討されると良いと思います。

Offline

#18 2020-02-10 03:55:40

ケロケロ
Guest

Re: 001-Rev.1 001-Rev.2 001-Rev.3 002-Rev1のようにしたいのですが。。。

koeda wrote:

「削除」と言っても、それなりの目的、意味があるはずです。
単に操作ミスで新規作成したレコードを削除したいのかもしれないし、注文キャンセル等の理由で不要になったからという理由かもしれない。
いずれにしても「なぜその番号が抜けているのか?」の理由を履歴として残すようにしないと、もしかすると決してはいけない
レコードを消した時にそれに気づかない危険が残りますし、物理削除してしまったレコードは復活できません。

というわけで、「基本的にレコードは物理削除しない、ミスによるレコードの新規作成が発生しないよう操作手順を工夫する」
などの仕様を検討されると良いと思います。

おっしゃる通りです。
管理者以外は削除できない様にしていますが、一般アカウントの人が新規作成した時に必要の無いレコードを作ってしまった時に、万が一に備え削除&通し番号にできる様に考えておりました。
新規作成の途中でやめてしまったり、違う動作に行けない様に考える必要がありますが、新規作成途中に作成を辞めて違うアカウントの人が操作しだす等の万が一に備えたいと思っております。

最後の番号を削除することしかないと思っております。
001、002、003→003削除後 003を使用するという様な仕様で考えております。



koeda様やshin様、色々とアドバイスありがとう御座います。

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: 570.96 KiB (Peak: 591.87 KiB) ]