ЕСЛИ 'x' соответствует 'y', то объединяется с существующим остальным Создать новый - PullRequest
0 голосов
/ 29 марта 2019

Мне нужно импортировать «контакты» в мою базу данных из нескольких внешних источников.

Некоторые «контакты» могут уже существовать, поэтому мне нужны только «новые» данные.

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

Я пытался использовать запрос на обновление / добавление, однако это только перезаписало значения исходного поля, а не ОБНОВЛЕНО, ЕСЛИ СТАРОЕ ЗНАЧЕНИЕ БЫЛО НЕДОСТАТОЧНО / ЛОЖНО. Проблема заключается в том, что он будет применять / удалять флаги профиля, которые приводят к переписке и использованию данных (неправильное обновление = потенциальное нарушение GDPR).

Я не могу программировать на SQL, я понимаю, как работают функции и что они делают, но не знаю, как скомпилировать / в каком порядке (пока), следовательно, пока использую VBA.

Dim myR As Recordset
Dim myR2 As Recordset

Set myR = CurrentDb.OpenRecordset("Staging - Import", dbOpenDynaset)
Set myR2 = CurrentDb.OpenRecordset("Contacts", dbOpenDynaset)

Do Until myR.EOF = True
    myR2.FindFirst ("Email = '" & myR![Email] & "'")
    If myR2.NoMatch = True Then
        myR2.AddNew
        myR2![Email] = myR![Email]
        myR2![First Name] = myR![First Name]
        myR2![Last Name] = myR![Last Name]
        myR2![Position] = myR![Position]
        myR2![Company] = myR![Company]
        myR2![Industry] = myR![Industry]
        myR2![Size] = myR![Size]
        myR2![Website] = myR![Website]
        myR2![Location] = myR![Location]
        myR2![Office Number] = myR![Office Number]
        myR2![Mobile Number] = myR![Mobile Number]
        myR2![Source] = myR![Source]
        myR2![CFO-DEL] = myR![CFO-DEL]
        myR2![CFO-SPON] = myR![CFO-SPON]
        myR2![DP-DEL] = myR![DP-DEL]
        myR2![DP-SPON] = myR![DP-SPON]
        myR2![HR-DEL] = myR![HR-DEL]
        myR2![HR-SPON] = myR![HR-SPON]
        myR2![CIO-DEL] = myR![CIO-DEL]
        myR2![CIO-SPON] = myR![CIO-SPON]
        myR2![CMO-DEL] = myR![CMO-DEL]
        myR2![CMO-SPON] = myR![CMO-SPON]
        myR2![CISO-DEL] = myR![CISO-DEL]
        myR2![CISO-SPON] = myR![CISO-SPON]
        myR2![NIS] = myR![NIS]
        myR2![Supress] = myR![Surpress]
        myR2.Update
    Else
        myR2.Edit
        myR2![First Name] = myR![First Name]
        myR2![Last Name] = myR![Last Name]
        myR2![Position] = myR![Position]
        myR2![Company] = myR![Company]
        myR2![Industry] = myR![Industry]
        myR2![Size] = myR![Size]
        myR2![Website] = myR![Website]
        myR2![Location] = myR![Location]
        myR2![Office Number] = myR![Office Number]
        myR2![Mobile Number] = myR![Mobile Number]
        myR2![Source] = myR![Source]
        myR2![CFO-DEL] = myR![CFO-DEL]
        myR2![CFO-SPON] = myR![CFO-SPON]
        myR2![DP-DEL] = myR![DP-DEL]
        myR2![DP-SPON] = myR![DP-SPON]
        myR2![HR-DEL] = myR![HR-DEL]
        myR2![HR-SPON] = myR![HR-SPON]
        myR2![CIO-DEL] = myR![CIO-DEL]
        myR2![CIO-SPON] = myR![CIO-SPON]
        myR2![CMO-DEL] = myR![CMO-DEL]
        myR2![CMO-SPON] = myR![CMO-SPON]
        myR2![CISO-DEL] = myR![CISO-DEL]
        myR2![CISO-SPON] = myR![CISO-SPON]
        myR2![NIS] = myR![NIS]
        myR2![Supress] = myR![Surpress]
        myR2.Update
    End If
    myR.MoveNext

Loop

Set myR = Nothing

End Sub

Есть ли более простой способ написать это или я должен использовать код

    myR2.FindFirst ("Email = '" & myR![Email] & "'")
    If myR2.NoMatch = True Then

Для каждого значения эффективно создавать 15-20 подпрограмм и макрос для запуска всего вместе?

Я пробовал несколько вариантов кода, пытаясь включить elseIf, isNull () и isFalse (), однако они всегда не компилировались или обновление не было завершено / записи были изменены.

Мне нужен код для следующего:

  1. Проверьте наличие контакта в таблице контактов

  2. Если контакт не существует, добавить все данные

  3. Если контакт существует, добавьте новые данные или обновите поля «да / нет» с «нет» до «да»

