

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
というのを書きました。これだとコードにキーを持たせているので、転送先フォームでコード以外の内容を修正すると、「重複しているので変更できませんでした」とエラー表示が出ます。上書き保存ができればいいのでしょうけど。上書き保存のコマンドボタンとかを作ればいいのでしょうか??何かいい方法はありますか?わかる方いましたらご教示ください。初心者の質問ですみません。宜しくお願いします。
No.6ベストアンサー
- 回答日時:
> この方法でしたら、普通の更新可能なフォームでの作成ですよね?
> でもこのやり方ができるのであれば、クエリから作成した更新不可
> の画面はいらなくなるわけですかぁ(^^ゞ
えっと、そうですね
更新可能なフォームで作成して、開いたら更新不可能にして開いてくれます
1つのフォームの訂正するたびに複数のフォームを訂正するのが面倒なので、データを弄れなくする為に制御掛ける場合は私は、こうしてます
訂正、新規、閲覧等のフォームがレイアウト違うと混乱しますので^^;
> でいちお上書き登録はされているのですが、上書きし終わった後も、
> 更新ができるのです。F_kihonnを開いている状態でF_kihonnに転送す
> るという表現もおかしい気がしますが、やっぱり変なのでしょうか?
よく見る非連結のフォームを使用するパターンとは、かなり違うような気がします
DAO、ADO、DLOOKUP等を使用して、非連結のフォームへ値を引用、登録時は、アクションクエリ(追加クエリ、更新クエリ)、DAO、ADOを使っているパターンをよく見かけますが・・・
更新前処理、更新後処理の間にフォームから自動的にテーブルへデータの書込み、レコード移動時の前にテーブルからフォームへデータを読出、このタイミングで自動的に処理を行っていることを除けば、非連結フォームと連結フォームの間に大きな差はないので、連結フォームを使用するのが、私のパターンです
> ただやはりレコード上の上書き保存ボタンが欲しいです。
う~ん、単純に考えるとすれば、新たに作るより表示を変えるほうが場所を取らないかな?
> Me.AllowEdits = True
Me.[修正というコマンドボタンの名前].Caption = "上書保存"
> Me.AllowEdits = False
Me.[修正というコマンドボタンの名前].Caption = "修正開始"
をそれぞれ追加すれば、上書保存のボタンは新たに作らなくても大丈夫かな?
No.5
- 回答日時:
>tbl_基本情報→qry_基本情報→frm_基本情報検索(閲覧画面)
> ∥
>frm_kihonn ←frm_基本情報登録(非連結)
???非連結のフォームに新規レコードはありませんよ
ボタンが置いてあるのはfrm_基本情報検索(閲覧画面)ですよね
だったら、Meはこのフォームですから
このフォームのカレントレコードの値をfrm_kihonnへ転記しています
frm_基本情報登録(非連結)を使用しているつもりになっておられるみたいですが
そうはなっていないですよ
選択したレコードを転記、修正を加えて書き戻しのようにしたければ
非連結フォームかワークテーブルを基にしたフォームに転記、
修正後更新クエリという流れにしなきゃ
この回答への補足
ご回答、ありがとうございます。確かに非連結には新規レコードはないですよね。試しにコメントブロックして、動かしても全然動きました。クエリから作成したfrm_基本情報検索のレコード内容をfrm_kihonnに転記するように作っています。frm_基本情報登録は登録するときのみ使用しています。
新規情報を登録(frm_基本情報登録)「非連結」→frm_kihonnに転記。(frm_kihonnに転記されることによって、tbl_基本情報に登録内容がはいっていく。→更新不可能なフォーム(閲覧用)が欲しかったため、クエリを作成。(qry_基本情報)→frm_基本情報検索
という流れで作りました。
閲覧したいときは、frm_基本情報検索を見るわけで、情報を修正したいときは修正ボタンを押したら、frm_kihonnに転記し、frm_kihonnが開くように。
要は情報の登録画面、修正画面、削除画面が欲しいわけです・・。で、登録以外で見るときは更新できないようにしたいのです。修正・削除等を行うときは、更新可にしたいわけです。自分で作っていても、フォームが多いな・・とは正直思いました。。一つのフォームで可能なんでしょうが、なんか作っていくうちにこんな感じになってしまいました。勉強不足ですみません。
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
の方が、使い勝手としては良いかな?
更新可能な状態であればレコードを保管して更新不可能な状態へもどす
更新不可能な状態であれば修正するか確認して更新可能な状態にする
この回答への補足
ありがとうございます<m(__)m>
こちらの方が細かくていいですね~。ただやはりレコード上の上書き保存ボタンが欲しいです。で、クリックしたら更新不可と。おかげ様でフォームが一つなくなりそうです♪宜しくお願いします。
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
を追加(手抜きかな?)
で、訂正用ボタンをクリックした後だけ、レコードの訂正は可能です
レコード移動をすれば、また訂正できないようにプロパティを操作してあります
この回答への補足
細かくご指導ありがとうございます<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>宜しくお願いします。
No.2
- 回答日時:
> DoCmd.GoToRecord acDataForm, fname, acNewRec
と、書いている時点で・・・新規レコードになってます
上書きしたいのであれば、レコードを指定して移動しなくてはならないのではないでしょうか?
私は、面倒なので非連結のフォームは使いませんが、非連結の場合、こう言う複雑な事を行うの?
修正であれば、ボタンで、フォームの「更新の許可」を「はい」、レコード移動時に「更新の許可」を「いいえ」で設定しても変らないと思うのですが・・・
この回答への補足
frm_基本情報検索画面に修正ボタンをもたせてあります。文字の追加や修正をさせたくないのですが。もし修正・削除する場合はコマンドボタンをクリックしたら修正・削除ができるように作りたかったんです。別フォームではなく一つのフォームでもできるのでしょうか?読み取りになっていて、ボタンを押したら書き込みOKにできるのでしょうか??
補足日時:2007/05/24 16:43No.1
- 回答日時:
何をしようとしているのですか?
アップされたコードだとボタンが置かれたフォームのカレントレコードの値を
別のフォームの新規レコードに転記しているだけですね
別のフォームのソースはボタンのあるフォームと同じテーブルなの?
だったら
新規レコードに入力すればそれは新規レコードの追加ですから
主キーを変えてやらない限りエラーになるのは当然ですね
この回答への補足
tbl_基本情報→qry_基本情報→frm_基本情報検索(閲覧画面)
∥
frm_kihonn ←frm_基本情報登録(非連結)
クエリをもとにしたfrm_基本情報検索に修正というコマンドボタンを作成して、それをクリックしたら、frm_基本情報登録というフォームが開くように作ったのですが。上記のような作りかたしか思いつかなかったのですが、やはり変でしょうか??すみません。宜しくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
レコードを保存するコード ア...
-
アクセスでフォームビューがみ...
-
抽出条件が複数ある場合で,抽...
-
AccessVBA RecordSourceのリセ...
-
Access:フォームプロパティ「...
-
ACCESSでフォームを使って、テ...
-
レコード削除時に(サブ)フォー...
-
アクセスの自動保存解除はでき...
-
アクセスでの警告について教え...
-
アクセス:フォーム入力で、最...
-
Access2016 検索窓の設置(該当...
-
Access レコード移動時イベント...
-
フィルタ後のフォームの件数の...
-
アクセス 前レコード内容を、...
-
アクセス データの競合を非表...
-
Accessでチェックボックスで抽...
-
Accessでのデータ消滅に...
-
ACCESSフォームのリストボック...
-
Access フォームで入力した番...
-
Access サブフォームにフィルタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコードを保存するコード ア...
-
アクセスでフォームビューがみ...
-
新規レコード行を非表示にしたい
-
レコード削除時に(サブ)フォー...
-
フィルタ後のフォームの件数の...
-
アクセス:フォーム入力で、最...
-
アクセスの自動保存解除はでき...
-
ACCESSフォームのリストボック...
-
AccessVBA RecordSourceのリセ...
-
レコードをダブルクリックする...
-
Access 「このレコードを保存す...
-
Access:フォームプロパティ「...
-
ACCESSでフォームを使って、テ...
-
Accessでフォーム上に 直前の...
-
ACCESS起動時に所定フォームを...
-
アクセス データの競合を非表...
-
Access サブフォームにフィルタ...
-
Accessでレコードの保存をせず...
-
Accessで上の行を自動でコピー...
-
Access レコード移動時イベント...
おすすめ情報