Доступ иногда переходит к существующей записи при сохранении новой записи-Access2k FE/SQL2005 BE



Я действительно публикую это из отчаяния после того, как много искал ответ и пытался сделать несколько разных вещей без успеха.



У меня есть база данных Access, где я недавно перенес таблицы в SQL 2005, Access продолжает функционировать для пользователей как интерфейс, предоставляющий формы, отчеты и запросы.



Однако с момента перехода к настройке Access FE / SQL пользователи сообщают, что иногда , когда они вводят новую запись, они щелкните в подформе (сохранение записи) или нажмите кнопку Сохранить в самом меню, оно переходит к существующей записи. Новая запись была сохранена, но по какой-то причине доступ переключается на другую запись по мере ее обновления. Затем пользователь должен закрыть, найти сохраненную запись и продолжить ее редактирование.




Сценарий : пользователь вводит предложение и заполняет все детали предложения, клиент,
дата и т. д., Затем щелкает в подформе линейные товары, чтобы добавить продукт (или щелкает сохранить в меню), и вдруг
форма предложения (и подформа строки) показывает детали некоторой случайной цитаты. Случайная цитата может быть недавней или из прошлых лет, и не имеет ничего общего с цитатой, которую они вводили.




Это странное поведение происходит только при вставке новой записи, но никогда при редактировании существующей записи. Пользователи говорят мне, что это происходит " чаще", когда они идут, чтобы добавить новый (цитата, клиент, что угодно) после открытия базы данных.



У меня есть заметила, что это происходит только на формах, которые имеют подформы, поэтому моя первая мысль заключается в том, что это связано с передачей доступа через данные подформы до сохранения данных формы, что вызывает нарушение PK. Но этого, похоже, не происходит: на SQL-сервере нет ошибок, и запись успешно сохраняется. Принуждение пользователей сохранять основную запись формы перед добавлением записей подчиненных форм (т. е. на цитате, заставляя их сохранять цитату перед добавлением элементов строки) не сработало, это просто вызывает скачок (иногда) по сейву.



Это не vba работает на save или на current, я установил точки останова на всех обработчиках событий, когда он прыгает, и никакой vba не выполняется. Некоторые из "прыгающих" форм не имеют vba на форме. Но у всех есть субформы. Я подозреваю, что это связано с блокировкой записей.



Сервер, на котором работают таблицы, - это SQL Server 2005, пользователи используют смесь Access 2000 и 2003, в основном XP SP3 с парой старых коробок Win2k. Они используют слияние репликация и несколько пользователей запускают реплицированные выпуски SSEE2005 и подписываются на главный сервер. Большинство пользователей не реплицируются, а просто подключаются непосредственно к серверу через ODBC или SQL native client connections. Но я проверил, что это происходит со всеми пользователями, обычно один или два раза в день, и это случалось со мной раньше. Так что это не проблема пользователя.



Худшая часть этого поведения заключается в том, что это происходит только иногда, и мне не удалось найти сценарий это будет Всегда причиной того, что это произойдет.



Если кто-то испытывал что-то подобное раньше, пожалуйста, дайте мне знать, как вы разобрались с этим, или даже предложения будут приветствоваться.



Обновление:
(1/10/09) проблема решена, благодаря Дэвиду Фентону. Установка формы в режим ввода данных (форма.DataEntry = true) перед его открытием для добавления записей действительно предотвращает скачок. Клиент сообщает, что никаких проблем вообще не было, так как я изменил это неделю назад.

598   7  

7 ответов:

Клиент периодически сообщает о подобных проблемах. Это началось сразу же после того, как они начали использовать репликацию слиянием.

Я проинформировал несколько контактов в группе продуктов Microsoft Access, а также моих коллег Access и SQL Server MVP.

Пожалуйста, напишите мне свой адрес электронной почты, чтобы я мог переслать его своим контактам в Microsoft, поскольку я предполагаю, что они захотят связаться с вами напрямую. Тони Ат granite.ab.ca

Кстати отличная тревога съемки и подробно описание проблемы.

Это определенно похоже на проблему блокировки записи. Вы используете автономерами как ПК? Вы пробовали 2 компьютера, добавляющих запись в одну и ту же форму одновременно (это означает, что один из них запустит событие insert, в то время как другой добавил новую запись в форму one, но все еще редактирует ее)?

Не могли бы вы проверить тем или иным способом, остается ли PK вставленной записи после вставки в таблице похожим на PK, заданный до вставки (добавив, например, несколько - отладка.печать на вашем коде)?

Сценарий может быть 2 отложенных вставки были даны машиной же PK, второй из которых затем автоматически изменяется во время вставки, в результате чего ваша форма теряет "активную" запись.

