Отдельные поля доступа, которые содержат несколько значений для уникальных строк с правильно соответствующими данными - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть поле в Access, где есть несколько значений, разделенных запятыми (Поле 1 имеет значения "1, 2, 3, 4" в строке 1, "2, 2, 3" в строке два).

Первое поле имеет 1-7 (но могут быть такими же большими, как 1,101) значений в нем.

Второе поле будет иметь такое же количество значений, что соответствует строке Field1,

Однако запятые могут быть расположены странным образом (Iпредположим, что это можно решить с помощью функции обрезки или смещения влево при анализе этого поля ", 1, 2, 3).

Мне нужно, чтобы на тысячах этих строк больше не было повторяющихся записей и чтобы они могликаждая из них имеет свою собственную линию. Важно решение, которое можно масштабировать, и разрешено использование всего пакета Microsoft Office.

Из строки:

 Field1           Field2

 1, 2, 3, 4      , 1, 1, 4, 4
 2, 2, 3         , 2, 3, 3

Выходные данныебудет выглядеть так:

 Field1  Field2
 1       1       
 2       1
 3       4
 4       4
 2       2
 2       3
 3       3

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Это общий обзор того, как это сделать.Вы должны будете выполнить детальную работу самостоятельно, так как этот сайт посвящен тому, как избавить вас от проблемы с написанием кода для вас.

  • Просмотрите ваши записи.Для каждого:

    • Используйте Replace для замены "," на ","
    • Используйте что-то вроде IIF(Left([Field2],1=",",Right([Field2],Len([Field2])-1),[Filed2]) для очистки начальных запятых.Аналогично для запятых при необходимости

    • Используйте Split, чтобы разбить оба поля на массивы строк.

    • Используйте UBound для определениясколько чисел в каждой записи (оно должно быть одинаковым в обоих полях, поэтому не имеет значения, какое из них вы проверяете).

    • Используйте цикл For для прохода по массивам

      • Используйте что-то вроде DoCmd.RunSQL "INSERT INTO MyCleanedUpTable (Field1, Field2) VALUES (" & Field1Array(i) & "," & Field2Array(i) & ")", чтобы добавить каждую пару в ваш новый стол очистки.
0 голосов
/ 15 февраля 2019

Вот что вы хотите:

Sub GetNumbers()
    Dim rs As DAO.Recordset
    Set rs = CurrentDb.OpenRecordset("Select Field1, Field2 From Table1")
    Do While Not rs.EOF
        'Get the fields values and 'trim away' any blanks.
        Dim field1 As String
        field1 = Trim(rs("Field1").Value)
        Dim field2 As String
        field2 = Trim(rs("Field2").Value)

        'If the strings now begin with a ',', remove it.
        If Left(field1, 1) = "," Then field1 = Mid(field1, 2)
        If Left(field2, 1) = "," Then field2 = Mid(field2, 2)

        'Split the strings to an array by ','
        Dim arrField1() As String
        arrField1 = Split(field1, ",")
        Dim arrField2() As String
        arrField2 = Split(field2, ",")

        'Loop the arrays (important is that the number of elements is equal in both arrays. This depends on your data!)
        Dim index As Long
        For index = LBound(arrField1) To UBound(arrField1)
            'Output the values and again 'trim away' any blanks
            Debug.Print Trim(arrField1(index)), Trim(arrField2(index))
            'Here you also can store the values to another table if you want/need.
            'If the new field is a text field:
            'DoCmd.RunSQL "Insert Into Table2 (Field1, Field2) Values ('" & Trim(arrField1(index)) & "', '" & Trim(arrField2(index)) & "')"
            'If the new field is a number field:
            'DoCmd.RunSQL "Insert Into Table2 (Field1, Field2) Values (" & Trim(arrField1(index)) & ", " & Trim(arrField2(index)) & ")"
        Next index
        rs.MoveNext
    Loop
End Sub
...