Доступ к Query / VBA для группировки из двух полей и значений конкатенации - PullRequest
0 голосов
/ 11 июня 2019

У меня сложная проблема, которую я пытаюсь решить, и я могу использовать ваш опыт в этом вопросе.

Я пытаюсь реплицировать некоторые отчеты в Access 2013, используя запросы, которые я в противном случае получаю из интерфейсного приложения в базу данных FootPrints Service Core 11.6. Я выполнил запросы и вычисления, чтобы реплицировать большинство полей из интерфейсных отчетов, за исключением информации о правопреемнике.

( Примечание: Получатель - это отдельная команда или [, как правило, ] команды, которым назначен билет для работы, может быть несколько [ команд и отдельных лиц ] )

Эти сотрудники перечислены отдельно в таблице сотрудников базы данных FootPrints (см. Прикрепленные изображения). Когда внешнее приложение генерирует отчеты, оно каким-то образом группирует информацию об отдельных лицах и сотрудниках группы таким образом, которым я не могу имитировать (см. Рисунок). Здесь мне нужна твоя помощь!

Мне нужно объединить всех сотрудников ( отдельных и командных сотрудников ) в одно поле, сгруппированное по номеру билета ( mrID ), с которым они связаны.

Итак, где в базе данных есть следующее

MrID | Цессионарий | Команда

12345 | Боб Смит | Служба поддержки Tier 1

12345 | Джейн Смит | Служба поддержки Tier 1

12345 | (Ноль) | Телеком

23456 | (Null) | Служба поддержки Tier 2

34567 | Чак Норрис | (Ноль)

45678 | (пусто) | Служба поддержки Tier 1

45678 | (Null) | Служба поддержки Tier 2

45678 | (Null) | Сеть

45678 | (Ноль) | Контроль доступа

Это должно выглядеть как 1 поле, например:

MrID | Правопреемники

12345 | Служба поддержки Уровень 1: Боб Смит, Джейн Смит. Телеком:

23456 | Служба поддержки Tier 2:

34567 | Чак Норрис

45678 | Служба поддержки Уровень 1:. Уровень службы поддержки 2:. Сеть: Контроль доступа:

Как вы можете видеть в приведенном выше примере, за каждым уполномоченным команды следует: 1105 *

Следуя этому соглашению Есть ли способ имитировать этот процесс с помощью запроса ( или VBA, если необходимо ) в Access?

С уважением,

Kris

A standard report, showing how the assignee field is grouped and concatenated

The Assignees Table of the Database, the way the assignee info is natively stored.  Note: Names blacked out for privacy reasons

The Assignees Table of the Database, the way the assignee info is natively stored.  Note: Names blacked out for privacy reasons

1 Ответ

1 голос
/ 11 июня 2019

Вы не предоставили достаточно данных для проведения дополнительных тестов.Да, вы включили скриншоты, но данные для копирования и вставки всего 3 записи, поэтому я работал с этим

Я ответил на вашу таблицу так (имя моей таблицы Table1): enter image description here

Затем у меня есть такой запрос:

enter image description here

Код SQL для этого запроса:

SELECT DISTINCT Table1.MrID, FINAL_ASSIGNEES([mrid]) AS ASSIGNEES FROM Table1;

Как видите, этот код SQL вызывает UDF, кодированный в VBA с именем FINAL_ASSIGNEES.Код этого UDF:

Public Function FINAL_ASSIGNEES(ByVal vThisMrID As Long) As String
Dim RST As Recordset
Dim SqlStr As String

SqlStr = "SELECT DISTINCT Table1.MrID, CONCATENATE_ASSIGNEE([MrID],[Team]) AS ASSIGNEES FROM Table1 " & _
    "WHERE Table1.MrID=" & vThisMrID & ";"

Set RST = Application.CurrentDb.OpenRecordset(SqlStr, 2, 4)

With RST
    If .EOF <> True And .BOF <> True Then
        .MoveLast
        .MoveFirst
        Do Until .EOF = True
            FINAL_ASSIGNEES = FINAL_ASSIGNEES & .Fields(1).Value & ". "
            .MoveNext
        Loop
            FINAL_ASSIGNEES = Left(FINAL_ASSIGNEES, Len(FINAL_ASSIGNEES) - 2) 'minus 2 to get rid of extra ". "
    End If

    Set RST = Nothing
End With


End Function

И да, этот код VBA вызывает второй UDF с именем CONCATENATE_ASSIGNEE.Код этого второго UDF:

Public Function CONCATENATE_ASSIGNEE(ByVal vMrID As Long, ByVal vTeam As String) As String
Dim MyRST As Recordset
Dim MySQL As String

MySQL = "SELECT Table1.Assignee FROM Table1 " & _
    "WHERE (((Table1.MrID)=" & vMrID & ") AND ((Table1.Team)='" & vTeam & "'));"

Set MyRST = Application.CurrentDb.OpenRecordset(MySQL, 2, 4)
DoEvents

With MyRST
    If .EOF <> True And .BOF <> True Then
        .MoveLast
        .MoveFirst

        Do Until .EOF = True

            If IsNull(.Fields(0)) = True Then
                CONCATENATE_ASSIGNEE = CONCATENATE_ASSIGNEE & "Unassigned" & ", "
            Else
                CONCATENATE_ASSIGNEE = CONCATENATE_ASSIGNEE & .Fields(0).Value & ", "
            End If

            .MoveNext
            DoEvents
        Loop

        CONCATENATE_ASSIGNEE = vTeam & ": " & Left(CONCATENATE_ASSIGNEE, Len(CONCATENATE_ASSIGNEE) - 2) 'minus 2 to get rid of the extra ", "
    End If
    Set MyRST = Nothing
End With



End Function

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

...