Невозможно извлечь значения из словаря, заданного в VBA / Access 2003
Я пишу сценарий, который извлекает некоторые данные пациента и генерирует экспорт 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.Пункт ("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.
Тестирование (и файл справки) указывает, что варианту 'v' не присваивается значение из свойства Keys, но для каждого это, по крайней мере, попытка по циклу...
-- Обновление
Я нашел подобный вопрос у кого-то на vbforums: http://www.vbforums.com/showthread.php?t=622933
Я протестировал с помощью жестко закодированного ключа и элемента:
DoctorList.Add 5, "String"
Теперь цикл For Each выполняется один раз успешно, но затем завершается ошибкой 3420 на втором цикле (даже если он должен был остановиться на первом цикле).
2 ответов:
Нашел проблему-оказывается, что словари будут с удовольствием использовать объекты в качестве ключей, поэтому при использовании словаря.Добавить метод вы должны явно использовать свойство Value поля из набора записей:
DoctorList.Add DoctorRec![Lng_Key].Value, DoctorRec![Txt_GUID].Value
Что касается GUID, доступу они не нравятся. Майкл Каплан писал об этом много лет назад. Возможно, вы захотите изучить функции StringFromGUID() и GUIDToString ().
И если нет внешнего требования, что вы используете GUID, вы должны серьезно рассмотреть вопрос о том, чтобы полностью избавиться от них. Они вообще не добавляют ничего, что необходимо в 99,99% приложений Access.
Во-вторых, я никогда не использовал словарь scripting runtime, но он на самом деле мне кажется, что он не предлагает ничего, что вы уже не можете получить с пользовательской коллекцией VBA. Можете ли вы описать, для чего вы его используете, и насколько он превосходит коллекцию VBA? Кроме того, почему вы используете раннее связывание, а не позднее связывание?
Comments