• ベストアンサー

Accessで、最後(更新)にエラーチェックをしたい。

Accessで、最後(更新)にエラーチェックをしたい。 入門を見ながら、サブフォームのあるフォームを作りました。 エラーチェックのため、テーブルの入力規則を設定しました。 実際に使用が始まると・・・ サブフォームから入力したり、またサブフォームも、すべて入力が終わらないのに、 次の行に入力したりと、私の予想外の使い方をします。 そこで、入力規則をなくしました。(わがままが多いので) すると、記入漏れが発生しました。 そこで質問ですが、レコードの更新時に、フォームの必修項目のエラーチェックすることは可能でしょうか? よろしくお願いします。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.9

#7です ご迷惑をおかけしております。 #6の先頭で書いた、(私の中での神様的存在の一人) (Access使われている方なら実践小技の大家とでもいいますか・・・) の方の、参考になりそうなアドレスを記述しておりましたが、 私本人のものでないにもかかわらず削除されました。 (他18件の過去回答のものについても) 私が今後その方のアドレスを記述すると、削除対象だそうです。 他の方のアドレスを、同一回答者が繰り返し提示したことにより 営業宣伝として判断されたそうです。 (私自身そういうことは考えたこともないのですが) 投稿本人のものに限らず、そのような判断があるようです。 (サポート担当とのやり取りのメールは転載禁止ということなので) (私が解釈した内容で記述しています) 判断される方の、Accessの知識の有無については答えられないとのことです。 ご質問者さんがURL付きで最近質問されたものがあったと思いますが、 ある回答者がそのサイトの他場所を記述(紹介)していくと、同様に 営業宣伝とみなされる可能性があるようです。 (その判断基準は公開されていないそうです) また、同じような質問があった場合、同じような回答になると思いますが、 (同じアドレスを記述することもある?) それについては、 http://guide.okwave.jp/guide/netiquette.htmlhttp://oshiete.goo.ne.jp/ask/guide/about/netiquette.html で、質問をする前にまず調べてみましょう・・・を「周知」させているので・・・・ ということのようです。 (転載できないので、前記同様私が解釈した内容になってます) 本ご質問への私が取れる対応をお聞きしたところ、 文字数が足りなければ連続して、完結となる記述に、ということでしたが、 私が考えるに、#3を含め、記述するとキーワードを与えることになると思います。 なので、フォーム上での表現および#3の回答内容について、触れないようにしたいと思います。 ご質問者さんは、おそらく、訪問されていないと思いますので忘れてください。 (アクセスログが確かなら、(削除確認のために訪れた?)1箇所からしか接続はありませんでしたので) 気を取り直して #3の補足に対して) > 親ホームをすべて入力前にサブフォームに移動すると、親フォームのエラーが出る。 > サブフォームのレコードを入力中に、次のレコードを入力するとサブフォームのエラーが出る。 フォームの構成は、親:単票 子:帳票 の様になっているのでしょうか。 実現するには以下の点を考える必要があると思います。 ・テーブル内の項目は主キー以外値要求「いいえ」 ・設定しているリンク親子フィールドを基準に ・・子側で、追加の許可制御 ・親側のレコード移動時に、親の前レコードにリンクする子レコードの各項目チェック ・など? 結構なVBA記述が必要になる気がします(難易度は高いのではないでしょうか)。 親フォーム、子フォーム単位でのチェックならすんなりいくと思いますが(現状?) (親が途中、子が途中で行き来となると・・・) 更新ボタンはどちら側に配置されるのでしょうか。 親側にあるのであれば、「移動ボタン」を表示していなければ容易にレコード移動しないので、 前述の親の前レコードに・・・・を更新ボタンで処理すれば良さそうです。 (雰囲気だけで未検証) 後は、親子を行き来する際に、途中でリンク親子フィールドに設定した項目変更は不可など、 制限を付けていくのでしょうか。 (制限とするよりも、編集ロックなどで制御するとか・・・でも) リンク親子フィールドを使ってなければ、また別の方法になると思います。 その辺の違いは、前回のご質問 http://okwave.jp/qa/q5878468.html に書いておいたつもりでいます。(応用の範囲になるのかも?)

