Удаление записей в представлении таблицы - PullRequest
0 голосов
/ 18 ноября 2011

В MS Access (2003) у меня есть запрос SELECT, состоящий из левого и внутреннего объединений, отображаемых в виде таблицы в виде подчиненной формы. Я хотел бы дать пользователям возможность удалять несколько записей в виде таблицы. Удаление по умолчанию, которое происходит, когда пользователь выбирает «Удалить запись» из контекстного меню записи, не работает; запись исчезает из представления таблицы, но продолжает существовать в нижележащих таблицах и вновь появляется при обновлении представления.

Я попытался определить запросы на удаление в событии Form_delete, используя объект CodeContextObject для получения значения первичного ключа выбранной записи, а затем запустив команду DELETE FROM tablename WHERE id = keyValue. Это работает , но Access отображает предупреждение «Ядро базы данных Microsoft Jet отключило процесс, потому что вы и другой пользователь пытаетесь изменить данные одновременно». Затем запись фактически удаляется из таблицы, но вместо исчезновения из представления она отображается как #Deleted. Как переопределить процедуру удаления по умолчанию в представлении таблицы?

Вот запрос SELECT:

SELECT *
FROM [SELECT *
      FROM ((GeneralTable as G 
             INNER JOIN SpecificTable as S ON G.id = S.id) 
             LEFT JOIN Assigned as A on G.id = A.id)]. AS Q1 
LEFT JOIN People AS P ON Q1.pID = P.pID
WHERE (((Q1.isPrimary) Is Null Or (Q1.isPrimary)=True));

Я изменил имена таблиц, но дизайн SpecificTable наследуется от GeneralTable, и люди назначаются на записи в SpecificTable в отношении многие ко многим. Этот запрос выбирает все записи в SpecificTable, и лицо, если таковое имеется, назначается в качестве основного для записи. Когда запись удаляется, запись в таблице People не должна быть удалена, но записи в G, S и A. должны быть удалены.

1 Ответ

2 голосов
/ 18 ноября 2011

Первый ответ, который я собираюсь дать вам, - это тот, который, я думаю, наверняка дадут вам опытные программисты Access: Избегайте попыток упростить удаление нескольких записей в форме, которая отображает записи, используя любые сложные объединения или подзапросы. Другими словами, избегайте делать то, что вы пытаетесь сделать.

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

CurrentDb.Excecute "DELETE * FROM tblMyTable WHERE ID = " & Me!ID, dbFailOnError
Me.Requery

Но я не думаю, что это полностью решает проблему получения сообщений об ошибках конфликта.

В качестве третьего предложения вы можете поместить кнопку «Удалить» в основную форму, которая запускает приведенный выше код. Вам нужно будет извлечь значение идентификатора из подчиненной формы.

Мое четвертое и последнее предложение похоже на мое третье предложение, которое я могу представить только в теории. Вы можете создать свое собственное контекстное меню и поместить в него пункт «Удалить», который запускает приведенный выше код. Я признаю, что есть несколько деталей об этом подходе, которые я не знаю, как сделать, например, показать это меню в правильное время и место и позволить пользователю выбирать и удалять несколько строк.

...