MW211 EXIT

devlog
ExcelVBA/EditModeとClose
2015年01月16日
MSSQLとのアクセスにて。

「.EditMode」の値の遷移を以下にまとめた。
┌──────────────────┬────────────┐
│Dim テーブル As New ADODB.Recordset │ テーブル.EditModeの値  │
├──────────────────┼────────────┤
│テーブル.Open …                    │「0(adEditNone)」       │
├──────────────────┤                        │
│テーブル.Fields("列名").Value = 値  ├────────────┤
├──────────────────┤「1(adEditInProgress)」 │
│テーブル.AddNew                     ├────────────┤
├──────────────────┤「2(adEditAdd)」        │
│テーブル.Fields("列名").Value = 値  │                        │
├──────────────────┤                        │
│テーブル.Update                     ├────────────┤
├──────────────────┤「0(adEditNone)」       │
│テーブル.Close                      │                        │
└──────────────────┴────────────┘
値が代入されれば更新モード(「1(adEditInProgress)」)、
「.AddNew」が実行されれば追加モード(「2(adEditAdd)」)となり、
「.Update」で、元(「0(adEditNone)」)に戻るようだ。

「.Close」時に元(「0(adEditNone)」)に戻ってない場合には
エラー(「このコンテキストで操作は許可されていません。」)となってしまう。

よって、「.Update」を漏らさずやるか、
更新失敗等の場合には必ず一次的なロールバック「.CancelUpdate」を
必ず行うこと。

クローズ処理を以下の様にしておけば、たいていは大丈夫だろう。
┌──────────────────────────────────────┐
│If Not (テーブル.BOF Or テーブル.EOF) Then                                  │
│    If テーブル.EditMode = adEditInProgress _                               │
│    Or テーブル.EditMode = adEditAdd Then                                   │
│        テーブル.CancelUpdate                                               │
│    End If                                                                  │
│End If                                                                      │
│If テーブル.State <> adStateClosed Then                                     │
│    テーブル.Close                                                          │
│End If                                                                      │
└──────────────────────────────────────┘

ちなみに削除モード「4(adEditDelete)」ってのもあるのだが
こいつがよくわからない。

「.Delete」の前後では「0(adEditNone)」のままだし、
もちろん「1(adEditInProgress)」とかになっている状況で
「.Delete」をすると「0(adEditNone)」になる。

MSDNの説明は「カレント レコードが削除されたことを示します。」なので
エラー系で発生するというわけでもなさそう。
もちろんトランザクション中でコミット前でも即「0(adEditNone)」になる。
分類:ExcelVBA