MS Access Вставить многострочные значения текстового поля в таблицу

У меня есть столбец с длинным текстом в моей таблице и многострочное текстовое поле в моей форме. Мое текстовое поле настроено на открытие FileDialog и вставку полных путей, каждый в новой строке, к выбранным файлам. Вставка не работает, когда она многострочная, она пустая. Я тестировал с одной строкой, и она работает. Вот мой код VB:

Моя вставка:

Private Sub btn_test1_Click()
  mSaved = True
  Dim strSQL        As String
  Dim db            As DAO.Database
  Dim rs            As DAO.Recordset
  Dim ctl           As Control
  Dim varItem       As Variant
  Dim i             As Integer

  On Error GoTo ErrorHandler

  Set db = CurrentDb()
  Set rs = db.OpenRecordset("TrainingLog", dbOpenDynaset, dbAppendOnly)

  'make sure a selection has been made
  If Me.ListBox_Emp.ItemsSelected.Count = 0 Then
    MsgBox "Must select at least 1 employee"
    mSaved = False
    Exit Sub
  ElseIf Me.ddl_Topic.Value = 0 Then
    MsgBox "Must select a topic"
    mSaved = False
    Exit Sub
  ElseIf Me.ddl_Type.Value = 0 Then
    MsgBox "Must select a category"
    mSaved = False
    Exit Sub
  ElseIf Me.ddl_Source.Value = 0 Then
    MsgBox "Must select a source"
    mSaved = False
    Exit Sub
  ElseIf Me.ddl_mediaType.Value = 0 Then
    MsgBox "Must select a media type"
    mSaved = False
    Exit Sub
  ElseIf Me.ddl_Cert.Value = 0 Then
    MsgBox "Must select either certificate, sign-in sheet, or both"
    mSaved = False
    Exit Sub
  End If

'add selected value(s) to table
  Set ctl = Me.ListBox_Emp
  For Each varItem In ctl.ItemsSelected
    rs.AddNew
    rs!Employee = ctl.ItemData(varItem)
    rs!Topic = Me.ddl_Topic.Value
    rs!TopicOther = Me.txt_TopicOther.Value
    rs!TitleOfTraining = Me.txt_Title.Value
    rs!Category = Me.ddl_Type.Value
    rs!CategoryOther = Me.txt_typeOther.Value
    rs!MediaType = Me.ddl_mediaType.Value
    rs!Source = Me.ddl_Source.Value
    rs!SourceOther = Me.txt_sourceOther.Value
    rs!DateCompleted = Me.DateCompleted.Value
    rs!CertSignSheet = Me.ddl_Cert.Value
    rs!MakeUp = Me.ChkBox_MakeUp.Value
    rs!DateOriginal = Me.dt_DateOriginal.Value
    rs!Mandatory = Me.ChkBox_Mandatory.Value
    rs!DateDue = Me.dt_DueDate.Value
    rs!DocumentLinks = Me.txt_DocumentLinks.Value
    rs!Notes = Me.txt_Notes.Value
    rs.Update
  Next varItem

  MsgBox ("Changes Saved!")
  mSaved = False
  If MsgBox("Do You Want to Log Another Training?", vbYesNo + vbQuestion) = vbYes Then
    For i = 0 To ListBox_Emp.ListCount
        If ListBox_Emp.Selected(i) = True Then
            ListBox_Emp.Selected(i) = False
        End If
    Next i
    ddl_Topic.Value = ""
    txt_TopicOther.Value = ""
    txt_Title.Value = ""
    ddl_Type.Value = ""
    txt_typeOther.Value = ""
    ddl_mediaType.Value = ""
    ddl_Source.Value = ""
    txt_sourceOther.Value = ""
    DateCompleted.Value = ""
    ddl_Cert.Value = ""
    ChkBox_MakeUp.Value = ""
    dt_DateOriginal.Value = ""
    ChkBox_Mandatory.Value = ""
    dt_DueDate.Value = ""
    txt_DocumentLinks.Value = ""
    txt_Notes.Value = ""
    Exit Sub
Else
    DoCmd.Close acForm, "AddTrainingLog_noSub"
End If
ExitHandler:
  Set rs = Nothing
  Set db = Nothing
Exit Sub

ErrorHandler:
Select Case Err
  Case Else
    MsgBox Err.Description
    DoCmd.Hourglass False
    Resume ExitHandler
  End Select
End Sub

Мой FileDialog:

Private Sub txt_DocumentLinks_Click()
    Dim dlgOpen         As FileDialog
    Dim varFileName     As String
    Dim sFolder         As String
    Dim vrtSelectedItem As Variant
    Dim myArray()       As Variant
    Dim myString        As String
    Dim x               As Long

        txt_DocumentLinks.Text = ""

        Set dlgOpen = Application.FileDialog(msoFileDialogOpen)
        With dlgOpen
            .AllowMultiSelect = True
            ''Start in
            .InitialFileName = "Y:\Data Dept"
            .Show
            For Each vrtSelectedItem In .SelectedItems
                'Using a msgbox to test getting the path names, this is working great!
                'MsgBox (vrtSelectedItem)
                txt_DocumentLinks.Text = txt_DocumentLinks.Text '& vbCrLf & vrtSelectedItem

                'sText = Replace(sText, vbLf & vbCr, "")
            Next vrtSelectedItem
        End With 
End Sub

person Chris    schedule 04.05.2020    source источник
comment
Зачем вам несколько значений в одном поле?   -  person June7    schedule 04.05.2020
comment
Теперь, когда я думаю об этом, я мог бы создать еще одну таблицу для хранения этих значений. Это ссылки на документы в сетевой папке, относящиеся к строке в таблице.   -  person Chris    schedule 04.05.2020


Ответы (1)


Объединение с vbCrLf и vrtSelectedItem

txt_DocumentLinks.Text = txt_DocumentLinks.Text & vbCrLf & vrtSelectedItem

Однако рекомендуется сохранять каждую ссылку на запись в связанной таблице. В этом случае вместо объединения одной строки в цикле выполняйте SQL-операцию INSERT на каждой итерации. Или откройте набор записей DAO этой таблицы вне цикла и выполните действия AddNew и Update внутри цикла, как вы делаете для родительской записи. Настоящим трюком будет сначала зафиксировать родительскую запись и получить новый уникальный идентификатор, сгенерированный для использования в качестве внешнего ключа в зависимой таблице.

person June7    schedule 04.05.2020
comment
Да, я изменил его, чтобы сделать это таким образом, спасибо! Сейчас пытаюсь понять, как сделать многошаговую форму. IE. После добавления исходной записи и создания идентификатора записи я переношу этот идентификатор в следующую форму, где пользователь может добавить ссылки на документы, связанные с этой записью. Я думаю, что мне нужно использовать общедоступную или глобальную переменную. - person Chris; 11.05.2020
comment
Или используйте аргумент OpenArgs команды OpenForm, если «следующая форма» еще не открыта, и вы открываете ее после ввода основной записи. - person June7; 11.05.2020