• ベストアンサー

アクセスでのコマンドボタンでの上書き保存について。

Private Sub cmd_修正_Click() Dim fname As String fname = "F_kihonn" '転送先のフォーム名 If SysCmd(acSysCmdGetObjectState, acForm, fname) = 0 Then DoCmd.OpenForm fname, acNormal '転送先フォームが開いてない場合は開く End If DoCmd.GoToRecord acDataForm, fname, acNewRec '転送先フォームの新規レコードをカレントにする '値の代入 Forms!F_kihonn!更新日 = Me!更新日 Forms!F_kihonn!コード = Me!コード Forms!F_kihonn!カナ = Me!カナ Forms!F_kihonn!発注者名 = Me!発注者名 Forms!F_kihonn!担当部署 = Me!担当部署 Forms!F_kihonn!郵便番号 = Me!郵便番号 Forms!F_kihonn!住所 = Me!住所 Forms!F_kihonn!ビル名等 = Me!ビル名等 Forms!F_kihonn!電話番号 = Me!電話番号 Forms!F_kihonn!FAX番号 = Me!FAX番号 Forms!F_kihonn!URL = Me!URL Forms!F_kihonn!特記事項 = Me!特記事項 End Sub というのを書きました。これだとコードにキーを持たせているので、転送先フォームでコード以外の内容を修正すると、「重複しているので変更できませんでした」とエラー表示が出ます。上書き保存ができればいいのでしょうけど。上書き保存のコマンドボタンとかを作ればいいのでしょうか??何かいい方法はありますか?わかる方いましたらご教示ください。初心者の質問ですみません。宜しくお願いします。

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

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

