テキストの壁に申し訳ありませんが、これは説明が必要で、投稿するにはコードが多すぎます...
データ入力が必要なメソッドのアクセスに固定幅のファイルをインポートしています。transferTextを使用してファイルを2つの仕様にインポートします(1つはグローバル、もう1つは特別な状況です)。
DAOを使用してTableDefs内のすべてのFieldオブジェクトを循環し、AutoIncrement PKを含む複製テーブルを作成する関数があるので、これらのレコードを編集することができます。INSERTINTOを使用してデータをそのテーブルにプッシュします。
よく働く。エラーが見つかった場合、ユーザーはデータ入力に移動して手動でエラーを修正します。これは、400文字の行をふるいにかけ、すべてを想定どおりに再編成するのに勝ります。よく働く!
問題:データ入力が変更されると、フォーム外のモジュール内の関数を呼び出すコミットボタンが押されます。データ入力フォームを閉じて、情報を元のテーブルから自動インクリメントされたPKを差し引いたものにプッシュし、複製されたテーブルをIDでドロップし、エラーをもう一度検索する新しいテーブルを生成することになっています...
元の状態に問題なくプッシュバックしますが、IDテーブルをドロップしません。このテーブルがロックされていることを示すメッセージが常に返されます。すべての関数/サブが終了するまで、テーブルが無期限にロックダウンされていることに気づきました。コードをステップスルーするときはいつでも手動で削除することはできません。実行が終了すると、コードを削除できます。
フォームのコマンドを使用してこれを呼び出したので、すべてのコードが終了し、フォームの終了を呼び出してその処理を実行できるようになるまで、ロックは解放されないと想定しています。何かご意見は?はい、これは非常に野蛮ですが、それは非常にうまく機能します。更新されたコピーを再ドロップできるように、この他のテーブルを惑星から引き裂くことができる必要があります...
最悪の場合、ユーザーにフォームを閉じてメインフォームの別のボタンを押すようにすることができますが、これはユーザーの能力を念頭に置いて設計されています。しかし、これは今私の完全な注意を引いており、それが最適なものでなくても、少なくとも解決策を見つけたいと思っています。
-編集-
この問題では2つの形式が使用されます
FormA (Role: Load in and search for problems)
Examine button is pressed that:
- Uses TextTransfer based on predefined specs into tempExtract to
import the file
- DAO fires off on the Fields collection in tableDefs for
tempExtract, creates new table tempExtractID
- Performs searches through the file to find errors. Errors are saved to
a table Problem_t. Table contains Problem_ID (Set from the ID field
added to tempExtractID) and Description
- Execution of these tasks is successfully requerying the initial
form to showing a list of problems and number of occurances. A button
gains visibility, with onClick that opens the form DataEntry.
- At this point in the code after DAO execution, I can DROP the table
tempExtractID. DAO is NOT used again and was only used to build a new table.
FormB-データ入力フォーム
このフォームを開くとすぐに、テーブルtempExtractIDがロックされ、テーブルを削除できなくなります。フォームへのレコードソースは、Problems_tのIDに対してtempExtractIDを照会し、キーイングする必要があるものだけを返します。
フォームが完全に終了するまでテーブルを削除できません。データ入力フォームのボタンを押して変更をコミットします。この場合、ロックエラーが発生する前に起動するコードは5行だけです。
*Xargs refers to the list of Field names pulled earlier through DAO. As DAO loops through Field objects, the physical names are added to an Xargs String which is placed in this table. Basically everything but the AutoNumber is being inserted back
docmd.Close acForm, "frmDataEntry", acSaveNo
call reInitializeExtract
> docmd.RunSQL "DELETE FROM tempExtract"
> docmd.RunSQL "INSERT INTO tempExtract SELECT (" & DLookup("Value", "CONFIG_t", "Item = 'Xargs'" & ") FROM tempExtractID"
docmd.DeleteObject acTable, "tempExtractID"
これは、フォームが開かれる時間(テーブルが最初にロックされる場所)の間に実行され、すべてのサブと関数が完了するまでロックされ続ける唯一のコードです。