フォームのレコードソースにストアドをしてした場合

このQ&Aのポイント
  • フォームのレコードソースにストアドを指定すると、VBAでデータを追加する際に特定の命令では追加できないことがあります。
  • 'acCmdSaveRecord'でデータの競合が発生し、メッセージが表示されずに進まなくなる場合もあります。
  • その場合、追加用のストアドを作成するか検討する必要があります。
回答を見る
  • ベストアンサー

フォームのレコードソースにストアドをしてした場合

フォームのレコードソースにパラメータ付きのストアドを指定した場合は、 データを追加する場合にはVBAで下記の命令では追加できないのでしょうか? 状況は「acNewRec」は正常に動作しているようです、「acCmdSaveRecord」で 「データの競合」のメッセージが表示されすすまないので、 終了させようとすると、「プロシージャまたは関数'○○○'には パラメータ'○○'が必要ですが、指定されませんでした。」となります. DoCmd.GoToRecord , , acNewRec データの入力処理 DoCmd.RunCommand acCmdSaveRecord 駄目な場合やはり追加用のストアドを作成するのでしょうか?

  • SEsyo
  • お礼率78% (64/82)

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

ストアドプロシージャというものの性質を理解する必要があると思います。 確かにストアドプロシージャの中にSELECT文を書けば、結果を返してくれますし、それをデータソースに使うことはできるでしょう。 ただし、テーブルやビューが更新可能(ビューは条件付)であるのに対し、ストアドプロシージャやテーブル関数が返すレコードは データ処理後の単なるデータ集合にすぎない(元テーブルとの関係から切り離されている)ため、それに対して更新を掛けるという 発想自体に無理があります。 試したわけではないですが、NewRecまではAccess側での処理にすぎないので、うまくいっているように見えるということではないかと思います。 更新する場合はテーブルやビューを使うか、全項目をパラメータにした更新用ストアドプロシージャを準備すべきでしょう。

SEsyo
質問者

お礼

いつもいつも、ありがとうございます。 「全項目をパラメータにした更新用ストアドプロシージャ」か ADOで更新するか検討します。 これでまた一歩すすめます、ありがとうございました。

