- 締切済み
Access オートナンバーについて
17年・18年の伝票整理をしたいと思っています。 伝票IDを、17年度分なら 17-(オートナンバー) 18年度分なら 18-(オートナンバー) のように、設定したいと思ったのですが、どんな方法があるでしょうか。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- O_cyan
- ベストアンサー率59% (745/1260)
>17年・18年の伝票整理をしたい・・ 伝票整理だけであれば17・18年度を日付のフィールドを元に年度別に抽出するテーブル作成クエリを作り別テーブルを作れば良いと思いますが。 同じテーブル構造のテーブルを用意しクエリで17年度分の伝票のレコードを抽出し日付等でソートしそのテーブルに追加します。オートナンバー型のフィールドを追加し連番を作り17-(オートナンバー)を保存するフィールドもテキスト型で追加します。 そのテーブルを更新クエリでオートナンバー型のフィールドから年度-連番を作りだし17-(オートナンバー)を保存するフィールドを更新します。オートナンバーのフィールドを[No]として17-(オートナンバー)のフィールドを[ID]・伝票の日付のフィールドを[日付](入力は西暦)とした場合。 17年度分を抽出しIDのレコードの更新欄に Format(Format([日付],"ee"),"00") & "-" & Format(Str([No]),"00000") で日付(西暦)から和暦に変換しテキストに変換、オートナンバーを00000のフォーマットでテキストに変換し間に-を入れる。 これでテーブルを更新すれば17年度分伝票の場合17-00001からの連番を振れます。日付を日付型で持っていなければMidで切り出すか単純に"17-"&Format(Str([No]),"00000")で出来ます。 18年度も同様に出来ます。 18年度の新しい伝票を入力する場合は上記の方法で18-0000?の連番を作ったテーブルを元に入力するようにすれば続きの連番を作り出せます。 DMax([No])で一番大きな連番を取得し連番(0000?)の部分を切り出して+1させて"18-"と結合した連番を新しいレコードと一緒にテーブルに保存するようにすれば出来ます。 こういう事でしょうか?
- temtecomai2
- ベストアンサー率61% (656/1071)
#1 です。 オートナンバーは "そのテーブルの全レコードの中で一意" であり、しかもユーザーまたは開発者が意図的に変えることができません。(最適化をすれば云々は別の話) しかも登録を途中でキャンセルしても次回採番予定の番号は 1つ進んでしまうので、歯抜け番号になったりします。 こういった理由から、私はオートナンバーを "ユーザーの目に触れる列" に使うことをお勧めしません。 私ならオートナンバーは決して一般ユーザーが見ることの出来ない "内部的なキー" に使います。 そして伝票番号のような番号は "年番号" と "連番" の 2列を使って "表現" します。 ただし、yy-nn の組み合わせが全体の中で一意にならなくてはいけないのは確かなので、レコードの新規作成や更新の操作はユーザーが画面上で行うにしても、実際にレコードを更新する行為はプログラムの中から行うようにしています。 複数ユーザーが更新しない保証がある場合の大雑把な例として下記のようなロジックが考えられます。 ホントに大雑把ですけど。 【新規登録】 ・必要項目入力後ユーザーが登録ボタンを押す。 ・日付またはユーザーが入力した "年" をキーに、同年での最終番号を取得。 ・その番号に 1を足した番号に決定。 ・情報を ADO で登録。 【更新(番号部分もユーザー編集が可能)】 ・必要項目入力後ユーザーが更新ボタンを押す。 ・フォーム上に表示されている番号を取得。 ・編集前の番号と同じならそのまま ADO で更新。 ・違っていれば、フォーム上の番号が既に使われているか確認。 ・使われていなければ新しい番号で更新。 ・(または新しい番号で新規登録して古い番号のレコードを削除) ・使われていれば更新せずにユーザーへ知らせる。
お礼
回答ありがとうございます。 あまりデータベースに深い知識を持っていませんが、自分で調べて、教えていただいたのをやってみたいと思います。本当にありがとうございました。
質問があまり明快ではありませんが、取り敢えず二つのやり方 1.「伝票整理」の前処理として更新クエリを動かす 2.データの新規登録(append,insert)時に、VBAなどで値をセットする しかしご質問のようなID設定にあまり意味がないように思われます。そのようなIDがなくても、演算その他の処理時にどのようにでも扱えると思うので。
- temtecomai2
- ベストアンサー率61% (656/1071)
できません。 データを操作するユーザーが手動で意図的につける。 データを操作するユーザーがレコードを保存するタイミング(登録用のボタンを押すとか)で、VBA などによって付ける。 ってところじゃないでしょうか。
お礼
回答ありがとうございました。 分けて作るということで、少し難しいような気がしますが、ぜひやってみたいと思います。