> この方法でしたら、普通の更新可能なフォームでの作成ですよね? > でもこのやり方ができるのであれば、クエリから作成した更新不可 > の画面はいらなくなるわけですかぁ(^^ゞ えっと、そうですね 更新可能なフォームで作成して、開いたら更新不可能にして開いてくれます 1つのフォームの訂正するたびに複数のフォームを訂正するのが面倒なので、データを弄れなくする為に制御掛ける場合は私は、こうしてます 訂正、新規、閲覧等のフォームがレイアウト違うと混乱しますので^^; > でいちお上書き登録はされているのですが、上書きし終わった後も、 > 更新ができるのです。F_kihonnを開いている状態でF_kihonnに転送す > るという表現もおかしい気がしますが、やっぱり変なのでしょうか? よく見る非連結のフォームを使用するパターンとは、かなり違うような気がします DAO、ADO、DLOOKUP等を使用して、非連結のフォームへ値を引用、登録時は、アクションクエリ(追加クエリ、更新クエリ)、DAO、ADOを使っているパターンをよく見かけますが・・・ 更新前処理、更新後処理の間にフォームから自動的にテーブルへデータの書込み、レコード移動時の前にテーブルからフォームへデータを読出、このタイミングで自動的に処理を行っていることを除けば、非連結フォームと連結フォームの間に大きな差はないので、連結フォームを使用するのが、私のパターンです > ただやはりレコード上の上書き保存ボタンが欲しいです。 う~ん、単純に考えるとすれば、新たに作るより表示を変えるほうが場所を取らないかな? > Me.AllowEdits = True Me.[修正というコマンドボタンの名前].Caption = "上書保存" > Me.AllowEdits = False Me.[修正というコマンドボタンの名前].Caption = "修正開始" をそれぞれ追加すれば、上書保存のボタンは新たに作らなくても大丈夫かな?

noname#49321
質問者

お礼

何度も丁寧にご指導ありがとうございました<m(__)m>。できました。

その他の回答 (5)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.5

>tbl_基本情報→qry_基本情報→frm_基本情報検索(閲覧画面) >  ∥ >frm_kihonn ←frm_基本情報登録(非連結) ???非連結のフォームに新規レコードはありませんよ ボタンが置いてあるのはfrm_基本情報検索(閲覧画面)ですよね だったら、Meはこのフォームですから このフォームのカレントレコードの値をfrm_kihonnへ転記しています frm_基本情報登録(非連結)を使用しているつもりになっておられるみたいですが そうはなっていないですよ 選択したレコードを転記、修正を加えて書き戻しのようにしたければ 非連結フォームかワークテーブルを基にしたフォームに転記、 修正後更新クエリという流れにしなきゃ

noname#49321
質問者

補足

ご回答、ありがとうございます。確かに非連結には新規レコードはないですよね。試しにコメントブロックして、動かしても全然動きました。クエリから作成したfrm_基本情報検索のレコード内容をfrm_kihonnに転記するように作っています。frm_基本情報登録は登録するときのみ使用しています。 新規情報を登録(frm_基本情報登録)「非連結」→frm_kihonnに転記。(frm_kihonnに転記されることによって、tbl_基本情報に登録内容がはいっていく。→更新不可能なフォーム(閲覧用)が欲しかったため、クエリを作成。(qry_基本情報)→frm_基本情報検索 という流れで作りました。 閲覧したいときは、frm_基本情報検索を見るわけで、情報を修正したいときは修正ボタンを押したら、frm_kihonnに転記し、frm_kihonnが開くように。 要は情報の登録画面、修正画面、削除画面が欲しいわけです・・。で、登録以外で見るときは更新できないようにしたいのです。修正・削除等を行うときは、更新可にしたいわけです。自分で作っていても、フォームが多いな・・とは正直思いました。。一つのフォームで可能なんでしょうが、なんか作っていくうちにこんな感じになってしまいました。勉強不足ですみません。

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

> 修正用のボタンを用意して・・・クリック時に > Me.AllowEdits = True > を追加(手抜きかな?) の部分やっぱり手抜きだね~^^; If Me.AllowEdits Then DoCmd.RunCommand acCmdSaveRecord Me.AllowEdits = False Else If MsgBox("修正開始しますか?", vbYesNo) = vbYes Then Me.AllowEdits = True End If End If の方が、使い勝手としては良いかな? 更新可能な状態であればレコードを保管して更新不可能な状態へもどす 更新不可能な状態であれば修正するか確認して更新可能な状態にする

noname#49321
質問者

補足

ありがとうございます<m(__)m> こちらの方が細かくていいですね~。ただやはりレコード上の上書き保存ボタンが欲しいです。で、クリックしたら更新不可と。おかげ様でフォームが一つなくなりそうです♪宜しくお願いします。

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

> 読み取りになっていて、ボタンを押したら書き込みOKにできるので > しょうか?? まあ、少々、芸を細かくして例えばで作ってみましょう^^; 普通の更新可能なフォームを用意してください テキストボックスを1つ追加して、 (名前は、なんでもお好きにしてください) コントロールソース : =[AllowEdits] 書式 : ;[赤]"編集中";"閲覧中" 使用可能 : いいえ 編集ロック : はい と設定します (これは、なくても良いのですが、編集可能なのか判らなくならないように作成してあります) フォームのレコード移動時のイベントに Private Sub Form_Current() Me.AllowEdits = False End Sub フォームの更新前処理のイベントに (これも無くてもいける、最終確認を取ってるだけ) Private Sub Form_BeforeUpdate(Cancel As Integer) If Me.Dirty Then If MsgBox("修正しますか?", vbOKCancel) = vbCancel Then Me.Undo End If End If End Sub 修正用のボタンを用意して・・・クリック時に Me.AllowEdits = True を追加(手抜きかな?) で、訂正用ボタンをクリックした後だけ、レコードの訂正は可能です レコード移動をすれば、また訂正できないようにプロパティを操作してあります

noname#49321
質問者

補足

細かくご指導ありがとうございます<m(__)m>。早速書き込んでみたのですが、元々はクエリを元に作成したフォームでは実行したかったのです。この方法でしたら、普通の更新可能なフォームでの作成ですよね?でもこのやり方ができるのであれば、クエリから作成した更新不可の画面はいらなくなるわけですかぁ(^^ゞ 読み取り専用のフォームを開き、修正したい箇所があったら、修正コマンドボタンをクリックすると、レコードの訂正などができるようになり、同フォーム上に上書き保存と言うコマンドを作成して、それをクリックしたら、上書きされて、更に更新不可の状態にするということはできるのでしょうか?今、作成したものは・・・。 フォーム名:F_kihonn Private Sub cmd_上書き保存_Click() If IsNull(Me.コード) Then MsgBox "コードが未入力です", vbCritical Me.コード.SetFocus Exit Sub End If If IsNull(Me.発注者カナ) Then MsgBox "発注者カナが未入力です", vbCritical Me.発注者カナ.SetFocus Exit Sub End If If IsNull(Me.発注者名) Then MsgBox "発注者名が未入力です", vbCritical Me.発注者名.SetFocus Exit Sub End If If IsNull(Me.住所) Then MsgBox "住所が未入力です", vbCritical Me.住所.SetFocus Exit Sub End If If IsNull(Me.電話番号) Then MsgBox "電話番号が未入力です", vbCritical Me.電話番号.SetFocus Exit Sub End If If MsgBox("上書きしてもよろしいですか?", vbOKCancel) = vbCancel Then Exit Sub Dim fname As String fname = "F_kihonn" '転送先のフォーム名 If SysCmd(acSysCmdGetObjectState, acForm, fname) = 0 Then DoCmd.OpenForm fname, acNormal '転送先フォームが開いてない場合は開く End If '値の代入 Forms!F_kihonn!更新日 = Me!更新日 Forms!F_kihonn!発注者コード = Me!発注者コード Forms!F_kihonn!発注者カナ = Me!発注者カナ Forms!F_kihonn!発注者名 = Me!発注者名 Forms!F_kihonn!担当部署 = Me!担当部署 Forms!F_kihonn!郵便番号 = Me!郵便番号 Forms!F_kihonn!住所 = Me!住所 Forms!F_kihonn!ビル名等 = Me!ビル名等 Forms!F_kihonn!電話番号 = Me!電話番号 Forms!F_kihonn!FAX番号 = Me!FAX番号 Forms!F_kihonn!URL = Me!URL Forms!F_kihonn!特記事項 = Me!特記事項 MsgBox "正常に登録されました", vbInformation End Sub でいちお上書き登録はされているのですが、上書きし終わった後も、更新ができるのです。F_kihonnを開いている状態でF_kihonnに転送するという表現もおかしい気がしますが、やっぱり変なのでしょうか? 更新不可ができるのでしたら教えてください<m(__)m>宜しくお願いします。

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

> DoCmd.GoToRecord acDataForm, fname, acNewRec と、書いている時点で・・・新規レコードになってます 上書きしたいのであれば、レコードを指定して移動しなくてはならないのではないでしょうか? 私は、面倒なので非連結のフォームは使いませんが、非連結の場合、こう言う複雑な事を行うの? 修正であれば、ボタンで、フォームの「更新の許可」を「はい」、レコード移動時に「更新の許可」を「いいえ」で設定しても変らないと思うのですが・・・

noname#49321
質問者

補足

frm_基本情報検索画面に修正ボタンをもたせてあります。文字の追加や修正をさせたくないのですが。もし修正・削除する場合はコマンドボタンをクリックしたら修正・削除ができるように作りたかったんです。別フォームではなく一つのフォームでもできるのでしょうか?読み取りになっていて、ボタンを押したら書き込みOKにできるのでしょうか??

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.1

何をしようとしているのですか? アップされたコードだとボタンが置かれたフォームのカレントレコードの値を 別のフォームの新規レコードに転記しているだけですね 別のフォームのソースはボタンのあるフォームと同じテーブルなの? だったら 新規レコードに入力すればそれは新規レコードの追加ですから 主キーを変えてやらない限りエラーになるのは当然ですね

noname#49321
質問者

補足

tbl_基本情報→qry_基本情報→frm_基本情報検索(閲覧画面)   ∥ frm_kihonn ←frm_基本情報登録(非連結) クエリをもとにしたfrm_基本情報検索に修正というコマンドボタンを作成して、それをクリックしたら、frm_基本情報登録というフォームが開くように作ったのですが。上記のような作りかたしか思いつかなかったのですが、やはり変でしょうか??すみません。宜しくお願いします。

関連するQ&A