MS Access извлекает элементы из многозначного поля на основе условия - PullRequest
1 голос
/ 06 мая 2019

Я получаю отчет, в котором есть многозначное поле, в котором находятся роли пользователей и соответствующая информация о них.Всего имеется 6 ролей, и в каждой строке данных может быть несколько человек, работающих под одной и той же ролью.Я использую MS Access 2013 для манипулирования данными.

ID  Data    Users
1   Data1   Supervisor (MICROSOFT OUTLOOK; microsoftoutlook@example.com 9999999999) Admin Assistant (WATER BOTTLE; waterbottle@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999)
2   Data2   Supervisor (COMPUTER MONITOR; computermonitor@example.com; 9999999999) Admin Assistant (MICROSOFT EXCEL; microsoftexcel@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999); Analyst (ORANGE PURPLE; orangepurple@example.com; 999999991)
3   Data3   Supervisor (GREEN BLUE; greenblue@example.com; 9999999999) Admin (MICROSOFT ACCESS; microsoftaccess@example.com, 9999999999) Analyst (ORANGE PURPLE; orangepurple@example.com; 999999999); Analyst (YELLOW BLACK; yellowblack@example.com; 999999991)

Выше приведен усеченный и замещенный набор данных.В ID = 2 и 3 есть 2 аналитика.Может быть случай, когда есть 2 «Помощника администратора».Форматирование для Users в точности соответствует указанному.Отдельные пользователи также могут быть перечислены в нескольких строках и иногда под разными ролями.

Мне не обязательно разбивать данные на части, но мне нужно выбрать определенные роли на основе столбца Data.Если Data = [Определенное условие], тогда введите определенную роль пользователя.Например, если Data = "Завершено", мне нужно вытащить всех "супервизоров" для этой строки.Если Data = "Выполняется", мне нужно вывести всех "Аналитиков" для этого ряда.Существуют и другие условия для определения роли и пользователей.Мне нужно получить как пользовательскую роль, так и пользователей, связанных с этой ролью, для этой строки.Я хотел бы создать 2 новых столбца для «Роль владения» и «Текущее владение».«Роль владения» - это роль пользователя, а «Текущее владение» должно содержать всех пользователей, связанных с этой ролью для этой строки.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или вам нужны разъяснения.Я ценю, что вы нашли время, чтобы прочитать это.

ОБНОВЛЕНИЕ

Мои желаемые результаты приведены ниже.

ID  Data    Ownership Role  Current Ownership   Users
1   Completed   Supervisor  MICROSOFT OUTLOOK   Supervisor (MICROSOFT OUTLOOK; microsoftoutlook@example.com 9999999999) Admin Assistant (WATER BOTTLE; waterbottle@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999)
2   In Progress Analyst GREEN BLUE, ORANGE PURPLE   Supervisor (COMPUTER MONITOR; computermonitor@example.com; 9999999999) Admin Assistant (MICROSOFT EXCEL; microsoftexcel@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999); Analyst (ORANGE PURPLE; orangepurple@example.com; 999999991)
3   Initiated   Admin   MICROSOFT ACCESS    Supervisor (GREEN BLUE; greenblue@example.com; 9999999999) Admin (MICROSOFT ACCESS; microsoftaccess@example.com, 9999999999) Analyst (ORANGE PURPLE; orangepurple@example.com; 999999999); Analyst (YELLOW BLACK; yellowblack@example.com; 999999991)

ОБНОВЛЕНИЕ 2019-05-10 Из-за моей неспособности правильнообъясните вопрос и настройте примерный набор данных, я публикую дела на основе ответа 7 июня и примерной строки данных.

Case "Initiated"
    strRole = "Main Admin Assistant"
Case "Drafted"
    strRole = "Financial Analyst"
Case "Rated"
    strRole = "Contractor Rep"
Case "Reviewed"
    strRole = "Assessing Official"
Case "Finalized"
    strRole = "Reviewing Official"

Пример данных - все это в одной ячейке в Excel и каждом элементенаходится на другой линии в этой клетке.Сразу после закрывающей круглой скобки НЕТ места из того, что я могу сказать, поэтому следующая роль пользователя начинается НЕМЕДЛЕННО.

