Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
Результаты опроса: Есть необходимость создавать свои статьи
согласен (согласна) 6 100.00%
не согласен (не согласна) 0 0%
мне все равно 0 0%
Голосовавшие: 6. Вы ещё не голосовали в этом опросе

 
 
Рейтинг 4.65/857: Рейтинг темы: голосов - 857, средняя оценка - 4.65
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
04.11.2022, 15:09
Студворк — интернет-сервис помощи студентам
Продолжаю цикл статей из книги Стивена Форта, Тома Хоуна и Джеймса Релстона «Microsoft Access 2000 Development»..

Репликация и JRO

Современные разработчики на Access возможно и не подозревают, что когда-то Access в базах формата MDB могла поддерживать репликацию данных. Как настоящая большая СУБД. Последняя версия Access, которая поддерживала репликации - 2010. С версии 2013 эту возможность убрали.

Для некоторых задач репликация данных была единственно возможным решением. Ну или приходилось самому писать кучу кода для согласования данных разных копий БД.

Я встречал тех, кто не хотели переходить на новые версии Офиса из-за отсутствия этой возможности. Или параллельно новому офису держали портабле версию 2003. Всё-таки Excel от версии к версии становился всё мощнее. Да и другие программы развивались.

Может кому-то и пригодится.
Вложения
Тип файла: zip Replica.zip (223.0 Кб, 23 просмотров)
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.11.2022, 15:09
Ответы с готовыми решениями:

Сжатие базы данных по варианту 6.4. из темы Написание статей
Выполнил все рекомендации изложенные в пункте 6.4.. На последнем этапе застрял. Короче, не сжимается база. Причем созданный мною...

Написание IT статей
Доброго времени суток! Ищу человека, которому интересно писать компьютерные статьи за оплату. Сам уже более 10 лет работаю в...

написание статей
:) помогите пожалуйсто. хочу вот заказать написание статьи незнаю какую лучше с оптимизацией или нет.Помогите :)

58
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
08.11.2022, 11:25
Продолжаю цикл статей из книги Стивена Форта, Тома Хоуна и Джеймса Релстона «Microsoft Access 2000 Development».

Access. Безопасность

Данная статья относится к базам данных в формате MDB и рабочих групп MDW

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

И хотя материал дан здесь для Access 2000 его можно свободно использовать и для более поздних версий. Надо только учитывать, то что в новых версиях появляются дополнительные возможности. Например в Access 2003 уже нет отдельной утилиты wrkgadm.exe. Она теперь встроена непосредственно в оболочку Access. И запустить её можно через Сервис | Защита | Администрирование Изменены виды некоторых вкладок. Добавлены новые параметры.

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


P.S. Office Access 2007 (и выше) не предусматривает защиту на уровне пользователя для баз данных, созданных в новом формате (файлы с расширением accdb или accde). Однако при открытии базы данных из более ранней версии Access, имеющей защиту на уровне пользователя, эти параметры будут продолжать работать.

Дополнительно прикладываю справочник по защите баз MDB при помощи рабочих групп. Хотя справочник и ограничивается версиями Access 2, 95 и 97, его можно применять и для баз в формате Access 2000, 2002-2003.

Справочник взят здесь
Вложения
Тип файла: zip Security.zip (141.9 Кб, 21 просмотров)
Тип файла: rar Microsoft_Access_Security_FAQ.rar (151.8 Кб, 37 просмотров)
2
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
10.11.2022, 12:12
Когда-то меня сильно приколола фраза из пособий по базам данных одного ВУЗа: "Access является однопользовательской системой..."

И так, продолжаю цикл статей из книги Стивена Форта, Тома Хоуна и Джеймса Релстона «Microsoft Access 2000 Development»

Особенности работы в многопользовательском режиме

В данной статье рассматриваются разрешение конфликтов, возникающих при одновременном обращении нескольких пользователей к базам данных Access.

Дополнительно выкладываю статью Мэтью Мак-Дональда из "Access 2007: The Missing Manual". Может быть использована как для 2007, 2010, так и для предыдущих версий. Для начинающих (и не очень).

Совместное использование БД несколькими пользователями.

Из предисловия.

Когда Ваша БД создана, возможно, вы захотите использовать ее совместно с друзьями и коллегами. В одних руках программа Access - первоклассное средство управления данными. Но программа предоставляет так же отличную возможность для совместной работы.
Совместное использование БД особенно важно, если она играет связующую роль в организации. Представьте себе, что вы создаете БД, которая отслеживает проекты компании и сроки их выполнения. (Обычно такая БД формируется как экономящее время средство в руках фаната Access, у которого есть небольшой избыток свободного времени.) Вскоре у других отделов возникает желание примкнуть к вам и сохранять свои проекты в вашей БД. И возможности этим не ограничиваются; если вы используете БД совместно с достаточно широкой аудиторией, можно собрать воедино все виды связанных задач. Сотрудники могут регистрировать время, потраченное на каждый проект. Тестировщики качества продукции могут фиксировать все нерешенные проблемы, влияющие на проект. Руководители проектов могут обозначить проекты с требующими напряжения сроками, главные начальники могут рассчитать премии, а генеральный директор оценить с высоты орлиного полета всю работу своей компании. Очень скоро будет трудно представить себе жизнь без вашей БД Access.
В этой статье вы научитесь использовать вашу БД вместе с небольшой группой, узнаете о возможных ловушках и о том, что нужно делать, чтобы все протекало гладко.


Содержание.

Совместное использование БД несколькими пользователями

1. Открытие вашей базы данных всему миру
1.1. Как действует многопользовательская поддержка в Access
2. Подготовка вашей базы данных
2.1. Что такое разделенная БД
2.2. Разделение БД с помощью мастера
2.3. Как действуют связанные таблицы
2.4. Разделение БД вручную
2.5. Блокировка вашей клиентской БД
2.6. Использование БД совместно с пользователями, у которых нет Access
3. Многопользовательский доступ
3.1. Как вносятся изменения
3.2. Обработка конфликтов редактирования
3.3. Применение блокировок для предотвращения наложения обновлений
3.4. Открытие БД с монопольным доступом
4. Повреждение данных
4.1. Диагностика и корректировка поврежденных БД
4.2. Предупреждение повреждений
5. Защита базы данных
5.1. Защита паролем
5.2. Пароли и разделенные БД
5.3. Применение защиты файлов ОС Windows
Вложения
Тип файла: zip MultiUse.zip (37.8 Кб, 67 просмотров)
Тип файла: rar Sharing_a_Database_with_Multiple_Users.rar (2.84 Мб, 117 просмотров)
1
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
21.11.2022, 10:09
Подключение Access к SharePoint

Статья Мэтью Мак-Дональда из "Access 2007. Недостающее руководство". Общие представления.

Здесь приведена статья Мэтью Мак-Дональда "Подключение Access к SharePoint" из "Access 2007. Недостающее руководство". В статье коротко описано назначение SharePoint, создание узлов SharePoint и о взаимодействии SharePoint с Access. Статья касается Access 2007 (и выше).

Содержание

1. Основные сведения о SharePoint
1.1. Что можно делать в программе SharePoint
2. Настройка SharePoint
2.1. Создание узла рабочей группы
2.2. Настройка вашего узла
3. SharePoint и Access
3.1. Формирование списка
3.2. Экспорт таблицы в SharePoint
3.3. Импорт данных в Access
3.4. Перенос всей БД на сервер SharePoint
3.5. Редактирование данных SharePoint в Access
3.6. Внесение изменений в автономном режиме

Новые возможности Access 2010.

Общий доступ к базам данных в Интернете
В Office Access 2007 была предусмотрена ограниченная поддержка общего доступа к базам данных в Интернете: можно было только публиковать списки и перемещать базы данных в библиотеки документов. В Access 2010 (при наличии доступа к Access в Microsoft SharePoint Server 2010) можно создавать веб-базы данных с помощью Access 2010. Пользователи могут открывать базы данных в окне браузера, однако для изменения структуры необходимо использовать Access 2010. Некоторые функции базы данных настольного компьютера СУБД не распространяются на Интернет, однако поддерживается целый ряд аналогичных функций, например вычисляемые поля и макросы данных.

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

Новые возможности служб Access в SharePoint Server 2010

Службы Access — это приложение службы Microsoft SharePoint Server 2010, предоставляющее пользователям возможность изменения, обновления и создания связанных баз данных Microsoft Access 2010, которые можно просматривать и которыми можно управлять с помощью интернет-браузера, клиента Access или связанной HTML-страницы.

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

Службы Access позволяют создавать, изменять и сохранять базы данных Access следующими способами:

* посредством создания экземпляра базы данных сервера Microsoft SharePoint Server на любом компьютере, который имеет разрешение на использование и может подключиться к службам Access на компьютере в сети, на котором работает сервер SharePoint Server.

* посредством создания, публикации и совместного использования сетевой базы данных сервера SharePoint на любом компьютере, который может опубликовать данные на компьютере, на котором работает сервер SharePoint и установлено приложение Access 2010;

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

