• ベストアンサー

Access2002 フォームからのレコード入力の成功/不成功

いつもお世話になっております。 早速ですが、従業員マスタテーブルがあり、それを元に従業員の情報を入力するフォームを作成しました。 従業員マスタテーブルは、「社員番号」だけをキーにしています。 例えば、新入社員のデータを、完全に新規に入力する場合、うまく行きます。 また、すでにいる社員の、「社員番号以外」のフィールドを更新することもできます。 しかし、社員番号が既存のものとかぶるような新規登録、あるいは情報変更に関しては、入力用フォーム上では正常終了したように見えますが、実際の従業員マスタテーブルをチェックしてみると、変更はされていません。 ですので、フォームしか触れないユーザは、自分の変更、新規追加がうまく行ったのかどうか、テーブルが見られないのでわからない、という状況になっています。 仕様要求としては、新規であれ、情報変更であれ、既存の社員番号に重なる場合はメッセージボックスで「更新失敗」を表示したいのです。 If Exist・・・のような分岐を情報を入力するフォームの「閉じる」ボタンの裏に設けたいのですが、やり方がイマイチわかっておりません。 ご存知の方がいらっしゃれば、ご教授、よろしくお願いします。 --------------------------------------------------------------- <従業員マスタ> ・社員番号・・・テキスト ・氏名・・・テキスト <仕様要求> 社員番号「0001」と「0002」の社員が存在する場合・・・ ・情報入力画面で、「0001」の社員の社員番号を「0002」に変更しようとすると、エラーメッセージ表示 ・新規情報入力(新入社員など)の際、社員番号が「0001」や「0002」の社員として登録しようとすると、エラーメッセージ表示 以上、お時間のあるときによろしくお願いします。

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

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

フォーム上の社員番号のテキストボックス名を「txt社員番号」と仮定します。 そのテキストボックスの入力規則に以下を設定します。 DLookUp("社員番号","従業員マスタ","社員番号='" & [txt社員番号] & "'") Is Null エラーメッセージに、「重複しています」等設定しておきます。 ※  DCount でも良いと思いますが、DLookUp は見つかった時点で戻ってくると思ってます。 DCount は、あってもなくても全レコードをみると思うので、どちらかと言えば DLookUp でしょうか。 (重複するものがなければ全レコードを見るのは変わらないと思いますけど)

camo-tech
質問者

お礼

ご回答ありがとうございます。 Dlookupにて、重複を避けることができました。 (結局こうしたかったんです) ずばり、の回答でした。 ありがとうございました。

その他の回答 (4)

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

>従業員マスタに、 >社員番号 氏名 >0001 たろう >0002 じろう >が登録されているとき、新規レコードとして、 >0001 さぶろう >を登録しようとすると、入力したフォームは、特にエラーなく終了します(終了ボタンに、Docmd.closeを記述) >しかし、テーブルを見ると、 >社員番号 氏名 >0001 たろう >0002 じろう >のままです。 社員番号が主キーならば、どのような形で また、エラー回避して 保存しようとしても二重登録しようとすれば システムエラーが出るはずです。したがって Docmd.Closeでは明確にレコードは保存されません。 明確に保存するならば、 DoCmd.RunCommand acCmdSaveRecord を宣誓して、 Docmd.Close します。 としたのですが、これで二重登録をして システムエラーが出るのか確認してください、 ということです。 単に、二重登録の防止ではなく、その前に システムの弱点を見つけ、改善するのが 先決だと思いますが。違いますかね。

camo-tech
質問者

お礼

追加回答ありがとうございます。 システムエラー、でました。 >システムの弱点を見つけ、改善するのが >先決だと思いますが。違いますかね。 おっしゃるとおりです。。。

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

