Не могу добавить запись в форму, выдает ошибку "невозможно перейти к указанной записи". (MS Доступ 2007-2016)

Я очень новичок в MS Access, и я пытаюсь добавить запись в форму, где всякий раз, когда я нажимаю кнопку «Добавить запись», я продолжаю получать сообщение об ошибке «Не удается перейти к указанной записи», что предотвращает меня от использования кнопки. Форма была создана с помощью запроса, который связывает вместе четыре таблицы. Я слышал, что мне нужно сделать запрос редактируемым, но я не уверен, как это сделать. (Вот как выглядит SQL запроса - автоматически сгенерированный MS Access).

SELECT tblCustomers.Forename, tblCustomers.Surname, tblCustomers.Telephone, tblCustomers.[Customer ID], Count(tblTickets.[Ticket Number]) AS [CountOfTicket Number], 
tblTickets.[Ticket Type ID], Sum(tblTickets.[Ticket Cost]) AS [SumOfTicket Cost], 
tblCustomerTypes.[Customer Type ID], tblCustomerTypes.[Customer Type], tblTicketTypes.[Ticket Type ID], tblTickets.[Ticket Cost], tblTickets.[Ticket Number] 
FROM ((tblCustomerTypes INNER JOIN tblCustomers ON tblCustomerTypes.[Customer Type ID] = tblCustomers.[Customer Type ID]) 
INNER JOIN tblTickets ON tblCustomers.[Customer ID] = tblTickets.[Customer ID]) INNER JOIN tblTicketTypes ON tblTickets.[Ticket Type ID] = tblTicketTypes.[Ticket Type ID] 
GROUP BY tblCustomers.Forename, tblCustomers.Surname, tblCustomers.Telephone, tblCustomers.[Customer ID], tblTickets.[Ticket Type ID], 
tblCustomerTypes.[Customer Type ID], tblCustomerTypes.[Customer Type], tblTicketTypes.[Ticket Type ID], tblTickets.[Ticket Cost], tblTickets.[Ticket Number];

Вот где возникает проблема, когда я пытаюсь добавить новые записи:

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

Данные ниже для каждой соответствующей таблицы:

Это запрос, который объединяет четыре таблицы:

Обычно форма используется для ввода/редактирования данных для одной таблицы. Попробуйте привязать форму к таблице вместо запроса. В любом случае запрос GROUP BY нельзя редактировать, а значит, нельзя создать новую запись.

June7 12.12.2020 03:29

Почему вы хотите изменить агрегированный запрос, который представляет собой сводку данных? Обычно вы хотите отредактировать данные на уровне единиц до того, как они будут суммированы.

Parfait 12.12.2020 05:49
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
353
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Разрешить редактирование формы?

Вы основываете форму НА ОДНОМ СТОЛЕ. И на самом деле в БОЛЬШИНСТВЕ случаев вы не используете запрос для этой формы. Учитывая ваш снимок экрана, вы все равно редактируете значения и столбцы только из одной формы.

Если вам нужно включить, отредактировать, просмотреть, получить данные из дочерней связанной таблицы?