(Взято с сайта фирмы Microsoft)

Формы и отчёты Access в SharePoint не поддерживаются.
Вложения
Тип файла: rar Access_connect_to_SharePoint_(pdf).rar (2.11 Мб, 24 просмотров)
1
10 / 10 / 0
Регистрация: 23.04.2018
Сообщений: 18
26.11.2022, 11:48
Работа с цветом в Access

Частые вопросы на форумах:

1 Как вызвать диалог выбора цвета?
2 Как конвертировать HexRGB --> в десятичное значение для Access
3 Как конвертировать десятичное значение цвета для Access --> в HexRGB
2 Как раскрасить ячейки в табличной форме?
3 Как раскрасить ячейки в ленточной форме?
4 Как хранить значения цвета и визуальное представление в таблице?
.......

Решил выложить свои наработки работы с цветом.
Использую чють-чють API
Использую чють-чють такое понятие, как програмное создание RTF текста (текст с тегами)
Использую чють-чють такое понятие - парсинг RTF текста
Остальное в подробных коментариях в коде.
Вложения
Тип файла: zip Работа с цветом в Access.zip (72.0 Кб, 47 просмотров)
3
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
23.03.2023, 11:04
И так, продолжаю цикл статей из книги Стивена Форта, Тома Хоуна и Джеймса Релстона «Microsoft Access 2000 Development»

ActiveX Data Objects (ADO).
Точнее, тут целых 2 статьи

Введение в ADO. Коротко и доступно.
В этой статье рассказывается о
- Развитие технологии доступа к данным
- Универсальная технология доступа к данным от Microsoft
- Объекты данных ActiveX (ADO)
- Объектная модель ADO
- Объект ADO Recordset
- Объект Error
- Переход от DAO к ADO
- Сравнение объектной модели DAO с ADO

Пример к статье прилагается.

Расширенные возможности ADO. Описание ADOx. Замечательная вещь. Может создавать базы, таблицы, поля, отношения, индексы, запросы ...

В этой статье
- Использование в Access провайдера OLE DB Provider
- Конструкция CurrentProject.Connection
- Подключение к базе данных с помощью связей Microsoft Data Link
- Управление связями с данными
- Программное управление связями с данными
- Использование ADO при обращении к нереляционным наборам данных
- Список пользователей Jet
- Создаваемые наборы записей
- Формирование данных
- Расширенные возможности обработки данных с помощью ADO
- Изменение данных в наборе записей
- Добавление записи
- Сохраняемые наборы данных
- Изменение структуры данных с помощью ADOx
- Объект Catalog
- Создание базы данных
- Создание таблиц и полей
- Создание связанной таблицы
- Определение свойств полей
- Создание индекса
- Создание отношений в ADOx
- Создание запросов в ADOx
- Создание представления
- Создание процедуры
- Изменение оператора SQL в запросе
И другое.

Замечания.
К сожалению, статья не полная. Потерял окончание. Так что - извините.

Примеры для VB 6 необходимо адаптировать под вашу версию Windows. Определение системных и рабочих каталогов и дисков необходимо переделать.
Я не смог найти в Проводнике пункт «Файл | Создать | Microsoft Data Link» ни в Windows 98 SE, ни Windows 2000 SP4, ни Windows XP SP2. Поэтому я создавал при помощи Блокнота пустой текстовый файл. А потом присваивал ему расширение udl.
Я не смог найти в Control Panel (Панель управления) пиктограмму Microsoft Data Links ни в Windows 98 SE, ни Windows 2000 SP4, ни Windows XP SP2. Поэтому я использовал Проводник Windows и открывать UDL-файлы непосредственно.
Кроме того надо обратить внимание на MS SQL базу для примеров. С Access поставляется база NorthwindCS, а примеры к статье ссылаются на базу Northwind. Так что надо в некоторых местах подправить код в примерах.
Я кое-где в примерах поставил свои комментарии.

Ну и в файле ADO.rar небольшой справочник по ADO.
Вложения
Тип файла: rar ADOvvedenie.rar (683.1 Кб, 31 просмотров)
Тип файла: rar ADOvozmognosti.rar (521.4 Кб, 26 просмотров)
Тип файла: rar ADOExsample.rar (870.0 Кб, 26 просмотров)
Тип файла: rar ADO.rar (15.8 Кб, 26 просмотров)
1
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
24.03.2023, 14:48
Описание элементов управления ActiveX (21 элемент)

Акцесс беден всякими примочками. Не буду спорить. Но его можно значительно обогатить используя ActiveX элементы управления. Их использование имеет как плюсы, так и минусы. Например, установка соответствующих библиотек. Не будем здесь их обсуждать. Лично я давно уже сделал себе установочную программу на VB , которая устанавливает все нужные мне ActiveX на машину заказчика. В книге Стивена Форта, Тома Хоуна и Джеймса Релстона «Microsoft Access 2000 Development» есть статья об ActiveX элементах управления, да ещё с примерами. Так, что я решил выложить скачанный материал здесь. Для пользы страждущих.
В статье дается описание элементов: Animation, Calendar, Common Dialog, DataTimePicker, FlatScrollBar, ImageCombo, ImageList, ListView, MAPIMessage, MAPISession, MonthView, ProgressBar, RichText, Slider, StatusBar, SysInfo, TabStrip, ToolBar, TreeView, UpDown, WebBrowser. Используя эти элементы можно сделать совсем неплохую программу. К статье приложены примеры.
Вложения
Тип файла: zip Manual21ActiveX.zip (898.1 Кб, 68 просмотров)
1
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
27.03.2023, 11:06
Механизм баз данных Microsoft Jet 4.0

Вам предлагается статья о Microsoft Jet 4.0. В статье дается краткий экскурс в историю и отличительные особенность версии 4.0.
Вложения
Тип файла: zip JET40.zip (39.6 Кб, 29 просмотров)
2
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
06.06.2023, 10:21
Для общего сведения

Особенности функции Round

Что нам говорит о ней справка? Вот что пишут здесь

Функция Round

Возвращает число, округленное до указанного количества десятичных разрядов.

Round(выражение[, количество_десятичных _знаков])

Синтаксис функции Round имеет следующие аргументы:

выражение - Обязательный. Числовое выражение, которое требуется округлить.

количество_десятичных _знаков - Необязательный. Число, указывающее количество цифр справа от десятичного разделителя включены округления. Если не указано, функция Округляет число до ближайшего целого числа.

И больше ничего там не написано. Но поиск в интернете даёт следующее

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

Функция Round использует логику округления к четному. Если округляемое выражение заканчивается на 5, функция округления округляет выражение так, чтобы последняя цифра была четным числом.


Пример:

Round(12.05, 1) Result: 12.0 (округление вниз)

Round(12.15, 1) Result: 12.2 (округление вверх)

Round(12.25, 1) Result: 12.2 (округление вниз)

Round(12.35, 1) Result: 12.4 (округление вверх)

Round(12.45, 1) Result: 12.4 (округление вниз)

Round(12.55, 1) Result: 12.6 (округление вверх)

Round(12.65, 1) Result: 12.6 (округление вниз)

Round(12.75, 1) Result: 12.8 (округление вверх)

Round(12.85, 1) Result: 12.8 (округление вниз)

Round(12.95, 1) Result: 13.0 (округление вверх)

Похоже, программа Access округляет числа неправильно. Как быть?

Вот здесь даётся этому разьяснение - https://studfiles.net/preview/5960642/page:52/

Дело в том, что Access использует так называемое "банковское округление".

Что такое "Банковское округление"

Вас может удивить то, что Access округляет число 21.985 до 21.98. Если вас учили округлять до большего числа, числа заканчивающиеся цифрой 5, то вы считаете, что результат должен быть 21.99. Этот способ называют арифметическим округлением. Программа Access не применяет арифметическое округление — она выбирает банковское округление, которое лучше в некоторых случаях.

Разница между арифметическим и банковским округлением заключается в трактовке цифры 5. Поскольку число 21.985 находится точно в середине, между числами 21.98 и 21.99, не просто решить, что с ним делать. При постоянном округлении числа с 5 на конце до большего числа вносится систематическое отклонение в итоги и средние значения. Поскольку вы округляете до большего чаще, чем до меньшего, любые итоги или среднее, которые вы вычисляете, получаются чуть больше, чем следовало бы.

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

Число 21.985 округляется до меньшего числа 21.98, а число 21.995 — до большего, 22. Это не единственный способ борьбы с систематическим отклонением (можно решать случайным образом, когда округлять, а когда нет), но это общепринятая практика в бухгалтерских расчетах и статистике.
1
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
19.08.2023, 14:16
Элемент управления Microsoft TreeView в 64-битном Access

Взято https://codekabinett.com/rdump... x64-access
Автор: Филипп Штифель, первоначально опубликовано 22 апреля 2020 г.

Давно хотел разместить этот материал, но всё никак не доходили руки.