ПРИМЕЧАНИЕ: В настоящее время таблица «контактов» пуста, так как нам нужно создать новые / объединить дубликаты, прежде чем данные будут импортированы в таблицу «контактов».

Итак, контакты в данный момент:

    Email   Name    Surname
    -       -       -
    -       -       -
    -       -       -
    -       -       -

Постановка - импорт в настоящее время:

    Email   Name    Surname
    b@b.c   Brad    
    t@b.c   Tony    Tiger
    b@b.c   B       Pitt
    r@b.c   Ryan    Reynolds

После завершения контакты должны выглядеть следующим образом:

    Email   Name    Surname
    t@b.c   Tony    Tiger
    b@b.c   Brad    Pitt
    r@b.c   Ryan    Reynolds

1 Ответ

2 голосов
/ 29 марта 2019

Определение того, что нужно обновить или добавить при сравнении строковых данных, может быть довольно сложным и часто требует рассмотрения в каждом конкретном случае.Какое правило следует применять к программному решению, чтобы взять "Брэд" из одной записи и "Питт" из другой?Что если данные для одного и того же электронного письма были: Brad Pitt и Bradley Pitt?Что является правильным и должно быть сохранено?Вероятно, придется выполнить запрос, который находит дубликаты электронных писем в Staging, и принять индивидуальное решение о том, что исправить / удалить для этих дубликатов.Затем вставьте в контакты.Код вставки может проверять содержимое каждого поля на наличие значений Null или False и определять, принимать ли новое значение.

Для полей, отличных от да / нет, используйте функцию Nz () (предполагается, что в текстовом поле не будет пустой строки)
myR2![First Name] = Nz(myR2![First Name], myR![First Name])
или (для обработки возможной пустой строки)
If myR2![First Name] & "" = "" Then myR2![First Name] = myR![First Name]
(советуем не допускать пустую строку в текстовом поле или нулевое значение по умолчанию для числового поля в дизайне таблицы).

Для поля «да / нет» проверьте значение «Ложь» (не устанавливайте свойство DefaultValue в дизайне таблицы):
myR2![Supress] = IIf(myR2![Supress] = False, myR![Supress], True)
или
If myR2![Supress] = False Then myR2![Supress] = myR![Supress]

Сокращенный коддля процедуры импорта.Измените с помощью описанного выше.

Do Until myR.EOF = True
    myR2.FindFirst ("Email = '" & myR![Email] & "'")
    If myR2.NoMatch = True Then
        myR2.AddNew
        myR2![Email] = myR![Email]
    Else
        myR2.Edit
    End If
    myR2![First Name] = myR![First Name]
    myR2![Last Name] = myR![Last Name]
    myR2![Position] = myR![Position]
    myR2![Company] = myR![Company]
    myR2![Industry] = myR![Industry]
    myR2![Size] = myR![Size]
    myR2![WebSite] = myR![WebSite]
    myR2![Location] = myR![Location]
    myR2![Office Number] = myR![Office Number]
    myR2![Mobile Number] = myR![Mobile Number]
    myR2![Source] = myR![Source]
    myR2![CFO-DEL] = myR![CFO-DEL]
    myR2![CFO-SPON] = myR![CFO-SPON]
    myR2![DP-DEL] = myR![DP-DEL]
    myR2![DP-SPON] = myR![DP-SPON]
    myR2![HR-DEL] = myR![HR-DEL]
    myR2![HR-SPON] = myR![HR-SPON]
    myR2![CIO-DEL] = myR![CIO-DEL]
    myR2![CIO-SPON] = myR![CIO-SPON]
    myR2![CMO-DEL] = myR![CMO-DEL]
    myR2![CMO-SPON] = myR![CMO-SPON]
    myR2![CISO-DEL] = myR![CISO-DEL]
    myR2![CISO-SPON] = myR![CISO-SPON]
    myR2![NIS] = myR![NIS]
    myR2![Supress] = myR![Supress]

    myR2.Update

    myR.MoveNext
Loop

Другой, при условии, что наборы записей имеют точно такие же поля.

Dim myR As DAO.Recordset
Dim myR2 As DAO.Recordset
Dim fld As DAO.Field
Set myR = CurrentDb.OpenRecordset("Staging - Import", dbOpenDynaset)
Set myR2 = CurrentDb.OpenRecordset("Contacts", dbOpenDynaset)
Do Until myR.EOF = True
    myR2.FindFirst "Email = '" & myR![Email] & "'"
    If myR2.NoMatch = True Then
        myR2.AddNew
        myR2![Email] = myR![Email]
    Else
        myR2.Edit
    End If
    For Each fld In myR.Fields
        If fld.Name <> "Email" And _
                (myR2.Fields(fld.Name) & "" = "" Or myR2.Fields(fld.Name) = False) Then
            myR2.Fields(fld.Name) = fld
        End If
    Next
    myR2.Update
    myR.MoveNext
Loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...