a-z_A-Z
質問者

補足

リンク先は、たぶん削除(予感)していたので、すぐにブックマークしました。 でも、使い慣れていないので、失敗してブックマーク出来ていなかったようです。 残念。 さて、今回の担当者の対応は非常に残念です。 ACCESSのようなある特定の質問の場合、参考として外部リンクは仕方無いと思います。 ブログ等は無数にありますが、本当に役にたつところといえば、数が限られてきます。 また、私のような初心者が検索した場合、数限らせた中のまた限られたところとなります。 そのような場合、同じようなところが外部リンクがはられるのではないでしょうか? それに、初心者というのは、同じようなところでつまずき、同じような質問します。 まず、質問する前に、同じような質問がないか調べることも知っていますが、実際は同じような質問があっても見付ける事ができません。 また、このような質問板の場合、専門的な質問は住人ともいえる、かぎられた人の回答で成り立っている場合があります。 言うなれば、そのような人との共存でこのようなサイトは成り立っているのではないでしょうか? それを、一辺倒の決まりということで、削除したことが非常に残念です。 ここまで書いたら、管理者から利用を断られそうでが・・・ ま~、利用させていただいているので、決まりを守らなければいけないのはわかります。 しかし、もうちょっと柔軟な対応をお願いしたいところです。 今回、最初に削除されたリンク先は、たぶん見たと思うのですが・・・ あれを見て、サイトに導く広告だと普通は思わないと思うのですが、これも私の思い違いでしょうか? リンクは、回答の下の方にあり、リンク先はACCESSの技についているサイトではなかったでしょうか。 なぜ、私がリンク先にこだわるかというと、別の件でACCESSについて探していました。 私からみて、かなり高度なテクニックが書かれていました。 その中の一つのサンプルについて、質問があったのですが、私があまりにも初心者すぎ、恐れ多くて質問できませんでした。そのブログの管理人が、回答頂いている人のものかな?ときになって。 さて、私は気持ちの切り替えが下手なので、気持ちを切り替えるなんて出来ませんが・・・ 今回の私の希望どおり、親子フォームを最後に確認ですが、かなり面倒なのでは? その後、私も色々テストしてみました。どうも、こまめにデータをレコードに記録しているように感じました。 そのため、普通につくって、親子同時にチェックって無理なようなきがしました。 だから、まず、非連結のテキストボックスをつくります。 そして、独立した更新ボタンを押したときに、フォームのデータを取得してエラーチェックします。もし、OKだった場合のみ、値を変数に入れてSQLで流し込む手続きで出来るような気がするのですが、そんな事をACCESSでできるのかどうかわかりません。 最終的には、データの保存はMysql等を考えています。(トランザクション等も考えています。) もし、私の考えているような手続きが必要なら、ACCESSでするのではなく、VBまたはVC++で作った方が、楽のようなきもします。(ACCESS独特の情報を集めるのに非常に苦労し、かなり嫌気がさしております。)

その他の回答 (11)

  • shinkami
  • ベストアンサー率43% (179/411)
回答No.12

ANo.5です >先に商品名を全部入力してから、単価等を入れたいとのわがまま、いえ希望をしており、そのため設定ができません。 これを許してはダメです 画面に見えていても、行が処理の単位です。 入力の改善で対応しては 1.必須項目は 値要求を「はい」 にして色付 2.テキストボックスのプロパティーで   IME入力モードを [オフ]…半角入力 または [ひらがな]…全角入力   IME変換モードを [一般]、[人名/地名] 3.商品のテーブルはありますか、コンボボックスでプルダウンからの選択にします。   このとき単価を自動で取り込…タブストップ[いいえ]   単価が変動するのであれば、標準単価にしておいてワンクリック5%引き、ダブルクリック5%高 4.金額の計算(数量×単価)、合計 (たぶん対応済みと思いますが) メインフォームの項目になると思いますが ・ ふりがな、住所入力支援も…  住所入力支援は郵便番号→市町村名、市町村名→郵便番号 ・日付入力の改善:初期値を入力日にしてダブルクリック5日先、シングルクリックで2日戻し  Access2007では日付選択カレンダーの表示、でカレンダー画面で入力  

