• 締切済み

ACCESS条件により自動に連番付与させるには

処理月   |処理日 |値 |番号付与 2010/12/01|2010/12/01|Is Not Null|1 2010/12/01|2010/12/01|Is Not Null|1 2010/12/01|2010/12/02|Is Not Null|2 2010/12/01|2010/12/02|Null | 2010/12/01|2010/12/02|Is Not Null|2 2010/12/01|2010/12/01|Is Not Null|1 2010/12/01|2010/12/05|Is Not Null|3 2010/12/01|2010/12/05|Is Not Null|3 2010/12/01|2010/12/05|Null | 2010/12/01|2010/12/10|Is Not Null|4 2010/12/01|2010/12/10|Null |4 2010/12/01|2010/12/10|Is Not Null|4 2011/01/01|2010/01/05|Is Not Null|1 2011/01/01|2010/01/05|Null | 2011/01/01|2010/01/05|Is Not Null|1 2011/01/01|2010/01/05|Is Not Null|1 処理月に対してスタート 処理日にたいして値があれば番号を自動付与 *処理月の値が変更されれば番号は1から自動付与 分かる方願います

みんなの回答

  • layy
  • ベストアンサー率23% (292/1222)
回答No.5

入力時に採番するのでは? 既存の数レコードに該当キーがあるかないか見る あればその番号と同じ なければ1加算した番号 1行目はレコードなく新規採番の1 2行目は1行目分があるための1 3行目はレコードなく新規採番2回め、1加算の2 の考え これを年度単位に行う 採番の原理が参考になるのでは? まとめてやるにはVBA使う等、前述のコントロールブレイクとかが参考

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

提示されたテーブルを「T処理」という名前にします。 提示されたテーブルにデータを固有に識別する フィールドがなければオートナンバーのフィールド を追加し、その名前をIDとしてください。主キーの 設定は特に必要ありません。 以下の手順で設定してください。 Q20、Q30、Q40 はクエリ名です。そのままで 登録してください。変更する場合はSQL文の中の すべてを変更する必要があります。また「T処理」 というテーブル名も必要に応じて変更してください。 この場合もクエリの中も変更する必要があります。 (1) Q20 SELECT T処理.処理月, T処理.処理日 FROM T処理 WHERE ((Not (T処理.値) Is Null)) GROUP BY T処理.処理月, T処理.処理日; (2) Q30 SELECT Q20.処理月, Q20.処理日, (SELECT COUNT(*) FROM Q20 AS Temp WHERE Q20.処理月 = Temp.処理月 AND Temp.処理日<=Q20.処理日 GROUP BY Temp.処理月) AS 連番 FROM Q20; (3) Q40 SELECT T処理.ID, T処理.処理月, T処理.処理日, T処理.値, Q30.連番 FROM T処理 INNER JOIN Q30 ON (T処理.処理月 = Q30.処理月) AND (T処理.処理日 = Q30.処理日) WHERE ((Not (T処理.値) Is Null)); (4) 標準モジュールに以下を貼り付け保存してください。 フォームに貼り付けるときは Sub を Private Sub にしてください。 DAOを使用しますのでコード表のツールから参照設定で DAOにチェックを入れてください。入っていればいいです。 Microsoft DAO xxx Object Library xxxは3.6のような数字です。 Sub cmd処理() Dim db As Database Dim rs1 As Recordset Dim rs2 As Recordset Set db = CurrentDb Set rs1 = db.OpenRecordset("T処理", dbOpenDynaset) Set rs2 = db.OpenRecordset("Q40", dbOpenDynaset) If rs1.RecordCount > 0 Then rs1.MoveFirst Do Until rs1.EOF If rs2.RecordCount > 0 Then rs2.MoveFirst Do Until rs2.EOF If rs1!ID = rs2!ID Then rs1.Edit rs1!番号付与 = rs2!連番 rs1.Update End If rs2.MoveNext Loop End If rs1.MoveNext Loop End If rs1.Close: Set rs1 = Nothing rs2.Close: Set rs2 = Nothing db.Close: Set db = Nothing End Sub (5) ボタンのクリックイベントで、 Call cmd処理 としてください。 クエリのSQL文は長いので貼り付けるときに 気をつけてください。 >*尚、yyyy/mm/bb(日付け)まで表示させていますから >月にたいしては1日で(2010/01/01)や(2010/02/01)で >統一するつもりです 余分な処理の発生がなくなるので考えることが 省略されます。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

