MS Access: К какой объектной модели относится контейнерный объект Forms? - PullRequest
0 голосов
/ 30 декабря 2018

Насколько я понимаю, объектные модели DAO и ADO имеют только объекты для доступа к данным, такие как таблицы и запросы, и не имеют объектов, которые относятся к представлению данных, таких как формы и отчеты.

В соответствии с этим, длинный список объектов в документации MS для объектов DAO не включает в себя формы или отчеты.

Также согласно соглашению документация MS дляКонтейнер DAO говорит: «В следующей таблице перечислены имена каждого объекта-контейнера, определенного ядром базы данных Microsoft Access», а в указанной таблице перечислены три объекта: Базы данных, Таблицы и Отношения.

Однако, когдаЯ выполняю следующую процедуру в Access 2007 VBA:

Sub ListDocuments()

Dim oDB As DAO.Database: Set oDB = CurrentDb()
Dim oContainer As DAO.Container

For Each oContainer In oDB.Containers
    Debug.Print oContainer.Name
  Next oContainer

End Sub

Я получаю следующий вывод:

DataAccessPages
Databases
Forms
Modules
Relationships
Reports
Scripts
SysRel
Tables

Есть две проблемы с этим выводом:

  • Незначительная проблема: у него есть контейнерный объект, который называется «Отношения», а не «Отношения».Указывает ли это на опечатку в документированном списке контейнерных объектов, указанных выше?
  • Хуже проблема.Список объектов-контейнеров DAO включает в себя объект под названием «Формы».Обратите внимание, что это НЕ то же самое, что объект с тем же именем в объектной модели Access.Документация MS для объекта Access Forms гласит, что она включает только открытые формы.На этой странице сказано, что объектом Access, включающим закрытые формы, является AllForms.В файле Access с одной формой, которая в данный момент закрыта, в «Немедленном окне» ? Forms.Count = 0, но ? CurrentDb().Containers("Forms").Documents.Count = 1.Таким образом, эти две вещи, которые обе называются «формами», являются разными вещами.

Этот объект-контейнер Forms, кажется, нигде не документирован.И его существование, кажется, противоречит приведенному выше утверждению, что Access определяет только три контейнерных объекта.Кроме того, поскольку он находится в объекте DAO «Контейнеры», он, похоже, также противоречит идее, что DAO не включает объекты для форм и отчетов.

Итак, мой вопрос: откуда взялись эти формы объекта-контейнера?К какой объектной модели она относится?Если вы знаете ответ, было бы полезно, если бы вы могли дать ссылку на некоторую документацию для него.

Ответы [ 3 ]

0 голосов
/ 30 декабря 2018

Не особо о чем тут писать.

В Access есть несколько «контейнерных» объектов.Мы можем хранить изображения, PDF-документы или что-то еще в этих контейнерах.

И мы могли бы даже хранить, скажем, диаграмму Отношений в этих контейнерах.(Ой, подождите - они сделали это !!!).

Контейнеры - это просто некоторые контейнеры в приложении Access.

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

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

ПОЭТОМУ сделать вывод, что в DAO имеется объект «клиенты» или объект «счет-фактура», как часть объектной модели DAO, здесь будет мало смысла.

Контейнеры «объекты» - это всего лишь контейнер вещей.Они имеют мало отношения к объектной модели DAO.

«Контейнеры» - это список объектов, предоставляемых системой Access, а не DAO.

Не существует метода «контейнеров» или «контейнеров».”Свойство объектной модели DAO.

Теперь, чтобы быть справедливым,« родным »механизмом базы данных, используемым в Access, является JET (теперь называется ACE).И, честно говоря, поскольку ядро ​​базы данных доступа ОЧЕНЬ близко связано с объектной моделью DAO, то, безусловно, справедливо утверждать, что Access (инструмент разработчика) связан гораздо ближе к DAO, чем к ADO.

Хотя вы наиболее свободно можете использовать DAO или ADO для получения данных из механизма JET / ACE, DAO, безусловно, является предпочтительным выбором здесь.

«Основная» причина этого предпочтения заключается в том, что DAOОЧЕНЬ тесно связаны с ядром базы данных JET / ACE.Первоначально Access был основан на коде библиотеки JET + dao, поэтому его корни более тесны в объектной модели DAO.

Однако, если вы собираетесь получать данные с SQL-сервера, то в течение долгого времени большинство разработчиков предпочиталиобъектная модель ADO.Есть несколько преимуществ использования ADO, если, скажем, использовать SQL-сервер, или, скажем, MySQL или Oracle в качестве внутренней базы данных с MS-доступом в качестве внешнего интерфейса.

«Основным» преимуществом использования ADO является то, что SQL, используемый для ADO, «ближе» к синтаксису SQL, который использует «отраслевой» стандарт (ansi-92).В результате ваш SQL, который вы пишете с помощью ADO, будет работать (в общем) без изменений, если вы используете SQL-сервер или скажете Oracle в качестве серверной части.(И вы, вероятно, можете переключаться между двумя базами данных без необходимости изменения используемого синтаксиса sql).