【要点】 DCount関数などを使用して、指定した社員番号のレコードが新規か既存かを 判定し、レコードの追加/レコードの更新のどちらを行うかを切り替えて下さい。 【詳細】 > 入力用フォーム上では正常終了したように見えますが、実際の従業員マスタ > テーブルをチェックしてみると、変更はされていません。 実際には保存時にエラーが発生しているのに、その旨のメッセージが表示されない、 という状況は、私の知る範囲では  a)DoCmd.SetWarningsでメッセージを殺しているか  b)CurrentDb.ExecuteでSQL文を実行しているか  c)On Error Resume Nextなどでエラーを無視しているか です(失念しているものがなければ(汗))。 ただ、連結フォームで、閉じることによる自動のレコード保存だとすると、「c)」による 可能性は薄いように思いますので、  『「閉じる」ボタンのクリック時に、非連結フォームを使用し、クエリ又はSQL文で  レコードの追加を行っている』 という仕様と推測して、以下、回答します。 ・・・なお、「閉じる」ボタンで登録だと、登録の取り消し(中止)ができませんので、 ボタンは「登録」(登録+閉じる)と「キャンセル」(閉じるのみ)にした方が便利かと 思います。 Private Sub 登録_Click() On Error Goto エラー処理   '変数の宣言   Dim strSQL As String, strMsg As String   'DCount関数で、指定した社員番号の新規/既存を判定   If DCount("*", "従業員マスタ", "[社員番号]='" & Me!社員番号 & "'") = 0 Then     '新規の社員番号の場合は、レコード追加用のSQLを実行     strMsg = "指定した社員を新規登録します。"     strSQL = "Insert Into 従業員マスタ (社員番号, 氏名)" & vbCrLf _         & "Values ('" & Me!社員番号 & "', '" & Me!氏名 & "');"   Else     '既存の社員番号の場合は、レコード更新用のSQLを実行     strMsg = "指定した社員番号の氏名を更新します。"     strSQL = "Update 従業員マスタ" & vbCrLf _         & "Set 氏名 = '" & Me!氏名 & "'" & vbCrLf _         & "Where 社員番号 = '" & Me!社員番号 & "';"   End If   If MsgBox(strSQL, vbOkCancel, "確認") = vbOk Then     CurrentDb.Execute strSQL     DoCmd.Close acForm, Me.Name, acSavePrompt   End If 終了処理:   Exit Sub エラー処理:   MsgBox Err.Number & ":" & Err.Description, , Me.Name & " 登録"   Resume 終了処理 End Sub ・・・以上です。

camo-tech
質問者

お礼

ご回答ありがとうございます。  a)DoCmd.SetWarningsでメッセージを殺しているか  b)CurrentDb.ExecuteでSQL文を実行しているか  c)On Error Resume Nextなどでエラーを無視しているか どれも、明示的には行なっておりません。 別回答で頂きました、Close処理の前に明示的にレコードの保存を行なうことで、システムメッセージが表示されるようになりました。 ご提示頂いたソースは、今後、参考にさせて頂きます。 ありがとうございました。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

>を登録しようとすると、入力したフォームは、 >特にエラーなく終了します(終了ボタンに、 >Docmd.closeを記述) Docmd.Closeでは明確にレコードは保存されません。 明確に保存するならば、 DoCmd.RunCommand acCmdSaveRecord を宣誓して、 Docmd.Close します。 現状が、 フォームのコントロールが連結なのか 非連結なのか、あるいはサブフォーム なのかはわかりませんが、 カレントレコードを移動するように 設計しているとそのレコードについては 保存されます。 以上を確認してみてください。 二重登録の防止は後で。

camo-tech
質問者

お礼

ご回答ありがとうございます。 Closeの前に、 DoCmd.RunCommand acCmdSaveRecord を挿入することで、システムメッセージ(重複~~)が出て、保存できないようになりました。 フォームはサブフォームは使っていません。 一応、わざと社員番号を重複させるようなレコード入力をして、移動ボタンを押しても、上記と同じく、システムメッセージが出るようになりました。 一応、目的は達成です。 ありがとうございました。

noname#182251
noname#182251
回答No.1

簡単なサンプルで試してみました。 「社員番号」はマスターキーになっているんですね? ・「0001」の社員の社員番号を「0002」には変更できない ・既存であれば社員番号「0001」や「0002」は追加登録できない どうも質問内容が理解できません。

camo-tech
質問者

お礼