a-z_A-Z
質問者

お礼

ありがとうございます。また、お礼が遅くなってすみません。現実逃避しておりました。 >これを許してはダメです 確かに、私もダメだと思います。しかし、エクセルからアクセスに変えるのに、2年掛かりました。 ここで厳しく言うと、難癖をつけられエクセルに逆戻りになります。 理想と現実の違いを改めて思い知らされました。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.11

横レス失礼致します。 > 私の今回の質問のような手続きは、例外的処理なのでしょうか? 「作業テーブル(ワークテーブル)」を使用するのが一般的(なはず)です。 Accessを使う上で、知っておいて損はないと思います。 【本体テーブル】(以下の2テーブルがあるとします)  ┌テーブル名: MT1_クラス  └フィールド名: クラスID(主キー)、学年、組、担任ID  ┌テーブル名: MT2_生徒  └フィールド名: 生徒ID(主キー)、クラスID、氏名、住所 【作業テーブル】(上記とは別に作成します)  <パターン1>   入力途中でのレコード移動を、メインフォームでも許可する場合  ┌テーブル名: WT1_クラス  └フィールド名: クラスID、学年、組、担任ID  ┌テーブル名: WT2_生徒  └フィールド名: 生徒ID、クラスID、氏名、住所  <パターン2>   メインフォームは1件ずつ、サブのみレコード移動を許可する場合    →「クラス」側は非連結フォームで対応(=テーブル不要)  ┌テーブル名: WT1_生徒  └フィールド名: 生徒ID、クラスID、氏名、住所   ※クラスIDは、新規入力だけを考えるなら1つしかありえないので     不要ですが、誤入力の修正を考えると必要になります。 本体テーブルのコピーなどにより、上記のような作業テーブルを作成 したら、主キーや入力規則など、入力値に制限をかけるような設定は 全て削除します(字数など、一部は残しても可)。 これで、フォームのレコードソースを作業テーブルに切り替えれば、 フォーム上でどんな順序で入力してもエラーは発生しなくなります。 もちろん、このままではフォームでの入力内容は、本体テーブルに 一切反映されませんので、更新ボタンからアクションクエリなりSQL なりで本体テーブルに書き戻してやります。 パターン2を前提に、全体の流れをもう少し具体的に説明します: 【メインフォームを開く時】  前回処理時のエラー発生に備え、作業テーブルの全レコードを削除 【入力対象指定時】  テキストボックスでクラスIDを指定するか、指定された学年と組から  クラスIDを特定したら、当該クラスIDのレコードを本体テーブルから  作業テーブルにコピーします(→追加クエリ/Insert文)。  ※更新反映時に必要なため、クラスIDは非連結テキストボックスに記録。  ※テーブルへの追加は、再クエリ(Requery)によりフォームに反映。  ※「クラスIDが不明なままでの入力」を避けるには、メインフォームの    入力用コントロールを編集ロック(→Lockedプロパティ)。  ※新規登録用には、別途コマンドボタンを用意して、編集ロックを解除   する、などの工夫が必要。  ※指定直後は更新ボタンは使用不可にしておく(Enabledプロパティ)。 【各コントロールの更新後イベント】  更新ボタンを使用可にします。  (ここで入力規則の評価を行う方法もありますが、今回は更新ボタンで   評価するパターンを紹介) 【更新ボタンクリック時】  本体テーブルでの値要求や入力規則に相当するチェックを実行。  (値要求ならIsNull、重複不可ならDLookupやDCount等、関数を   使用するのが簡単)  a)全てOKの場合   1)本体テーブルの当該IDのレコードを削除    (削除クエリ/Delete文)   2)作業テーブルから本体テーブルにレコードをコピー    (追加クエリ/Insert文)   3)適当なコントロールにフォーカス移動後(SetFocus)、更新ボタンを    使用不可に設定  b)NGありの場合   当該箇所をMsgBoxなどで通知(背景色(BackColor)の変更でも可) 【メインフォームの読み込み解除時】  更新ボタンが使用可(=編集あり)の場合は、MsgBoxへの返答により  閉/取消を切替(Cancel=Trueで取消)   【メインフォームを閉じる時】  作業テーブルの全レコードを削除(削除クエリ/Delete文) ・・・以上です。 概略の説明でこの長文ですので、実際にコードに置き換えるとかなりの ボリュームになるとは思いますが(汗)、慣れてしまえば難易度としては それほど高くはないと思います。 (・・・とにかくコーディングなどの作業量の多さが最大のネックかと(汗))