В DAO вы используете Access (jet) SQL-синтаксис или, точнее, синтаксис JET / ACE.Когда вы используете ADO, но все еще используете движок JET / ACE, вы можете использовать синтаксис sql ansi-92.В результате ваш синтаксис для sql НАМНОГО больше будет соответствовать синтаксису, используемому на SQL-сервере, или, скажем, oracle.

Для приложений access + JET / ACE рекомендуемым стандартным выбором является использование DAO.(18 лет назад Microsoft изменила объектную модель «по умолчанию» на ADO в Access 2000. Разработчики устроили «восстание»), и в Access 2003 они вернули DAO по умолчанию. (Вы можете до сих пор выбирать все равнообъектная модель или, что еще хуже, «смешать» две - не ходите туда !!!). Таким образом, Microsoft не заставляла изменение, но настройкой «по умолчанию» было ADO - но мы просто всегда меняли ссылку на DAO и сохранялина написание кода, как мы всегда это делали.

Так что в течение многих лет Microsoft подталкивала всех к использованию ADO - включая очень популярную систему MS-доступа.

Однако большинство из насразработчики проигнорировали этот совет от Microsoft, и cПродолжайте использовать DAO при создании приложений с собственным доступом.И, как уже отмечалось, довольно долгое время DAO является объектной моделью по умолчанию.Поскольку DAO несколько устарела, команда Access взяла библиотеку объектов и кода DAO, и теперь они владеют этой библиотекой.(Раньше это была просто стандартная библиотека Microsoft, которую могли использовать все разработчики).Так что для V6, vb.net и т. Д. Они обычно использовали ADO.

