2014-12-01 3 views
0

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

В моей базе данных есть система примечаний, чтобы пользователи могли делать заметки о различных вещах - например, в записи клиента может быть заметка, в которой говорится: «Этот клиент всегда заказывает собственное стекло из оконной рамы». Все это обрабатывается с помощью одной таблицы «Примечания», которая имеет PrimaryNoteTableID, которая ссылается на статическую таблицу поиска, которая идентифицирует основную таблицу, к которой относится примечание, и поле PrimaryTablePK, которое хранит PK записи в этой таблице, которая применяется к ,

Во избежание коррупции рекомендуется хранить поля memo в собственной таблице с соотношением 1: 1 к их родительской таблице (see here), что я и сделал.

При добавлении новых сообщений и задач, пользователь, как правило, хотят, чтобы добавить следующее:

  • Информация о человеке, сообщение является с.
  • Предмет сообщения.
  • Тип требуемого действия и крайний срок для этого действия.
  • записку с подробностями того, что было обсуждено и т.д.

Имея это в виду, у меня есть:

tblCommTaskLog с полями CommDate, ActionRequiredTypeID(FK), ActionDeadlineDays, CommAccountID(FK) и т.д.

tblNote с : NoteID(PK), PrimaryNoteTableID(FK), PrimaryTablePK(FK), EnteredByUserID(FK), EntryDate.

tblNoteText с NoteTextID(PK), NoteID(FK), NoteText(Memo)

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

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

  • Вы заперты в отображая вещи определенным образом, если вы хотите использовать подчиненный или подчиненный из подчиненных.
  • Доступ сохраняет записи до того, как вы нажали, чтобы сохранить. Он также сохраняет записи в подформатах, которые не могут обрабатываться простым «me.undo» в коде формы и приводят к тому, что вам нужно найти запись в подформе и удалить ее с помощью кода.
  • Подформы действуют глупыми способами, поскольку они назначают автономерам PK и выбирают их в ссылках между дочерними и основными формами.

Я хотел бы просто иметь поля из tblCommTaskLog и NoteText поля на одной форме, так что пользователь заполняет в деталях от tblCommTaskLog (ActionRequired и т.д.) И текстовая заметка, попадает на кнопку «Сохранить», а затем с помощью кода детали сохранены правильно, так что:

  • Новая запись создается в tblCommTaskLog с, например, a PK 72 (Autonumber).
  • Новая запись создается в tblNote с PrimaryNoteTableID из 4 что соответствует tblCommTaskLog, в PrimaryTablePK из 72 и PK NoteID например, 422 (Автономный номер).
  • Новая запись создается в tblNoteText с NoteID из 422.

Я думаю, что мне нужно, это главная форма с полями из tblCommTask с несвязанной текстовое поле, чтобы взять вход для NoteText. Я просто не могу понять, как создать новую запись в tblNote, получить AutonumberPK из этого поля и вставить ее в FK tblNoteText, чтобы все было правильно связано с правильными FK. Могу ли я сделать это с помощью SQL INSERT, а затем SELECT TOP в поле Autonumber? Будет ли я лучше делать это с помощью Recordsets и Lastmodified? Есть ли другой метод, о котором я не думаю?

+0

Сколько у вас первичных таблиц? почему бы вам не использовать таблицы заметок для каждого из ваших [клиентов, пользователей, xxx, asdb] таким образом, чтобы вы могли применять простые отношения 1: m? –

+0

В настоящее время существует 11 таблиц, в которых будут храниться примечания. Я решил, что это лучший способ сделать что-то [здесь] (http://stackoverflow.com/questions/25992670/notes-system-in-database). – WhatEvil

+0

Я не храню заметки (тип memo) в своей таблице и не страдал от коррумпированных баз данных за многие годы. Существуют и другие вещи, которые гораздо важнее, такие как разделение FE/BE. – Fionnuala

ответ

-1

@whatEvil:

вы все еще можете сделать это, как 1: M. если вам разрешено изменять основные таблицы, изменить их и добавить

  1. новый столбец pk_guid: String (38). (также может быть 36, если вы не используете {})
  2. Добавьте триггер до вставки, чтобы автоматически добавлять GUID для каждой новой записи.
  3. что-то вроде: для каждой строки перед вставкой набор pk_guid = get_uuid()

в вашем tbl_note просто

  1. Note_id: рк
  2. origin_guid: строка (38) Fk
  3. Примечания:
  4. добавленный
  5. .....

Теперь вы можете просто обеспечить соблюдение отношений 1: M. GUID - это глобальный уникальный идентификатор. Все ваши первичные таблицы создадут уникальный ключ, в котором вы можете просто присоединиться к ним на любом этапе, не думая о том, к какой таблице он принадлежит, или о том, как сохранить имя родительской таблицы.

, конечно, нужна пользовательская функция, чтобы получить GUIDs: использовать этот код, чтобы создать один

Public Function GET_UUID() As String 
    With CreateObject("Scriptlet.TypeLib") 
     GET_UUID = VBA.Left(.GUID, 38) 
    End With 
End Function 

Edit: Идея заключается в том, чтобы иметь глобальный уникальный идентификатор в каждом из вашей основной таблицы (GUID/UUID). Которая затем будет использоваться для подключения к вашей основной и настольной таблицам. Примечание. Чтобы создать GUID, вам нужно добавить триггер (перед вставкой) в каждую вашу основную таблицу.Также обратите внимание, что MS доступа называют его DataMacro (проверьте, если ваша версия поддержка datamacro) более о datamacro: https://support.office.com/en-ca/article/Create-a-data-macro-b1b94bca-4f17-47ad-a66d-f296ef834200?ui=en-US&rs=en-CA&ad=CA

почему именно так? В настоящее время ваши основные таблицы производят Auto-number, возможно, что одна или несколько таблиц будут иметь одинаковый идентификационный номер. В конце концов, autonumber уникален только по всей таблице не по всей базе данных. Чтобы избежать дублирования, вы добавляете еще один ключ (ключ идентификации таблицы), чтобы определить, к какой первичной таблице принадлежит внешний ключ. это звучит хорошо, пока вы не сделаете одно неправильное обновление вашей основной таблицы с неправильным значением для идентификатора примечания.

с помощью GUID вы сможете просто поддерживать отношения 1: m независимо от того, сколько первичных таблиц участвует. Также мне лично нравится идея с GUID в случае, если ваше приложение растет и нуждается в реальных уникальных идентификаторах в вашей базе данных. его полностью до вас, каким образом вы хотите пойти, я просто объяснил один метод.

+0

Разве это просто лишний раз усложняет всю мою базу данных? Если я это сделаю, мне нужно будет возиться с событиями BeforeUpdate в каждой из моих форм, нет? – WhatEvil

Смежные вопросы