Расчет сложных табличных отношений в Access - PullRequest
0 голосов
/ 01 мая 2020

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

На данный момент база данных довольно проста. Две таблицы.

Данные приложения - таблица, содержащая запись для каждого отдельного приложения и всех связанных с ним данных (имя, разработчик, команда, подразделение, архитектор и т. Д. c). Приложения называются с 2 или 3-значными кодами, например, Приложение X может называться XYZ, приложение Y может называться YF.

Данные о событиях - собираются ежедневно, это список всех событий, которые были запущены. Он хранит информацию о событии, такую ​​как имя события, дата, статус успеха, время выполнения, максимальный код завершения и т. Д. c.

события определяются в системе с соглашением об именах. События могут иметь имена до 8 символов. Первый символ всегда 'P' указывает на производственные события. Следующие 2 или 3 символа - это код приложения, а остальные символы могут быть любыми приложениями.

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

Моя проблема заключается в том, что в настоящее время единственным реальным способом определения взаимосвязи является анализ имени события и сравнение. Я пытаюсь взять 2-й, 3-й и 4-й символы и сравнить их с полем кода приложения таблиц данных приложения. Если найдено совпадение, это приложение, и я могу взять эту запись и добавить идентификатор данных приложения в качестве внешнего ключа для отношения. Если совпадения нет, используйте первые 2 символа для сопоставления, чтобы определить, является ли это 2-символьный код приложения, и снова введите внешний ключ для данных приложения в четной таблице данных.

Я пытался использовать запрос, сравнивающий имя события (проанализированный с серединными строками) и серию операторов IIF, но это впечатляюще взорвалось, и я просто не мог заставить работать сложный синтаксис. Моей следующей мыслью было сделать это в пакетном режиме с модулем vba, чтобы проанализировать имя события в каждой записи и найти в поле кода приложения данных приложения совпадение, а затем обновить поле внешнего ключа. Но я верю, что мне нужно было бы делать это регулярно, когда добавляются новые данные о ежедневных событиях.

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

Спасибо. Горд

1 Ответ

0 голосов
/ 01 мая 2020

Я бы предположил, что использование серии SQL операторов в VBA может быть способом go.

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

Я предполагаю, что таблица Application имеет первичный ключ Autonumber, и что таблицы Event / Temp имеют номер c внешний ключ, который необходимо обновить. Затем вы можете запустить какой-нибудь VBA:

Sub sEventData()
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Set db = DBEngine(0)(0)
    db.Execute "UPDATE tblTemp AS T INNER JOIN tblApplication AS A ON A.ApplicationCode=Mid(T.EventName,2,3) " _
        & " SET T.ApplicationID=A.ApplicationID " _
        & " WHERE T.ApplicationID=0;"
    db.Execute "UPDATE tblTemp AS T INNER JOIN tblApplication AS A ON A.ApplicationCode=Mid(T.EventName,2,2) " _
        & " SET T.ApplicationID=A.ApplicationID " _
        & " WHERE T.ApplicationID=0;"
    db.Execute "INSERT INTO tblEvent (EventName,EventDate, ApplicationID) " _
        & " SELECT EventName, EventDate, ApplicationID " _
        & " FROM tblTemp " _
        & " WHERE ApplicationID<>0;"
    db.Execute "DELETE * FROM tblTemp WHERE ApplicationID<>0;"
sExit:
    On Error Resume Next
    Set db = Nothing
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sEventData", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

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

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...