Таким образом, теперь вы можете «прочитать», что DAO устарела, но Access использует обновленную и более новую версию, которая включена в ядро ​​базы данных ACE.,(Таким образом, в то время как DAO как автономная библиотека объектов является устаревшей, код DAO обновляется, и новые функции продолжают действовать в Access как объект обработчика данных ACE.

Когда вы устанавливаете ссылку на обработчик данных ACE, тогда все вашиКод DAO должен работать просто отлично. Что это значит (начиная с Access 2007), вам НЕ нужно устанавливать внешнюю ссылку на объектную модель DAO - теперь она является частью ядра базы данных JET / ACE (до доступа 2007 выЯ должен был установить ссылку на DAO. И если вы собираетесь использовать ADO, вы ВСЕГДА должны были установить эту ссылку, и вы все еще делаете это по сей день)

Это изменение было сделано, поскольку на самом деле только сообщество Access иразработчики использовали DAO - большинство других платформ использовали ADO (по многим причинам, но одной из основных причин было то, что ADO НЕ был связан и не имел корней в ядре базы данных MS-access, как это делает DAO, и до сих пор существует по сей день.

Помните, что в течение 5-10 лет у Microsoft не было SQL-сервера, поэтому Access + DAO был их «большойal ». Когда они наконец начали продавать SQL-сервер, то, конечно, все изменилось в связи с продвижением Microsoft DAO.DAO была «первичной» технологией механизма доступа к MS.

Если вы в будущем переместите данные из Access на сервер SQL и продолжите использовать MS-доступ в качестве внешнего интерфейса графического интерфейса, доступСообщество STILL предлагает вам придерживаться любой объектной модели, которую вы использовали для разработки своего приложения.Таким образом, доступ к приложениям, разработанным с помощью DAO, но с использованием сервера SQL в качестве внутренней базы данных, работает нормально и должен оставаться таковым.

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

Вы по-прежнему всегда используете «те же» внутренние контейнеры, которые существуют в Access - эти контейнеры НЕ меняются, если вы используете ADO или DAO при написании кода для изменения данных в клиенте доступа.

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

Однако для разработчиков .net, разработчиков Visual Basic, они, вероятно, оттачивали свои навыки, используя объектную модель ADO и когда они используют MS-доступ в качестве разработки.инструмент, тогда они могут продолжать использовать свое «долгое время», знакомое с объектной моделью данных ADO при написании кода в MS-доступе.

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

edit:

Цитировать по этой ссылке: https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/container-object-dao

Каждый объект базы данных имеет контейнерыколлекция, состоящая из встроенных объектов-контейнеров.Приложения могут определять свои собственные типы документов и соответствующие контейнеры (только базы данных ядра базы данных Microsoft Access);однако эти объекты не всегда могут поддерживаться через DAO.

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

0 голосов
/ 31 декабря 2018

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

  • Технически, «объектная» модель - это плохой выбор слов, поскольку более правильный термин - это модель класса.Обычно объект является экземпляром класса в памяти.Во время выполнения действительно существует иерархия реальных объектов, но иногда полезно ссылаться не на конкретный экземпляр (т. Е. На объект), а на общий класс.Я обычно стараюсь быть очень осторожным с терминологией, но особенно в отношении некоторых из этих более старых моделей, названия и термины, используемые в документации, (откровенно говоря) небрежны.Это отказ от ответственности за всю неудачную терминологию.Я сделаю все возможное, чтобы уточнить, где различие имеет решающее значение для понимания.
  • Существует избыточность в различных объектных моделях, связанных с Access.Могут быть веские причины для некоторой избыточности, но, по крайней мере, для некоторой избыточности может быть нет веская причина (по крайней мере, ни одна из них не опубликована).Скорее некоторые части различных компонентов - результат зрелого продукта, который развился в течение долгого времени.Разная информация должна быть представлена ​​на разных уровнях, но вместо того, чтобы сделать всю модель открытой, доступной и согласованной, она была разработана с парадигмой «по мере необходимости».
    • Избыточность существует как
      • в имени : разные классы с одинаковыми или похожими именами не идентичны, но могут предоставлять другой набор методов и свойств для манипулированията же основная сущность.Это также верно для названий коллекций и перечислений.Иногда они даже не манипулируют одним и тем же базовым объектом, хотя они могут предоставлять аналогичные функциональные возможности (например, ADO.Recordset и DAO.Recordset)
      • в наличии : некоторые идентичные объекты открываются через разныеколлекции и свойства различных родительских / контейнерных объектов.

У него есть контейнерный объект, называемый «Отношения», а не «Отношения».».Указывает ли это на опечатку в документированном списке объектов-контейнеров, приведенных выше?

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

Откуда приходят формы этого контейнерного объекта?

Это только предположение, но по крайней мере попытка прямого ответа:

Контейнерный объект предоставляется в качестве обратной ссылки для обнаружения связанных объектов.Когда MS Access создает / загружает базу данных через DAO, он, очевидно, добавляет дополнительные объекты-контейнеры для своих собственных целей.DAO предоставляет общую коллекцию Containers и позволяет другим объектам добавлять к ней.

Несмотря на то, что цель DAO состоит в том, чтобы просто получить доступ к самим данным и представить их, очевидно, MS решила, что было бы полезно предоставить способ публикации (иначе говоря, выставления) связанных объектов через объектную модель DAO.Я бы рассмотрел это как свойство Parent многих объектов.Без такого свойства Parent часто не существует встроенного способа определения отношения объекта к его источнику.Аналогично, в сложном приложении, возможно, не было другого способа определить различные детали базы данных без коллекции контейнеров.Альберт Д. Каллал уже подчеркнул, что не должно быть никакой конкретной связи между DAO и объектами-контейнерами.Возможно, это правда, что классы и объекты Контейнера действительно не имеют никакого значимого отношения, но MS, очевидно, по какой-то причине решила привязать это к объектной модели DAO, поэтому мне не хватает объяснения г-на Каллала.Access по-прежнему является проприетарным продуктом со скрытыми методами, и MS не публикует все сведения об API и классах.Я, честно говоря, не верю, что это было так произвольно - у MS были свои причины, даже если они не разделяют это.

К какой объектной модели она относится?

Из того, что описано в документации И из изучения деталей в VBA Object Browser и использования некоторых методов VBA, таких как TypeName и т. Д., Получается, что Containersобъекты коллекции и Container действительно являются частью объектной модели DAO.Однако сами объекты-контейнеры (и связанные с ними объекты Document) могут ссылаться и / или содержать объекты вне объектной модели DAO.Строго говоря, концепция формы доступа находится за пределами DAO.Фактические классы и объекты для форм являются частью объектной модели Access.


Чтобы пойти немного дальше, различные коллекции - это не просто "открытые формы" против "всех форм".Хотя все они возвращают концептуальные объекты, называемые «формами», они даже не возвращают объекты одного и того же типа во время выполнения.Коллекция CurrentDB.Database.Containers(FormContainerIndex) возвращает Container объекты с Document объектами (где FormContainerIndex может равняться или не равняться 2).Коллекция Application.CurrentProject.AllForms возвращает экземпляры AccessObject.Коллекция Application.Forms возвращает фактические объекты форм, которые имеют определенные типы классов форм.

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

0 голосов
/ 30 декабря 2018

Это происходит от:

Microsoft Access

Вы можете легко проверить это:

? Forms.Parent.Name
Microsoft Access

Это содержит все формы, открытые или нет:

Application.CurrentProject.AllForms

текущая база данных ссылается на этот контейнер.Они будут возвращать то же количество:

? CurrentDb.Containers(acForm).Documents.Count
? Application.CurrentProject.AllForms.Count

CurrentDb (или любой другой объект DAO.Database ), вероятно, входит в DAO - в документации, к которой вы обращаетеськ.

...