Меня интересует сценарий, в котором вы используете форму для добавления записей, в которой есть любые другие записи для перехода пользователя.

То есть я не верю в использование той же формы для редактирования записей, что и для их создания.

Вместо этого я использую несвязанный диалог для сбора всех необходимых полей, вставки записи в SQL, а затем открываю основную форму редактирования для этой единственной записи (а не для формы, в которой вся таблица перемещается к только что добавленной записи).

Имейте в виду что в сценарии основной формы / подчиненной формы создание записи в подчиненной форме, когда родительская форма не сохранена, приводит к сохранению родительской записи. Вы можете проверить, есть ли какой-либо код в событиях вставки и обновления основной формы, который вызвал бы запрос основной формы на вставку новой записи (вызванный редактированием подформы).

Но я бы все же предположил, что лучшая архитектура-это избегать такого рода возможных сценариев, загружая только отдельные записи, поэтому нет другой рекорд, чтобы перейти к нему. Это, безусловно, ограничит возможности того, где пользователь может оказаться, когда возникнет проблема.

Я видел поведение "как" это, когда есть несколько способов сделать то же самое. (например, выделение вкладки из текстового поля, запускающего lostfocus против нажатия кнопки) поэтому убедитесь, что это не так, если вы этого еще не сделали.

Эта проблема решается триггером репликации слиянием. В этом триггере (эта проблема strart из sql 2005 server , в SQL 2000 server это не НАКе проблемы) репликации вставить некоторые данные в таблицы репликации с идентификаторами и доступ получить это количество идентификаторов вместо реальной формы indentity insert. Я читал, что доступ использует @ @ IDENTITY insetad SCOPE_IDENTITY, и это проблема . Чтобы избежать этого, вы должны изменить триггер слияния таким образом, что в insert trigger on beginning вы сохраните текущее значение из @ @ identity в переменную и в конце триггера вставить значение во временную таблицу как identity с начальным значением того, что записано в переменной. это исправит @ @ iddentity и acces получит правильное значение.

В начале триггера Объявить @identity int Объявить @strsql varchar (128) set @identity=@ @ IDENTITY ar конец что-то вроде set @strsql= 'select identity (int,' +CAST (@identity as varchar (15))+', 1) as id в #temp' exec (@strsql) Эт и он должен быть помещен между если @ @ ошибка Ноль неудача Гото
и возвращение

Проблема в acces будет стираться не только на форме, но и непосредственно в таблице ссылок ODBC.

Я ищу способ, как добавить это автоматически в триггер репликации слиянием (в основном insert).

Это ошибка в доступе и SQL-коммуникации. Доступ возьмите идентичность новой записи из @ @ IDENTITY и когда вы закончите вводить запись, она перезагрузит данные на основе значения из @@IDENTITY value из SQL. В SQL 200 вставленный триггер слияния и доступ обычно работают нормально. Из SQL 2005 триггер слияния имеют некоторую часть, в которой данные вводятся в некоторую таблицу репликации слиянием, которые имеют идентичность и изменяют значение @IDDENTITY формы, что из вновь введенного rcord от доступа.

Одним из решений является chanege все мереге вставляют триггер, чтобы сохранить @IDDENTITY в начале его в переменной и в конце триггера вставляют запись dumy в # temp таблицу как столбец identity с начальным значением переменной, ранее сохраненной.

Это решение я нашел где-то в сети, когда на прошлой неделе меня тоже затронула эта проблема. Я перемещал базу данных из SQL 200 в SQL 2008, а затем обнаружил эту проблему с идентификацией в Access. Я подозреваю репликацию, потому что когда я удалял одну из подписок, все начинало работать ну а после воссоздания его снова стерли.

Я использую это для решения задачи (такем откуда-то в сети).

В начале триггера вставки слияния

Объявить @identity int

Объявить @strsql varchar (128)

Set @identity=@@IDENTITY

И в конце слияния вставить триггер

Set @strsql= 'select identity (int,' +CAST(@identity as varchar (15))+', 1) as id в #temp '

Exec (@strsql)

Последний код должен быть помещен на место / * вставить конец на этом месте */ в коде репликации слиянием

Если @ @ ошибка 0

Goto FAILURE

/ * вставить конец на это место * /

Возврат

Но я ищу способ сделать это автоматически для всех существующих триггеров слияния при публикации и для всех существующих триггеров слияния при существующих и будущих подписках.

0I нашел это

Http://jagbarcelo.blogspot.com/search/label/identity

Но я не знаю, Могу ли я использовать его на SQL 2008.

Comments

    Ничего не найдено.