- ベストアンサー
Access2000 連番の振り方
次のようなテーブルに対して連番を振りたいのです。 伝票番号 日付 行番号 金額 00001 2007/01/01 1 1000 00001 2007/01/01 2 1000 00001 2007/01/01 3 1000 00002 2007/01/02 1 1000 00002 2007/01/02 2 1000 00002 2007/01/02 3 1000 以下はこのような状態で続く。 ここで知りたいのは、同日のデータに対しては伝票番号は同じ番号で 行番号のみ連番を振る。 日が変われば伝票番号は次の番号になり、行番号は新たに1から 振りなおすというものです。 クエリーでこのようなことは可能でしょうか。 やはりVBAで組まないと出来ないのでしょうか。 この方法を教えていただきたくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>別にクエリを作って、これらの該当するフィールドに使用するのでしょうか。 でもいいですし、テーブル作成クエリにして別テーブルを作ってもいいし 更新クエリにして原テーブルに書き込んでもいいですよ いずれの場合も同じ式が使えます
その他の回答 (3)
- CHRONOS_0
- ベストアンサー率54% (457/838)
番号を振る順番を決めるフィールドが必要です 順序を問わないのであれば、インポート時にオートナンバーで番号を振ります(ID) 日付だけを重複無しに取り出すクエリを作ります(Q1) 伝票番号: Format(DCount("*","Q1","日付<=#" & [日付] & "#"),"00000") 行番号: DCount("*","テーブル名","日付=#" & [日付] & "# and ID<=" & [ID])
お礼
もう少し詳しく教えていただきたいのですが この「伝票番号: Format・・・」と「行番号: DCount・・・」は 別にクエリを作って、これらの該当するフィールドに使用するのでしょうか。
- mshr1962
- ベストアンサー率39% (7417/18945)
選択クエリだと日付入力時点の現在の伝票番号と行番号の最大値が分かりません。 更新クエリで行なう場合は、全レコード対象の振り直しになりますので、 通常の運用では効率が悪いです。 通常はフォームとかの更新後イベントを使ってのオートナンバー処理ですね。 DCOUNTとDMAXとDLOOKUPを使えば設定可能です。 Sub 日付_AfterUpDate() Dim GB As Long GB = DCOUNT("*","テーブル名","日付=" & Me.日付) '入力日付の件数 If GB = 0 Then '新しい日付の場合の設定 伝票番号=最大値+1 行番号=1 伝票番号 = Format(CLng(Nz(DMAX("伝票番号","テーブル名"))) + 1,"00000") 行番号 = 1 Else '既にある日付の場合の設定 伝票番号=既存の値 行番号=件数+1 伝票番号 = DLookup("伝票番号","テーブル名","日付=" & Me.日付) 行番号 = GB + 1 End If End Sub ※伝票番号 テキスト型(5桁),行番号 数値型(長整数) として作成しています。
お礼
koroloさま、mshr1962さま ご対応ありがとうございます。 ANo.1には補足説明をさせていただきましたのでそちらもご覧ください。 なるべくクエリーで解決できたらと思っているのです。 それは、今は私はAccessが使えるのでVBAでもいいのですが、担当が代わったりとかしてあまりAccessになじみのない方にも後々簡単にメンテナンスできるようにしたいと思ってるからです。 すみません、いろいろ言いまして。 よろしくお願いします。
- korolo
- ベストアンサー率42% (39/92)
VBを使わなくても大抵の事はマクロで出来ると思いますが、下記の点により作り方は違ってきます。 (1)データを1レコード入力する毎に採番して行く方法 (2)既に入力済みのデータに対して付番する方法(この場合は、付番する為の定義が必要です。→行番号を付って行く順番のルールの事)
補足
後者のパターンです。 このデータは他のシステムからCSV形式のファイルを取り込みます。 この中身は伝票番号と行番号は存在しません。 この2つの番号は会計システム側で必要となるので Accessでこの情報を追加する必要があるのです。 伝票番号は1番から始めても問題ありません。 同一日が同じ番号であればいいのです。 上限はおそらく500番ぐらいかなと思います。
お礼
みなさま、いろいろ教えていただきありがとうございました。 これらを参考に組んで行きます。