(1) >値の入力時の処理にさせたい とありますが、レコードはランダムに入力 されていくのですか。 (2) 連番付与はテーブルに書き込むのですか、 あるいはクエリで表示でいいのですか。 (3) >処理月に対してスタート と、ありますが、年度が変わっても月が同じ 場合は同じ月として計算するのですか、あるいは 年度が変われば同じ月でも違うグループとして 計算するのですか。 (4) (1)かつ(2)のテーブル書き込みの場合は >値の入力時の処理にさせたい だと、その都度全てのレコードの書き換えが 起こります。レコード数が多ければ時間が かかるようになりますが。 (出来ないことはありませんが) (5) 各レコードを一意に識別できる番号などは ありますか。 以上のことをお聞かせいただければ、と思います。 なお、レコードの入力順序はどのようになっていても 構いません。

BSR123
質問者

お礼

お返事有難うございます >(1) >値の入力時の処理にさせたい >とありますが、レコードはランダムに入力> >されていくのですか。 はい、追加入力が発生するのを想定しております >(2) >連番付与はテーブルに書き込むのですか、 >あるいはクエリで表示でいいのですか。 テーブルに書き込みしたいです >(3) >処理月に対してスタート >と、ありますが、年度が変わっても月が同じ >場合は同じ月として計算するのですか、あるいは >年度が変われば同じ月でも違うグループとして >計算するのですか。 年度がかわれば違う日付けとしての認識で考えております *尚、yyyy/mm/bb(日付け)まで表示させていますから 月にたいしては1日で(2010/01/01)や(2010/02/01)で統一するつもりです >(4) >(1)かつ(2)のテーブル書き込みの場合は >値の入力時の処理にさせたい >だと、その都度全てのレコードの書き換えが >起こります。レコード数が多ければ時間が >かかるようになりますが。 >(出来ないことはありませんが) そうですか;; それだとたとえば、計算ボタンを作成し押せば実行するような形 が理想となります >(5) >各レコードを一意に識別できる番号などは >ありますか。 IDのことでしょうか? いまのとろ管理番号は作ってないです

  • layy
  • ベストアンサー率23% (292/1222)
回答No.2

「ACCESS」、「連番」、 で検索。 これだけでいろいろサンプルあります。 グループ単位につけたり、連番にしたり 適合するものを探してみると良いです。 一例 http://www.accessclub.jp/qa/qa_021.htm http://www.accessclub.jp/samplefile/samplefile_72.htm VBAを使うなら、 先頭から単純に1レコードずつ処理していき、 キーが変わったら カウントを+1し、その値を出力する。 同じキーなら、 前レコードに付与したカウントをそのままの値セットする。 EOFになるまでこれの繰り返し。 ただ、 6行目については、過去に出現したキーと同じなので カウンタ+1させる前に、その判定が事前に必要です。 前に出現したキーであれば、+1しないでその保持したカウンタをそのまま適用、 前に出現したキーでない、前のレコードと違うならカウンタ+1。 サンプル等で、 >処理日にたいして値があれば番号を自動付与 付与していく番号を保持するにはどうするか・・・・の実現方法を考えてみる >処理月の値が変更されれば番号は1から自動付与 前の処理月を保持するにはどうするか・・・・の実現方法を考えてみる

  • layy
  • ベストアンサー率23% (292/1222)
回答No.1

まず、コントロールブレイクの考え方を組み込むと良いです。 6行目が他と並びが違うので、最初の並びを保持する項目は準備する必要あります。

BSR123
質問者

お礼

>まず、コントロールブレイクの考え方を組み込むと良いです。 具体的にどうすればよいのか^^; >6行目が他と並びが違うので、最初の並びを保持する項目は準備する必要あります ・値の入力時の処理にさせたい

関連するQ&A