関連するQ&A

  • Accessレコードの削除(VBA)

    Accessで入力フォームを使用して入力をしていますが、 全項目の入力がされていない場合そのレコードを削除したいのです。 閉じるときに消そうと思い DoCmd.RunCommand acCmdDeleteRecord を入れてみたのですが、レコードの削除はできません、とメッセージが出てしまい消せません。 次のレコードを選択すれば消せるかと思い DoCmd.GoToRecord , , acNewRec を足してみたりしてみたのですが、やっぱりダメでした。 この場合はどのようにすればいいのでしょうか?

  • エラーメッセージの意味(完全に指定されていない一意テーブル)

    1026:存在しないか、または完全に指定されていない一意テーブルです。 間違いなく存在しているので、「完全に指定されていない」のだと思います。 何が考えられるのでしょうか? ACCESSのVBAでSQLに対して更新(追加)をかけると上記のエラーがでます。 FORMのLOAD時のイベントで下記の命令が実行されます。 DoCmd.GoToRecord , , acNewRec Me!支払番号 = wk_端末番号       'キーの設定 DoCmd.RunCommand acCmdSaveRecord    ←の命令でエラーになります。 似たシステムをコピーして名称などを変えながら作成しているのですが・・・ 元のシステムは正常に動いています。 DB側で何か指定する必要があるのでしょうか? DB側はSQLServer2008を使っています。

  • Access:ストアドプロシージャの作成後にそれをレコードソースとしたフォームを開きたい

    WINDOWS XP ACCESS 2002 MSDE を使用しています。 ADOでストアドプロシージャを作成して 作成したストアドプロシージャをレコードソースとしたフォームを開こうとしたところ エラーが発生してしまいます。 以下、ソースを大まかに示します '------------------------------------------------- sub test_Click() On Error GoTo err_test Dim Dname As New ADODB.Connection Dname.Open Dname.Execute "CREATE PROCEDURE q AS " + vbCrLf + _ " SELECT a FROM b WHERE (c = 1) ORDER BY d DoCmd.OpenForm "F" , Exit Sub err_test: MsgBox "err : " + Err.Description End Sub '------------------------------------------------- 開こうとしているフォーム"F"のレコードソースには 作成したストアドプロシージャ"q" を指定しています。 DoCmd.OpenForm で以下のエラーが発生します。 エラー番号は"2580" メッセージは"このフォームまたはレポートで指定されているレコード ソース 'q' は存在しません。" Access再起動して、ストアドプロシージャを作成せずにフォームを開くと フォームは開けるのですが、 作成した直後にフォームを開きたいと考えております。 なにが原因なのでしょうか? ご回答のほど、何卒よろしくお願いいたします。

  • ストアドから別のストアドを作成できますか?

    パラメータ付きストアドから、そのパラメータを展開したSELECT文のストアドを作成する事は可能でしょうか? アクセスのデータシートビューを表示するにはパラメータがあっても指定出来ないようなんです。 「DoCmd.OpenStoredProcedure」でパラメータ付きのストアドを実行すると、 パラメータ用のインプットボックスが表示されその都度入力しなくてはなりません。 そこで、アクセスから@フィールド名 と @テーブル名 をパラメータとしてストアドを実行し、 ストアドで「SELECT @フィールド名 from @テーブル名」パラメータを展開したSELECT文にして、 別の名前を付けたパラメータ無しのストアドとして登録し、そのストアドを アクセスの「DoCmd.OpenStoredProcedure」で実行すれば、目的のデータシートビューを表示出来ると考えました。 ストアドからストアドを作成できるのでしょうか、可能であれば方法を教えて下さい。

  • Accessでレコードの複製

    Accessで、ボタンをクリックすると 表示させているレコードをコピーして複製したいです。 以下のようにコードを書いてみたのですが、 「コマンドまたはアクション”追加貼り付け”は無効です」 となってしまいます。 DoCmd.RunCommand acCmdSelectRecord 'レコードの選択 DoCmd.RunCommand acCmdCopy 'コピー DoCmd.RunCommand acCmdRecordsGoToNew '新規レコードへ DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdPasteAppend '追加貼り付けを実行 ちなみに DoCmd.RunCommand acCmdPasteAppend を DoCmd.RunCommand acCmdPaste に修正しても 「コマンドまたはアクション”貼り付け”は無効です」 となって、エラーになってしまいます。 そこで、以下のようにコードを省略して DoCmd.RunCommand acCmdSelectRecord 'レコードの選択 DoCmd.RunCommand acCmdCopy 'コピー DoCmd.RunCommand acCmdRecordsGoToNew '新規レコードへ DoCmd.RunCommand acCmdSelectRecord ここで、手動で、ctrl+Vをすると、レコードのコピーができます。 コードの書き方が間違っているのでしょうか? ご教授よろしくお願いいたします!

  • アクセス enterで次ページ(レコード)移動

    アクセスでformを使い最後の入力”失効有無”が終わったら次のレコードにenter keyで 移動したいのですがうまくいきません。 プロパティの更新後処理 イベントプロシージャのところに下記を書いています。 Private Sub 失効有無_AfterUpdate() DoCmd.GoToRecord , , acNewRec DoCmd.GoToControl "ID" End Sub 以前はこれでうまくいったと思います。。。 おかしいですか? よろしくお願いします、

  • サブフォームの新規レコードに移動したい アクセス

    親フォームのコマンドボタンをクリックしたら 親フォームにはまっているサブフォームの新規レコードに移動したいのですが、 うまくできません。 サブフォームのオブジェクト名は、"F_SubForm"です。 サブフォームはデータシートビューです。 VBAコードは Private Sub cmd_test_Click() DoCmd.SelectObject acForm, "F_SubForm" DoCmd.GoToRecord , , acNewRec End Sub です。 上記コードを実行すると DoCmd.SelectObject acForm, "F_SubForm" の部分で、 「実行時エラー 2489  オブジェクトが開いていません。」 となります。 だからと言って、 DoCmd.GoToRecord , , acNewRec だと、何も起こりません。(新規レコードに移動しません) 解決方法をご教授ください。

  • クエリフォームからのレコード追加について

    お世話になります。 タイトルとして、「クエリフォームからのレコード追加」とすべきか 「フォーム上でのテーブル参照」とすべきか迷うところなのですが 仕入マスタ(ID、品番、仕入日、仕入数) 商品マスタ(ID、品番、商品名) という二つのマスタと、 品番でリレーションして「仕入マスタのフィールド(from仕入マスタ)+商品名(from商品マスタ)」を出すだけの単純なクエリがあります。 今、仕入マスタに新規レコードをフォームから追加する際、 品番を入れたら商品マスタから商品名が参照され表示される、というフォームを作成したいのですが、どうしたら実現可能でしょうか。 (絶対やりかたがあると思ったのですが、うまく探せず質問させていただきます) 当初、新規レコード追加時には、品名を表示させようとしていなかったため、普通に「仕入マスタのフォーム」で「新規」ボタンに下記プロシージャを登録していたのですが。。 「仕入マスタのフォーム」を「仕入クエリのフォーム」に変更して、下記プロシージャを少々修正するだけで実現できるでしょうか。 (素人考えでいくつか試してみたのですが、この場合★の部分に何を指定すればいいのかわかりません。) Private Sub 新規_Click() Me.AllowEdits = False Me.AllowAdditions = True DoCmd.GoToRecord acDataForm, "仕入マスタ", acNewRec '★ End Sub わかりにくい説明で申し訳ございません。 何卒お力添え宜しくお願い致します。

  • サブサブフォームのレコード移動方法

     いつもお世話になっております。サブサブフォームのニューレコードに移動するボタンを作成しようとしているのですが、サブフォームは移動できるのですが、サブサブフォームを移動させることができません。 Me.sub1.Form.sub2.Form.コンボボックス名.SetFocus DoCmd.GoToRecord , , acNewRec で記述してみたのですが反応がありませんでした。指定方法が間違っているのでしょうか?よろしくお願いします。

  • ストアドプロシージャについて

    教えてください。 NT4.0上でAccess2000+MSDEで使用しているのです。 ストアドプロシージャでUPDATE文のあとにSELECT文を使い更新したデータを受け取ろうとしているのですが、実行すると「ストアドプロシージャは実行されましたがレコードは返されませんでした。」とメッセージが表示されるだけなのです。UPDATE文を注釈にするとレコードは返されるのでデータはあるのだと思います。 宜しくお願いします。