Supervisor (ERGO KB; ergokb@example.com; (999) 999-9999)Team Lead (WIDE SCREEN; widescreen@example.com; 9999999999)Team Rep (CELL PHONE; cellphone@example.com; 999-999-9999)Team Rep (CLICK PEN; clickpen@example.com; (999) 999-9999)Main Admin Assistant (WIRED MOUSE; wiredmouse@example.com; 999-999-9999)Main Admin Assistant (PHONE CHARGER; phonecharger@example.com; 9999999999)Financial Analyst (WATER BOTTLE; waterbottle@example.com; (999) 999-9999)Financial Analyst (CLEAR TAPE; cleartape@example.com; 999-999-9999)Human Resources (POST IT NOTE; postitnote@example.com; 999-999-9999)

Для каждого статуса ниже я хочу ассоциированную роль пользователя.

Status      User Role
Initiated   Main Admin Assistant
Drafted     Financial Analyst
Rated       Team Rep
Reviewed    Financial Analyst
Finalized   Human Resources
Completed   Completed

реальные желаемые результаты

Status      User Role               Users
Initiated   Main Admin Assistant    WIRED MOUSE, PHONE CHARGER
Drafted     Financial Analyst       WATER BOTTLE, CLEAR TAPE
Rated       Team Rep                CELL PHONE, CLICK PEN
Reviewed    Financial Analyst       WATER BOTTLE, CLEAR TAPE
Finalized   Human Resources         POST IT NOTE
Completed   Completed               Completed

1 Ответ

1 голос
/ 07 мая 2019

Согласованность структуры имеет решающее значение при разборе строк. Например, между последними двумя элементами идентификаторов 2 и 3 стоит точка с запятой, но после остальных нет точки с запятой. Эта лишняя точка с запятой усложняет логику программирования. Поскольку в комментариях говорится, что точка с запятой является опечаткой, а не пробел после), код отражает эти исправления в структуре.

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

Function GetUsers(strData As String, strUsers As String) As String
Dim aryS As Variant, x As Integer, strRole As String, strNames As String
aryS = Split(strUsers, ")")
Select Case strData
    Case "Initiated"
        strRole = "Main Admin Assistant"
    Case "Drafted"
        strRole = "Financial Analyst"
    Case "Rated"
        strRole = "Team Rep"
    Case "Reviewed"
        strRole = "Financial Analyst"
    Case "Finalized"
        strRole = "Human Resources"
End Select
For x = 0 To UBound(aryS) - 1
    If strRole = Left(aryS(x), InStr(aryS(x), "(") - 2) Then
        strNames = strNames & Mid(aryS(x), InStr(aryS(x), "(") + 1, InStr(aryS(x), ";") - 1 - InStr(aryS(x), "(")) & ", "
    End If
Next
If strNames <> "" Then GetUsers = Left(strNames, Len(strNames) - 2)
End Function

Вместо определения роли путем расчета с использованием данных предложите таблицу, которая определяет эти связи. Включите эту таблицу в запрос, затем передайте Роль для функции вместо данных, и блок Case не требуется.

Пересмотрен код, чтобы справиться с несогласованной структурой телефонных номеров, в которой иногда присутствуют символы скобок, приводящие к сбою предыдущего кода, а также возможность схожих имен ролей (я, вероятно, должен был начать с этого):

Function GetUsers(strData As String, strUsers As String) As String
Dim strRole As String, strNames As String
Select Case strData
    Case "Initiated"
        strRole = "Main Admin Assistant ("
    Case "Drafted"
        strRole = "Financial Analyst ("
    Case "Rated"
        strRole = "Team Rep ("
    Case "Reviewed"
        strRole = "Financial Analyst ("
    Case "Finalized"
        strRole = "Human Resources ("
    Case "Completed"
        strRole = "Financial Analyst Jr ("
End Select
Do While InStr(strUsers, strRole) > 0
    strUsers = Mid(strUsers, InStr(strUsers, strRole))
    strNames = strNames & Mid(strUsers, InStr(strUsers, "(") + 1, InStr(strUsers, ";") - Len(strRole) - 1) & ", "
    strUsers = Mid(strUsers, 2)
Loop
If strNames <> "" Then GetUsers = Left(strNames, Len(strNames) - 2)
End Function
...