みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
FM11 Win7 利用です。
フィールドAに値が入ったら (If[ not IsEmpty ( フィールドA )])
フィールドBに「A0001」、「A0002」、「A0003」...と自動で入力したいです。
※フィールドAに値が入力された順番でいいです。
よろしくお願い致します。
Offline
これも 引栗様の 応用でいけそうでしょうかね?
https://fm-aid.com/bbs2/viewtopic.php?id=661
の #15 の設定
や
https://fm-aid.com/bbs2/viewtopic.php?id=838
を参照して
フィールドA で自己リレーションして、
SerialIncrement("0001";Max(テーブル2::フィールドB))
で いかがでしょう?
Offline
リレーションは
フィールドA = フィールドA
だけにして、計算値自動入力、既存値置き換え、常に評価する
SerialIncrement ( "A0001" ; Max(テーブル2::フィールドB))
にしてみました。
フィールドAは常に違う値が入るのですが、"A0001"しか入力されません。
フィールドAに同じ値が入ると、"A0001"、"A0002"、"A0003"...となりますが、、
希望とは異なります。
Offline
フィールドAは常に違う値が入るのですが、"A0001"しか入力されません。
フィールドAに同じ値が入ると、"A0001"、"A0002"、"A0003"...となりますが、、
希望とは異なります。
失礼しました。 私がお世話になったのとは条件が異なりますね。
そしたら同じく
https://fm-aid.com/bbs2/viewtopic.php?id=661
の
#2
の チポ様案はいかがでしょう。
レコードにシリアル番号をふって、
シリアル番号 => シリアル番号 で IsValid(フィールドA)を Count して Max+1
…と パーツは思いつきましたが、組み立てまで頭がまわりません…
すみません やはり初級者の見よう見まねでは力不足でした。
Offline
リレーションは
フィールドA X フィールドA
にして、計算値自動入力
Case ( not IsEmpty ( フィールドA ) ; SerialIncrement ( "A0001" ; Max(テーブル2::フィールドB)) )
ですかね。
既存値置き換えは、Aを修正時にどうしたいかによります。
Offline
Waderさま
ありがとうございます。
リレーションは
フィールドA X フィールドA
にして、計算値自動入力
Case ( not IsEmpty ( フィールドA ) ; SerialIncrement ( "A0001" ; Max(テーブル2::フィールドB)) )
ですかね。
でも結果は同じです。。
おはりこさま
ありがとうございます。
おはりこさまの質問も拝見させていただきました。
似てるようで少し違いそうですね。
私の場合は通し番号がないので。。
通し番号をつけた方がいいのですがね?
Offline
Wader様の
リレーションは
フィールドA X フィールドA
にして、計算値自動入力
Case ( not IsEmpty ( フィールドA ) ; SerialIncrement ( "A0001" ; Max(テーブル2::フィールドB)) )
のときに、
「式内の全フィールドの値が空欄の時、計算しない」のチェックをはずしてみてはいかがでしょう?
参照: #19 @ https://fm-aid.com/bbs2/viewtopic.php?id=661
通し番号をつけた方がいいのですがね?
Count しないでできそうなので、今回は不要なケースのようですね。(おそるおそる。)
Offline
waderさんので、リレーション記号を=からXに変えてるのを見落としてませんか。
皆様ありがとうございます!
完全に "X"を見落としていました。
"X"にすることで、A0001、A0002、A0003…とできました!
しかし、もうひとつ条件を増やしたいのですが、またわからなくなりました。
その条件とは
リスト=東京(左から2つの文字が東京の場合)はフィールドB=A0001、A0002、A0003…
リスト=埼玉(左から2つの文字が埼玉の場合)はフィールドB=B0001、B0002、B0003…
のようにリスト名が違う場合にそれぞれにカウントするようにしたいのです!
--------------------------
リレーションは
フィールドA X フィールドA
にして、計算値自動入力
If ( Left ( リスト ; 2 ) = "東京" ;
Case ( not IsEmpty ( フィールドA ) ;
SerialIncrement ( "A0001" ; Max(テーブル2::フィールドB))) ;
If ( Left ( リスト ; 2 ) = "埼玉" ;
Case ( not IsEmpty ( フィールドA ) ;
SerialIncrement ( "B0001" ; Max(テーブル2::フィールドB))) ;
0 )
)
--------------------------
とやってみたのですが、
リスト=東京で「A0001」がある状態で、リスト=埼玉で「B0001」が出てきません!
(B0002となってしまいます。)
これを「B0001」にするにはどうしたらよいでしょうか?
よろしくお願い致します。
Offline
リスト=東京(左から2つの文字が東京の場合)はフィールドB=A0001、A0002、A0003…
リスト=埼玉(左から2つの文字が埼玉の場合)はフィールドB=B0001、B0002、B0003…のようにリスト名が違う場合にそれぞれにカウントするようにしたいのです!
「リスト名」というのは、フィールドA にあたるものでよろしいでしょうか?
ここには 東京 と 埼玉 のいずれかのみが必ず入るのでしょうか?
東京と埼玉に該当しないものの場合のフィールドBは空欄でしょうか?
個別になると、私がお世話になった条件よりさらに複雑な構成になりますね。
「フィールドA」 →「リスト」フィールド だとして
SerialIncrement (
Case ( Left ( リスト ; 2 ) = "東京" ; "A0001" ;Left ( リスト ; 2 ) = "埼玉" ;"B0001" ;0 ) ; Max(テーブル2::フィールドB)))
とか??
Case ( not IsEmpty ( フィールドA ) はいらなくなりそう??
Last edited by おはりこ (2014-01-28 02:23:36)
Offline
すいません。ややこしくて。。
フィールドA=リストではないです。
仮にフィールドC=リスト と考えて下さい!
今のところ東京、埼玉しか入りません!
フィールドCには県域しか入りませんが今後増えても2~3県程です。
増えた時はその都度If関数やCase関数で増やそうと思っています。
条件が追加でややこしいですが、よろしくお願い致します。
--------------------------
リレーションは
フィールドA X フィールドA
にして、計算値自動入力
If ( Left ( フィールドC ; 2 ) = "東京" ;
Case ( not IsEmpty ( フィールドA ) ;
SerialIncrement ( "A0001" ; Max(テーブル2::フィールドB))) ;
If ( Left ( フィールドC ; 2 ) = "埼玉" ;
Case ( not IsEmpty ( フィールドA ) ;
SerialIncrement ( "B0001" ; Max(テーブル2::フィールドB))) ;
0 )
)
--------------------------
Offline
リレーション先のレコードから最大値を求めるんで、グループ分けはIfでなくリレーション設定でやります。
よって、CでなくLeft ( フィールドC ; 2 ) のフィールドが必要です。Dとすると
リレーションは
フィールドD= フィールドD
にして、計算値自動入力
Case ( not IsEmpty ( フィールドA ) ;
SerialIncrement (
Case(D= "東京" ; "A0001" ; D= "埼玉" ; "B0001" ; "C0001" ) ;
Max(テーブル2::フィールドB)
)
)
要らないかと思って式を書き始めたら、初期値の設定のとこにIfというかCaseが必要になってしまった...
本件では関係ないけど、「左右交換」できるのはシリアル値に数字部分が1か所しかないからです。複数あるとMAX値を加工する必要があって面倒になる。
初出の場合のみ手入力すれば
SerialIncrement ( テーブル2::フィールドB ; Max ( テーブル2::フィールドB ) )
で済み、
追加メンテもいらなくなりますが。。
Offline
>初出の場合のみ手入力す
なるほど!既存値から加算するんだから、データ自体がマスタのようになるのですねえ。
チポさま
ありがとうございます。
初出の場合のみ手入力すれば
SerialIncrement ( テーブル2::フィールドB ; Max ( テーブル2::フィールドB ) )
の場合リレーションは何で組めばいいのでしょうか?
Offline
リレーションはD=Dです。
しかし今考えたら、テーブル2::フィールドB は同グループの最初の値だから、0001が削除されると、その後は連番でなくとびとびの値になってしまう。
多分ないでしょうけど。
ああ、
そうですね、確かにあり得る!
苦し紛れ、
Left ( テーブル 2::フィールドB ; 1 ) & SerialIncrement ( "0001" ; Max ( テーブル 2::フィールドB ) )
で逃げられるかな。
Offline
引栗さま
ありがとうございます。
リレーションは
フィールドD= フィールドD
にして、計算値自動入力
Case ( not IsEmpty ( フィールドA ) ;
SerialIncrement (
Case(D= "東京" ; "A0001" ; D= "埼玉" ; "B0001" ; "C0001" ) ;
Max(テーブル2::フィールドB)
)
)
で出来たみたいなんですけど。。。
この式ってなにが問題なんでしょうか?
リレーションは
フィールドD= フィールドD で
SerialIncrement ( テーブル2::フィールドB ; Max ( テーブル2::フィールドB ) )
や
Left ( テーブル 2::フィールドB ; 1 ) & SerialIncrement ( "0001" ; Max ( テーブル 2::フィールドB ) )
だとフィールドBに値が反映されないですね。
なぜなんでしょうか??
Offline
>この式ってなにが問題なんでしょうか?
「増えた時はその都度If関数やCase関数で増やそうと思って」る分には問題ないはずです。
データが変わった時に式というかテーブルの定義を変えないといけないということ自体が、一般的には忌避されます。
>だとフィールドBに値が反映されないですね。
試してないんですが
初期値(各アルファベットの0001)は手入力なんですけど、実験のために空のファイルへインポートとかやってませんか。
この式は、関連レコードがあることが前提になってるから、SerialIncrementの引数を左右逆にする意味は全く無くなってますよね...
つまり初期値を手入力するんだったら、普通に
SerialIncrement ( Max ( テーブル 2::フィールドB ) ; 1 )
でいいはず?
>SerialIncrement ( Max ( テーブル 2::フィールドB ) ; 1 )
ですが、フィールドAに値が入った時に有効にする場合は、
Case ( not IsEmpty ( フィールドA ) ;SerialIncrement ( Max ( テーブル 2::フィールドB ) ; 1 ))
ですよね?
初期値を手入力"A0001"としても次の値は"2"となりますし、東京と埼玉と県域が違っても"3"、"4"...希望の値と違がいます。
もちろんリレーション
フィールドD=フィールドD ですが。
Case ( not IsEmpty ( フィールドA ) ;Left ( テーブル 2::フィールドB ; 1 ) & SerialIncrement ( "0001" ; Max ( テーブル 2::フィールドB ) ))
とすると、初期値を手入力しても、数字の前のアルファベットが付いてこないですし、県域ごとに数字が加算されないです。
Offline
Max関数の戻り値はなぜか数字になりますね。
(ヘルプではテキストも返すと言っていますが、返さないようです)
苦し紛れ
をお試しください。
初出の値の場合、
計算式を変更するより、手入力した方が簡単でしょう。
という提案です。
Offline
苦し紛れ、
Left ( テーブル 2::フィールドB ; 1 ) & SerialIncrement ( "0001" ; Max ( テーブル 2::フィールドB ) )
で逃げられるかな。
ですと、埼玉での初期値"A0001"、東京での初期値を"B0001"としたのですが、
埼玉、東京関係なしに値が 0003、0004、0005...となります。
数字の前のアルファベットが付きません。
Case ( not IsEmpty ( フィールドA ) ;Left ( テーブル 2::フィールドB ; 1 ) & SerialIncrement ( "0001" ; Max ( テーブル 2::フィールドB ) ))
フィールドAに値が入った時にこの計算式を実行させたいので Case ( not IsEmpty ( フィールドA ) 付けたんですけど、いりますよね?
Offline
>埼玉、東京関係なし
これはリレーションがXでなく=になってるか確認。
>Max関数の戻り値はなぜか数字になります
昔のバージョンだけかと思った。
すると、MaxはSerialIncrementでは増分にしか使えないですね。リレーションで降順ソートしてMAX関数を排除?
×ではなく=になってます。
Offline
それなら数字部分はグループごとの連番になると思うけど
Left ( テーブル 2::フィールドB ; 1 ) &
だと、アルファベットはグループごとの最初に作られたレコード=初出とみなしちゃってるので、フィールドA条件があるのでだめですね。
リレーションは
テーブル::D=テーブル 2::D
のリレーションでテーブル2側をBの降順ソートにする。
Case ( not IsEmpty ( フィールドA ) ; SerialIncrement ( テーブル 2::フィールドB ; 1 ) )
新規グループの場合「1」になるんで手で入れる。
1つのファイルで色々な方法のテストをやると使用するフィールドやリレーションを間違える(た^^;)ので、ファイルのコピーでやってみた方がよいです。
[ Generated in 0.006 seconds, 8 queries executed - Memory usage: 583.42 KiB (Peak: 620.33 KiB) ]