6 返信 最新の回答 日時: Jul 1, 2014 8:06 AM ユーザー:goo

    テキスト+西暦+シリアル

    goo

      タイトル

      テキスト+西暦+シリアル

      フォーラムに投稿

           シリアルに関して質問させて頂きたく投稿させて頂きました。

           宜しくお願い致します。

            

           早速なのですが質問させて頂きます。

            

           1)テーブル毎にそれぞれの独自のシリアルを以下のような構造で作りたいと考えているのですが、どのようにしたら良いのでしょうか。いまのところ西暦は1/1変わりなのですが、これを年度4/1を変わり初めにする場合も教えて頂けると助かります。宜しくお願い致します。

             【 固定アルファベット + 西暦(下2桁) + 4桁シリアル 】  

                     例)A140001

            

           2) (1)のシリアルが出来て、A140001〜A140010までのレコードが存在したとして間のA140005レコードを削除した場合、A140005というシリアルを欠番にすることは可能でしょうか?

            

           3)

           1/ シリアルは自動生成

           2/ レコードを書き込む人はこのシリアルを書き換えれない

           3/ ブラウズモードにおいて生成されたシリアルをコピーして他のフィールドにペースト

           1/と2/ は[ レイアウト設定」からシリアルのフィールドを選択してインスペクタの「フィールド入力」の「ブラウズモード」のチェックを外すという設定を ]で出来たのですが、この設定だとブラウズモードでシリアルの値をマウスでハイライトしコピーが出来ないのですが何か良い方法は有りますでしょうか。

            

           少し長くなってしまいましたが御教授の程宜しくお願い致します。

        • 1. Re: テキスト+西暦+シリアル
          goo

               すいません。追記なのですが

               1)の固定アルファベット というのは私が各テーブルに任意にAやBなど付ける為のものなので、指定したテーブルのシリアルの先頭が必ず指定したアルファベットになればいいということです。

               なので、ここでは 固定アルファベット の部分に A というテキストが入ると仮定して教えて頂けると助かります。

                

               宜しくお願い致します。

          • 2. Re: テキスト+西暦+シリアル
            sago350@未来Switch

                 こんな感じですかね。

            サンプルファイル

                 たぶん、ちゃんと動くと思います。
                 1)についてはSQL文を変更すれば可能かなと
                  
                 2)はシリアル値の最大値を取るようにしているので、欠番になります。
                 ただ、A140005を作って、すぐに削除→また生成すると、A140005が出てきます。
                  
                 3)シリアル値を計算フィールドで作ってあるのでコピーはできるけど修正できない状態。
                  
                  
                 ↓中のSQL文はこんな感じ。
                  
                      
                           Let([
                      
                           //▼▼設定箇所▼▼
                      
                           %年月日Fld    = GetFieldName( 登録日 ) ;
                      
                           %シリアルFld = GetFieldName( 年シリアル ) ; //自分自身のフィールド名
                      
                           //▲▲設定箇所▲▲
                      
                           %シリアルFld = GetValue( Substitute( %シリアルFld ; "::" ; "¶" ) ; 2 ) ;
                      
                           %テーブル名  = GetValue( Substitute( %年月日Fld ; "::" ; "¶" ) ; 1 ) ;
                      
                           %年月日Fld    = GetValue( Substitute( %年月日Fld ; "::" ; "¶" ) ; 2 ) ;
                      
                           %年月日        = GetField( %年月日Fld ) ;
                      
                           %年 = Year( %年月日 ) ;
                      
                           %月 = Month( %年月日 ) ;
                      
                           %日 = Day( %年月日 ) ;
                      
                           %年月日ST = Date ( 1   ;  1 ; %年 ) ;
                      
                           %年月日ED = Date ( 12 ; 31 ; %年 )
                      
                           ];
                      
                           ExecuteSQL(
                      
                           "
                      
                           SELECT MAX( " & Quote( %シリアルFld ) & " )
                      
                           FROM " & Quote( %テーブル名 ) & "
                      
                           WHERE
                      
                           ? <= " & Quote( %年月日Fld ) & " and " & Quote( %年月日Fld ) & " <= ?
                      
                           "
                      
                           ; ","
                      
                           ; "¶"
                      
                           ; %年月日ST
                      
                           ; %年月日ED
                      
                           )
                      
                           +1 //ココでプラス1する
                      
                            
                      
                           )
                 

                  

            • 3. Re: テキスト+西暦+シリアル
              goo

                   sago35さん

                   以前もsagoさんに教えて頂き、今回も本当にありがとうございます。

                   関数の本を片手に頑張っていたのですが全然思うように行かずに教えて頂く事にしたのですが、自分が作っていたものとは全く発想も何も違いました。。本当に有り難うございます。まさにこれの通りです。

                    

                   いまサンプルで頂いたものを試していて、幾つか疑問に思った事が有るのでお答えいただけると幸いです。

                   1) 「年シリアル」「登録シリアル」をレイアウト上に配置したくない場合、「cシリアル」の計算式に使われてる前者2つを配置しなくても「cシリアル」はまともに動き続けてくれるのでしょうか?頂いたサンプルで試したら動いてくれはしたのですが、あまりよくない(推奨はできない)使い方でしょうか?

                    

                   2)「登録日」のオプション設定が「データ入力」になっていて、その部分を「作成日」の日付取得に変更し1/1に西暦が変わってほしいのですが、データ入力→作成日にオプションを変更した場合、「cシリアル」の計算式もなにかかえた方が良いでしょうか?

                   3)素朴な疑問で申し訳ないのですが、計算式の頭につく「%」はどういった意味があるのでしょうか。

                    

                   質問に質問を重ねてしまい恐縮ですが、再度御教授の方を宜しくお願い致します。

              • 4. Re: テキスト+西暦+シリアル
                sago350@未来Switch

                     1)について
                     配置しなくてもOKです。

                     2)について
                     デバッグ(確認)の為にデータ入力にしていたので、作成日の設定でOKです。
                     すいません、そうなおしておけばよかったですね。

                     3)について
                     %はなくても動作します。
                     Let関数内で定義する変数と他のフィールドやらとを区別する為に付けています。
                     ※Let関数というは、変数を定義する関数です。
                     計算式を読みやすくするマイルールです。

                     なので、gooさんが解りやすい記号にしてOKです。

                • 5. Re: テキスト+西暦+シリアル
                  Shin

                       1) Year ( 日付 + 275 ) - 1 という式で参照すれば、年度が求められます。このフィールドを、FYearとしておきます。

                       2) シリアルを設定するフィールドに、自動入力「シリアル値」を設定し、"A140001" を初期値、増分を1にしておきます。

                       新規レコードを作る際に、

                       新規レコード/検索条件
                       If [ Middle ( Table::serial ; 2 ; 2 ) ≠ Right ( Table::FYear ; 2 ) ]
                       フィールド設定 [ Table::serial; "A" & Right ( Table::FYear ; 2 ) & "0001" ]
                       次のシリアル値を設定 [ Table::serial; "A" & Right ( Table::FYear ; 2 ) & "0002" ]
                       End If

                       というスクリプトを走らせれば良いでしょう。

                       これを更に別の計算フィールド参照しておいて、レイアウトに配置しておくと、コピーは出来ますが変更できなくなります。または、アクセス権で変更できない様に制限しておいても良いはずです。

                  • 6. Re: テキスト+西暦+シリアル
                    goo

                         sago35さん

                         なるほど!すごくスッキリしました!笑

                         %も「なんだなんだこれは」と探しまくってしまいましたが、そういったマイルールを自分で作って見やすくしていくのですね。とても勉強になります。

                         本当に助かりました!有り難うございます!

                          

                          

                         shinさん

                         年度に関しまして、なるほどです!有り難うございます!

                         スクリプトも有り難うございます。

                         別のフィールドに参照させて....なるほど....、こういった場所が幾つか有るので他の場所にどんどん使っていきます。勉強になります!

                         同じやり方にもこれだけ違うやり方もあるのですね。shinさんの方のやり方も試してやってみます。ありがとうございます!

                          

                          

                         お二人ともご返答有り難うございます。とても勉強になりました!

                         また何かあれが投稿させて頂きますので、その際はまた宜しくお願い致します。

                         ベストアンサーはお二人とも選ばせて頂きたい所なのですが、先にお答えいただいたsago35さんを選ばせて頂きます。

                         お二人とも本当に有り難うございました!