Объединить поля из одного столбца в одной таблице в одно значение с разделителями-запятыми в другой таблице - PullRequest
4 голосов
/ 29 сентября 2011

Любая помощь, которая может быть предоставлена ​​Access и VB noob, будет принята с благодарностью.Я пытаюсь объединить значения из одной таблицы и вставить их в виде значения, разделенного запятыми, в поле другой таблицы.Я пытаюсь взять все имена серверов, например, Linux-боксы, и объединить их в другое поле.

Таблица A выглядит следующим образом

Machine Name | Zone   | Operating System
----------------------------------------
Server01      Zone A    Linux
Server02      Zone B    Linux
Server03      Zone A    Windows
Server04      Zone C    Windows
Server05      Zone B    Solaris

Таблица B содержит поле, которое мне нужновставить в: Acted_Machine_Names.

Теперь я попытался просмотреть сообщения Concatenate / Coalesce, но представлению SQL в Access не нравятся операторы Declare.Мои навыки VB плохо сосут, и я не могу заставить работать код в VB for Applications.К сожалению, я не могу преобразовать эту базу данных в нашу ферму SQL, потому что в данный момент у меня нет доступного сервера для ее размещения.

Кто-нибудь может указать мне правильное направление?

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011

Вы можете использовать Объединить значения из связанных записей Аллена Брауна для этого.Скопируйте код функции с этой веб-страницы и вставьте его в новый стандартный модуль.Сохраните модуль и дайте ему имя, отличное от имени функции;modConcatRelated будет работать.

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

Первое замечание Я изменил имена полей в Таблице A, чтобы заменить пробелы подчеркиванием.С этим изменением этот запрос ...

SELECT
    sub.Operating_System, 
    ConcatRelated("Machine_Name", "TableA", 
        "Operating_System = '" & sub.Operating_System & "'") AS Machines
FROM [SELECT DISTINCT Operating_System FROM TableA]. AS sub;

... создает такой набор результатов:

Operating_System Machines
Linux            Server01, Server02
Solaris          Server05
Windows          Server03, Server04

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

SELECT DISTINCT TableA.[Operating System]
FROM TableA;

Сохраните его как qryDistinctOperatingSystems, затем используйте его в этой версии основного запроса:

SELECT
    sub.[Operating System], 
    ConcatRelated("[Machine Name]", "TableA", 
        "[Operating System] = '" & sub.[Operating System] & "'") AS Machines
FROM qryDistinctOperatingSystems AS sub;
1 голос
/ 29 сентября 2011

Это довольно простая функция VBA, которая перебирает каждую строку в столбце и объединяет ее в результирующую строку с разделителями-запятыми. т. е. для вашего примера он вернет «Server01, Server02, Server03, Server04, Server05». (Не забудьте заменить имена столбцов и таблиц)

Function ConcatColumn(OS As String) As String
    Dim rst As DAO.Recordset
    Set rst = CurrentDb.OpenRecordset("Select * from TableA")

    Dim result As String

    'For every row after the first, add a comma and the field value:
    While rst.EOF = False
        If rst.Fields("Operating System") = OS Then _
            result = result & ", " & rst.Fields("MyValue")
        rst.MoveNext
    Wend

    'Clean it up a little and put out the result
    If Left(result, 2) = ", " Then result = Right(result, Len(result) - 2)
    Debug.Print result
    ConcatColumn = result
End Function

Чтобы использовать это,
1. ConcatColumn("Windows") вернет "Server04, Server03"
2. ConcatColumn("Linux") вернет "Server01, Server02"
3. ConcatColumn("Solaris") вернет "Server05"
4. ConcatColumn("") вернет "".

...