Затем закройте форму, над которой вы только что работали (та, которая основана на ОДНОЙ таблице, а НЕ на запросе0.

Теперь вы создаете новую форму, скажем, для дочерней таблицы. Опять же, эта форма основана на ОДНОЙ таблице (а не на запросе). Эта форма будет отображать информацию о дочерних данных.

После того, как у вас есть эта форма, все выглядит красиво?

Затем вернитесь в «основную» форму, в режим разработки, а затем из боковой панели навигации перетащите + отпустите в «дочернюю» форму. Затем это станет подчиненной формой.

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

Таким образом, у вас может быть такая основная форма:

Вышеуказанное не имеет SQL-запроса - просто форма, основанная на ОДНОЙ таблице.

Но допустим, я хочу отобразить дочернюю таблицу вариантов бронирования «тура».

Хорошо, мы создаем эту форму отдельно и основываем ее на дочерней таблице.

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

Теперь я получаю это:

А скажем, я хотел отобразить людей, забронированных в комнате?

Ну и еще раз ухожу, создаю форму, и ОПЯТЬ на основе одной таблицы.

И теперь я могу вставить эту форму в приведенную выше форму.

Итак, теперь мы должны сказать следующее:

Итак, я на самом деле не писал НИ ОДНОГО sql. Каждая часть формы, которая должна отображать связанную (дочернюю таблицу) информацию, является просто еще одной на 100% отдельной формой, которую я создал.

Затем я просто поместил эти дополнительные формы в одну основную форму на основе самой верхней записи.

Итак, где вы ошиблись?

Вы основываете форму на таблице. И НЕ запрос.

А если по какой-то странной причине вам нужен или используется запрос для формы? СНОВА это должно быть основано на одной таблице.

Так что верхняя форма (дочерняя форма) отображает людей, забронированных в комнате. Остальная часть формы - это бронирование.

А затем в нижней части я закидываю таблицу (и откуда), в которой отображаются варианты бронирования.

Access автоматически извлечет дочерние записи, если вы настроите свои отношения для себя.

Ответ принят как подходящий

Чтобы форма позволяла добавлять (т. е. добавлять новую запись), форма должна быть редактируемым источником записей. Однако ваш источник записи запроса — это агрегированный запрос, в котором вы запускаете агрегированные функции (COUNT, SUM) по группам (см. пункт GROUP BY). Поскольку агрегированные запросы зависят от базовых данных для предоставления результатов, вы не можете обновить эти базовые данные в самих агрегированных выходных данных. Следовательно, формы/отчеты, основанные на агрегированных запросах, недоступны для редактирования.

SELECT tblCustomers.Forename
     , tblCustomers.Surname
     , tblCustomers.Telephone
     , tblCustomers.[Customer ID]
     , tblTickets.[Ticket Type ID]
     , tblCustomerTypes.[Customer Type ID]
     , tblCustomerTypes.[Customer Type]
     , tblTicketTypes.[Ticket Type ID]
     , tblTickets.[Ticket Cost]
     , tblTickets.[Ticket Number] 

     , COUNT(tblTickets.[Ticket Number]) AS [CountOfTicket Number]
     , SUM(tblTickets.[Ticket Cost]) AS [SumOfTicket Cost]

FROM ((tblCustomerTypes
INNER JOIN tblCustomers 
   ON tblCustomerTypes.[Customer Type ID] = tblCustomers.[Customer Type ID]) 
INNER JOIN tblTickets 
   ON tblCustomers.[Customer ID] = tblTickets.[c]) 
INNER JOIN tblTicketTypes 
   ON tblTickets.[Ticket Type ID] = tblTicketTypes.[Ticket Type ID] 

GROUP BY tblCustomers.Forename
       , tblCustomers.Surname
       , tblCustomers.Telephone
       , tblCustomers.[Customer ID]
       , tblTickets.[Ticket Type ID]
       , tblCustomerTypes.[Customer Type ID]
       , tblCustomerTypes.[Customer Type]
       , tblTicketTypes.[Ticket Type ID]
       , tblTickets.[Ticket Cost]
       , tblTickets.[Ticket Number];

MS Access позволяет редактировать некоторые запросы JOIN в зависимости от настроек. Поэтому просто удалите агрегатные функции (COUNT, SUM) и GROUP BY, чтобы вернуться к данным на уровне единиц. Чтобы проверить, не является ли запрос доступным только для чтения, запустите его в дизайне запросов и посмотрите, можете ли вы редактировать какое-либо значение в любом столбце (кроме автонумерации) выводимых результатов. Даже прокрутите вниз и проверьте, можете ли вы добавить запись.

SELECT tblCustomers.Forename
     , tblCustomers.Surname
     , tblCustomers.Telephone
     , tblCustomers.[Customer ID]
     , tblTickets.[Ticket Type ID]
     , tblCustomerTypes.[Customer Type ID]
     , tblCustomerTypes.[Customer Type]
     , tblTicketTypes.[Ticket Type ID]
     , tblTickets.[Ticket Cost]
     , tblTickets.[Ticket Number] 

FROM ((tblCustomerTypes
INNER JOIN tblCustomers 
   ON tblCustomerTypes.[Customer Type ID] = tblCustomers.[Customer Type ID]) 
INNER JOIN tblTickets 
   ON tblCustomers.[Customer ID] = tblTickets.[Customer ID]) 
INNER JOIN tblTicketTypes 
   ON tblTickets.[Ticket Type ID] = tblTicketTypes.[Ticket Type ID] 

Однако обычно в дизайне MS Access вы хотите отделить запись формы так же, как нормализованные таблицы. Используя приведенный выше запрос JOIN, вы ожидаете, что пользователь введет всех клиентов и их типы, а также все соответствующие им билеты и эти типы билетов в одной форме!

Рассмотрим другой, удобоваримый подход:

  1. Попросите пользователя ввести всю информацию о клиенте в одну форму.

    Record source: tblCustomers
    
  2. Используйте поле со списком для [Customer Type]. В MS Acccess поля со списком могут показывать пользователям человеческие значения, но скрывают и сохраняют соответствующий первичный ключ.

  3. Затем в другой форме или подчиненной форме введите все билеты.

    Record source: tblTickets
    
    • Если это другая форма, используйте поле со списком для поля [Customer ID], чтобы выбрать из существующих клиентов.
    • Если подчиненная форма основной формы клиентов, [Customer ID] неявно добавляется с новыми записями в подчиненную форму билетов.
  4. Используйте поле со списком для [Ticket Type].

  5. Затем запустите агрегированный запрос, чтобы просмотреть только результаты, а не редактировать данные!

Другие вопросы по теме