みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
いつも皆様に感謝しております。ありがとう御座います。
こちらのサイトを参考にして日々やっておりますが、今回は出来なくて、書き込みしてみました。
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
の様にしたいのですが、説明が下手くそで申し訳在りませんが、どなたかご教示お願い致します。
Revを入力するのは
レコード作成順にRevを振って行くことを前提として、
レコードIDのフィールドを作り、自己リレーション
番号 = 番号
and
レコードID > レコードID
レコードIDの降順でソート指定
として、
Revの入力値の自動化・計算値.既存値置き換えで
Case ( IsValid ( 自己リレーション::番号 ) ; SerialIncrement ( 自己リレーション::Rev ; 1 ) ; "Rev.0" )
でいいでしょう。
番号&"-"&Rev
これは、
Rev.0なら空白
以外ならそのRevを連結
と考えればできますね。
Offline
スクリプトでやる方法の一例です。
https://www.dropbox.com/s/9sozd22mld3og … fmp12?dl=0
(追記)
しまった、Revのフィールドは"Rev."を付記したいのですね。見落としてました。
そこは関数等をうまく使って補ってください(^^ゞ
Last edited by koeda (2020-01-29 12:14:25)
Offline
チポ様 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が最新のものだけの合計を出したいのですが。。。。
お手数をおかけしますが、教えていただけたら嬉しいです。
説明が下手くそで申し訳ないですが、何卒よろしくお願い致します。
金額集計用の計算フィールドを追加して、最新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
> 最新ならその金額を、最新でないなら0円をセットします。
デフォルトの入力から考えると、ちょっと面倒では。
ちょっと特殊な集計を行なったサンプルです。
https://www.dropbox.com/s/r1yaahpq83zxh … 2.zip?dl=0
Last edited by Shin (2020-01-31 15:01:04)
Offline
>Shinさん
ありがとうございます。なるほど、ですね。
以前にも同趣の回答を寄せられていたように思うのですが、この「金額をレコード数で割っておき再集計する」という発想は
私にはなかなか湧かないんですよねえ…。
Offline
koedaさん Shinさん
ありがとう御座います。
私には、思いつかない発想でした。
頭が上がりません!!!
ですが、金額が100にしていましたが、いろんな金額になるので上手くいきませんでした。
何か、スマートにやる方法はないでしょうか?
皆様に頼ってばかりでも仕分けないですが、何卒宜しくお願い致します!
revによって価格が変わる、という事ですか。
Offline
kordaさんの方法でいいんですが、
もう少し詳細を。。
計算フィールドを作り、
私の自己リレーションを使い、
Case ( レコードID = 自己リレーション::レコードID ; 金額 )
とすると、
Rev最新のレコードのみにその金額、他はnullとなります。
さらに、
集計フィールドを作り、上記の計算フィールドの合計とします。
レイアウトモードで
後部小計パートを作り、ソート対象を番号フィールドとし、
表示したいボディのフィールドを全てそこへ移動、
ボディパートを削除。
後部総計パートを作り、上記の集計フィールドを配置。
これで番号フィールドでソートして、
結果を見てください。
Offline
ですが、金額が100にしていましたが、いろんな金額になるので上手くいきませんでした。
何か、スマートにやる方法はないでしょうか?
単に上手くいかない、ではなく、こういう実装にしてみたけれど、ここが上手くいかない、という具体的な問題点を書かないと回答は得られないでしょう。
例えば
・このようなリレーションにしてみたが、金額が0になる…
・こういうスクリプトを組んでみたが、最新の金額で合計されない/2重計上される…
など。
リレーションや関数、スクリプトを活用する以外に、ケロケロさんの必要とする機能をスマートに実現する方法はありません。
Last edited by koeda (2020-02-01 08:34:01)
Offline
shinさん チポさん koedaさん
ありがとう御座いました。 出来ました!!!
koedaさんのおっしゃる通りですね! もっと勉強して頑張っていきますので、これからも宜しくお願い致します。
本当にありがとう御座いました。
解決のつもりだったのですが、削除すると欠番が出てしまいます。自分なりにMaxを使ったりやってみましたが、上手くいきません。REVもあって欠番にならない方法がないかと思い再投稿いたします。皆様にお知恵をお貸しください、よろしくおねがいいたします。
提示しているサンプルでは、削除しても欠番はでませんよ。
Offline
親番号000、001、002…が抜ける、という意味ですかね?
Offline
親番号000、001、002…が抜ける、という意味ですかね?
はい、そうなんですよ。削除したら必ず連番になって欲しいのですが。。。
なんか、本当に奥が深く楽しいのですが、やり方が見つからなくて。。。
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
「削除」と言っても、それなりの目的、意味があるはずです。
単に操作ミスで新規作成したレコードを削除したいのかもしれないし、注文キャンセル等の理由で不要になったからという理由かもしれない。
いずれにしても「なぜその番号が抜けているのか?」の理由を履歴として残すようにしないと、もしかすると決してはいけない
レコードを消した時にそれに気づかない危険が残りますし、物理削除してしまったレコードは復活できません。というわけで、「基本的にレコードは物理削除しない、ミスによるレコードの新規作成が発生しないよう操作手順を工夫する」
などの仕様を検討されると良いと思います。
おっしゃる通りです。
管理者以外は削除できない様にしていますが、一般アカウントの人が新規作成した時に必要の無いレコードを作ってしまった時に、万が一に備え削除&通し番号にできる様に考えておりました。
新規作成の途中でやめてしまったり、違う動作に行けない様に考える必要がありますが、新規作成途中に作成を辞めて違うアカウントの人が操作しだす等の万が一に備えたいと思っております。
最後の番号を削除することしかないと思っております。
001、002、003→003削除後 003を使用するという様な仕様で考えております。
koeda様やshin様、色々とアドバイスありがとう御座います。
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 570.96 KiB (Peak: 591.87 KiB) ]