言葉足らずで申し訳ありません。 「社員番号」はマスターキーです。 どういう部分がご理解いただけないのでしょうか? 切り分けのために、 ・既存であれば社員番号「0001」や「0002」は追加登録できない の部分を詳細化させていただきます。 従業員マスタに、 社員番号 氏名 0001 たろう 0002 じろう が登録されているとき、新規レコードとして、 0001 さぶろう を登録しようとすると、入力したフォームは、特にエラーなく終了します(終了ボタンに、Docmd.closeを記述) しかし、テーブルを見ると、 社員番号 氏名 0001 たろう 0002 じろう のままです。 これでは、ユーザは登録が完了したのか、失敗したのかがわからないだけでなく、メッセージが何も出ないため、完了したと思い込んでしまいます。(実際は完了していません) せめて、「重複した~~~レコードの保存に失敗しました」というメッセージが出てくれればうれしいのですが。。。 もちろん、テーブルを開いてじかに新規レコードとして追加しようとしても、マスタキーの重複エラーではじかれます。この場合は、メッセージが出ます。 意味が通じていますでしょうか?

関連するQ&A

  • アクセスでテーブル入力用のフォームを他のテーブルのレコードを参照しながら入力するには

    こんにちわ アクセスでテーブルのレコードを作成するのに 他のテーブルのレコードを引っ張ってきて フォーム上で表示したいのですが うまくいきません たとえば、社員名テーブル(従業員番号と名前) 配属テーブル(従業員番号と営業所コード) 支社テーブル(支社名と営業所コードの上2桁) 営業所テーブル(営業所名と営業所コード)を作成しておきます 退職者が出るたびに 退職者テーブル用のフォームに 従業員番号を入力すると フォーム上にその人の名前・支社名・営業所名が表示され それを確認してから その他のデータをその同じフォームに 入力したいのです 今、試しに作ったのは テーブルに一度上書きしないとデータを引っ張ってこないの不便なのです よろしくお願いします

  • ACCESSでのフォームから固定値での更新に関して

    初歩的な質問で申し訳ありません。 教えて下さい。 社員マスタテーブルと評価テーブルが以下の項目で存在しています。 《社員マスタ》  社員マスタ、氏名 《評価テーブル》  社員マスタ、評価、年月 上記内容をフォームを使って、社員番号、氏名、評価、年月 という項目を 表示させ、社員番号が存在するまで評価を手入力するというような仕掛けを考えています。 表示は参照クエリで社員番号をキーにして両テーブルを結合させ、フォームに出力しています。 上記条件の中で、フォームのヘッダーへ年月を入力する欄を設け、そこに入力されたデータで、 追加されるデータの年月を全て入力された年月にしたいと考えております。 何か良い記述?の方法はありますでしょうか。。。 教えて頂きたいと思います。 よろしくお願いします。

  • Access2002 レコード入力時に更新/追加を判別できないでしょう

    Access2002 レコード入力時に更新/追加を判別できないでしょうか? わかりにくくてすみません。 現在、簡単な従業員データベースを作っています。 テーブルは2つだけです。 T_基本データ ・従業員番号=主キー ・氏名 ・カナ T_付属データ ・従業員番号=主キー ・職位 だけです。 本来ならば、1つのテーブルでいいのですが、T_基本データのみ、他部署からMDBで送られてくるため、そのMDBの内容、構成は変更できない(頻繁に送られてくるため、いちいち弊部署にマッチした構造に変換する暇が無い)ため、リンクテーブルにしており、弊部署で必要な付属データを別テーブルにし、従業員番号でリンクしている状態です。 フォームは2つ作っており、1つはT_基本データと、T_付属データを一まとめにして表示できるようになっています。付属データが存在しない場合は、該当項目のテキストボックスは空白です。また、従業員番号や氏名で検索(フィルタ)できるようにしています。単票形式です。 そのフォームに「付属情報入力フォーム」を呼び出すコマンドボタンを用意し、そのフォームを呼び出すようにしています。こちらも単票形式です。ちなみに、プロパティで「入力用=はい」にしています。こうしないと、T_付属データの1レコード目が変更されるだけで、追加してくれないためです。 1つ目のフォームで付属情報入力用フォームの呼び出しボタンをクリックすると、フォームが現れ、従業員番号と氏名のテキストボックス(表示済み)と付属情報を選択するコンボボックスが表示されます。 ここで、コンボボックスから適当な項目を選択し、保存を押すと、そのフォームが消え、1つ目のフォームがリクエリーされて、選択した付属情報がテキストボックスに表示されます。 ここまではすんなり作成できたのですが、問題は、一度入力した付属データを更新できないのです。(消すことはできますので、ユーザがめんどくさがっても、一度消去→再入力、は可能です。が。。。美しくない気がします) 一度付属データを入力した社員を1つ目のフォームで表示させ、付属データ入力用のフォームを表示させると、すでに入力してある付属データが表示されますが、これを変更して終了ボタンを押すと、主キーが重複・・・というメッセージが出て保存できません。 当たり前といえば当たり前なのですが。。。 私の頭の中では、2つ目のフォームで、 1.コンボボックスで職位を選択 2.終了をクリック 3.T_付属情報で従業員番号を検索し、あればそのレコードを更新、なければ新規レコードを追加 というシナリオがあるのですが、どう実現していいのかがわからない状態です。 お詳しい方、ご教授くださいませ。 また、「この程度なら1つのフォーム(とサブフォーム)でできるじゃん」という気もするのですが・・・そういう解決策もあればお教え願えれば幸いです。 長文になりましたが、何卒よろしくお願いします。

  • Accessでのフォーム入力エラー

    顧客管理を 顧客マスタ 受注明細 入金明細のテーブルを作成し、リレーションシップの設定をしてあります。テーブルには、この形で入力できるのですが、フォームをウィザードを使って作成(サブフォームのリンクされたフォーム)しました。 新規入力することができません。「テーブル’顧客マスタ’にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更をおこなうことはできません。」のメッセージが出ます。 どうしていいのか、わかりません。教えてください。

  • Access2002_検索フォームの作り方《初心者》

    既存のフォーム上に検索機能を追加させたいと思っております。 現在のフォームは社員の情報を入力していくものです。 既に入力されている社員の情報を変更するときにも使用します。 既存情報の変更はAccessの検索機能を使用して行っておりますが 今後Accessを使えない人でも変更処理が出来るよう、使いやすい検索機能を追加することになりました。 イメージとしては検索したい社員コードを入力し、検索ボタンを押すと該当の情報が表示されるようにしたいと思ってます。 いろいろ調べてみたところ、やりたいことに近いVBAコードをいくつか見かけましたがどうもうまくいきません。 下記のようなオブジェクトがある場合どのようなコードをどこに書けばよろしいでしょうか? 初心者なので出来るだけ手取り足取り教えていただけると助かります。 T_社員マスタ(テーブル) ・社員CD ・氏名 T_社員サブ(テーブル) ・社員CD ・住所 ・生年月日 ・血液型 Q_結合(選択クエリ) ・社員CD ・氏名 ・住所 ・生年月日 ・血液型 ↓このフォームに検索用機能を追加したいです F_検索&入力(フォーム) ・社員CD ・氏名 ・住所 ・生年月日 ・血液型 長々と申し訳ありません。 どうぞよろしくお願い致します。

  • Accessのフォーム

    Access2003を使用しています。 テーブルまたはクエリを元に作成したフォームにはテーブル・クエリに入力されているデータが表示されますよね? それらのデータをフォームから変更出来ないようにする方法はありますか? データ自体を非表示(入力用フォーム)にするのではなく、既存のデータは表示されるけど変更は出来ないという状態にしたいです。 ちなみに新規入力は行えるようにしておきたいです。 よろしくお願いします。

  • Access2003でフォームにあるコマンドボタンで更にフォームを開く

    Access2003でフォームにあるコマンドボタンで更にフォームを開くときのVBA記述で困っています。 Access2003で社員情報管理のデータベースを作成中です。 社員の情報を入力するにあたり、【基本情報】と【詳細情報】とでフォームを分けてあり、【詳細情報】を入力したい場合は、"基本情報フォーム"にあるコマンドボタンをクリックして"詳細情報フォーム"を開くようになっています。 この際、"基本情報フォーム"で開いている社員の【社員番号】を"詳細情報フォーム"の【社員番号】欄にも自動的に表示させるため、以下のようなVBAを記述しました。 Private Sub コマンドボタン_Click() DoCmd.OpenForm "詳細情報フォーム" Forms![詳細情報フォーム![社員番号].DefaultValue = Me![社員番号] End Sub 【社員番号】は7ケタの半角英数で、社員によって、数字だけの場合と、英数混じっている場合とがあります(データ型はテキスト型にしてあります)。 困っているのは、 1.上記を実行した際に、数字だけの社員番号は問題ないのですが、英数混じりの場合だと"社員番号"テキストボックスが「#Name?」という表示になってしまう 2."基本情報フォーム"のコマンドボタンをクリックして新規の"詳細情報フォーム"を開き(社員番号のみが反映され、他の項目は空欄の状態)、詳細情報を入力→保存したあと、別の社員番号で"基本情報フォーム"を開き、コマンドボタンで"詳細情報フォーム"を開くと、前に入力した社員の情報が出てきてしまう。 (つまり、"詳細情報フォーム"のもととなるテーブルに、1行でもレコードがあると、それが出てきてしまう。) 【詳細情報】は、 1.データを入力する社員としない社員とがいる 2.新規でレコードを作成する場合と、既存のレコードを上書きする場合とがある ので、もととなる"詳細情報テーブル"にその【社員番号の】レコードがなければ新規入力画面を、レコードがあればそのレコードを呼び出す形にしたいのですが、英数混じりの表示の件も含め、どうすれば、正しく表示されるか教えていただきたいです。 ぜひぜひよろしくお願いします。

  • (ACCESS)入力フォームについて

    こんにちはmynannです またまた困っているのでよかったらヒントを いただきたいと思い質問させていただきます まずテーブルが二つあり 商品マスタには管理番号(主キー)と価格の二つの項目があります。 もうひとつは販売マスタというのがあり フィールドは管理番号、販売可(チェックボックス) の二つです。 この二つはリレーションシップの関係にあります そしてこの二つを一つにした 販売可商品マスタクエリがあります 商品マスタにはすでに多くのデータがあり それ専用の入力フォームもあります 今販売マスタの入力フォームを作りたいのです どのようなものかといいますと 管理番号を入力すると価格用のテキストボックスに 自動的に入力された管理番号の価格(商品マスタから調べると思うのですが)を表示するようにしたいのです 管理番号[       ]←ここに値を入力 価格[       ]←管理番号が入力されると自動的にでる 販売可 □ ←自分でチェックする イメージはこのような感じです 更新後処理を使うということはなんとなくわかるのですが どのような処理をさせていいかわかりません 助けてください!お願いします!

  • access フォーム間で情報が引き継がれない

    初心者です、よろしくお願いします。 仕様環境 WinXP Access2002 請求管理のシステムを作っています。 テーブルには 顧客マスタ(主キーは顧客番号でテキスト型 例:0001等) 請求マスタ(主キーは請求番号でテキスト型 例:A0001等) 明細マスタ(主キーは明細番号でオートナンバー ダミーみたいな感じで使っています。) そしてリレーションシップで顧客マスタ(1)→(多)請求マスタ(1)→(多)明細マスタになっています。 顧客マスタを元にしたフォーム(顧客入力フォーム)に顧客情報を入れて、 「請求書作成ボタン」を作り、そのボタンを押すと別のフォーム(請求書作成フォーム)に 飛ぶようにしているのですが、その際に顧客入力フォームに入力した情報を 引っ張っていくようにしたいのですが、うまくいきません。 ちなみに顧客マスタと請求マスタのリレーションは”顧客番号”でつなげています。 請求書作成フォームは請求書作成クエリから成り、 その中で顧客番号(テーブル:顧客マスタ)の抽出条件に[Forms]![顧客入力フォーム]![顧客番号]と 入れて”顧客番号つながり”で飛ぶようにしているのですが、 請求書作成フォームは開くのですけど、項目はすべて空白です。 またいろいろレコードを追加している内に、請求番号が既にあるものに対しては顧客情報も引き継がれることが判明しました。 構文が間違っているのでしょうか? 混乱しています、お助けください。

  • Access2003 ~入力のみ可能なフォームを作成したい~

    Access2003 ~入力のみ可能なフォームを作成したい~ データ入力用のフォームを作っているのですが、テーブル上の既存のデータに対しても 編集が可能になっているので、これを出来ないようしたいのですが、どのように操作すればよいのでしょうか? 作りたいものは次のいずれかです。 (1)既存のデータは参照のみ可能で新規エントリー可能。 (2)既存のデータは表示させずに、完全に入力しかできないフォーム。 ●さらに入力後に、データを登録するかキャンセルするか を行うボタンを設定したい。 ※入力しただけではデータが保存されないようにしたい。 よろしくお願い致します。