親レコードが作成されていない場合、Excel から Access サブフォームにセルをコピー/貼り付けすると、予想どおりエラーが発生します。
問題は、このエラーが発生した後、アクセスがロックされ、入力された後続のすべてのデータが「トランザクションでサポートされていない操作」エラーになることです。テーブルを開くと、新しく追加されたデータがまだテーブルにないことがわかります。そのため、Access が実際に何らかのトランザクションを行っているように見えます。
私は 'Save' .. 'Refresh' .. を押して commitTrans() を強制するために AfterInsert イベントを追加しようとしましたが、運がありませんでした - そして Access は進行中のトランザクションがないと主張します
レコードが手動で入力されている場合、エラーはありません。この問題は、レコードを貼り付けるときにのみ発生するようです。Access が複数のレコード操作を処理するトランザクションを作成しており、エラーから適切に回復していないと推測しています。
「必須」フラグを削除すると機能しますが、孤立したレコードができます。After Insert Data Macro を使用して、デフォルトのバッチ名で新しいバッチを追加し、新しい BatchID を Items テーブルに自動入力できるのではないかと考えていました。ただし、それがどのように行われるかはわかりません。
「必須」フラグを削除し、Before Change Data マクロを使用してエラーをトラップしようとしましたが、エラーを削減しましたが、それでも同じOperation not supported in transactionsエラーが発生しました。
Microsoft Knowledgebase でエラーを調べましたが、私の状況に固有のものは見つかりませんでした。エラーメッセージをstackoverflowで検索しましたが、何も見つかりませんでした。
新しいデータベースを作成し、問題を再現できました。
複製する手順
データベースのセットアップ
- Access 2010 で新しい ACCDB データベースを作成する
- 次のフィールドを使用して、「バッチ」という名前のテーブルを作成します。
- BatchID (オートナンバー) (主キー)
- バッチ名 (テキスト)
- 次のフィールドを持つ「Items」というテーブルを作成します。
- RecordID (オートナンバー) (主キー)
- BatchID (長整数)
- 必須属性を True に設定
- データ - テキスト
- リレーションシップを作成し、Batches.BatchID を Items.BatchID にリンクします
- バッチからのすべてのレコード、およびアイテムからの一致するレコードを含める
- 参照整合性の強制
- カスケード更新/削除
- 「フォーム」という名前のフォームを作成します
- レコードソースをバッチに設定する
- BatchID と Batch name テキスト ボックスを追加します。
- サブフォーム/サブレポート コントロールに追加する
- ソースオブジェクトを「Table.Items」に設定
- リンクマスターフィールドを「BatchID」に設定
- リンクの子フィールドを「BatchID」に設定します
- 「空のマスターでフィルター」を設定 = はい
- サンプルデータの作成(フォームを使用)
- バッチで新しいレコードを作成します。
- BatchName = "Test" を設定
- アイテムに新しいレコードを作成します。
- バッチ レコードを参照します。
- 設定データ = "テスト"
- バッチで新しいレコードを作成します。
ご覧のとおり、これは手動でうまく機能します。
Excel からのデータのコピーと貼り付け
- エクセルで
- A1 から A10 まで、セルごとに 1 つの文字を入力します: A、B、C、D、E、F、G、H、I、J
- セル A1 ~ A10 を強調表示します
- コピー (Control+C)
- Access では、フォームを使用して:
- 新しいバッチ レコードを追加します。BatchID TextBox に "(New)" と表示されるはずです
- バッチ名を入力しないでください
- サブフォームで、新しいレコードのレコード セレクター (*) をクリックして、行全体を選択します。Control+V を入力して貼り付けます。
- 「'Data.BatchID' フィールドに値を入力する必要があります。」エラー
に対して [OK ] をクリックします。
- このエラーが繰り返される場合があります。[OK] をクリックし続ける
- 「これ以上エラー メッセージを表示しないようにしますか...」と尋ねられたら、「はい」と答えます。
- 「Microsoft Access が貼り付けることができなかったレコードは、'貼り付けエラー' という名前の新しいテーブルに挿入されました」の [OK] をクリックします。通知
- バッチ名のテキスト ボックスに「TestName」と入力します。
- 優雅に回復してみてください。エスケープを押します。レコードを変更します。
この時点で、入力された BatchID、バッチ名、および新しいデータが表示されます。すべてが期待どおりに機能しているようです。更新または別のバッチ レコードに移動しようとすると、Operation not supported in transactionsというエラーが表示されます。Access は、フォームを閉じて再度開くまで、このエラー メッセージを表示し続けます。貼り付けたデータは、データベースには作成されません。
通常、少し技術に精通している人は、何かがうまくいかないことに気づき、データベースを閉じて再び開きます...しかし、残念ながら、ポップアップボックスで「もぐらたたき」をしてから試してみるユーザーがいます続けます - だから私は物事を可能な限り防弾にしたいと思います.
望ましい解決策
この問題の回避策が必要です。最終的には、アクセスや値の重複などの他の癖につながることはありません。
私自身の経験では、VBA を使用してキーを「修正」することは信頼できません。データ マクロの方がはるかに信頼性が高いようですが、セットアップが難しい場合があります。まだあまり主流ではありません ( stackoverflowに ms-access-data-macrosタグがあるべきだと思いますが、ありません) 。まだ)