Довольно часто одной из основных проблем при переходе на 64-разрядную версию Microsoft Access является элемент управления Microsoft TreeView, включенный в библиотеку общих элементов управления Microsoft Windows. Очень долгое время этот элемент управления был недоступен для 64-битной версии.
На заре 64-битного Office/Access возникла путаница по этой теме, потому что, очевидно, Microsoft включила общие элементы управления в 64-битную установку, но это были 32-битные общие элементы управления, которые не работали в 64-битных приложениях.
После многих лет бесчисленных запросов в службу поддержки и жалоб Microsoft наконец решила выпустить 64-битную версию Microsoft Common Controls, особенно для использования с Microsoft Office. Он был выпущен в обновлении 1707 от 27 июля 2017 г. (сборка 8326.2058).

Поскольку по-прежнему существует путаница относительно того, как установить и использовать 64-битную версию Microsoft Common Controls, я решил исследовать проблемы и записать свои выводы.

Полную статью смотрите в приложении
Вложения
Тип файла: rar Элемент управления Microsoft TreeView в 64-битном Access.rar (152.1 Кб, 47 просмотров)
Тип файла: zip MsTreeView64_Registry.zip (854 байт, 41 просмотров)
0
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
20.06.2024, 09:58
Наткнулся на интересную тему, которую можно назвать Бестабличный запрос SELECT в MS Access (Jet/ACE)
Заинтересовался. начал читать. Вот решил выложить то, что накопал. Возможно кому-то пригодится.

Эту тему можно разбить на несколько частей. Соответственно несколько статей. И так, часть первая.

Таблица DUAL

Таблица DUAL — это специальная таблица с одной строкой и одним столбцом, которая по умолчанию присутствует в Oracle и некоторых других базах данных. В Oracle таблица имеет единственный столбец VARCHAR2(1) с именем DUMMY и значением «X». Он подходит для использования при выборе псевдостолбца, такого как SYSDATE или USER.
Пример использования
Синтаксис SQL Oracle требует предложения FROM, но для некоторых запросов не требуются таблицы — в этих случаях можно использовать DUAL.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT 1+1
FROM dual;
 
SELECT 1 
FROM dual;
 
SELECT USER 
FROM dual;
 
SELECT SYSDATE 
FROM dual;
 
SELECT * 
FROM dual;
История

Чарльз Вайс объясняет, почему он создал DUAL:
Я создал таблицу DUAL в качестве базового объекта в словаре данных Oracle. Он никогда не предназначался для просмотра сам по себе, а вместо этого использовался внутри представления, к которому ожидался запрос. Идея заключалась в том, что вы могли бы выполнить JOIN к таблице DUAL и создать в результате две строки для каждой строки в вашей таблице. Затем, используя GROUP BY, полученное соединение можно суммировать, чтобы показать объем хранилища для экстента DATA и экстента(ов) INDEX. Название DUAL казалось подходящим для процесса создания пары строк из одной.

Оптимизация

Начиная с версии 10g Release 1, Oracle больше не выполняет физический или логический ввод-вывод с таблицей DUAL, хотя таблица все еще существует.
DUAL доступен всем авторизованным пользователям базы данных SQL.
В других системах баз данных
Некоторые другие базы данных (включая Microsoft SQL Server, MySQL, PostgreSQL, SQLite и Teradata) позволяют полностью опустить предложение FROM, если таблица не требуется. Это позволяет избежать необходимости в какой-либо фиктивной таблице.
ClickHouse имеет однострочную системную таблицу system.one с одним столбцом с именем «dummy» типа UInt8 и значением 0. Эта таблица используется неявно, когда в запросе SELECT не указана таблица.
• В Firebird имеется однострочная системная таблица RDB$DATABASE, которая используется так же, как и таблица DUAL в Oracle, хотя она также имеет собственное значение.
• В IBM Db2 есть представление, которое разрешает DUAL при использовании совместимости с Oracle. Также имеется таблица sysibm.sysdummy1, свойства которой аналогичны таблице Oracle DUAL.
Informix: Informix версии 11.50 и более поздних версий имеет таблицу с той же функциональностью, но с более подробным именем. Вы можете использовать для создания имени в текущей базе данных с той же функциональностью.sysmaster:"informix".s ysdualCREATE PUBLIC SYNONYM dual FOR sysmaster:"informix".sysdualdual
Microsoft Access : можно создать таблицу с именем DUAL и применить ограничение одной строки с помощью ADO (запрос UNION без таблиц в MS Access).
Microsoft SQL Server: SQL Server не требует фиктивной таблицы. Запросы типа «select 1 + 1» можно выполнять без имени предложения/таблицы «from».
MySQL позволяет указывать DUAL как таблицу в запросах, которым не нужны данные из каких-либо таблиц. Подходит для использования при выборе функции результата, такой как SYSDATE() или USER() , хотя это не обязательно.
PostgreSQL: можно добавить DUAL-представление для облегчения переноса из Oracle.
Snowflake: DUAL поддерживается, но не документирован явно. Он появляется в образце SQL для других операций в документации.
SQLite: представление с именем «dual», которое работает так же, как «двойная» таблица Oracle, может быть создано следующим образом: CREATE VIEW dual AS SELECT 'x' AS dummy;
• В SAP HANA есть таблица DUMMY, которая работает так же, как «двойная» таблица Oracle.
• База данных Teradata не требует фиктивной таблицы. Запросы типа «select 1 + 1» можно выполнять без имени предложения/таблицы «from».
• В официальной документации Vertica есть поддержка таблицы DUAL.

Источник: https://en.wikipedia.org/wiki/DUAL_table
0
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
20.06.2024, 10:33
Взято https://gpgonaccess.blogspot.c... table.html

Создание таблицы "DUAL"

Мой друг Банана иногда любит выйти за рамки привычного. Он первоклассный разработчик, который всегда пробует новые идеи. Поэтому для меня не было сюрпризом, когда он спросил меня, знаю ли я, что такое "DUAL Table". Я решил, что меня ждет еще одно путешествие за пределы моих существующих знаний, и не ошибся.

Это больше, чем просто двойка

Оказывается, таблица DUAL — это функция Oracle. Я не буду тратить здесь место на описание. Вы можете прочитать об этом здесь.

Oracle будет использовать DUAL в следующем операторе SQL:

SQL
1
2
SELECT 1+1
FROM DUAL
который возвращает 2.

В большинстве запросов нам не особо нужен DUAL в Access. Мы можем написать операторы SQL следующим образом:

SQL
1
SELECT 1+1;
и получить действительные результаты.

Однако есть по крайней мере одно место, где может быть полезен эквивалент таблицы DUAL — некоторые запросы UNION. В частности, мы часто заполняем поля со списком "поиска" (поля с выпадающим списком) таким запросом на объединение:

SQL
1
2
3
4
SELECT CompanyID, CompanyName
FROM tblCompany
UNION SELECT 0 AS CompanyID, " New" AS CompanyName
FROM tblCompany;
Событие AfterUpdate таких полей со списком либо перемещает фокус формы на выбранную запись (в данном случае это будет компания, определенная выбранным первичным ключом), либо, если выбрано значение 0, оно перемещает фокус формы на новую запись.

Это хорошо работает почти во всех случаях, кроме одного. Если в таблице еще нет записей (например, в таблице tblCompany еще нет записей компании), этот запрос объединения не возвращает записей, и поле со списком остается пустым; вы даже не можете выбрать "Новый", чтобы добавить первое название компании.

Чтобы обойти эту проблему, мы традиционно использовали одну из системных таблиц (например, MSysObjects) во втором предложении FROM вместо таблицы реестра, которая может быть пустой при первом использовании приложения.

SQL
1
2
3
4
SELECT CompanyID, CompanyName
FROM tblCompany
UNION SELECT 0 AS CompanyID, " New" AS CompanyName
FROM tblCompany;
Мне это никогда не нравилось, хотя, полагаю, это достаточно безопасно. Мое главное возражение не техническое; дело в том, что это может раскрыть пользователю имя системной таблицы и, возможно, открыть дверь для неразумного исследования. Я съеживаюсь, когда думаю о том, как кто-то смотрит на этот SQL и задается вопросом: «Интересно, что это за штука MSysObjects?»

В любом случае, когда мы обсуждали концепцию таблиц DUAL и говорили о том, как их создавать в Access (оказывается, это не слишком сложно), нам пришло в голову, что создание нашего собственного эквивалента таблицы «DUAL» в Access могло бы быть хорошим решением. альтернатива использованию существующей системной таблицы в запросе UNION. Вполне возможно, что есть и другие места, где он может оказаться полезным инструментом.

Чтобы быть наиболее эффективной, эта таблица должна иметь те же характеристики, что и таблица DUAL:

a) Она должна быть скрыта, чтобы у пользователей не возникало соблазна использовать ее для других целей.
б) Она должен состоять из одного столбца и содержать одну запись.
в) Не должно быть возможности изменить значение этой записи по умолчанию.

Компания Banana (также известная как BananaRepublic) предоставила для этого операторы DDL, и она и GroverParkGeorge включили их в форму. Мы обернули все это в демо-версию, которую вы можете скачать на моем сайте. Этот zip-файл содержит версии mdb (2003) и accdb (2007).

