• ベストアンサー

Accessのサブフォーム内で連続番号を振りたい

Accessのサブフォーム内で連続番号を振りたい メインフォームで受付番号親(オートナンバー型) サブフォームで受付番号子(数値) でサブフォームで連続番号を振りたい場合の方法が見つかりません。 例: メインフォーム 受付番号親1 サブフォーム 受付番号親1 子1 商品~~~ サブフォーム 受付番号親1 子2 商品~~~  メインフォーム 受付番号親2 サブフォーム 受付番号親2 子1 商品~~~ サブフォーム 受付番号親2 子2 商品~~~ てな具合なんですけど。

質問者が選んだベストアンサー

  • ベストアンサー
  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.1

フォーム自体で行うことも可能ですが、クエリ側で行うことをお勧めします。 関数として、DCount関数を使う事になりますが使い方わかりますか?

shiema
質問者

お礼

ありがとうございます。 できたら、フォームでのやり方が今後のために知りたいのですが。

その他の回答 (3)

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.4

おはようです。 すみません。Upするときに、DCountをDMaxに変更したため、思惑通り動作してませんでした>< 申し訳ありません。 変更した理由が「1,2,3」とあって、「2」を削除後「1,3」とした時、Countだと3を追加、連続番号ではなくなるので、Maxに変更してみたんですが・・・。 Private Sub Form_BeforeUpdate(Cancel As Integer) If IsNull(Me.受付番号子.Value) Then If IsNull([Forms]![フォーム1]![受付番号親]) Then Me.受付番号子.Value = 1 Else If DCount("[受付番号子]", "サブフォームに使用しているテーブル名", _ "[サブフォームに使用しているテーブル名]![受付番号親] =" & [Forms]![親フォーム名]![受付番号親]) = 0 Then Me.受付番号子.Value = 1 Else Me.受付番号子.Value = _ DMax("[受付番号子]", "サブフォームに使用しているテーブル名", _ "[サブフォームに使用しているテーブル名]![受付番号親] =" & [Forms]![親フォーム名]![受付番号親]) + 1 End If End If End If End Sub 多分これで^^; 単に連続する番号を振りたいのであれば、テーブルにフィールドを作成する必要もなくなるのですが、フィールドを作った理由を深読みしすぎてますか?

shiema
質問者

お礼

おはようございます。回答くださった方法で試してみましたが全て"1"が代入されてしまいます。 社内販売の管理として使用したく、依頼者が複数の方に商品を発送する際の管理番号として付番したかったので、レコードに保存します。 もう一度考えてみます。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

サブフォーム内での連番でしたら、「CurrentRecord」の代入でやるのが楽です。 既存のデータに割り当てるのでしたら、 1)メインフォームで先頭レコードに移動 2)サブフォームで先頭レコードに移動(念のため) 3)サブフォームの「受付番号」にCurrentRecordを代入したら、  次のレコードに移動 4)同様に、サブフォームの最後のレコードまで繰り返し 5)メインフォームで次のレコードに移動 6)上の「2)~5)」を、メインフォームの最後のレコードまで繰り返し となります。 新規レコードの場合は、「レコード挿入時」イベントでCurrentRecordを代入するのがよいでしょう。 一応、既存レコードへの代入については、以前の回答でサンプルを作成してますので、よければそちらも参考に。(→参考URL)

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1575853
shiema
質問者

お礼

回答ありがとうございます。 基本的に新規レコードのみに適用します。 ただし、結構ド素人なもんでCurentRecordの使い方がよくわかりません もう少し詳しく教えていただくと幸いです。

  • Dxak
  • ベストアンサー率34% (510/1465)
回答No.2

結構、フォームで行おうとすると、難しいですね^^; サブフォームの更新前処理で、 Private Sub Form_BeforeUpdate(Cancel As Integer) If IsNull(Me.受付番号子.Value) Then If IsNull([Forms]![親フォーム名]![受付番号親]) Then Me.受付番号子.Value = 1 Else Me.受付番号子.Value = DMax("[受付番号子]", "サブフォームに使用しているテーブル名", _ "[サブフォームに使用しているテーブル名]![受付番号親] =" & [Forms]![親フォーム名]![受付番号親]) + 1 End If End If End Sub で、サブフォームに使用しているテーブルの「受付番号子」の既定値を0を削除し、Nullに変更してます。 更新前処理まで「受付番号子」を空欄で置いてあるのですが、レコード移動時にすればカーソールがレコードに移った時にも数値が入れられますが・・・ESC等でデータを消された際、やはり更新後にも必要になってきます。 受付番号子(数値)を演算として、テーブルに保管せず、裏でサブフォームにオートナンバー型のインデックスを取り付け、表の表記だけ、子の連番を取り付けるって考えたのですが・・・。こちらの方だと新規の時にもレコードに受付番号子に値が入ってくるように何とかなるかな~っと^^;

shiema
質問者

お礼

さっそくありがとうございました。 手元にそのDBがないのでこの情報を持ってやってみます。

関連するQ&A