a-z_A-Z
質問者

お礼

ありがとうございます。また、お礼が遅くなってすみません。 明日できる事は明日すると言うポリシーが、今日まで伸ばしてしまいました。 >とにかくコーディングなどの作業量の多さが最大のネックかと(汗) なるべくなら、簡略にしたいです。 なぜなら、私の実力がない。 そして、それ以上に、他の人の実力がもっとない。 と言う、どうしようもない状態です。 今回作った分も、既にどうやって作ったかわからない状態です。 改めて、人間は忘れやすいことを認識しました。 そんな、状態で大量のコーティングをすると・・・ 考えるだけで恐ろしいです。 ま~、これも面倒な事はさけようとする言い訳かもしれませんけど。 ACCESSって便利なようで、ちょっと変わったことをすると複雑になるように思えます。 こればこるほど、他の言語でフルスクラッチで作った方が楽になるようなきがします。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.10

> 私の感覚的には、最後に全部の項目チェックって普通だと思うのですが・・・ > 例えば、ネットショップの買い物かご。 > 名前や住所をいれて、ボタンをおして入力チェックがされます。 1レコードに対して最後にチェックという考え方が普通だと思います。 でも、a-z_A-Zさんのユーザーさんは複数のレコードをあちらこちら入力してから 最後にその複数のレコードをチェックするような仕様を要求してるように思えます。 買い物籠に入れるのも、商品を選択して購入数を入力し(ここで入力チェックが入ります)次の商品を選択します。 最後は確認のために一覧で表示しているだけで入力チェックをしてるわけではありません。

a-z_A-Z
質問者

お礼

ありがとうございます。 また、お礼が遅くなってすみません。 私のな負け癖をお許しください。 >最後は確認のために一覧で表示しているだけで入力チェックをしてるわけではありません。 もちろん、私もちょっと違うな~って思っていたのですが、いい例が思いつきませんでした。 最近、買い物かごのプログラムを組んだので、それで頭がいっぱいだったもので・・・ 私の場合、買い物かごは、選択時にジャバスクリップトでチェックしたり、フォームをサーバに送った時点で、チェックしたりしています。 でも、今回のニュアンスとはちょっと違うのはわかっていましたが、他の例を出すと、マニアックになる上に、例として微妙なところなので買い物かごを例にしました。 わがままたちの意見を聞いていると、私の仕事(パシリ&雑用)が進まないので、とりあえず、今のままで我慢してもらっています。 正直、今回の事で色々あり、疲れ果てました。(パソコンを見たくないぐらい) もうちょっと、精神的に回復したら、皆さんの意見を参考に試そうと思っています。 ありがとうございました。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.8

> フォームの更新ボタンを押したときに、親フォーム、サブフォームのチェックさ > れることが希望なのですが、そのような都合のいいチェックはできないのでしょ > うか? フォームの更新ボタンを押したときのイベントでチェックすればいかがでしょう。 親フォームでレコードを移動したときにチェックしないと処理が面倒だとは思いますが (どのレコードをチェックするのかが分からないので、それを示すための チェックボックスを用意して、チェックしたらそれをオンにするようにして オンになっていないレコードをチェックするとか)

a-z_A-Z
質問者

補足