Вы можете создать одну или несколько скрытых «двойных» таблиц в любой базе данных, к которой у вас есть доступ, и даже присвоить им собственное имя. Наша демо-версия, например, уже содержит скрытые «двойные» таблицы с именами "Banana" и "GPG". Вы можете проверить их, открыв два запроса по этим именам.

Мы надеемся, что этот метод создания скрытых таблиц DUAL окажется для вас интересным и полезным.

Вот еще раз ссылка: Create an Access Dual

Не нажимайте большую красную кнопку.

Имейте в виду, что метод, который мы использовали для скрытия таблицы DUAL, не является стандартным методом, который можно вызвать в контейнере базы данных или в области навигации. Эти таблицы можно увидеть, если выбрать опцию отображения "Скрытых" объектов. Мы использовали метод "Скрытые объекты", который полностью их скрывает. Есть предостережение относительно использования этого метода.

В Jet 3.5 эти таблицы удаляются с помощью операций сжатия и восстановления.

Этого не происходит в Jet 4.0 (и ACE), но вам не следует развертывать какое-либо решение, основанное на одной из этих таблиц DUAL, пока вы его тщательно не протестируете.

Написал Grover Park George
-------------------------------------
Ну, программу я на всякий случай приложил
Вложения
Тип файла: zip createdual_3.zip (98.7 Кб, 16 просмотров)
0
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
21.06.2024, 11:57
Взято: https://stackoverflow.com/ques... 27#7933927

Бестабличный запрос UNION в MS Access (Jet/ACE)

Это работает так, как ожидалось:

SQL
1
SELECT "Mike" AS FName
А это завершается с ошибкой «Ввод запроса должен содержать хотя бы одну таблицу или запрос»:

SQL
1
2
3
SELECT "Mike" AS FName
UNION ALL
SELECT "John" AS FName
Это просто причуда/ограничение ядра базы данных Jet/ACE или я что-то упускаю?

Всё так. Механизм базы данных Access позволяет использовать одну строку SELECT без FROM источника данных. Но если вы хотите использовать UNION или UNION ALL для объединения несколько строк, вы должны включить в запрос FROM..., даже если вы не ссылаетесь ни на одно поле из этого источника данных.

Можно создать таблицу с одной строкой и добавить проверочное ограничение, гарантирующее, что в ней всегда будет одна и только одна строка.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Public Sub CreateDualTable()
    Dim strSql As String
    strSql = "CREATE TABLE Dual (id COUNTER CONSTRAINT pkey PRIMARY KEY);"
    Debug.Print strSql
    CurrentProject.Connection.Execute strSql
    strSql = "INSERT INTO Dual (id) VALUES (1);"
    Debug.Print strSql
    CurrentProject.Connection.Execute strSql
 
    strSql = "ALTER TABLE Dual" & vbNewLine & _
        vbTab & "ADD CONSTRAINT there_can_be_only_one" & vbNewLine & _
        vbTab & "CHECK (" & vbNewLine & _
        vbTab & vbTab & "(SELECT Count(*) FROM Dual) = 1" & vbNewLine & _
        vbTab & vbTab & ");"
    Debug.Print strSql
    CurrentProject.Connection.Execute strSql
End Sub
Эта Dual таблица полезна для таких запросов:

SQL
1
2
3
4
5
SELECT "foo" AS my_text
FROM Dual
UNION ALL
SELECT "bar"
FROM Dual;
Другой подход, который существует, заключается в использовании SELECT оператора совместно с TOP 1 или WHERE предложения, которое ограничивает набор результатов одной строкой.

Ограничения проверки примечаний были добавлены в Jet 4 и доступны только для операторов, выполняемых из ADO. CurrentProject.Connection.Execute strSqlработает, потому что CurrentProject.Connectionэто объект ADO. Если вы попытаетесь выполнить тот же оператор с помощью DAO (т. е. CurrentDb.Executeили с помощью конструктора запросов Access), вы получите синтаксическую ошибку, поскольку DAO не может создавать проверочные ограничения.

Уточнение

«Проверочные ограничения... доступны только для операторов, выполняемых из ADO» — не совсем верное утверждение. Хотя в конструкторе запросов Access по умолчанию используется режим запроса ANSI-89, что действительно приводит к сбою CHECK синтаксиса, вы можете изменить синтаксис конструктора запросов Access на режим запроса ANSI-92, что позволит запросу работать успешно. DAO всегда использует режим запроса ANSI-89, а ADO всегда использует режим запроса ANSI-92. Но конструктор может использовать и то, и другое.

Примеры

Если у вас есть доступ к некоторым системным таблицам, вы можете эмулировать двойную таблицу следующим образом:

(SELECT COUNT(*) FROM MSysResources) AS DUAL

К сожалению, мне не известны какие-либо системные таблицы, которые всегда доступны для чтения (MSysObjects могут быть доступны не для каждого соединения) и могут содержать ровно одну запись
Итак, можно было бы написать:

SQL
1
2
3
4
5
SELECT 'Mike' AS FName
FROM (SELECT COUNT(*) FROM MSysResources) AS DUAL
UNION ALL
SELECT 'John' AS FName
FROM (SELECT COUNT(*) FROM MSysResources) AS DUAL
MSysResources - таблица, доступная для чтения
Это то, что реализовано как синтаксический элемент.
1
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
24.06.2024, 15:03
Взято туг: сайт "Хижина разработчиков" VBA – Run PowerShell Command

VBA — запуск команды PowerShell

Выполнение команды PowerShell из VBA

Давайте сначала рассмотрим простое выполнение команды. Во многих случаях мы просто хотим запустить команду PowerShell и не нуждаемся в возврате значения.
PowerShell можно просто вызвать/выполнить из стандартной командной строки с помощью команды
Visual Basic
1
powershell -команда
Вооружившись этой информацией, можно просто использовать объект WScript Shell для выполнения команды, что дает нам простую функцию вроде
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'---------------------------------------------------------------------------------------
' Procedure : PS_Execute
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Run a PowerShell command
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Late Binding  -> none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sPSCmd : PowerShell command to run
'
' Usage:
' ~~~~~~
' Copy a File
'   PS_Execute "Copy-Item -Path C:\temp\Book1.xls -Destination C:\temp\charts\Book1.xls -Force"
' Create a Directory or Directories
'   PS_Execute "New-Item -Path 'C:\temp\charts\Test' -ItemType Directory"
'   Can do multiple directories in one call!
'   PS_Execute "New-Item -Path 'C:\temp\charts\Test\1\2\3\4' -ItemType Directory"
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' ***********************************************************************************
' 1         2020-04-13              Initial Release
'---------------------------------------------------------------------------------------
Public Sub PS_Execute(ByVal sPSCmd As String)
    'Setup the powershell command properly
    sPSCmd = "powershell -command " & sPSCmd
    'Execute and capture the returned value
    CreateObject("WScript.Shell").Exec (sPSCmd)
