みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Win7, FMP10 にて
前回 種別ごとのステータスフィールドがある状態で ナンバリングをしたい、と思っていましたが
そうではなく 種別フィールドは1つで、新規レコードで種別ごとの通し番号をスクリプトトリガで
自動採番できないか教えていただきたく思います。
利用者名簿に個人IDをつけているのですが、
関連先別のグループがあり、そのグループコードとグループ内の通し番号を
全体の通し番号に組み合わせたIDをつけてあります。
ID取得関連のフィールドは以下のものがあります:
grp code : PC1、PJ1、PJ2、A1W、A2V、A3H、A4S
grp vol : 0001 ~
vol no : 0001 ~
個人ID : PJ1-0001-0001、A1W-0001-0009、A1W-0157-0352、等
グループコード(grp code)はすべて半角英数字3文字で、今後増える可能性はあります。
そのグループコードごとの通し番号が grp vol で、現状は手書きで入れております。
vol no はレコードのシリアル番号ですので、自動取得しています。
個人IDは 3文字グループコード-グループ内通し番号4桁-トータル通し番号4桁、を
下記の計算式で自動入力となっています。
grp code & "-" & Left(GetAsNumber(grp vol); 4) & "-" & Left(GetAsNumber(vol no); 4)
考えてみたのは、grp codeフィールドでグループコードを値一覧から選ぶと
grp vol フィールドに自動的に一番新しい番号が入る、です。
grp codeのフィールドでセルフリレーションを張っておいて
OnObjectExitのスクリプトトリガでなんとかなりそう…かと想像しておりますが
Case関数かと思ってみたものの どう設定したらよいのかわからず、
Case ( grp code= ??? ; Max (grp vol)+1 )
といった感じで行き詰まりました。
ご指導いただきたく宜しくお願い致します。
Offline
自己リレーション
grp code = grp code
and
vol no => vol no
として、この
Count
でグループごとの連番が得られます。
これを計算フィールドとすると、
途中のレコードを削除するとそれ以降の番号が全て変わります。
入力値の自動化ならそれは無いですね。
Offline
チポ様、 ありがとうございます。
grp vol のフィールの 入力値の自動化を 計算で
Case ( grp code = grp code and vol no ≥ vol no ; Count ( grp code))
としてみたところ、 grp code名の中にある数字1~4を返されてしまいました…
どこを直したらよいでしょう…
リレーションは grp code でつなぎました。
でも上記内では活用されていないですよね…
Offline
> 自己リレーション
> grp code = grp code
> and
> vol no => vol no
この二つのフィールドで照合するのですよ。
で、grp volの入力値の自動化の計算式
Count ( grp code )
とします。( 4桁にはさらに加工が必要ですね )
入力値の自動化ですから、
既存のレコードには入力できませんよ、
全置換等で入力してください。
Last edited by チポ (2013-12-18 14:40:35)
Offline
ああ、
Count
では、途中のレコード削除が有るとだめでした。
Max (リレーション::grp vol) + 1
でいいかな。
Offline
ありがとうございます。
フィールド照合を2つにして、
vol no => vol no
↑ ここの不等号の向きですが、 テーブル2(リレーション先) => テーブル1(元テーブル)
の並びで設定して、
4桁設定は 入力値の制限で 0001~9999 にして、
フィールドを リレーション先の grp vol にしたのですが
Count ( grp code ) でも Max (リレーション::grp vol) + 1 でも
「0001」と返されてしまいます…
Offline
> テーブル2(リレーション先) => テーブル1(元テーブル)
向きが逆です。
で、
計算式のコンテキストを テーブル1
計算式を
Max ( テーブル2::grp vol ) + 1
とするのが普通ですね。
Offline
チポ様
> テーブル2(リレーション先) => テーブル1(元テーブル)
向きが逆です。
直しました。
計算式のコンテキストを テーブル1
確認しました。 そうなっていました。
計算式を
Max ( テーブル2::grp vol ) + 1
確認しました。そうなっていました。
で
新規レコードを開いて grp code にドロップダウンの値一覧から選んで入力して出ると…
grp vol に何も表示されなくなりました… (T_T)
ちなみに grp vol のフィールドを テーブル1とテーブル2と それぞれ試しましたが
どちらも何も表示されず、です…。
Offline
今、検証できないのですが、、
新規の grp volに対応できないか
Case ( not IsValid ( テーブル2::gro vol ) ; 1 ; Max ( テーブル2::grp vol ) + 1 )
これでどうかな。
Offline
チポ様、 いろいろ考えて下さって本当にありがとうございます。
Case ( not IsValid ( テーブル2::gro vol ) ; 1 ; Max ( テーブル2::grp vol ) + 1 )
これも、表示されず、でした…
Offline
試しに計算フィールドを置いてみてください。
Offline
お返事遅くなりましてすみませんでした。
計算フィールドにして式をあてはめてみると、
Case ( not IsValid ( テーブル2::grp vol ) ; 1 ; Max ( テーブル2::grp vol ) + 1 )
では 新規レコードを開いた時点で grp vol のフィールドには「?」が最初から表示されていて、
grp code に入力後も「?」の表示となりました。
ちなみに
Count ( grp code )
と
Max ( テーブル2::grp vol ) + 1
も
それぞれあてはめてみましたが、これらに対しては結果はどちらも空欄のままでした。
Offline
ああ、
Maxを使うから、計算フィールドの場合、
自己リレーション
grp code = grp code
and
vol no > vol no
としないとだめですね。
で、
入力値の自動化はgrp codeが入力されるまで
計算しないようにしないと先に入力されてしまうので、
Case ( IsEmpty ( grp code ) ; "" ; not IsValid ( テーブル2::grp code ) ; 1 ; Max ( テーブル2::grp vol ) + 1 )
これでいいか。。
Offline
既に入力済み(最新を除く?)のレコードのgrp codeは変更しない(変更できない)という条件付きなら
grp code = grp code
and
vol no > vol no
のリレーションで
OnObjectExitのスクリプトトリガで
Case ( Count ( テーブル2::grp ) = 0 ; "0001"; Right ( "0000" & Max ( テーブル2::grp_vol )+1; 4 ))
でフィールド設定したほうが簡単かも知れない?
リレーションは
grp code = grp code
だけにして、計算値自動入力、既存値置き換え、常に評価する
SerialIncrement ( "0001" ; Max ( テーブル2::grp_vol ) )
レコード作成時(grp_code空欄)に0001が入りますが、入れた後再計算されます。
そっ、それ良さそうですね。
おお、すばらしい!
この手の問題は過去多々ありましたが、
今までに無い方法がでてきましたね。
SerialIncrement
の増分を可変にする発想は無かったです^^
私の陳腐な方法はボツに ;;;
Offline
チポ様、 Traveller様、 引栗様、
パソコンに触れずにいた間に高尚な展開がされていて恐縮です。
なんとなくレベルでしか内容にはついていけてないままに、ご呈示いただいた式をコピペで組み込むばかりですが
画期的とのご推奨の
grp code = grp code
だけにして、計算値自動入力、既存値置き換え、常に評価する
SerialIncrement ( "0001" ; Max ( テーブル2::grp_vol ) )
を試みてみました。
grp code の「=」だけでリレーションを組み、
「入力値の自動化」の「計算値」に式をあてはめ、
「フィールドに既存の値がある場合は置き換えない」のチェックをはずし、
「入力値の制限」の「このフィールドの入力値を制限する」を「常時」にチェック、
として
新規レコードを開いてみたのですが…
開いた時点で grp vol 欄は空欄、 grp code を入れていても空欄のまま、でした…
私だけ…? どぼじで~(ToT)
Offline
常に評価する、は制限じゃなく[式内の全フィールドの値が空欄の時、計算しない] のこと
私の陳腐な方法の
IsEmpty
の判定を入れて、
式内の全フィールドの値が空欄の時、計算しない
これのチェックを入れると、grp code を入力するまで空白になります。
この方が精神的にいいかもしれない^^
Offline
引栗様、 チポ様、 ありがとうございます
「入力値の制限」の「このフィールドの入力値を制限する」を「データの入力時のみ」に戻し、
「式内の全フィールドの値が空欄の時、計算しない」のチェックをはずしました。
で 計算式を
Case ( IsEmpty ( grp code ) ; "" ; not IsValid ( テーブル2::grp code ) ; 1 ; SerialIncrement ( "0001" ; Max ( テーブル2::grp_vol ) ) )
としてみたところ…
美しくできましたー!!!!! grp code 未入力時には空欄で、たしかに精神的にもよろしい感じになりました♪
やったーやったーやったー\(^0^)/ ほんっっとに嬉しいです!!
すみません、ちなみにCase関数の中身ですが、解説していただけますでしょうか。
IsEmpty ( grp code ) の場合 "" 、 まではわかるのですが
そのうしろは 3つ ですよね?
not IsValid ( テーブル2::grp code ) の場合 1 、 だとすると この「1」とは?
そして最後の本題の SerialIncrement ( "0001" ; Max ( テーブル2::grp_vol ) )のための条件に
not IsEmpty (grp code) などが入らずにうまくいっているのはどういう仕組みなのでしょうか?
蛇足ながら、実は個人IDの組合わせ自動表示もうまくできていませんでした。
ご指導いただきながらいろいろ考えて、
GetAsText ( grp code ) & "-" &GetAsText (grp vol) & "-" &GetAsText ( vol no)
で希望通りに表示できるようになりました。
Offline
ファイルメーカーの関数の説明はどうもわかりにくくて苦手なもので
自分の使い道にあてはめてみるとようやく見えてくる感じです。
最後に置く SerialIncrement ( "0001" ; Max ( テーブル2::grp_vol ) はデフォルト値、というのは
その他の事情がなければ基本はコレ、なわけですね。
Case関数を使うときに、デフォルト値を入れずに使っていたかも…。
not IsValid ( テーブル2::grp code ) ; 1 のところは… grp code に該当しないデータが入ると「1」になるのですね。
grp code に警告文を無視して 「123」とか「いろは」とか入れてみて、「1」を表示させることができました。
ということは、ここは「1」でなくてもなんでもよさそうでしょうか?
今回はフィールドが数字としているので数字のみという制限の中で、4桁でない、というので違いを目立たせるのに有効ですが
たとえばテキスト表示だったら NG code などの注意表示を出させるようにするのも有りでしょうか?
Offline
Case ( not IsEmpty ( grp code ) ; SerialIncrement ( "0001" ; Max ( テーブル2::grp_vol ) ) )
でもいいでしょう。
デフォルト値の指定がなければ空欄になります。
not IsValid ( テーブル2::grp code ) ; 1 ;
は、元々はgrp_codeが初出の場合の計算なので、Maxで処理されてる(関連レコードがなければ空)ので不要(4桁ぞろえにならないのでむしろ邪魔)
>たとえばテキスト表示だったら NG code などの注意表示を出させるようにするのも有りでしょうか?
ありかもしれないけど、単純にgrp codeの側で制限した方がいいのでは。「grp_codeが初出の場合」なので不正な値とは限りません。
引栗様、 ありがとうございます。
Case ( not IsEmpty ( grp code ) ; SerialIncrement ( "0001" ; Max ( テーブル2::grp_vol ) ) )
でもいいでしょう。
デフォルト値の指定がなければ空欄になります。
スッキリしますね。 空欄でよければ、デフォルト値は設定しなくても大丈夫なわけですね。
not IsValid ( テーブル2::grp code ) ; 1 ;
は、元々はgrp_codeが初出の場合の計算なので、Maxで処理されてる(関連レコードがなければ空)ので不要
何度か読み返してみてようやく、ですが、「初出の場合の計算」ということなのですね!
だとすると、今後新しい grp code が発生する可能性はあるので、今回はなしにしたほうがよさそうです。
「grp_codeが初出の場合」なので不正な値とは限りません。
ををををを。そういうことですよね。
ガッテンガッテンガッテン!
ノーミソのシワが増えた気がします。
皆様、文殊の知恵を本当にどうもありがとうございました☆
Offline
[解決]ですが
not IsValid ( テーブル2::grp code ) ; 1 ;
は、元々はgrp_codeが初出の場合の計算なので、Maxで処理されてる(関連レコードがなければ空)ので不要
私の前レスのリレーションでは、
初出の grp code の場合関連レコードが有りませんので、その場合の対処です。
引栗さんのリレーションでは、
初出でも自身と照合しますからこれが不要ということです。
グループコード(grp code)はすべて半角英数字3文字
この制限をかけることもできますよ。
上記の計算式に入れて「だめだよ」と表示とか、
別フィールドでアラート表示とか、
入力値の制限でとか、、
Offline
[ Generated in 0.010 seconds, 9 queries executed - Memory usage: 581.7 KiB (Peak: 618.23 KiB) ]