Вставить запись в таблицу в мс доступа - PullRequest
1 голос
/ 09 ноября 2010

Мне нужно создать небольшое «приложение», используя ms access 2007. Все, что мне нужно, - это создать форму, которая позаботится о вводе / выводе, связанном с несколькими таблицами в дБ.Я создал таблицы: пациенты, методы лечения и лабораторные результаты.

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

Я также создал форму, которую я упомянул в начале этого вопроса.Он имеет несколько вкладок.1-ая вкладка открывает / создает пациента, а вторая используется для ввода данных, которые необходимо ввести в таблицу лабораторных результатов.То же самое относится и к таблице процедур.

Моя проблема: I added a button to the 2nd tab, and I want to attach an 'action' that will set an INSERT query with values taken from fields (controls) in tab 2, together with ID field taken from tab1 (that corresponds with patient ID from patients table), and then execute a query.

Прямо сейчас я пытаюсь достичь этого самостоятельно, но без особого успеха.Кроме того, поиск на сайте MS решений (решений) довольно сложен, так как он всегда показывает результаты, в которых есть «запрос»:) ... И запрос не тот, который я хочу использовать.(Однако, я приму любое решение).

Thx

Таблицы:

пациентов

ID - primary key, autogenerated
patientID - internal number of the patient record. I could've used this, but it would complicate my life later on :)
gender
age
dateOfDiagnose

- полеимена на самом деле на сербском, но имена полей не так важны

labtests

ID - primary key
patientID - foreign key, from patients table
... bunch of numerical data :)

Есть еще 2 таблицы, но они в основном отражают некоторую дополнительную информациюи не так важны.

Моя форма должна позволять пользователю вводить данные о пациенте, а затем вводить несколько строк в таблицу лабораторных испытаний по мере продвижения лечения.Существует 2 типа лечения, и с этим связана таблица, но в них есть только несколько полей, содержащих информацию о начале лечения, а остальное - информация о лабораторных тестах.

1 Ответ

5 голосов
/ 09 ноября 2010

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

Некоторые дополнительные примечания, основанные на последующем комментарии

Из ваших комментариев кажется, что у вас естьминимум три соответствующие таблицы:

Пациенты

PatientID PK, Counter

Процедуры

TreatmentID PK, Counter
PatientID FK
TreatmentTypeID FK

LabResults

LabResultID PK, Counter
TreatmentID FK 
PatientID FK <-- Optional, can be got through TreatmentID
LabResultTypeID FK

Кроме того, вам понадобится таблица TreatmentTypes, в которой перечислены два текущих лечения и предусмотрены следующие типы лечения:

TreatmentTypes

TreatmentTypeID PK, Counter 
TreatmentDescription 

Вам также понадобятся:

LabResultTypes

LabResultTypeID PK, Counter <-- This can be referenced in the LabResults table
TreatmentTypeID FK

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

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

Ваша форма будет содержать записи для каждого пациента и две подчиненные формы, «Обработки» и «LabResults».Подчиненная форма «Обработки» связана с таблицей «Обработки», имеющей поля PatientID для LinkChild и Master, а также поле со списком для TreatmentTypeID:

Rowsource: SELECT TreatmentTypeID, TreatmentDescription FROM TreatmentTypes
ColumnCount: 2
BoundColumn: 1

После добавления типа обработки в подформу «Обработки» можно выполнить запрос или выполнитьSQL под VBA.Вы можете использовать событие «После вставки» для формы, содержащейся в подчиненной форме обработок, или кнопку, событие «После вставки» имеет преимущества, но оно запускается только тогда, когда пользователь сохраняет запись или удаляется из записи, что является тем же самым.Работая из подчиненной формы обработки и события After Insert, SQL будет выглядеть следующим образом:

''Reference Microsoft DAO x.x Object Library
Set db = CurrentDB
sSQL = "INSERT INTO LabResults (TreatmentID, PatientID, LabResultTypeID) " _
     & "SELECT " _
     & Me.TreatmentID & ", " _
     & Me.PatientID & ", " _
     & "LabResultTypeID FROM LabResultTypes " _
     & "WHERE TreatmentTypeID " = & Me.TreatmentTypeID
db.Execute sSQL

MsgBox "Records inserted: " & db.RecordsAffected

Me.Parent.LabResults_Subform.Form.Requery

Запрос также должен содержать дату и имя пользователя, как предложено выше, если ваша версия меньше2010, и вы не настроили триггеры.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...