End Sub
Проблема с вышеизложенным заключается в том, что он создает видимое окно PowerShell, которое увидит конечный пользователь. К счастью, мы можем внести небольшое изменение, чтобы избежать этого. Переключившись с использования .Exec на .Run, мы можем автоматически запускать команды PowerShell. Таким образом, наша процедура становится
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
'---------------------------------------------------------------------------------------
' Procedure : PS_Execute
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Run a PowerShell command
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Late Binding  -> none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sPSCmd : PowerShell command to run
'
' Usage:
' ~~~~~~
' Copy a File
'   PS_Execute "Copy-Item -Path C:\temp\Book1.xls -Destination C:\temp\charts\Book1.xls -Force"
' Create a Directory or Directories
'   PS_Execute "New-Item -Path 'C:\temp\charts\Test' -ItemType Directory"
'   Can do multiple directories in one call!
'   PS_Execute "New-Item -Path 'C:\temp\charts\Test\1\2\3\4' -ItemType Directory"
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' ************************************************************************************
' 1         2020-04-13              Initial Release
' 2         2024-02-07              Added quotes around command string
'                                   Added ExecutionPolicy, bShowShell, bDebug arguments
'---------------------------------------------------------------------------------------
Public Sub PS_Execute(ByVal sPSCmd As String, _
                      Optional sExecutionPolicy As String, _
                      Optional bShowShell As Boolean = False, _
                      Optional bDebug As Boolean = False)
    'Setup the powershell command properly
    If sExecutionPolicy = "" Then
        sPSCmd = "powershell -command """ & sPSCmd & """"
    Else
        sPSCmd = "powershell -executionpolicy " & sExecutionPolicy & " -command """ & sPSCmd & """"    'Required to make BurntToast work
    End If
    If bDebug Then Debug.Print sPSCmd
    'Execute the command
    If bShowShell Then
        CreateObject("WScript.Shell").Run sPSCmd, 1, True    'Display to user
    Else
        CreateObject("WScript.Shell").Run sPSCmd, 0, True    'Hide from user
    End If
End Sub
Теперь, когда мы знаем основы, давайте посмотрим, как мы можем вернуть ответ из команд PowerShell.

Возврат значения PowerShell в VBA

Следующий шаг — вернуть ответ в случае его создания. К счастью для нас, объект WScript Shell предоставляет нам все необходимое благодаря свойству StdOut (стандартный вывод) и методу ReadAll .
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
'---------------------------------------------------------------------------------------
' Procedure : PS_GetOutput
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : [url]http://www.cardaconsultants.com[/url]
' Purpose   : Run a PowerShell command and return the response
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - [url]https://creativecommons.org/licenses/by-sa/4.0/[/url]
' Req'd Refs: Late Binding  -> none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sPSCmd : PowerShell command to run and return the value/response of
'
' Usage:
' ~~~~~~
' ? PS_GetOutput("Get-ComputerInfo -Property 'OsName'")
'   Returns
'       OsName
'       ------
'       Microsoft Windows 10 Home
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' ************************************************************************************
' 1         2020-04-13              Initial Release
'---------------------------------------------------------------------------------------
Public Function PS_GetOutput(ByVal sPSCmd As String) As String
    'Setup the powershell command properly
    sPSCmd = "powershell -command " & sPSCmd
    'Execute and capture the returned value
    PS_GetOutput = CreateObject("WScript.Shell").Exec(sPSCmd).StdOut.ReadAll
End Function
Теперь проблема с вышеизложенным заключается в том, что он открывает приглашение PowerShell и делает его видимым для пользователя во время выполнения команды. Так что это далеко не идеал.

Тихое получение ответа PowerShell

Один из подходов к получению ответа PowerShell — просто вывести ответ команды в текстовый файл.
Первоначально я пытался сделать это, добавив команду PowerShell, как мы делаем в DOS… (ну, кто с ним работал)
sPSCmd = "powershell -command" & sPSCmd & ">" & sFile
К моему удивлению, текстовый файл, прочитанный обратно в память, оказался в беспорядке.
Visual Basic
1
2
3
4
5
6
7
ÿþ
 
 O s N a m e                                       
 
 - - - - - -                                       
 
 M i c r o s o f t   W i n d o w s   1 0   H o m e
Похоже, что по умолчанию используется формат Unicode. К счастью для меня, PowerShell предлагает другой способ экспорта файла и указание используемого формата. Итак, я смог настроить код, чтобы получить стандартный текстовый файл ASCII, и вернулся к делу. Конечный результат был
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
'---------------------------------------------------------------------------------------
' Procedure : PS_GetOutput
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : [url]http://www.cardaconsultants.com[/url]
' Purpose   : Run a PowerShell command and return the response
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - [url]https://creativecommons.org/licenses/by-sa/4.0/[/url]
' Req'd Refs: Late Binding  -> none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sPSCmd        : PowerShell command to run and return the value/response of
' sTxtFile      : Text file to output the response to and then read from
' bDelTxtFile   : Whether to delete the generated text file or not
'
' Usage:
' ~~~~~~
'?PS_GetOutput("Get-ComputerInfo -Property 'OsName'", _
'               Environ("userprofile") & "\Desktop\PSTest.txt", False)
'?PS_GetOutput("Get-ComputerInfo -Property 'OsName'")
'   Returns
'       OsName
'       ------
'       Microsoft Windows 10 Home
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' ****************************************************************************
' 1         2020-04-13              Initial Release
'---------------------------------------------------------------------------------------
Public Function PS_GetOutput(ByVal sPSCmd As String, _
                              Optional sTxtFile As String = "", _
                              Optional bDelTxtFile As Boolean = True) As String
    'If no Text file was specified create one in the Temp folder
    If sTxtFile = "" Then sTxtFile = Environ("temp") & "\PSTemp.txt"
    'Build the basic PowerShell command
    sPSCmd = "powershell -command " & sPSCmd
    'Add the Out-File so the output generates a text file
    sPSCmd = sPSCmd & " | Out-File '" & sTxtFile & "' -encoding ASCII"
    'Run the PowerShell command
    CreateObject("WScript.Shell").Run sPSCmd, 0, True
    'Retrieve the content of the generated Text file
    With CreateObject("Scripting.FileSystemObject")
        'Read the contents of the text file into memory
        PS_GetOutput = .OpenTextFile(sTxtFile).ReadAll()
        'Delete the text file if so desired
        If bDelTxtFile = True Then .DeleteFile sTxtFile
    End With
End Function
Теперь все вышеперечисленное нормально, но оно бесполезно использует ввод-вывод, постоянно читая/записывая на жесткий диск. Поэтому я хотел бы представить еще один вариант, который предлагает нам объект WScript Shell, а именно поместить результат в буфер обмена. Итак, ниже приведен пример, в котором объект WScript Shell выполняет команду PowerShell автоматически (не показывается пользователю) и сохраняет результат в буфер обмена, откуда мы затем можем легко его получить.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
'---------------------------------------------------------------------------------------
' Procedure : PS_GetOutput
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : [url]http://www.cardaconsultants.com[/url]
' Purpose   : Run a PowerShell command and return the response
'               Improved version where the PS prompt is never displayed to the user
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - [url]https://creativecommons.org/licenses/by-sa/4.0/[/url]
' Req'd Refs: Late Binding  -> none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sPSCmd : PowerShell command to run and return the value/response of
'
' Usage:
' ~~~~~~
' ? PS_GetOutput("Get-ComputerInfo -Property 'OsName'")
'   Returns
'       OsName
'       ------
'       Microsoft Windows 10 Home
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' ****************************************************************************
' 1         2020-11-05              Initial Release
'---------------------------------------------------------------------------------------
Public Function PS_GetOutput(ByVal sPSCmd As String) As String
    'Setup the powershell command properly
    sPSCmd = "powershell -command " & sPSCmd & "|clip"
    'Execute the command which is being pushed to  the clipboard
    CreateObject("WScript.Shell").Run sPSCmd, 0, True
    'Get an instance of the clipboard to capture the save value
    With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        PS_GetOutput = .GetText(1)
    End With
End Function
Итак, с помощью нескольких строк кода мы можем получить всю мощь PowerShell без необходимости чтения и записи на жесткий диск.

А как насчет повышенных привилегий – Запуск от имени?

Выполнение команды с повышенными привилегиями

Одна вещь, которую я заметил, играя с PowerShell на своем ПК, чтобы получить информацию, содержащуюся в этом документе, заключается в том, что для работы многих команд, по-видимому, требуется запуск от имени администратора, хотя выполнение того же действия вручную не требуется. Примером этого может быть отключение Wi-Fi, отключение диспетчера очереди печати; Я могу сделать это в несколько кликов без UAC, но через PowerShell мне приходится использовать «Запуск от имени».
Короче говоря, я хотел найти способ сделать то же самое в VBA, потребовалось немного поиграться, чтобы получить правильный синтаксис “ и ' в нужных местах, но конечный результат
Visual Basic
1
2
3
4
5
6
7
Public Sub PS_Admin_Execute(ByVal sPSCmd As String)
'Setup the powershell command properly
    sPSCmd = "powershell -command ""Start-Process powershell -Verb runAs " & _
             "-ArgumentList '-Command " & sPSCmd & "'"""
    'Execute and capture the returned value
    CreateObject("WScript.Shell").Run sPSCmd, 0, True
End Sub
Итак, хитрость заключается в том, чтобы запустить экземпляр PowerShell, указать ему запустить другой экземпляр с повышенными привилегиями и выполнить вашу команду.
Вышеупомянутое действительно работает, но есть одна небольшая проблема. Хотя окно запуска WScript скрыто, дополнительные окна PowerShell — нет. Опять же, благодаря возможностям PowerShell, это легко исправить: мы добавляем аргумент -WindowStyle при создании второго экземпляра. Таким образом, процедура просто становится
Visual Basic
1
2
3
4
5
6
7
Public Sub PS_Admin_Execute(ByVal sPSCmd As String)
'Setup the powershell command properly
    sPSCmd = "powershell -command ""Start-Process powershell -Verb runAs -WindowStyle Hidden " & _
             "-ArgumentList '-Command " & sPSCmd & "'"""
    'Execute and capture the returned value
    CreateObject("WScript.Shell").Run sPSCmd, 0, True
End Sub
Затем, учитывая вышеизложенное, вы можете просто сделать, например:

Остановить/запустить диспетчер очереди печати

Visual Basic
1
2
PS_Admin_Execute "Stop-Service -Name spooler"
PS_Admin_Execute "Start-Service -Name spooler"

Отключить/включить адаптер Wi-Fi

Visual Basic
1
2
PS_Admin_Execute "get-netadapter wi-fi |disable-netadapter -confirm:$false"
PS_Admin_Execute "get-netadapter wi-fi |enable-netadapter"
Получение результатов выполнения команды с повышенными привилегиями

Как и в другом случае, мы можем использовать буфер обмена с аргументом runAs Verb. Таким образом, мы получим что-то вроде
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 
Public Function PS_Admin_GetOutput(ByVal sPSCmd As String) As String
Dim i As Long
 
