スポンサーサイト 


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--

Category: スポンサー広告

TB: --  /  CM: --

top △

更新した内容を全て元に戻す 


連結した帳票フォームの処理で、フォーム全体としての変更で「登録」する。
いやいや、一連の変更操作を一括して「Cancel」(キャンセル)したい。

ワークテーブルを使って云々・・・・あるかと思いますが、
そのテーブル・・・現物だけでやりたい・・・

単純なものであれば、なんか・・・できる・・・・・みたい。
でも、結構注意が必要な感じ・・・・・

やってみて、動いたッポイので記事としてみます。
ただ、使えるのかどうかは、わかりません・・・・・
(自己責任にて以下参照してください)

フォームを起動するメニューを用意しました。
kEnt113_Menu

「WorkSpace」で起動するフォームは「F1」
「DBEngine」で起動するフォームは「F2」
フォームの見え方は同じなので、フォーム「F1」のものを
kEnt113_F1
 

メニューフォーム


メニューフォームは他フォームを起動するだけなので
Private Sub btn1_Click()
  DoCmd.OpenForm "F1"
  Call btn3_Click
End Sub

Private Sub btn2_Click()
  DoCmd.OpenForm "F2"
  Call btn3_Click
End Sub

Private Sub btn3_Click()
  DoCmd.Close acForm, Me.Name, acSaveNo
End Sub

 

今回、フォーム「F1」はテーブル「T1」を元に、フォームウィザードで作成しました。
それに処理をいろいろと記述していきます。

「WorkSpace」を使ったフォーム「F1」


ここでは、ワークスペースを求め、トランザクションを開始し、
フォーム作成時に作られたレコードソースを参照し、レコードセットを得て、
そのレコードセットをフォームに設定する・・・・
この時、Accessさんに変に動いてもらっても困るので、大元のレコードソース部分は空欄に・・・
ボタン「登録」(btn1) で、Commit を、ボタン「Cancel」(btn2) で、Rollback を・・・
これをやりたいので、
フォーム等途中で終了されないように Form_Unload で常に Cancel = True としてみる。
各ボタンがクリックされたら、3秒間テーブル「T1」を表示し確認できるように・・・

Dim wsp As DAO.Workspace
Dim db As DAO.Database
Dim rs As DAO.Recordset

Private Sub Form_Timer()
  Me.TimerInterval = 0
  DoCmd.Close acTable, "T1", acSaveNo
  DoCmd.OpenForm "F_MENU"
  Me.OnUnload = ""
  DoCmd.Close acForm, Me.Name, acSaveNo
End Sub

Private Function CommitRoll(iNum As Integer)
  If (Me.Dirty) Then
    MsgBox "編集中です", vbCritical
    Exit Function
  End If
  Select Case iNum
    Case 1: wsp.CommitTrans
    Case 2: wsp.Rollback
  End Select
  Me.Visible = False
  DoCmd.OpenTable "T1"
  Me.TimerInterval = 3000
End Function

Private Sub Form_Load()
  Set wsp = DBEngine.Workspaces(0)
  wsp.BeginTrans
  Set db = wsp.Databases(0)
  Set rs = db.OpenRecordset(Me.RecordSource, dbOpenDynaset)
  Me.RecordSource = ""
  Set Me.Recordset = rs
  Me.btn1.OnClick = "=CommitRoll(1)"
  Me.btn2.OnClick = "=CommitRoll(2)"
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Cancel = True
End Sub

Private Sub Form_Close()
  rs.Close
  Set rs = Nothing
  Set db = Nothing
  Set wsp = Nothing
End Sub

 

「DBEngine」を使ったフォーム「F2」


フォーム「F1」を「F2」でコピーします。
WorkSpace で出来たのなら、DBEngine ではどうなるのか・・・・を確認してみたものになります。
ま、同じように動くみたいです。

Dim db As DAO.Database
Dim rs As DAO.Recordset

Private Sub Form_Timer()
  Me.TimerInterval = 0
  DoCmd.Close acTable, "T1", acSaveNo
  DoCmd.OpenForm "F_MENU"
  Me.OnUnload = ""
  DoCmd.Close acForm, Me.Name, acSaveNo
End Sub

Private Function CommitRoll(iNum As Integer)
  If (Me.Dirty) Then
    MsgBox "編集中です", vbCritical
    Exit Function
  End If
  Select Case iNum
    Case 1: DBEngine.CommitTrans
    Case 2: DBEngine.Rollback
  End Select
  Me.Visible = False
  DoCmd.OpenTable "T1"
  Me.TimerInterval = 3000
End Function

Private Sub Form_Load()
  DBEngine.BeginTrans
  Set db = CurrentDb
  Set rs = db.OpenRecordset(Me.RecordSource, dbOpenDynaset)
  Me.RecordSource = ""
  Set Me.Recordset = rs
  Me.btn1.OnClick = "=CommitRoll(1)"
  Me.btn2.OnClick = "=CommitRoll(2)"
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Cancel = True
End Sub

Private Sub Form_Close()
  rs.Close
  Set rs = Nothing
  Set db = Nothing
End Sub

 

※ 当初、レコードが編集中にボタンがクリックされた時の処理として、
  Me.Dirty = False で確定させてから Commit / Rollback させると変てこな動きに・・・
 なので、編集中は、はじくように・・・

各フォームで、変更/追加/削除 してみてもそこそこ動くみたい・・・・
(2000 / 2003 / 2007 全部で動いたし・・・)
とは言っても、複雑になったりしたら・・・・ WHERE 条件が・・・・
途中で Filter したいってなったら・・・・
 ・・・ rs で Filter して rs.OpenRecordset したのを Me.Recordset に Set し直し・・・

どうだろう・・・・簡単なものには使えるのかなぁ ・・???・・・

あ、でも、この最中 Me.RecordsetClone はどうなってるんだろう??


サンプルは以下
 バージョン 20002003 (2002)2007
 ファイル kEnt113_2000.zipkEnt113_2003.zipkEnt113_2007.zip
 サイズ 24,06825,25726,920
※ ファイルは zip 形式
※ 2007 以外は、2007 保存時に変換 & 各バージョンで動作確認 & 最適化

関連記事

2011/12/12

Category: やってみる

TB: 0  /  CM: 0

top △

この記事に対するコメント

top △

コメントの投稿

Secret

top △

トラックバック

トラックバックURL
→http://kikutips.blog13.fc2.com/tb.php/113-ad3921c3
この記事にトラックバックする(FC2ブログユーザー)

top △


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。