Невозможно извлечь значения из словаря после установки в VBA / Access 2003 - PullRequest
5 голосов
/ 11 марта 2011

Я пишу скрипт, который извлекает некоторые данные пациента и генерирует экспорт XML.

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

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

В любом случае, короче говоря, вот бит, который составляет список требований:

While Not PatientRec.EOF
    Set DoctorRec = MyDB.OpenRecordset("Select Lng_Key, Txt_GUID From Tbl_LU_DoctorDetail Where Lng_Key = " & PatientRec![Lng_Doctor])

    While Not DoctorRec.EOF
        If (IsNull(DoctorRec![Txt_GUID])) Then
            DoctorRec.Edit
            DoctorRec![Txt_GUID] = CreateGUID()
            DoctorRec.Update
        End If

        DoctorList.Add DoctorRec![Lng_Key], DoctorRec![Txt_GUID]

        ' outputs something like '5:{03f50fe1-a0a4-4733-906a-771e22845ea6}
        MsgBox (DoctorRec![Lng_Key] & ":" & DoctorList.Items(DoctorRec![Lng_Key]))

        DoctorRec.MoveNext
    Wend
Wend

' outputs nothing!
MsgBox (DoctorList.Item(5))

' but there is something in there???
MsgBox (DoctorList.count)

Я также пытался привести идентификатор к строке, используя CStr, но получить тот же результат с DoctorList.Item ("5")

Хуже, когда я пытаюсь:

Dim v As Variant
For Each v In DoctorList.Keys
    MsgBox (v & ":" & DoctorList.Item(v))
Next

Я получаю ошибку:

Run-time error '3420':

Object invalid or no longer set.

Тестирование (и файл справки) показывает, что Variant 'v' не устанавливается ни на что из свойства Keys, но For Each по крайней мере пытается выполнить цикл ...

- Обновление

Я нашел похожий вопрос на vbforums: http://www.vbforums.com/showthread.php?t=622933

Я проверил с помощью жестко закодированного ключа и предмета:

DoctorList.Add 5, "String"

Цикл For Each теперь успешно выполняется один раз, но затем завершается с ошибкой 3420 во втором цикле (даже если он должен был остановиться в первом цикле).

Ответы [ 2 ]

7 голосов
/ 11 марта 2011

Обнаружена проблема - похоже, словари с радостью будут использовать объекты в качестве ключей, поэтому при использовании Dictionary.Add метод необходимо явно использовать свойство Value поля из набора записей:

DoctorList.Add DoctorRec![Lng_Key].Value, DoctorRec![Txt_GUID].Value
0 голосов
/ 12 марта 2011

Что касается GUID, Access их не любит. Майкл Каплан писал об этом годы и годы назад .Возможно, вы захотите взглянуть на функции StringFromGUID () и GUIDToString ().

И если нет внешнего требования использовать GUID, вам следует серьезно подумать о том, чтобы полностью избавиться от них.Они не добавляют ничего, что необходимо в 99,99% приложений Access.

Во-вторых, я никогда не использовал словарь среды выполнения сценариев, но мне действительно кажется, что он не предлагает ничего, что вы не можетеуже получить с пользовательской коллекцией VBA.Можете ли вы описать, для чего вы его используете и как он превосходит коллекцию VBA?Кроме того, почему вы используете раннее связывание, а не позднее связывание?

...