'Setup the powershell command properly
    sPSCmd = "powershell -command ""Start-Process powershell -Verb runAs -WindowStyle Hidden " & _
             "-ArgumentList '-Command " & sPSCmd & "|clip'"""
    'Execute and capture the returned value
    CreateObject("WScript.Shell").Run sPSCmd, 0, True
    With CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        'Wait for a value to appear in the clipboard, remember PowerShell is slow!
        On Error Resume Next
        For i = 0 To 100
            PS_Admin_GetOutput = .GetText(1)
            If Err.Number <> 0 Then
                Err.Clear
            Else
                Exit For
            End If
            Sleep 100 'Don't forget the API declaration!
        Next i
    End With
End Function
Обратите внимание, что мне пришлось добавить цикл со спящим режимом/задержкой, чтобы дождаться создания экземпляра PowerShell, запустить команду и вернуть ее ответ.
Вышеупомянутую функцию затем можно использовать, выполнив
Получить имя ОС
Visual Basic
1
? PS_Admin_GetOutput("Get-ComputerInfo -Property ""OsName""")
UAC во всем этом?!

Вышеупомянутое работает нормально, но обратите внимание, что вы получаете приглашение UAC, которое вам необходимо авторизовать для выполнения команды, и я не нашел способа обойти это. Это вопрос безопасности!
Из-за этой проблемы, как подсказывает UAC, я бы советовал не использовать этот подход «Запуск от имени» повсеместно. Используйте исходный стандартный код для всего, что можете, чтобы вашим пользователям не приходилось сталкиваться с какими-либо подсказками, но если вам когда-нибудь действительно понадобится использовать команды, требующие повышенных разрешений, вы можете использовать этот код.

Несколько последних слов на эту тему

Как видно из кода, эти функции полностью неспецифичны для приложения и могут использоваться в любом приложении, поддерживающем VBA (Access, Excel, Outlook, PowerPoint, Word и т. д.), что делает их для нас гораздо более полезными.
Один общий комментарий: PowerShell медленный, мощный, но медленный. Таким образом, запуск команд PowerShell может вызвать задержки по сравнению с другими функциями. Так что подумайте хорошенько, чтобы убедиться, что есть лучшие альтернативы. Тем не менее, PowerShell открывает совершенно новый мир возможностей, выходящих за рамки того, что мы обычно можем делать с помощью VBA!
Также не забудьте добавить обработку ошибок! То, что я представил выше, работает прекрасно, но все еще является голым, и вам следует добавить правильную обработку ошибок, чтобы избежать неприятных сюрпризов для ваших конечных пользователей.
Если вы хотите больше узнать о оболочке Windows, обратитесь к https://docs.microsoft.com/en-... 7(v=vs.84)
Кроме того, я хотел отметить, что если вы используете метод .Exec (который отображается пользователю), вы можете дождаться запуска команды и проверить возвращенный статус, чтобы узнать, завершена ли команда или не выполнена, но это не так. Кажется, невозможно сделать то же самое, используя метод .Run?! Поэтому, если вы заинтересованы в переходе на этот уровень кодирования, это возможно, но вы должны использовать .Exec, проверить свойство Status, а затем вернуть свойство StdErr с помощью метода ReadAll.
Наконец, мои процедуры используют исключительно параметр командной строки powershell « -Command », чтобы сделать его максимально универсальным, но обратите внимание, что в зависимости от того, что вы делаете, можно использовать гораздо больше, в первую очередь « -NoProfile », ' -NonInteractive ', ' -OutputFormat ', ' -ExecutionPolicy '. Полный список обязательно просмотрите: about_PowerShell_exe .
Я искренне надеюсь, что это поможет некоторым из вас. Было интересно немного изучить эту тему.
https://web.archive.org/web/20... rshell-5.1
0
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
27.06.2024, 12:21
Взято Get a String Hash using VBA

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


Получить хэш строки с помощью VBA

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
'---------------------------------------------------------------------------------------
' Procedure : PS_GetStringHash
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Returns the specified Hash for the supplied string.
'             Utilizes PowerShell to perform the Hashing.
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Late Binding  -> none required
' Dependencies: Requires PS_GetOutput()
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sInput            : String to get the Hash of
' sHashAlgorithm    : Algorithm to use for the Hashing: MACTripleDES, MD5, RIPEMD160
'                     SHA1, SHA256, SHA384 or SHA512
'
' Usage:
' ~~~~~~
' PS_GetStringHash("Testing The Code A Little Bit", "MD5")
'   Returns -> D2A8E6028DEDC41F87E133E036DCCDE2
' PS_GetStringHash("Testing The Code A Little Bit", "RIPEMD160")
'   Returns -> 2037F4F018759E0EC813213CA36ACC20236891D8
' PS_GetStringHash("Testing The Code A Little Bit", "SHA256")
'   Returns -> FB58DAE56E917CD5F5B4A5DEFDEB46B0222E09C660226A69D19381442ABBA51D
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2021-10-06              Initial Public Release
' 2         2022-11-22              Remove trailing vbCrLf per comment by Leslie Desser
'---------------------------------------------------------------------------------------
Function PS_GetStringHash(sInput As String, sHashAlgorithm As String) As String
 
    Dim sPSCmd                As String
 
    On Error GoTo Error_Handler
 
    Select Case sHashAlgorithm
        Case "MACTripleDES", "MD5", "RIPEMD160", "SHA1", "SHA256", "SHA384", "SHA512"
        Case Else
            MsgBox "Unknown Algorithm", vbCritical Or vbOKOnly, "Operation Aborted"
            GoTo Error_Handler_Exit
    End Select
    sPSCmd = "(Get-FileHash -InputStream ([System.IO.MemoryStream]::" & _
             "New([System.Text.Encoding]::ASCII.GetBytes('" & sInput & "'))) " & _
             "-Algorithm " & sHashAlgorithm & ").Hash"
    PS_GetStringHash = PS_GetOutput(sPSCmd)
    PS_GetStringHash = Replace(PS_GetStringHash, vbCrLf, "")
 
Error_Handler_Exit:
    On Error Resume Next
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occured" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: PS_GetStringHash" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occured!"
    Resume Error_Handler_Exit
End Function
Функция PS_GetOutput(sPSCmd) описана в предыдущем посте.
Параметр sHashAlgorithm можно сделать опционным. По умолчанию используется алгоритм SHA256

Итак, как вы можете видеть, используя VBA, мы теперь можем использовать некоторые очень мощные командлеты PowerShell. Таким образом, мы можем выполнить одну строку командной строки PowerShell и получить то, что нам нужно!

Как объяснено в документации PowerShell Get-FileHash, мы можем использовать любой из 7 различных алгоритмов хеширования:

MACTripleDES
MD5
RIPEMD160
SHA1
SHA256
SHA384
SHA512


что делает эту функцию весьма универсальной.

Добавлено через 11 минут
Примечание

Лесли Дессер 23 ноября 2022 г., 3:44

Однако использование буфера обмена имеет побочный эффект: пользователь потеряет все, что ранее хранилось в буфере обмена. Другая сторона медали — в буфере обмена теперь есть то, что вернула функция.
Эта «утечка» может быть проблемой в некоторых случаях.

Чтобы учесть эти моменты, действительно необходимо сохранить старое значение буфера обмена и восстановить его до завершения программы.
0
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
28.06.2024, 21:15
Чтобы не пропало VBA – получение хеша строки без PowerShell
0
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
01.07.2024, 13:07
Просто для полноты коллекции. Взято тут Get a File Hash using VBA

Получить хэш файла с помощью VBA

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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
'---------------------------------------------------------------------------------------
' Procedure : PS_GetFileHash
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Returns the specified Hash for the supplied file.
'             Utilizes PowerShell to perform the Hashing.
'             Can handle files in excess of 2GB and is faster that standard VBA version.
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Late Binding  -> none required
' Dependencies: Requires PS_GetOutput()
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sFile             : Fully qualified path and filename to get the Hash of
' sHashAlgorithm    : Algorithm to use for the Hashing: MACTripleDES, MD5, RIPEMD160
'                     SHA1, SHA256, SHA384 or SHA512
'
' Usage:
' ~~~~~~
' PS_GetFileHash("C:\Temp\test.xlsx", "MD5")
'   Returns -> 82BACEED94ACB83CA9B75F69244A2978
' PS_GetFileHash("C:\Temp\Office2013.iso", "SHA1")
'   Returns -> F5D743B0909024F718F65C4C72DE4AA1BE6352C3
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2021-10-06              Initial Public Release
'---------------------------------------------------------------------------------------
Function PS_GetFileHash(sFile As String, sHashAlgorithm As String) As String
    Dim sPSCmd                As String
 
    On Error GoTo Error_Handler
 
    Select Case sHashAlgorithm
        Case "MACTripleDES", "MD5", "RIPEMD160", "SHA1", "SHA256", "SHA384", "SHA512"
        Case Else
            MsgBox "Unknown Algorithm", vbCritical Or vbOKOnly, "Operation Aborted"
            GoTo Error_Handler_Exit
    End Select
    sPSCmd = "(Get-FileHash '" & sFile & "' -Algorithm " & sHashAlgorithm & ").Hash"
    PS_GetFileHash = PS_GetOutput(sPSCmd)
 
