みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
[環境]
Win7,XP
FM12Ad
FMS12Ad
「A0001」の様に、アルファペット+数字4ケタの連番を振りたいのですが、
「A9999」まで使用した後、次の連番を「B0001」にする様な計算式、または技法はありますか?
構成として、
「連番管理」テーブルにて「連番」(グローバルフィールド)のみを作成 初期値「A0001」
ある一連のスクリプト内で、現在の「連番管理」テーブルの「連番」フィールド値を変数格納後、次のユーザが使用する連番を取得できるよう
[フィールド設定]ステップで「連番」+1に値を書き換えています。
単純に行くと、「A9999」の次は「A10000」となってしまいますが、そこを「B0001」としたいです。
宜しくお願いします。
普通に、0から始まるシリアル値をとるフィールドを作っておきます。
それを元に、
Choose ( Div ( serial ; 9999 ) ; "A" ; "B" ; "C" ; "D" ; "E" ) )
& Right ( "0000" & ( Mod ( serial ; 9999 ) + 1 ) ; 4 )
という計算フィールドを作るのが、一番簡単かもしれません。
Offline
Shinさんのアルファベットの部分を
Char ( 65 + Div ( serial : 9999 ) )
とすればテキストの羅列をしないで済みますね。
ちなみに、
Char ( 65 ) = "A"
です。
Offline
確かに、それいいですね。
Offline
Shin様
チポ様
ありがとうございます。
Choose,Div,Mod
どれも今まで使用した事がない関数でしたので、それぞれを勉強してみました。
うまく説明出来るほどの理解は出来ていませんが、引数を変えてみたりしてなんとなく理解出来てきました。
その上で、教えていただいた下記計算フィールドを作成し、手動で引数となる数値フィールドの値を変えてみたところ、意図していた事が可能となりました。
Choose ( Div ( serial ; 9999 ) ; Char ( 65 + Div ( serial ; 9999 ) ) ; Char ( 65 + Div ( serial ; 9999 ) ) )
& Right ( "0000" & ( Mod ( serial ; 9999 ) + 1 ) ; 4 )
<質問&確認1>
Choose ( Div ( serial ; 9999 ) ; "A" ; Char ( 65 + Div ( serial ; 9999 ) ) )
& Right ( "0000" & ( Mod ( serial ; 9999 ) + 1 ) ; 4 )
というように、Chooseの2つ目の引数に"A"を持ってきても、もちろん同じ結果を取得出来ますが、普通はどちらを記述しますか?好みでしょうか?
<質問&確認2>
最初の構成と同じく、連番管理テーブルに数値フィールド、計算フィールド(今回追加)、どちらもグローバルフィールドとしています。
スクリプトにて現在の計算フィールド値を変数格納後、フィールド設定ステップにて、数値フィールドを「数値フィールドの値+1」に書き換えという事で、
スクリプトに関しては当初と大きな変更なしでいけると思いますが、Shin様の云う「数値フィールド」「計算フィールド」は、グローバルでのお考えでしたでしょうか?
計算式は
Char ( 65 + Div ( serial ; 9999 ) ) & Right ( "0000" & ( Mod ( serial ; 9999 ) + 1 ) ; 4 )
これでいいんですよ。
これを計算フィールドとの計算式とすれば、
sirialフィールドを作るだけで、他になにもいらないですよ。
後々のメンテナンス等を考えたら出来るだけシンプルにした方がいいですよね。
Offline
Char ( 65 + Div ( serial ; 9999 ) )
& Right ( "0000" & ( Mod ( serial ; 9999 ) + 1 ) ; 4 )
で良いですよ。
書かれている式では、Cxxxxが欲しい時におかしくなります。
グローバルではなくレコード毎に値を持たせる必要がありますよね。フィールドは、グローバルでは有りませんし、スクリプトで設定することもありません。
Offline
書かれている式では、Cxxxxが欲しい時におかしくなります。
確かに...Cxxxxとなるところが、xxxxとなってしまう事が確認出来ました。
関数の理解が出来ていないようです。
Char ( 65 + Div ( serial ; 9999 ) )
& Right ( "0000" & ( Mod ( serial ; 9999 ) + 1 ) ; 4 )
として動作確認出来ました。
グローバルではなくレコード毎に値を持たせる必要がありますよね。フィールドは、グローバルでは有りませんし、スクリプトで設定することもありません。
ですが、詳細を申し上げると、この採番した連番を複数行に同じ値をもたせる仕様となります。
親番、子番みたいな感じの親番に該当します。
データの本登録をする前に、まず一時テーブルに各ユーザが入力処理を行います。
1回の入力時(入力処理~本登録実行処理)にはMAX5件まで入力出来、その1回の登録実行処理に対し、上記採番した値を親番フィールドにセットし、別のフィールドの子番フィールドに(Get(レコード番号))を持ちます。
入力処理されたものが全て本登録されるわけではなく、一時テーブル入力中にあるレコードを意図的に削除、または本登録実行はしない場合等があります。
本登録処理実行完了後、一時テーブルのレコードは都度レコード削除します。
親番 子番
A0001 1
A0001 2
A0001 3
A0002 1
A0003 1
A0003 2
というような形になります。
こういった場合、本登録実行時のボタンのスクリプトに、先に記載した
スクリプトにて現在の計算フィールド値を変数格納後、フィールド設定ステップにて、数値フィールドを「数値フィールドの値+1」に書き換え
という考えになったのですが、もっとスマートな方法はありますでしょうか?
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 517.43 KiB (Peak: 521.97 KiB) ]