#vba #ms-access #attachment #ms-access-forms #ms-forms
Вопрос:
У меня есть ограниченная форма со свойством «Ввод данных = Да», которая содержит несколько текстовых полей и одно поле типа Вложения.
У меня есть кнопка «Сохранить», которая запрашивает подтверждение сохранения записи.
В форме я поставил флажок с надписью «Включает обучение».
Если этот флажок установлен, я хочу добавить в ту же таблицу дополнительную запись (отличную от той, которая добавлена через ограниченную форму) с точно такой же информацией, что и запись, вставленная в ограниченную форму, за исключением одного текстового поля, которое будет отличаться и определено в коде VBA.
Я попытался CurrentDB.Execute SQL
выполнить запрос, но он не работает с типом поля вложения.
Решение, предложенное в документации, не относится к этому случаю, так как я хочу взять вложение, содержащееся в ограниченном поле вложения в форме, а не из пути на диске.
Я думаю, что может сработать что-то вроде следующего, но когда я тестирую его, он сохраняет запись из ограниченной формы, но не дополнительную, которую я хочу добавить с помощью кода VBA, И она заканчивается ошибкой:
Требуется 424 Объекта
Код VBA:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctl As Control
On Error GoTo Err_BeforeUpdate
If Me.Dirty Then
If MsgBox("Do you want to save the new record?", vbYesNo vbQuestion, _
"Save Record") = vbNo Then
Me.Undo
MsgBox "Changes discarded."
Else
If Me.checkbox.Value = True Then
Set rsTable = db.OpenRecordset("Table")
With rsTable
.AddNew
!TextField1 = Me.TextField1.Value
!TextField2 = "My Own Text Field"
!AttachmentField = Me.AttachmentField.Value
.Update
.Bookmark = .LastModified
End With
MsgBox "Record was correctly saved."
End If
End If
End If
End Sub
Большое спасибо за любую помощь.
Редактировать:
Таким образом, очевидно, что это неправильный способ сохранения новой записи, но мне нужно, чтобы эта запись была сохранена ОДНОВРЕМЕННО (или сразу после) с записью в ограниченной форме. Я НЕ хочу, чтобы пользователь заполнял другую ограниченную форму.
Причина этого в том, что я ввожу записи о сертификации языка, и существуют сертификаты, которые являются более широкими и включают в себя два уровня. Следовательно, флажок сигнализирует «вы также хотите включить предыдущий уровень?», если он установлен, то загруженный сертификат PDF будет действителен как для уровня 1, так и для уровня 2. Вся информация будет одинаковой, за исключением названия уровня записи.
Мне нужно, чтобы эти две записи были отдельными, потому что я также могу иметь их отдельно, а позже я проверяю условия, основанные на этих отдельных языковых уровнях.
Комментарии:
1. ПРИМЕЧАНИЕ: Вы никогда не должны дублировать запись. Если у вас есть таблица вложений, внешний идентификатор которой является таблицей этой формы, вы можете добавить столько вложений на запись, сколько захотите. Никакого дублирования. Пожалуйста, изучите Нормализацию базы данных
2. Нецелесообразно создавать новую таблицу для всех вложений, так как количество случаев, когда они дублируются, составляет незначительную часть всех записей.
3. Если это произойдет один раз, это проблема. Тем не менее, это не причина для моей рекомендации. Я рекомендую Нормализацию базы данных. Это имеет много преимуществ. Это также длинная тема со множеством противоречивых мнений, поэтому лучше много читать по этой теме.
Ответ №1:
Чтобы использовать поле вложения, вы должны использовать специальные методы LoadFromFile
, чтобы поместить вложение в базу данных и SaveFromFile
вернуть вложение из базы данных. Похоже, вы пытались присвоить строку полю вложения.
Я не вижу, где db
это определено. Ты это имел в виду CurrentDb
?
Другая проблема, которую я вижу, заключается в том, что вы используете нотацию взрыва в With
блоке. Нотация Bang — это поиск строк. Если вы хотите назвать предмет по имени, вы бы сделали это так:
With CurrentDb.OpenRecordset("Table")
.AddNew
.Fields.Item("TextField1").Value = Me.TextField1.Value
.Fields.Item("TextField2").Value = "My Own Text Field"
.Fields.Item("AttachmentField").LoadFromFile Me.AttachmentField.FileName
.Update
.Bookmark = .LastModified
.Close
End With
Названия этих предметов должны быть правильными.
Комментарии:
1.
With rs
…!Fieldname = foo
работает совершенно нормально.2. @Andre просто потому, что ты можешь, не значит, что ты должен. На эту тему ведется много жарких дебатов. Я нахожусь в лагере «никогда не используй взрыв». Исключительно потому, что я предпочел бы обнаружить проблему во время компиляции, а не во время выполнения. Взрыв приводит к большему количеству ошибок во время выполнения, потому что он может скрыть от вас проблемы.
3. Где бы это ни было полезно, я с тобой. Но
!Feildname
ни.Fields.Item("Feildname").Value
один из них не поймает имя поля с ошибкой во время компиляции.4. Большое спасибо за помощь! Решение @HackSlash работает гладко до тех пор, пока не появится строка . Поля. Элемент(«Поле вложения»). Загрузите из файла Меня.Поле вложения. Значение, при котором появляется ошибка компиляции, которой давно опасались: «Метод или элемент данных не найден» в свойстве .Value поля Вложения. Я вчетверо проверил написание имени поля
5. Ок,
LoadFromFile
ожидает строку, которая является путем к реальному файлу. Так что же возвращается? Me.AttachmentField.Value
? Это веревочка? Возможно, вам придется использоватьMe.AttachmentField.FileName
вместо этого.
Ответ №2:
В конце концов я решил эту проблему, создав отдельную ограниченную форму, которая появляется, когда я нажимаю «Сохранить» в исходной ограниченной форме, если флажок установлен. Там у пользователя есть выбор, загружать ли тот же документ, что и исходная ограниченная форма, или другой.