- ベストアンサー
Accessで運用管理テーブルの番号を更新する方法
- Accessの業務管理テーブルで、A管理番号にチェックを入れると、番号が自動的に更新される方法を教えてください。
- 業務管理テーブルにはA点検、B点検、C点検という項目がありますが、A管理番号のみを更新したいです。
- A管理番号の初期値が201900で、Aにチェックを入れるたびに1ずつ増えるようにしたいです。BとCの番号は変更されてはいけません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
【まだバグがあるかも】 念の為に1996~2000年に書いたコードを確認すると、次のようになっている。で、よくよくコードを精査すると cnnの出番はない。あっても動作はするだろうが、無駄な宣言は、バグの一種。そこんとこは、質問者で修正テストして欲しい。 Dim isOK AS Boolean Dim R As Integer ' 行インデックス Dim N As Integer ' 行総数 - 1 Dim lngNumber As Long Dim rst As ADODB.Recordset Dim fld As ADODB.Field Set rst = New ADODB.Recordset With rst .Open strSQL, _ CurrentProject.Connection, _
その他の回答 (4)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【バグ発見】DIM文中の lngNunber は不要! 関数内で、リナンバー初期値を取得するというアイデアで書き始め、「いやいや、コールする時に指示できる方が断然よい!」と考えを改めた。その痕跡が、このバグ。今宵は、酒量も大分多い。許されたし。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足】いちゃもんを付けるだけの回答では不満だろうから・・・ 《一番簡単な解決方法》 A管理番号付与ルール:何もなし。 というのであれば、入力が済んだら[管理番号付与フォーム]を呼び出す。 理由:一斉入力でユーザーがレ点を誤って付けることもある。 :また、レ点を消したり付けたりすることも考えられる。 :この問題に対応するには、常にリナンバーするしかない。 :で、7日を経過した入力データの訂正は不可とする。 :Yes/No型の列[管理番号ロック]を設けるという手もある。 《管理番号リナンバーを可能にするテーブル要件》 要件:業務管理テーブルに主キー列[ID]が存在すること。 ・出来れば、オートナンバーではなくて採番した方がよい。 ・でないと、データベースが壊れた時の復旧が滅茶困難。 【管理番号付与フォームに書くべきコード】 管理番号付与フォームは、管理番号A、B、Cの3つを管理するそれにする手もある。が、それは横において、 1、リナンバー対象のデータを呼び出すSQL分を生成する。 ・主キー[ID]は、データを入力順に呼び出す上で不可欠。 ・単に呼び出しても、入力順であることは保証されない。 2、ADODBでSQL文に相当するレコードセットを呼び出しリナンバーする。 というのが一般的だと思う。 以下は、70歳になった爺が晩酌しながら23年振りに書いた VBA コード。必ず、1行1行を精査して欲しい。strSQLは、リナンバー対象のデータを呼び出すSQL分。lngNumberは、リナンバーの最初の値を指示する引数。エラーなく1件以上リナンバーした時は、True を戻す予定である。 Private Function NumberUpdate(ByVal strSQL As String, _ ByVal lngNumber As Long) As Boolean On Error GoTo Err_NumberUpdate Dim isOK AS Boolean Dim R As Integer ' 行インデックス Dim N As Integer ' 行総数 - 1 Dim lngNumber As Long Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim fld As ADODB.Field Set cnn = CurrentProject.Connection Set rst = New ADODB.Recordset With rst .Open strSQL, _ CurrentProject.Connection, _ adOpenForwardOnly, _ aadLockPessimistic If Not .BOF Then N = .RecordCount - 1 .MoveFirst For R = 0 To N .Fields("A管理番号") = lngNumber + 1 lngNumber = lngNumber + 1 .MoveNext Next R Else isOK = True End If End With Exit_NumberUpdate: On Error Resume Next rst.Close Set rst = Nothing NumberUpdate = Not isOK Exit Function Err_NumberUpdate: isOK = True MsgBox "SQL 文の実行時にエラーが発生しました。(NumberUpdate)" & Chr(13) & Chr(13) & _ "・Err.Description=" & Err.Description & Chr(13) & _ "・SQL Text=" & strSQL, _ vbExclamation, " 関数エラーメッセージ" Resume Exit_NumberUpdate End Function
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
【補足】管理番号=入力順ってのは大いに疑問。 だって、管理番号って、管理の為に付与する番号。その付与には、それなりのルールがあるのでは?そういう意味での《XXX番号の管理》フォーム。 それと、入力は、一件だけではなくて連続して入力する筈。だから、入力データには、万全なそれもあるし、登録に適さないそれも発生する筈、だから、連続入力して閉じたら、《入力データ精査プログラム》が走って、 >3件の不適な入力を発見しました。 >以下のデータは登録されていせん。 > >【不適なデータ】 > > XXXXXXXX > XXXXXXXX > XXXXXXXX などの表示を行うと思う。で、この場合に、どうやって《XXXX管理番号》を自動付与するのか? と、色々と検討すべきことは多いと思うが・・・。
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Q、Aにチェック有りで閉じるとA管理番号をカウントアップする方法。 A、それは、極めて初歩的なコードを書けば済むこと。だが・・・ なぜ、そんなことをする必要があるのかな? ・A管理番号が主キーであれば、《採番テーブル》が《採番関数》の出番。 でも、その場合、フォーム上に[主キー]も表示しておくのが一般的。 で、データの新規追加の発生したタイミングで表示もカウントアップ。 ・A管理番号が主キーではなくて、いわゆる生産管理番号だとする。 この場合には、フォーム上に表示する必要はない。 また、入力フォームを閉じた時に、生産管理番号を更新するのも拙い。 【トップメニュー】に配置した、《生産番号管理フォーム》をクリック。 で、一斉に新生産番号を付与する。 まあ、IT業界とは縁もゆかりもないど素人の考え。適当に読み流してください。