Error_Handler_Exit:
    On Error Resume Next
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occured" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: PS_GetFileHash" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occured!"
    Resume Error_Handler_Exit
End Function
Обратите внимание, что для этой функции требуется функция PS_GetOutput. Описана здесь

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

Просмотрев код, вы увидите, что PowerShell в настоящее время предлагает нам на выбор 7 различных алгоритмов хеширования:

МАКТриплДЕС
MD5
RIPEMD160
SHA1
SHA256
SHA384
SHA512


таким образом, простая функция становится весьма универсальной.

Обратите внимание, алгоритмы SHA1 и MD5 считаются недостаточно устойчивыми к взлому.

Надеюсь, это поможет некоторым из вас.
0
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
12.08.2025, 13:20
Поле типа Вложение (Attachment). Описание и использование

Вложение (Attachment) — используется для вложения в поле записи файлов изображений, электронных таблиц, документов, диаграмм и других файлов поддерживаемых типов точно так же, как в сообщения электронной почты.
Вложенные файлы можно просматривать и редактировать в соответствии с заданными для поля параметрами. Эти поля не имеют ограничений, связанных с отсутствием зарегистрированных OLE-серверов. Они более рационально используют место для хранения, чем поля с типом данных Поле объекта OLE (OLE Object), поскольку не создают растровые изображения исходного файла. Максимальная длина поля для сжатых вложений — 2 Гбайт, для несжатых — примерно 700 Кбайт в зависимости от степени возможного сжатия вложения.

Использование данных типа Вложение

Тип данных Вложение (Attachment) можно использовать для хранения нескольких файлов в одном поле, причем в этом поле можно хранить файлы разных типов. Например, в таблице ТОВАР можно в поле с типом данных Вложение добавить несколько файлов со сведениями о товаре: сертификат происхождения, сертификат качества, инструкцию по эксплуатации, рекламации, фотографии, схемы и т. д.
Вкладывать файлы можно только в базы данных, созданные в приложении Access 2007 (и выше) в формате файла ACCDB.
Тип данных Вложение (Attachment) предлагается для хранения изображений и документов вместо типа данных Поле объекта OLE (OLE Object). Вложениям необходимо значительно меньше места для хранения и не требуется применения программ, называемых OLE-серверами.
В соответствии с правилами нормализации каждое поле в реляционной базе данных должно содержать только один элемент данных. В противном случае поиск данных будет затруднен или даже невозможен. Вложения нарушают правила разработки базы данных, поскольку в поле можно добавлять несколько файлов — элементов данных. Чтобы избежать этих нарушений, Access по мере добавления файлов вложения создает системные таблицы, которые неявно используются для нормализации данных.

Размещение вложений
Добавим поле вложения в таблицу базы данных ТОВАР. Access 2007 (и выше) предоставляет два способа добавления поля вложения в таблицу. Такое поле можно добавить в режиме таблицы или в режиме конструктора. В любом режиме для поля достаточно выбрать тип данных Вложение (Attachment). В режиме таблицы в строке заголовка поля вложения отображается значок скрепки, и в него нельзя ввести текст. В режиме конструктора можно изменить имя поля и в свойстве поля ввести подпись, например, Поле вложений, которая заменит значок скрепки в заголовке поля вложения.

ЗАМЕЧАНИЕ
Преобразовать поле вложения в поле с другим типом данных невозможно. Такое поле можно только удалить.

Для добавления и изменения вложений служит диалоговое окно Вложения (Attachments) . Это диалоговое окно можно открыть двойным щелчком в поле вложения в таблице. Файлы вложений сохраняются в базе данных.
В окне Вложения (Attachments) перечислены добавленные файлы, а в поле вложений указано их число.
Вложения можно просматривать и редактировать, нажав в окне Вложения кнопку Открыть (Open). Для открытия вложения используются программы, в которых создавались эти файлы, или программы, поддерживающие файлы такого типа. Например, при открытии вложенного в таблицу рисунка BMP запускается программа просмотра фотографий Windows, при открытии документа Word запускается приложение Word, и работа с документом происходит в этом приложении. Если приложение Word не установлено на компьютере, откроется диалоговое окно с предложением выбрать программу для работы с файлом.
Для рисунка, открытого в программе просмотра, выполните команду Открыть и выберите программу, с помощью которой можно выполнить редактирование рисунка.
Отредактируйте открытый файл средствами открывшей его программы. Сохраните внесенные в файл изменения и завершите работу программы. При этом все изменения вложенного файла сохранятся во временной копии файла на жестком диске в папке временных файлов Интернета.
Чтобы сохранить изменения в базе данных, вернитесь в Access и в диалоговом окне Вложения (Attachments) нажмите кнопку OK. Окно закроется, и появится сообщение с предложением сохранить вложенный файл нажмите кнопку Да.
Любой из файлов или все файлы, вложенные в поле записи, можно сохранить на жестком диске или в сети. В диалоговом окне Вложения (Attachments) щелкните соответственно кнопку Сохранить как (Save As) или Сохранить все (Save All). В диалоговом окне Сохранить вложения (Save Attachment)[/B] выберите папку для нового расположения файла или всех файлов вложения и нажмите кнопку Сохранить (Save)[/B].
При использовании поля вложений в форме или отчете на элементе управлени отображаются и могут просматриваться без использования дополнительного программного обеспечения вложения таких форматов графических файлов, как BMP, PNG, GIF, JPEG, JPG, TIFF, TIF и ряда других, непосредственно поддерживаемых Access. Для неграфических файлов на элементе управления отображается значок программы, создавшей файл. Для элемента управления в форме, так же как и в таблице, доступно окно Вложения (Attachments) со всеми его командами управления. В формах и отчетах для перехода по файлам и вызова окна Вложения используется прозрачная мини-панель инструментов , вызываемая щелчком мыши в элементе управления.
Как правило, в качестве вложений можно использовать файлы, созданные в любых программах Microsoft Office. Кроме того, вложениями могут служить файлы жур нала (LOG), текстовые файлы (TEXT, TXT) и сжатые ZIP-файлы.

Для работы с полями типа Вложение (Attachment) необходимо использовать VBA. Впрочем бывают и исключения.

Удаление вложений с помощью запроса
Статья Даниэля Пино

Работая над клиентской базой данных, мне нужно было удалить вложения, связанные с записью, и не удалось заставить ее работать с использованием стандартного синтаксиса DELETE
SQL
1
DELETE MyAttachments FROM Att
который будет генерировать следующую ошибку

Запрос UPDATE или DELETE не может содержать многозначное поле

Я искал и не мог найти прямой способ удаления вложений с помощью простого запроса. Каждый столбец, с которым я столкнулся, всегда указывал на использование кода VBA. Поэтому я выпустил SOS для своих коллег Access MVP, и к счастью для меня Брент Сполдинг пришел мне на помощь!

Решение удивительно неясное, но простое! Используйте .Value . Если мы изменим исходный запрос на
SQL
1
DELETE MyAttachments.Value FROM Att
Да, это простое решение решает проблему! Теперь запрос будет эффективно работать и удалять вложения.

К любому такому запросу вы можете добавить другие стандартные предложения (WHERE, HAVING).

Только SQL View!
Однако важно отметить, что вам нужно создать инструкцию SQL в SQL View (текстовом редакторе SQL запросов). Access испортит синтаксис, если вы используете режим Design View. Поэтому вам нужно создать такой запрос с помощью текстового редактора, иначе он не сработает. Просто переход из SQL View в Design View испортит синтаксис и сгенерирует ошибку, относящуюся к многозначному полю, как показано ниже.

Нельзя ссылаться на многозначное поле в инструкции UPDATE или DELETE, которая содержит другие поля

Примечание.
Это еще раз иллюстрирует, почему следует избегать полей Attachment, Lookups и любого другого такого многозначного поля, как чуму. Microsoft реализовала такие вещи так плохо, что вы не можете управлять ими самостоятельно! Не поймите меня неправильно, к счастью для меня. У Brent есть обходное решение для меня, но на самом деле для обычного пользователя нет решения, так как они не могут построить такой запрос с помощью QBE.
Проще говоря, многозначные поля (MVF) нарушили Access. Когда вы больше не можете управлять значениями полей базы данных с помощью стандартных запросов, вы нарушили базу данных, и это именно то, что Microsoft сделала несколько лет назад. Стремясь упростить и улучшить Access, они фактически сделали его неуправляемым и фактически создали большую проблему, чем когда-либо фиксировалась.

Я просто закончу тем, что произнесу большое БЛАГОДАРЮ, Брент! (с)

А вот так выглядит очистка поля на VBA.

Удаление вложений (Attachment) при помощи VBA

