Пользовательская функция в Access, запускается только один раз, а не в строке - PullRequest
0 голосов
/ 29 ноября 2011

У меня проблема с запуском пользовательской функции в базе данных Access. В настоящее время существует процесс для импорта новых данных и назначения внешнего ключа (ENTRY_ID) -1 для всех новых строк. Отдельный процесс выполняется для замены -1 на следующее число в последовательной последовательности.

Это функция:

Public Function GetNextEntry(table As String) As Double
    Dim r As DAO.Recordset
    Dim i As Double

    Set r = CurrentDb.OpenRecordset("SELECT LAST_ENTRY_ID FROM LAST_ENTRY WHERE TABLE_NM='" & table & "';")
    If r.EOF Then
        GetNextEntry = -1
        Exit Function
    End If
    i = r![LAST_ENTRY_ID] + 1
    r.Edit
        r![LAST_ENTRY_ID] = i
    r.Update
    GetNextEntry = i
Exit Function
GetNextEntry_ERROR:
    GetNextEntry = -1
End Function

И это чрезвычайно упрощенная версия запроса:

INSERT INTO DATA
SELECT GetNextEntry('DATA') AS ENTRY_ID, IMPORT.*
FROM IMPORT

То, что я ожидаю получить обратно, будет выглядеть

ENTRY_ID, NAME, NUMBER
1, 'account 1', '1234567'
2, 'account 1', '1234567'
3, 'account 1', '1234567'
4, 'account 1', '1234567'
5, 'account 1', '1234567'

Но на самом деле я получаю

ENTRY_ID, NAME, NUMBER
1, 'account 1', '1234567'
1, 'account 1', '1234567'
1, 'account 1', '1234567'
1, 'account 1', '1234567'
1, 'account 1', '1234567'

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

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

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Как предлагает mwolfe02 в своем комментарии, определите поле Autonumber (Entry_ID) в таблице DATA, прекратите использование функции и дайте Access назначить уникальное значение Entry_ID при вставке данных в таблицу.

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

INSERT INTO DATA ([Name], [Number], [NextField], etc.)
SELECT ([Name], [Number], [NextField], etc.)
FROM IMPORT
1 голос
/ 29 ноября 2011

Доступ умный; он не понимает, что ваша функция возвращает другое значение каждый раз.

Попробуйте переопределить вашу функцию как:

Public Function GetNextEntry(table As String, salt as integer) As Double

А потом

INSERT INTO DATA
SELECT GetNextEntry('DATA', IMPORT.SOMEINTEGERFIELD) AS ENTRY_ID, IMPORT.*
FROM IMPORT

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

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