>親フォームでレコードを移動したときにチェックしないと処理が面倒だとは思いますが 逆に、私の今回の質問のような手続きは、例外的処理なのでしょうか? 私の感覚的には、最後に全部の項目チェックって普通だと思うのですが・・・ 例えば、ネットショップの買い物かご。 名前や住所をいれて、ボタンをおして入力チェックがされます。 ACCESSの場合、名前の入力をして、チェックって感じの、その都度チェックしているように感じます。(すぐにレコードに入れすぎ。) ま~、買い物かごの場合、サブフォームって概念があるかどうかわかりませんが。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.7

#6です > >URLは再度記述しません。 > プロフィールのURLにブログのアドレスを設定できないのでしょうか? これも規約で禁止されているようです。 サンプルを触って頂いた方がイメージし易いと思うのですが、 私から提示できる手段は、今のところないと思います。 申し訳ありません

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.6

#4です。 > 削除されたので困っています URLは再度記述しません。 どうもナンチャラリスト???にでも載ったのでしょうか??? #5さんの投稿/補足メールは届いたのに、 #4については今だにどちらも届いておりません。 質問したことがないのでわからないのですが、 質問者さんが受信する回答が投稿された通知メールには、全文記述されているのでしょうか? (削除済みのものが? 回答頭部分数文字だけの内容?) 仕組みはわかりません。 また、規約によればURLが検索で引っかかるキーワードの提示もできないようです。 今から内容をかいつまんで、ここで記述したとしても、字数制限もあり、 しかもキーワードになると思うので・・・・ 大変申し訳ありません。 私からの回答は、ここまでということで、失礼しました。 通報がトリガとなって調査する様ですけど。 今回の件で過去回答で該当する部分も作業されたようです。 親切にも、参考となる他の方のブログURLまで、ご丁寧に。 (若干残っているようですが) 本当に申し訳ありませんでした。 これも削除対象かな?

a-z_A-Z
質問者

補足

>URLは再度記述しません。 プロフィールのURLにブログのアドレスを設定できないのでしょうか? >質問者さんが受信する回答が投稿された通知メールには、全文記述されているのでしょうか? 出だし数行だけです。 ところで、質問に関してですが、また、サボりたい病が復活してきたので、気晴らしに散歩に行ってきます。 今日の夜に再開する予定です。その時に改めてお願いします。

  • shinkami
  • ベストアンサー率43% (179/411)
回答No.5

>すべて入力が終わらないのに テーブルのフィールドプロパティーで 値要求を「は」にするのはいかがでしょう

a-z_A-Z
質問者

補足

>値要求を「は」にするのはいかがでしょう 最初は、値要求を「はい」にしておりました。 しかし、チャレンジャーは、先に商品名を全部入力してから、単価等を入れたいとのわがまま、いえ希望をしており、そのため設定ができません。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

#3です > サブフォームのエラーチェックも、親フォームでするのでしょうか? 必須入力のチェックは、各フォームの更新前処理で行います。 他に、 ボタンを配置し、修正/新規登録した際にはボタンを押さない限り確定させない 方法とかもあります。 こうすると、一部分を入力/修正すると、他行やメインへ移ることができなくなります。 (確定する一手間が増えますが) やり方は、http://okwave.jp/qa/q5129734.html の#6を参考にしてください。 (Form_BeforeUpdate 部分と btn01_Click 部分) (チェック処理は★のところで) > >フォーム上の他の部分に、同じようなものが存在するから・・・・ > いえ、チャレンジャーが一人います。 > だめだといっても、とりあえず試そうとします。 > そのため、想定外のエラーを出してくれます。 これはラッキーだと思いますが。 運用前にその方に使ってもらう期間を設けてみてはいかがでしょうか・・・ (もちろん修正する期間も考慮しておきます) 回答投稿者が管理するブログのURLを記述したとのことで、その部分は削除されたようです。 規約にあるので削除も仕方がないと思っておりますが、 質問者さんにお尋ねしたいのですが、削除されたそのURL記述について ・書かれていたことは知らない ・メール/回答で見た ・・その先は見ていない ・・一応見てみた(何を営業、宣伝していましたか) ただ、今回の削除理由は、営業、宣伝目的と判断されたようですので、 どうなのかな・・・と思い、感想を一言でも頂ければと思います。 この投稿も削除対象になるんでしょうか?