Взято с сайта sql.ru
Для поля с вложением нужно использовать DAO.Recordset2
этот тип рекордсета предназначен для работы именно с этими полями
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Function RemoveAttachment(strRemoveFile As String, Optional strFilter As String) As Long
'RemoveAttachment "*.pdf" 'вызов функции - можно указать удаляемые файлы
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset2
    Dim rsA As DAO.Recordset2
    Dim fld As DAO.Field2
    Set dbs = CurrentDb
    If Len(strFilter) > 0 Then 'tblAttachments - запрос на выборку записей в которых чистим вложения 
        Set rst = dbs.OpenRecordset("SELECT * FROM tblAttachments WHERE " & strFilter)
    Else
        Set rst = dbs.OpenRecordset("tblAttachments")
    End If
    Set fld = rst("FileV") 'FileV - имя поля с вложениями
    Do While Not rst.EOF
        Set rsA = fld.Value
        Do While Not rsA.EOF
            If rsA("FileName") Like strRemoveFile Then
                rsA.Delete
                RemoveAttachment = RemoveAttachment + 1
            End If
            rsA.MoveNext
        Loop
        rsA.Close
        Set rsA = Nothing
        rst.MoveNext
    Loop
    rst.Close
    dbs.Close
    Set fld = Nothing
    Set rst = Nothing
    Set dbs = Nothing
    MsgBox "Успешно! Удалено вложений - " & RemoveAttachment
End Function
Загрузка/извлечение файлов в/из записи путем программирования

Access позволяет использовать модель объектов и интерфейсы программирования для вложения и извлечения файлов в записи программным путем с помощью кода VBA (Visual Basic для приложений). Дополнительные сведения см. в статьях "LoadFromFile" и "SaveToFile" на веб-сайте MSDN https://msdn.microsoft.com.

Загрузка файлов в поле Вложение (Attachment)
Метод DAO

Синтаксис
expression.LoadFromFile(имя_файла)

expression - Переменная, представляющая объект Field2 .
имя_файла - строка, полный путь к файлу, который вы хотите загрузить.

пример
Следующий фрагмент кода использует метод LoadFromFile для загрузки изображения сотрудника с диска.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'  Instantiate the parent recordset.  
   Set rsEmployees = db.OpenRecordset("Employees") 
  
   … Code to move to desired employee 
  
   ' Activate edit mode. 
   rsEmployees.Edit 
  
   ' Instantiate the child recordset. 
   Set rsPictures = rsEmployees.Fields("Pictures").Value  
  
   ' Add a new attachment. 
   rsPictures.AddNew 
   rsPictures.Fields("FileData").LoadFromFile "EmpPhoto39392.jpg" 
   rsPictures.Update 
  
   ' Update the parent record 
   rsEmployees.Update
В следующем примере показано, как добавлять файлы из указанного пути папки в поле вложения.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Public Function LoadAttachments(strPath As String, Optional strPattern As String = "*.*") As Long
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset2
    Dim rsA As DAO.Recordset2
    Dim fld As DAO.Field2
    Dim strFile As String
    
    'Get the database, recordset, and attachment field
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("tblAttachments")
    Set fld = rst("Attachments")
    
    'Navigate through the table
    Do While Not rst.EOF
    
        'Get the recordset for the Attachments field
        Set rsA = fld.Value
        
        'Load all attachments in the specified directory
        strFile = Dir(strPath & "\*.*")
        
        rst.Edit
        Do While Len(strFile) > 0
            'Add a new attachment that matches the pattern.
            'Pass "" to match all files.
            If strFile Like strPattern Then
                rsA.AddNew
                rsA("FileData").LoadFromFile strPath & "\" & strFile
                rsA.Update
                
                'Increment the number of files added
                LoadAttachments = LoadAttachments + 1
            End If
            strFile = Dir
        Loop
        rsA.Close
        
        rst.Update
        'Next record
        rst.MoveNext
    Loop
    
    rst.Close
    dbs.Close
    
    Set fld = Nothing
    Set rsA = Nothing
    Set rst = Nothing
    Set dbs = Nothing
End Function
Пример кода предоставляется: The Microsoft Access 2010 Справочник программиста

Продолжение следует
0
 Аватар для Silur
1365 / 285 / 16
Регистрация: 16.01.2014
Сообщений: 896
12.08.2025, 13:27
Продолжение

Выгрузка файлов из поля Вложение (Attachment)
Метод DAO

Синтаксис
expression.SaveToFile(FileName)

expression - Переменная, представляющая объект Field2 .
FileName - строка, полный путь к файлу, в который вы хотите сохранить вложение.

Пример
Следующий фрагмент кода иллюстрирует использование метода SaveToFile для сохранения всех вложений для конкретного сотрудника на диск.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'  Instantiate the parent recordset.  
   Set rsEmployees = db.OpenRecordset("Employees") 
  
   … Code to move to desired employee 
  
   ' Instantiate the child recordset. 
   Set rsPictures = rsEmployees.Fields("Pictures").Value  
 
   '  Loop through the attachments. 
   While Not rsPictures.EOF 
  
      '  Save current attachment to disk in the "My Documents" folder. 
      rsPictures.Fields("FileData").SaveToFile _ 
                  "C:\Documents and Settings\Username\My Documents" 
      rsPictures.MoveNext 
   Wend
В следующем примере показано, как сохранить файлы, сохраненные в поле вложения, указанному пути к папке.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Public Function SaveAttachments(strPath As String, Optional strPattern As String = "*.*") As Long
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset2
    Dim rsA As DAO.Recordset2
    Dim fld As DAO.Field2
    Dim strFullPath As String
    
    'Get the database, recordset, and attachment field
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("tblAttachments")
    Set fld = rst("Attachments")
    
    'Navigate through the table
    Do While Not rst.EOF
    
        'Get the recordset for the Attachments field
        Set rsA = fld.Value
        
        'Save all attachments in the field
        Do While Not rsA.EOF
            If rsA("FileName") Like strPattern Then
                strFullPath = strPath & "\" & rsA("FileName")
                
                'Make sure the file does not exist and save
                If Dir(strFullPath) = "" Then
                    rsA("FileData").SaveToFile strFullPath
                End If
                
                'Increment the number of files saved
                SaveAttachments = SaveAttachments + 1
            End If
            
            'Next attachment
            rsA.MoveNext
        Loop
        rsA.Close
        
        'Next record
        rst.MoveNext
    Loop
    
    rst.Close
    dbs.Close
    
    Set fld = Nothing
    Set rsA = Nothing
    Set rst = Nothing
    Set dbs = Nothing
End Function
Пример кода предоставляется: The Microsoft Access 2010 Справочник программиста

В приложении статья с support.office.com

------------------------------------------------------------------------
Взято здесь - https://access-programmers.co.... p?t=180349

Часть решения найдена с помощью Palvo ( http://sites.google.com/site/msaccesscode/ ). Это Loop в основном цикле.

Это код для копирования записи с типом данных вложения:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Dim rstFrom As ADODB.Recordset
Dim rstTo As ADODB.Recordset
Dim rstMVF As ADODB.Recordset
Dim rstMVT As ADODB.Recordset
 
Set rstFrom = New ADODB.Recordset
rstFrom.Open "select * from a where Notransaction=1", CurrentProject.Connection, _
              adOpenDynamic, adLockOptimistic
 
Set rstTo = New ADODB.Recordset
rstTo.Open "b", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
 
Do While rstFrom.EOF = False
   rstTo.AddNew
   rstTo!Description = rstFrom![Description]
   Set rstMVF = rstFrom!Photo.Value ' Photo is the attachment data type
   Set rstMVT = rstTo!Photo.Value
' Copy all the attachment in the field Photo (attachment datatype)
   Do While rstMVF.EOF = False
      rstMVT.AddNew
      rstMVT!FileData = rstMVF!FileData
      rstMVT!FileFlags = rstMVF!FileFlags
      rstMVT!FileName = rstMVF!FileName
      rstMVT!FileTimeStamp = rstMVF!FileTimeStamp
      rstMVT!FileType = rstMVF!FileType
      rstMVT!FileURL = rstMVF!FileURL
      rstMVT.Update
      rstMVF.MoveNext
   Loop
   Set rstMVF = Nothing
   Set rstMVT = Nothing
   rstTo.Update
   rstFrom.MoveNext
Loop
rstFrom.Close
rstTo.Close
Как работать с Вложениями методом ADO пока не нашел
Вложения
Тип файла: rar FileAttachment.rar (196.1 Кб, 4 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2025, 13:27
Помогаю со студенческими работами здесь

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

Wordpress-написание разных статей
Извиняюсь если заголовок не о чем. Писал до этого сайты с нуля (mvc). Но вот понадобилось разобраться в вордпресс. Вопрос : Есть несколько...

Написание и хранение статей (контента) сайта
Здравствуйте. Не знаю как правильно сформулировать... Начал разбираться с ASP.NET MVC и столкнулся с проблемой разработки и хранения (в...

Каталоги статей, сколько статей стоит размещать
У меня вот такой вопрос. В нете существует, достаточно много бесплатных каталогов статей, из них не так много достойных. Я вот для себя...

Посоветуйте литературу по написание основам написание плагинов
пишу курсовую на тему, основы написание плагинов. Посоветуйте литературу.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
59
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru