Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


2202 / 2272 ツリー ←次へ | 前へ→

【3393】メイン&サブフォームの非保存終了 mako 04/9/3(金) 11:20 質問[未読]
【3394】Re:メイン&サブフォームの非保存終了 YU-TANG 04/9/3(金) 14:40 回答[未読]
【3395】Re:メイン&サブフォームの非保存終了 mako 04/9/3(金) 15:50 質問[未読]
【3396】Re:メイン&サブフォームの非保存終了 クロ 04/9/3(金) 16:25 回答[未読]
【3398】Re:メイン&サブフォームの非保存終了 mako 04/9/3(金) 17:19 発言[未読]
【3484】Re:メイン&サブフォームの非保存終了 mako 04/9/10(金) 13:47 お礼[未読]

【3393】メイン&サブフォームの非保存終了
質問  mako  - 04/9/3(金) 11:20 -

引用なし
パスワード
   こんにちは、access超初心者です。
質問自体がうまくできていないかもしれませんが、
どうかよろしくお願いいたします。
OS:XP
access2000

メインフォーム(F料理名)にサブフォームを2つ(F材料とF手順)設け、
3つのテーブルを レシピ番号 というフィールドで関連付けました。
入力途中で終了した時に、途中までしか入力していないデータを
保存せずに終了したいのです。

具体的には、
1.入力途中で終了(右上の×)すると、入力途中のデータが
 各テーブルに保存されてしまいます。
2.なのでメインフォームに キャンセル という名前の
 コマンドボタンを作成し、
  Private Sub キャンセル_Click()
  Me.Undo
  End Sub
 といれました。
 が、これだと一度でもカーソルがサブフォームに
 移動してしまうとメイン・サブフォーム共に途中のデータを
 保存してしまいます。

最後の項目まで入力していても、キャンセルボタンをクリックすると
データが保存されないようにしたいです。

どうかよろしくお願いいたします。

【3394】Re:メイン&サブフォームの非保存終了
回答  YU-TANG WEB  - 04/9/3(金) 14:40 -

引用なし
パスワード
   こんにちは、YU-TANG です。

>  Private Sub キャンセル_Click()
>  Me.Undo
>  End Sub

あくまで基本的な例ですが。

Private Sub キャンセル_Click()
On Error Resume Next

  Echo False
  Me!F材料.SetFocus
  RunCommand acCmdUndo
  Me!F手順.SetFocus
  RunCommand acCmdUndo
  Me!キャンセル.SetFocus
  RunCommand acCmdUndo
  Echo True

End Sub

状況によってはトランザクションを使ったり、SendMessage API で
WM_UNDO をポストする方が良い場合も有り得ます。

【3395】Re:メイン&サブフォームの非保存終了
質問  mako  - 04/9/3(金) 15:50 -

引用なし
パスワード
   YU-TANGさま、お返事ありがとうございました。
早速してみましたところ、2点教えていただきたいことが
できてしまいました。質問が的確でなくて本当にすみません。

1.どちらのサブフォームも、ひとつの レシピ番号 に対して
 複数のデータ(レコード?)を入力します。
 F材料はにんじん、じゃがいも、ピーマン
 F手順は洗う、切る、炒めるみたいにです。
 でも、どちらのサブフォームも最後に入力したデータしか消えてくれません。
 ひとつのレシピ番号に関連するデータは全部消したいと思っています。

2.キャンセルボタンをクリックすると、各フォームごとに
 1件のレコードが削除されます。はい、いいえ。のメッセージが出てきます。
 できれば、クリックしたらメッセージなしで閉じたいのです。

最後になりましたが、教えていただいた最後の2行は
私の知識不足で(本当にすみません)、語句の意味を調べたりしたのですが
試すことができませんでした。↓

>状況によってはトランザクションを使ったり、SendMessage API で
>WM_UNDO をポストする方が良い場合も有り得ます。

よろしくお願いいたします。

【3396】Re:メイン&サブフォームの非保存終了
回答  クロ  - 04/9/3(金) 16:25 -

引用なし
パスワード
   横レス失礼します。

メインと各サブは「レシピ番号」でリンクされているのでしょうか?

リレーションシップを使ってはどうてしょうか?
F料理名のレコードソースのテーブルをデザインビューで開き「レシピ番号」
フィールドを主キーにしてください。(テーブル名を仮にT_料理名とします)

F材料のレコードソースとなるテーブル名を仮に「T_材料」、F手順のレコー
ドソースとなるテーブル名を仮に「T_手順」とします。

メニュー>ツール>リレーションシップを開くとウィンドウが開きます。
既に何かある場合は無視してください。(システム上のものなので)
メニュー>リレーションシップ>テーブルの表示で「テーブルの表示」がでま
すので、ここで「T_料理名」「T_材料」「T_手順」を選択して追加してくだ
さい。

主キーのある「T_料理名」の「レシピ番号」フィールドをドラッグアンドド
ロップで「T_材料」の「レシピ番号」フィールドに落とすと「リレーション
シップ」ダイアログが開きますので、「参照整合性」にチェックを入れて、
「レコードの連鎖削除」にもチェックを入れて作成ボタンを押してください。

「T_料理名」の「レシピ番号」フィールド側に「1」、「T_材料」の「レシ
ピ番号」フィールド側に「∞」が付きます。同様に「T_手順」の「レシピ番
号」フィールドのほうも作成して、リレーションシップウィンドウを閉じて
保存してください。

これで「T_料理名」の「レシピ番号」フィールドが削除されると自動的に
「T_材料」「T_手順」の「レシピ番号」フィールドの同じ値のレコードが
削除されます。

よって「2」メッセージをオフにする処理を追加すると以下のようになります。

Private Sub キャンセル_Click()
On Error Resume Next
DoCmd.SetWarnings False
  Echo False
  RunCommand acCmdUndo
  Echo True
DoCmd.SetWarnings True
End Sub

以下の部分は先程のリレーションの「連鎖削除」で補えますので
要らないかと思います。

  Me!F材料.SetFocus
  RunCommand acCmdUndo
  Me!F手順.SetFocus
  RunCommand acCmdUndo
  Me!キャンセル.SetFocus

【3398】Re:メイン&サブフォームの非保存終了
発言  mako  - 04/9/3(金) 17:19 -

引用なし
パスワード
   クロさま、ありがとうございました。

クロさま、YU-TANGさまへ
私は、会社でしかパソコンをさわることができないので、
平日の5時以降と土・日曜日は、試すことができません。
早速のアドバイスをいただきながら、大変失礼ですが
月曜日(といっても来週は少ししか時間をさけないのです。。。)に
教えていただいたことを実行してみます。
楽しみです。

どうもありがとうございました。
また月曜日に報告させていただきます。

【3484】Re:メイン&サブフォームの非保存終了
お礼  mako  - 04/9/10(金) 13:47 -

引用なし
パスワード
   クロさま、YU-TANGさま本当にありがとうございました。
お礼が遅くなり申し訳ございません。

-非保存終了-
>主キーのある「T_料理名」の「レシピ番号」フィールドをドラッグアンドド
>ロップで「T_材料」の「レシピ番号」フィールドに落とすと「リレーション
>シップ」ダイアログが開きますので、「参照整合性」にチェックを入れて、
>「レコードの連鎖削除」にもチェックを入れて作成ボタンを押してください。
この処理で、ばっちりでした!
「参照整合性」にばかり目がいっていました。
リレーションシップの勉強をきちんとします。

-メッセージオフ-
>Private Sub キャンセル_Click()
>On Error Resume Next
>DoCmd.SetWarnings False
>  Echo False
>  RunCommand acCmdUndo
>  Echo True
>DoCmd.SetWarnings True
>End Sub
こちらもこの処理でばっちりでした!
でも丸写ししてしまいました。
この処理については、これから勉強したいと思っています。

このふたつの処理がわからなくて、何冊も本を買ったり
インターネットで調べたりと丸2週間を費やして、
最後にこちらにお邪魔しました。
本当にありがとうございました。

2202 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078299
(SS)C-BOARD v3.8 is Free