a-z_A-Z
質問者

補足

>回答投稿者が管理するブログのURLを記述したとのことで、その部分は削除されたようです。 削除したという連絡がありました。いろいろと規則はあると思います。しかし、何を削除したのか教えてほしいです。といいますのは・・・ 私にとって今回の質問は、いやだけど、やらなければいけない、学生時代の勉強みたいなものです。 今回の、回答をいただいたとき、たぶんリンク先を見ました。 Accessに関しては、今回いろいろなサイトを見ました。 そして、ためになるサイトのデザインは記憶の片隅に残っています。 リンク先は、そのためになるサイトのデザインだったと思います。 だから、問題が解決したと安心して、後でゆっくり見ようと思っていました。 そのリンク先を削除されたので困っています。 だから、グーグルのキャッシュに、リンク先の情報が残っていないか探したぐらいです。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

解決されていましたら、スルーしてください。 項目「pno」「番号」「氏名」が必須入力だった、と仮定します。 フォームの更新前処理で、必須入力のチェックを行います。 チェックする時には、必須項目すべてをチェックした後、まとめてメッセージを出すようにしています。 1つ引っかかったらそれだけを出す、、、親切じゃないような気が・・・ 記述例) Private Sub Form_BeforeUpdate(Cancel As Integer)   Dim sMsg As String   Const EMSG = "チャンと入力してよ" & vbCrLf   sMsg = EMSG   If (IsNull(Me.pno)) Then sMsg = sMsg & vbCrLf & " pno"   If (IsNull(Me.番号)) Then sMsg = sMsg & vbCrLf & " 番号"   If (IsNull(Me.氏名)) Then sMsg = sMsg & vbCrLf & " 氏名"   If (sMsg <> EMSG) Then     MsgBox sMsg     Cancel = True   End If End Sub Cancel = True を設定すると、他へ移動できなくなります。 > サブフォームから入力したり、またサブフォームも、すべて入力が終わらないのに、 > 次の行に入力したりと、私の予想外の使い方をします。 フォーム上の他の部分に、同じようなものが存在するから・・・・ ということではないですか。 既定値を使うとか、テーブルを見直すとか・・・ 必須入力項目であることを、フォーム上で表現されてみてはいかがでしょうか。

a-z_A-Z
質問者

お礼

ありがとうございます。 たぶん、私が求めていた答えだと思うのですが、うまくいきません。 サブフォームのエラーチェックも、親フォームでするのでしょうか? >フォーム上の他の部分に、同じようなものが存在するから・・・・ いえ、チャレンジャーが一人います。 だめだといっても、とりあえず試そうとします。 そのため、想定外のエラーを出してくれます。 こちらはヒヤヒヤものです。

a-z_A-Z
質問者

補足

試したところ、現在(値要求)と同じ動作でした。 【現状】 親ホームをすべて入力前にサブフォームに移動すると、親フォームのエラーが出る。 サブフォームのレコードを入力中に、次のレコードを入力するとサブフォームのエラーが出る。 【希望動作】 親フォーム、サブフォームを順序適当に入力。更新時に親フォーム、サブフォームのチェックをする。 このような、入力チェックってできないのでしょうか?

  • shinkami
  • ベストアンサー率43% (179/411)
回答No.2

[Enter]キーを押下するとカーソルが次のボックスへ移動しますね この順番はボックスを作成した順ですが、この順を変えたりスキップしたりできます。 この処理はボックスのプロパティーの[その他]タブのタブ移動順、とタブストップで行います。 タブ移動順は0から始まりタブの数以上の数値は受け付けません。設定した数が他にある時は それ以降のタブの移動順が順送りに替わっていきます。 また[タブストップ]をいいえに設定するとスキップしますが入力が必要な時はマウスポインターを 移動できます。以降はタブ移動順に従います。

a-z_A-Z
質問者

お礼

ありがとうございます。 タブストップは設定しますが、そんなのは無視して、好き勝手に入力してくれます。 また、だめだといっても、それを守らずチャレンジしてくれる人がいます。 そのため、エラーのビープ音が鳴り響いています。

関連するQ&A