プロが教える店舗&オフィスのセキュリティ対策術

Accessでの連番設定に関して教えて下さい。
Access2010で注文DBを作成しています。
注文フォームにはサブフォームが設けてあり、サブフォームに注文明細を入れています。
サブフォームには明細IDのフィールドが作成してあります。

注文フォームを開けた時に常にサブフォームの明細IDが1から始まるようにしたいと考えているのですが、方法をお教えいただければと思います。

よろしくお願いします。

A 回答 (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


「サブフォーム 連番を維持する」をキーワードにググるといろいろサンプルコードが見つかると思います。
    • good
    • 0
この回答へのお礼

hatena1989様

ご回答ありがとうございます。無事注文IDごとの子IDを作成する事ができました。

ググってはみたのですが、なかなか思い通りのページに当たるのは難しかったです。

また何かありましたらよろしくお願いいたします。

お礼日時:2011/09/06 20:04

サブフォームの明細IDということなので


メインフォームのレコードソースの中に注文ID
サブフォームの中には、注文IDと明細ID。
で、注文IDごとの連番が欲しいのでは・・と思いますよ。
    • good
    • 0
この回答へのお礼

nicotinism様

ご回答ありがとうございます。

hatena1989様の方法にて無事解決いたしました。
nicotinism様ご指摘の通、注文IDごとの連番を希望していました。

また何かありましたらよろしくお願いいたします。

お礼日時:2011/09/06 20:01

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
    • good
    • 0
この回答へのお礼

piroin654様

この度はご回答ありがとうございました。
私の説明不足により、何度もお手数をおかけしてしまい大変申し訳ありませんでした。

また、出張によりお返事が遅れてしまい大変申し訳ありませんでした。

hatena1989様の方法にて無事に解決いたしました。

本当にお世話になり、ありがとうございました。
また何かありましたらよろしくお願いいたします。

お礼日時:2011/09/06 19:59

ひょっとしてレコードを入力するごとに


連番を1から自動採番していきたい、ということですか。
    • good
    • 0

サブフォームのレコードソースを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のような名前になっていますが、
分からないときはフォームのデザインビューで
サブフォームの縁を右クリックしてプロパティ
で確認してみてください。
    • good
    • 0

サブフォームのレコードは、たとえば


伝票処理ごとにデータを他のテーブルに
移動させるのですか。
新たな伝票処理のときはサブフォームの
中は空にしておくのでしょうか。
    • good
    • 0

普通は、サブフォームの開くときの


イベントに、

Private Sub Form_Open(Cancel As Integer)
DoCmd.GoToRecord , , acFirst
End Sub

で、一番最初に移動するはずですが。

この回答への補足

piroin654様
早速のご回答ありがとうございました。
私の書き方が悪くて申し訳ありません。
一番最初のレコードへの移動ではなく、明細IDに1番からの連番を振りたいと考えております。

もし、方法が解るようでしたらご回答いただければと思います。

よろしくお願いします。

補足日時:2011/09/05 15:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!