- ベストアンサー
Accessでの連番設定に関して
Accessでの連番設定に関して教えて下さい。 Access2010で注文DBを作成しています。 注文フォームにはサブフォームが設けてあり、サブフォームに注文明細を入れています。 サブフォームには明細IDのフィールドが作成してあります。 注文フォームを開けた時に常にサブフォームの明細IDが1から始まるようにしたいと考えているのですが、方法をお教えいただければと思います。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
新規追加したとき、あるいは、途中のレコードを削除したときも、含めて、常にサブフォームの明細IDが1から始まる連番になるコード例です。 '削除後確認 Private Sub Form_AfterDelConfirm(Status As Integer) If Status <> acDeleteOK Then Exit Sub If Me.NewRecord Then Exit Sub With Me.RecordsetClone .Bookmark = Me.Bookmark Do Until .EOF .Edit !明細ID = .AbsolutePosition + 1 .Update .MoveNext Loop End With End Sub '更新前処理 Private Sub Form_BeforeUpdate(Cancel As Integer) If Me.NewRecord Then Me.明細ID = Me.CurrentRecord End Sub 「サブフォーム 連番を維持する」をキーワードにググるといろいろサンプルコードが見つかると思います。
その他の回答 (6)
- nicotinism
- ベストアンサー率70% (1019/1452)
サブフォームの明細IDということなので メインフォームのレコードソースの中に注文ID サブフォームの中には、注文IDと明細ID。 で、注文IDごとの連番が欲しいのでは・・と思いますよ。
お礼
nicotinism様 ご回答ありがとうございます。 hatena1989様の方法にて無事解決いたしました。 nicotinism様ご指摘の通、注文IDごとの連番を希望していました。 また何かありましたらよろしくお願いいたします。
- piroin654
- ベストアンサー率75% (692/917)
No4のような事だとします。 サブフォームのレコードソースはNo3と同じT明細にします。 T明細に明細ID以外に品名というフィールドがあるとします。 つまり、 明細ID 品名 他のフィールド1 他のフィールド2 のようになっているとします。 サブフォームの品名の更新後処理に以下を設定していください。 Private Sub 品名_BeforeUpdate(Cancel As Integer) Dim i As Long i = DMax("明細ID", "T明細") + 1 Me!明細ID = i End Sub
お礼
piroin654様 この度はご回答ありがとうございました。 私の説明不足により、何度もお手数をおかけしてしまい大変申し訳ありませんでした。 また、出張によりお返事が遅れてしまい大変申し訳ありませんでした。 hatena1989様の方法にて無事に解決いたしました。 本当にお世話になり、ありがとうございました。 また何かありましたらよろしくお願いいたします。
- piroin654
- ベストアンサー率75% (692/917)
ひょっとしてレコードを入力するごとに 連番を1から自動採番していきたい、ということですか。
- piroin654
- ベストアンサー率75% (692/917)
サブフォームのレコードソースをT明細とします。 T明細はテーブルで、フィールドの明細IDは数値型 とし、主キーを設定しません。 なお、以下はDAOを使っているので、コード表の 参照設定から、 Microsoft DAO xx Object Library にチェックを入れ↑ボタンで上げられるところまで あげてください。xxは3.6のような数字です。 以下はフォームを開くときのイベントです。 Private Sub Form_Open(Cancel As Integer) Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("T明細", dbOpenDynaset) If rs.RecordCount = 0 Then rs.AddNew rs!明細ID = 1 rs.Update End If rs.Close: Set rs = Nothing db.Close: Set db = Nothing Me.埋め込み0.Requery End Sub なお、上記の最後の Me.埋め込み0.Requery の埋め込み0とはサブフォームを表示するコントロールで サブフォームそのもではありません。初期値では 埋め込み0のような名前になっていますが、 分からないときはフォームのデザインビューで サブフォームの縁を右クリックしてプロパティ で確認してみてください。
- piroin654
- ベストアンサー率75% (692/917)
サブフォームのレコードは、たとえば 伝票処理ごとにデータを他のテーブルに 移動させるのですか。 新たな伝票処理のときはサブフォームの 中は空にしておくのでしょうか。
- piroin654
- ベストアンサー率75% (692/917)
普通は、サブフォームの開くときの イベントに、 Private Sub Form_Open(Cancel As Integer) DoCmd.GoToRecord , , acFirst End Sub で、一番最初に移動するはずですが。
補足
piroin654様 早速のご回答ありがとうございました。 私の書き方が悪くて申し訳ありません。 一番最初のレコードへの移動ではなく、明細IDに1番からの連番を振りたいと考えております。 もし、方法が解るようでしたらご回答いただければと思います。 よろしくお願いします。
お礼
hatena1989様 ご回答ありがとうございます。無事注文IDごとの子IDを作成する事ができました。 ググってはみたのですが、なかなか思い通りのページに当たるのは難しかったです。 また何かありましたらよろしくお願いいたします。