Извините за стену текста, ребята, но это требует объяснения, слишком много кода для публикации...
Я импортирую файлы фиксированной ширины в доступ в методах, требующих ввода данных. Я импортирую файл с помощью TransferText в две спецификации (одна глобальная, другая для особых обстоятельств).
У меня есть функция, которая использует DAO для циклического перебора всех объектов Field в TableDefs для создания дублирующей таблицы, включая AutoIncrement PK, поэтому у меня есть возможность редактировать эти записи. Я помещаю данные в эту таблицу с помощью INSERT INTO.
Работает отлично. Обнаружены ошибки, пользователь переходит к вводу данных, чтобы вручную исправить их, что лучше, чем просеивать 400 строк символов и реорганизовывать все так, как должно быть. Работает отлично!
Проблема: при изменении ввода данных нажимается кнопка фиксации, которая вызывает функцию внутри модуля вне формы. Он закрывает форму ввода данных и отправляет информацию обратно в исходную таблицу за вычетом автоинкрементного PK, и ПРЕДПОЛАГАЕТСЯ УДАЛИТЬ реплицированную таблицу с идентификаторами и создать новую, снова ища ошибки...
Он отлично возвращается к оригиналу, но не УДАЛИТ таблицу идентификаторов. Всегда возвращается ко мне с сообщением о том, что эта таблица заблокирована. Я заметил, что таблица заблокирована на неопределенный срок, пока все функции/подпрограммы не выйдут. В любое время, выполняя код, я не могу удалить его вручную, после завершения выполнения я могу удалить его.
Я предполагаю, что, поскольку я вызвал это с помощью команды в форме, блокировка не будет снята до тех пор, пока не завершится весь код, а форма не может быть вызвана и не сделает свое дело. Есть предположения? Да, это очень варварски, но это работает достаточно хорошо, мне просто нужно иметь возможность вырвать этот другой стол с планеты, чтобы я мог повторно загрузить обновленную копию...
В худшем случае я могу заставить пользователя закрыть форму и нажать другую кнопку в основной форме, но это в значительной степени разработано с учетом компетентности пользователя. Однако теперь я полностью сосредоточен на этом и хотел бы хотя бы найти решение, даже если оно не оптимальное.
-ИЗМЕНИТЬ-
В этой задаче используются две формы
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 становится заблокированной, и я не могу удалить таблицу. Источник записей для формы запрашивает tempExtractID по идентификаторам в Problems_t, чтобы вернуть только то, что нам нужно для ключа.
Я не могу удалить таблицу, пока форма полностью не завершится. Кнопка в форме ввода данных нажата для фиксации изменений, в которых есть только 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"
Это единственный код, который запускается между моментом открытия формы (где таблица впервые блокируется) и продолжает блокироваться до тех пор, пока не будут завершены все подпрограммы и функции.