Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.00/2: Рейтинг темы: голосов - 2, средняя оценка - 4.00
 Аватар для BasicMan
19318 / 2626 / 84
Регистрация: 17.02.2009
Сообщений: 30,364

Делимся наработками

03.11.2009, 11:04. Показов 488731. Ответов 282
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
в этой теме предлагаю выкладывать интересные наработки по акцессу...

зы. в дальнейшем на основе их можно будет создать темы "важное"

Добавлено через 45 секунд
ззы. флуд и спам в этой теме будет награжден красными карточками
17
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2009, 11:04
Ответы с готовыми решениями:

Для рубрики "Делимся наработками", добить БД поставка-сделка авто
День добрый, форумчане. Хочу довести до ума БД, чтобы добавить в раздел форума "Делимся наработками", так как там нашел только...

Обсуждение поста #137 в теме "Делимся наработками". Программный модуль контроля ресурсов принтеров сети.
Сейчас тестовая страница на каждом принтере выдаёт эту информацию.

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

282
Эксперт MS Access
 Аватар для Eugene-LS
13254 / 5933 / 1526
Регистрация: 05.10.2016
Сообщений: 16,598
16.08.2023, 20:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alecko5 Посмотреть сообщение
Ваше не работает, Eugene-LS, работает.
Пояснения в пост #237
1
ᴁ ©
Эксперт MS Access
 Аватар для АЕ
4180 / 2465 / 513
Регистрация: 13.12.2016
Сообщений: 8,386
Записей в блоге: 5
16.08.2023, 20:52
Цитата Сообщение от alecko5 Посмотреть сообщение
Тут вообще как то неясно - Ваше не работает, Eugene-LS, работает.
Не хочу сводить все к вашему экспертному заключению на двух скриншотах. (вызывает большие сомнения) Вижу, что скачиваний было поболее. Прошу остальных отписаться. А вы пользуйтесь тем, что работает у вас и не засоряйте тему или выносите свои проблемы в отдельную ветку. Трам пам пам!
0
788 / 67 / 4
Регистрация: 28.05.2015
Сообщений: 114
29.01.2024, 13:31
Цитата Сообщение от Silur Посмотреть сообщение
Просто для завершения коллекции
Закрыть все открытые макросы
Завершением коллекции, ИМХО, должно быть "Закрыть все открытые модули".
0
788 / 67 / 4
Регистрация: 28.05.2015
Сообщений: 114
30.01.2024, 13:21
Ну раз Вам, может быть, лень или типа не царское это дело, завершу коллекцию.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Function CloseAllOpenModules()
    On Error GoTo Err_
    
    Dim oModules As Modules
    Dim LCount As Long
 
    Set oModules = Application.Modules
    LCount = oModules.Count
    For LCount = oModules.Count - 1 To 0 Step -1
        DoCmd.Close acModule, oModules(LCount).Name, acSaveYes
    Next LCount
    
    Set oModules = Nothing
    
Exit_:
    Exit Function
Err_:
    Resume Next
End Function
1
 Аватар для alecko5
885 / 148 / 35
Регистрация: 05.08.2022
Сообщений: 681
30.01.2024, 14:57
режет глаз
Цитата Сообщение от UUMprimor Посмотреть сообщение
DoCmd.Close acModule,
как можно закрыть модуль?
другой вариант
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
 For i= application.Modules.Count - 1 To 0 Step -1
application.DoCmd.Save acModule, application.Modules(i).name
next
application.RunCommand  acCmdCompileAllModules
application.CloseCurrentDatabase
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
31.01.2024, 11:44
Архив с базой данной ФИАС построенной по данным ГАР (от 29.01.2024). Каждый регион представлен отдельным файлом. Топик для обсуждения

Формат

Кодировка: UTF-8
Формат файла: CSV
Первая строка содержит заголовки: Да
Разделитель полей: ;
Ограничитель текста: "

Структура таблицы

Имя поляТип данныхОписаниепримечание
idДлинное целоеПервичный ключ записиPK
idParentДлинное целоеID вышестоящей записиРекомендуется создать не уникальный индекс
sGuidКороткий текстGUID записиМожно создать уникальный индекс, если требуется поиск
sOKАТОКороткий текстОКТМО 
sRegionCodeБайтНомер региона 
sPostalCodeКороткий текстПочтовый индекс 
sFormalNameКороткий текстФормальное название 
sOfficialNameКороткий текстОфициальное название 
sShortNameКороткий текстАббревиатура названия 
nLevelБайтУровень элемента 1 - Регион, 3 - Район, 4 - Город, 6 - Поселок, 7 - Улица, 10 - Дом 
nCodeКороткий текстКод КЛАДР 
sHouseNumКороткий текстНомер дома 
sBuildNumКороткий текстНомер корпуса 
sStructNumКороткий текстНомер строения 
sFullNameДлинный текстПолный адрес уровня, может включать дополнительные элемента (например территории) 
1
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
15.02.2024, 23:34
Комментарии, замечания предложения прошу размещать в отдельной теме

Основная ссылка на репозиторий

Проект предназначен для демонстрации подключения таблиц Access как виртуальные таблицы в SQLLite3.
Возможности запросов SQLite шире чем у Acccess, становятся доступны CTE таблицы, рекурсивные запросы, нумерация строк, частичная агрегация, оконные функции и тд. В целом SQL в SQLite является достаточным что бы на нем писать программы, например решение задачи 5 букв.

С таблицами Аccess поддерживаются операторы SELECT, DELETE, INSERT, UPDATE. Для последних трех обязательно должен быть ключевой столбец с типом целое число, для него должен быть создан индекс (на 1 столбец).

Есть поддержка прилинкованных таблиц, но работа по уникальным индексам с ними будет медленнее чем с обычными таблицами.

Внимание! Решение пока не является законченным промышленным. Не выполняйте запросы над чувствительными данными или делайте резервные копии.

Установка

Проверялась работа только в 32 разрядном MS Office. Движок написан на VBScript и подключается к Access через компонент ScriptControl. Данное решение связано с тем что DLL скомпилирована по стандарту cdecl, для VBA нужно что бы было stdcall.

Нативный движок SQLite3 представлен в виде DLL (sqlite3.dll). Можно скачать актуальную версию или версию с большими возможностями (нужно 32 разрядная) с официального сайта SQLite. Версия должна быть не младше 3.10.0.

Для работы с DLL используется компонент DynamicWrapperX. для проверки установлен компонент или нет запустите файл SQLite.vbs. Если выполнится без ошибок значит дополнительно ни чего устанавливать не нужно.
Если появилась ошибка, то необходимо зарегистрировать библиотеку `dynwrapx.dll` как COM объект. Для этого скопируйте файл в постоянное место и выполните команду (Подробнее)

Bash
1
2
regsvr32.exe <путь-к-компоненту>\dynwrapx.dll — для всех пользователей.
regsvr32.exe /i <путь-к-компоненту>\dynwrapx.dll — для текущего пользователя.
В 64 битной системе в фоне создается окно для работы с 32 битными скриптами.

Начало работы

Добавьте класс SQLiteEngine.cls в проект. При необходимости поправьте пути до файлов sqlite3.dll и SQLite.vbs в функции Class_Initialize.

Пример работы

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
'Создаем движок
Set Engine = New SQLiteEngine
 
'Открываем пустую БД в памяти. Можно открыть и физическую
Set SQLite_Connection = Engine.OpenDataBase(":memory:")
 
'Добавляем возможность подключать виртуальные таблицы из Access
SQLite_Connection.AttachAccessDB CurrentDb(), ""
 
'Для того что бы можно было работать с таблицами нужно создать их виртуальную копию
SQLite_Connection.Execute "Create virtual table if not exists MyTable using Access(MyTable)"
 
'Дальше можно открывать набор данных, который по составу методов похож на обычный Recordset
Set SQLite_Recorset = SQLite_Connection.OpenRecordset("select * from MyTable", 0)
If Not SQLite_Recorset.EOF Then
  Debug.Print "Name = [" & SQLite_Recorset.Fields(0).Name & "] Value = [" & SQLite_Recorset.Fields(0).Value & "]"
End If
SQLite_Recorset.Close
Set SQLite_Recorset = Nothing
 
'для удаления таблиц используйте команду 
SQLite_Connection.Execute "drop table if exists MyTable"
 
'Хорошим тоном является все закрыть за собой
SQLite_Connection.Close
Ограничения

Поддержка русского языка частичная,
  • Поля на кириллицы становятся регистр зависимыми. т.е. как записано в БД так к ним и нужно обращаться.
  • Не работают функции Lower Upper.

В SQLite всего 4 базовых типа данных
  • Integer - 32 битное целое
  • Double - вещественное двойной точности
  • Text - Строки
  • Blob - Двоичные строки

В данном проекте поддерживаются только первые три.

Тип данных AccessТип данных SQLiteПримечание
Boolean, Byte, Integer и LongIntegerTrue приводится к 1, False к 0
Date, Timestamp, TimeDoubleВ SQLLite Есть поддержка даты и времени но их кодирование отличается от кодирования в Access. Если нужно сравнить дату Access с датой SQLLite к первой нужно прибавить 2415018.5.
Double, Float, SingleDouble 
Все остальныеText 

Результаты запроса нельзя куда-либо вывести, только программная обработка.

Вывод отладочных сообщений

Для вывода отладочных сообщений в файл используйте метод LogToFile класса SQLiteEngine

Visual Basic
1
Engine.LogToFile CurrentDb().Name & ".log"
Так же сообщения можно перенаправить в любое другое место. Для этого создайте объект с методом Output принимающий единственный параметр - текстовое сообщение лога.

Например вывод в текстовое поле на форме:

Visual Basic
1
2
3
Public Sub Output(text)
  If Me.log.Value <> "" Then Me.log.Value = Me.log.Value & (vbCrLf & text) Else Me.log.Value = Me.log.Value & text
End Sub
Затем подключите логирование

Visual Basic
1
Engine.ScriptControl.Run "SetPrintProvider", Me
Комментарии к Demo

Тестовая БД для быстрой демонстрации. Основная форма предоставляет графический интерфейс к основным функциям.

Описание элементов управления:
  • Кнопка "Создать подключение SQLite". Создает подключение и инициализирует ресурсы. Эту кнопку жмем первой
  • Кнопка "Подключить таблицы ACCESS". Создает линки в SQLite на таблицы Access.
  • Кнопка "Показать список доступных таблиц" - Выводит в окно вывода информации список доступных таблиц. Если ничего не менять, то будет доступно три таблицы из Access
  • Кнопка "Показать лог" - Показывает или прячет окно логирования
  • Кнопка "Очистить лог" - Очищает поле с логом
  • Кнопка "Включить логирование" - Выводит в окно лога отладочные сообщение об этапах выполнения запроса
  • Поле "Введите запрос" - Окно ввода для запросов. Перед вводом запросов нужно прожать кнопки "Создать подключение SQLite" и "Подключить таблицы ACCESS"
  • Кнопка "Выполнить" - Выполняет запрос из поля "Введите запрос" и выводит результаты выполнения в окно вывода информации.
  • Кнопка "Следующий пример" - Выводит из таблицы SQLExamples в поле "Введите запрос" очередной пример и отправляет его на выполнение. Каждый пример начинается с постановки в комментарии и затем идет SQL запрос с решением.
  • Список вывода информации. Сюда выводится результат выполнения запроса. Размер колонок можно менять, таская их за границы.
1
Эксперт MS Access
 Аватар для Eugene-LS
13254 / 5933 / 1526
Регистрация: 05.10.2016
Сообщений: 16,598
16.02.2024, 02:40
Цитата Сообщение от alecko5 Посмотреть сообщение
как можно закрыть модуль? - другой вариант
А модули форм не считаются?!
Я бы так написал:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim iVal%, sVal$
    For iVal = Application.Modules.Count - 1 To 0 Step -1
        sVal = Application.Modules(iVal).Name
        'Debug.Print sVal
        If Left(sVal, 5) = "Form_" Then
            If IsFormLoaded(Mid(sVal, 6), True) Then
                Application.DoCmd.Close acForm, Mid(sVal, 6), acSaveYes
            End If
        Else
            Application.DoCmd.Save acModule, sVal
        End If
        
    Next iVal
    Application.RunCommand acCmdCompileAllModules
    ' Application.CloseCurrentDatabase
+ используется функция:
Private Function IsFormLoaded()
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Function IsFormLoaded(sFormName$, Optional blnAnyView As Boolean) As Boolean 
' Определяет загружена ли указанная в аргументе форма
'   blnAnyView  = False   = Кроме режима редакции
'   blnAnyView  = True    = В любом режиме
'   CurrentView = 0       = DesignView
' -------------------------------------------------------------------------------------------------/
On Error GoTo IsFormLoaded_Err
    If Forms(sFormName).CurrentView > blnAnyView Then IsFormLoaded = True
IsFormLoaded_Err:
    Err.Clear
End Function
0
788 / 67 / 4
Регистрация: 28.05.2015
Сообщений: 114
16.02.2024, 10:02
А если еще добавить и модули отчетов, то код не только глаз будет резать, но и даже может вырвать.
И чем вдруг alecko5 не устроил краткий рабочий код, закрывающий все виды открытых в текущем моменте модулей?
И приложение зачем-то предложил закрывать в конце своего нерабочего кода.
0
Эксперт MS Access
 Аватар для Eugene-LS
13254 / 5933 / 1526
Регистрация: 05.10.2016
Сообщений: 16,598
16.02.2024, 10:23
Цитата Сообщение от UUMprimor Посмотреть сообщение
А если еще добавить и модули отчетов
Не учёл = Факт!
И действительно, ваш код из post#244 работает чётко и без лишних вопросов.
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
11.04.2024, 13:15
Как можно прикрутить HTTP сервер к access? Для этого понадобится AutoHotKey, не много VBScript и совсем чуть чуть JScript. Итак механизм следующий: Access запускает AutoHotKey. AutoHotKey через VBScript создает линк на Access. Так же AutoHotKey поднимает HTTP сервер по порту который передал Access.

Возможности:
  • Обработка статичный файлов.
  • Выполнение функций в Access по запросу.
  • Доступ к объектной модели Access.Application.
  • Поддержка технологии динамического создания страниц на стороне "сервера". ASP на минималках.


Порядок работы:
  • Запускаем Демо.accdb
  • Запускаем процедуру StartServer. Сервер запускается на порту 5678. можно поменять в модуле ServerProcessor
  • Для обзора краткой справки переходим в любой браузер и переходим по адресу http://localhost:5678/static/hello.vb

Теперь у Вас есть еще больше возможностей создать на Access красивых, разнообразных приложений.
Вложения
Тип файла: zip Web.zip (483.6 Кб, 86 просмотров)
2
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
11.04.2024, 13:31
P.S. Только не нужно публиковать такие сайты в небезопасной среде. Вопрос безопасности здесь вообще ни как не решался.
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
25.05.2024, 22:57
Обновленная версия генератора отчетных форм в формате RTF.
  • Теперь поддерживаются привычные выражения, вместо plus(a;b) нужно записать так a+b;
  • В выражениях можно использовать функции VBA abs(a+b);
  • Строковые константы теперь можно заключать в 3 разные кавычки ", ', ` MsgBox(`Это "текст"`);
  • Функция f теперь принимает второй аргумент - формат вывода {f(a.BooleanValue,';"Согласен";"Не согласен"')};
  • Добавлена функция fmt, для форматированного вывода строки, переработан механизм форматированного вывода {f(DlookUp("Номер_контракта","Контракты",fmt("Дата_контракта = %$ДК%")))};
  • В функцию Scan добавлены блоки ScanEntry, ScanFooter и ключевое слово NewPage;
  • В функцию Scan добавлена возможность создавать собственные итераторы. Добавлен числовой итератор для примера;
  • В функции скан теперь вместо запроса можно указывать ссылку на форму или подчиненную форму с которой необходимо взять набор данных {scan("a" for "@Контракты.подформаПлатежи")}, так же можно указать имя параметризованного запроса, значение параметров будет взято из текущего контекста;
  • Устранена проблема с лишними пробелами в итоговом документе.

В VBA для форматирования строки доступна функция FormatString - Производит замену в тексте подстановочных сиволов на значения заданные в словаре. Подстановочные символы обрамляются символом `%`. Если нужно вывести символ как есть то его необходимо удвоить `%%`. Если первый символ равен $ далее следует выражение, значение которого нужно вставить в строку в виде SQL литерала. В остальных случаях значение между % рассматривается как выражение, значение которого нужно вставить как есть. Дополнительно можно указать формат для предварительной обработки.
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
26.06.2024, 21:46
Взято Using VBA To Lock The PC

Использование VBA для блокировки компьютера

Когда-нибудь требовалось или хотелось иметь возможность заблокировать компьютер? Возможно, после запуска вашего кода?

Ну, это на удивление просто сделать!

К счастью для нас, есть простой API, который мы можем реализовать для выполнения всей тяжелой работы. Все, что нам нужно сделать, это создать простую функцию-оболочку вокруг него, как показано ниже:
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
#If VBA7 Then
 Private Declare PtrSafe Function LockWorkStation Lib "user32.dll" () As Long
#Else
 Declare Function LockWorkStation Lib "user32.dll" () As Long
#End If
 
 
'---------------------------------------------------------------------------------------
' Procedure : LockPC
' Author : Daniel Pineault, CARDA Consultants Inc.
' Website : http://www.cardaconsultants.com
' Purpose : Lock the current PC (this does not logoff the user, simply lock the session)
' 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: None required
' Dependencies: LockWorkStation API Declaration(s)
'
' Usage:
' ~~~~~~
' Call LockPC
'
' ? LockPC
' Returns -> True : when successful
' False : when it fails to lock the PC
'
' Revision History:
' Rev Date(yyyy-mm-dd) Description
' **************************************************************************************
' 1 2024-04-11 Initial Public Release
' Added Function header
'---------------------------------------------------------------------------------------
Public Function LockPC() As Boolean
On Error GoTo Error_Handler
 Dim lRet As Long
 
 lRet = LockWorkStation
 If lRet = 0 Then
 Debug.Print "Couldn't lock the PC for an unknown reason."
 Debug.Print Err.LastDllError 'to get more details on the error itself
 Else
 LockPC = True
 Debug.Print "PC Successfully locked!"
 End If
 
Error_Handler_Exit:
 On Error Resume Next
 Exit Function
 
Error_Handler:
 MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
 "Error Source: LockPC" & vbCrLf & _
 "Error Number: " & Err.Number & vbCrLf & _
 "Error Description: " & Err.Description & _
 Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
 , vbOKOnly + vbCritical, "An Error has Occurred!"
 Resume Error_Handler_Exit
End Function
Как показано в заголовке функции, ее использование может быть достигнуто простым выполнением:

Visual Basic
1
2
3
4
5
If LockPC Then
    'Lock PC Call was successful
Else
    'Lock PC Call was NOT successful
End if
Или, возможно, что-то более похожее:

Visual Basic
1
2
3
4
If Not LockPC Then
    Exit Sub
    'Exit Function
End if
и это все, что нужно сделать.
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
28.06.2024, 15:17
Вот ещё о хэшировании VBA – Get a String’s Hash Но уже без PowerShell

VBA – получение хеша строки

В предыдущей статье я продемонстрировал (не я а автор статьи), как мы можем использовать PowerShell для получения HASH MACTripleDES, MD5, RIPEMD160, SHA1, SHA256, SHA384 или SHA512 строки.
Я также решил продемонстрировать, как это можно сделать с помощью простого 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
'---------------------------------------------------------------------------------------
' Procedure : Crypto_GetStringHash
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Returns the specified Hash for the supplied string.
' 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 ReadStringAsBinary()
'
' 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:
' ~~~~~~
' ? Crypto_GetStringHash("String to get the Hash of", "MD5")
'   Returns -> 69563FFABD2E9D63BF83567F1B664C6
' ? Crypto_GetStringHash("String to get the Hash of", "SHA256")
'   Returns -> 823C17899E52A815FD90EEDDAB5C67B88C1E868E81B88F5ECEFA1D3B17D753
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2023-01-03              Initial Public Release
'---------------------------------------------------------------------------------------
Function Crypto_GetStringHash(sInput As String, sHashAlgorithm As String) As String
    On Error GoTo Error_Handler
    Dim oSSCrypto             As Object
    Dim aFileBytes()          As Byte
    Dim sOutput               As String
    Dim lCounter              As Long
 
    Select Case sHashAlgorithm
        Case "MACTripleDES"
            Set oSSCrypto = CreateObject("System.Security.Cryptography.MACTripleDES")    '
        Case "MD5"
            Set oSSCrypto = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")    '128 bits
        Case "RIPEMD160"
            Set oSSCrypto = CreateObject("System.Security.Cryptography.RIPEMD160Managed")    '160 bits
        Case "SHA1"
            Set oSSCrypto = CreateObject("System.Security.Cryptography.SHA1Managed")    '160 bits
        Case "SHA256"
            Set oSSCrypto = CreateObject("System.Security.Cryptography.SHA256Managed")    '256 bits
        Case "SHA384"
            Set oSSCrypto = CreateObject("System.Security.Cryptography.SHA384Managed")    '384 bits
        Case "SHA512"
            Set oSSCrypto = CreateObject("System.Security.Cryptography.SHA512Managed")    '512 bits
        Case Else
            'MsgBox ""
            GoTo Error_Handler_Exit
    End Select
 
    'aFileBytes() = StrConv(sInput, vbFromUnicode) 'fine for English only.
    aFileBytes() = ReadStringAsBinary(sInput)
    aFileBytes() = oSSCrypto.ComputeHash_2((aFileBytes()))
    For lCounter = 0 To UBound(aFileBytes())
        sOutput = sOutput & UCase(Mid("0" & Hex(aFileBytes(lCounter)), 2))
    Next
    Crypto_GetStringHash = sOutput
 
Error_Handler_Exit:
    On Error Resume Next
    Set oSSCrypto = Nothing
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Source: Crypto_GetStringHash" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function
Вспомогательная функция
Вышеизложенное опирается на одну вспомогательную функцию:
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
64
65
66
'---------------------------------------------------------------------------------------
' Procedure : ReadStringAsBinary
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Converts the supplied string to a binary array
' 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
'             Early Binding -> Microsoft ActiveX Data Objects X.X Library
' Based off of ReadFileAsBinary()
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sInput     : String to be converted
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2023-01-03              Initial Public Release
'---------------------------------------------------------------------------------------
Public Function ReadStringAsBinary(ByVal sInput As String) As Variant
On Error GoTo Error_Handler
    '#Const EarlyBind = 1    'Use Early Binding
    #Const EarlyBind = 0    'Use Late Binding
    #If EarlyBind Then
        Dim oADOStream As ADODB.Stream
    #Else
        Dim oADOStream As Object
        Const adTypeBinary = 1
    #End If
    Dim aStringBytes() As Byte
 
    #If EarlyBind Then
        Set oADOStream = New ADODB.Stream
    #Else
        Set oADOStream = CreateObject("ADODB.Stream")
    #End If
    With oADOStream
        .Charset = "utf-8"
        .Open
        .WriteText sInput
        .Flush
        .Position = 0
        .Type = adTypeBinary
        .Position = 3    'no bom
        aStringBytes() = .Read
    End With
    ReadStringAsBinary = aStringBytes()
 
Error_Handler_Exit:
    On Error Resume Next
    If Not oADOStream Is Nothing Then
        oADOStream.Close
        Set oADOStream = Nothing
    End If
    Exit Function
 
Error_Handler:
    MsgBox "The following error has occured" & vbCrLf & vbCrLf & _
           "Error Source: ReadStringAsBinary" & vbCrLf & _
           "Error Number: " & Err.Number & 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
Пример использования
Основная функция очень проста в использовании!

Visual Basic
1
? Crypto_GetStringHash("Microsoft Access", "SHA512")
который вернет/выведет значение

Visual Basic
1
C4208CAAFB46AFA43F246676C8331CAD5B955CF7C2CFE4B4D3E404C75F242E16FE59A41C58984587C6FEAA93C9ED0824C4FD4D6FA2B972BB769A27CD094
Или

Visual Basic
1
? Crypto_GetStringHash("Any String You'd Like to Hash", "MD5")
который вернет/выведет значение

Visual Basic
1
23954A0132E39C143EA654982F3CE0
Примечание

Для этого метода требуется .Net 3.5, который предварительно установлен в большинстве операционных систем.
1
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
02.01.2025, 18:21
Обновлен генератор печатных форм (RTFReport)

Теперь шаблоны можно составлять в формате DOCX. При построении отчета или добавлении его во внутреннее хранилище документ будет автоматические пересохранен в RTF формат для получения шаблона, а по окончании заполнения сохранен в формате docx. Если нужно формировать много документов по одному и тому же шаблону, то рекомендуется сохранить шаблон во внутреннее хранилище при помощи макроса "InstallReportTemplate".

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

Добавлена возможность формирования шаблона в формате Excel.

Основной идеей данного модуля - это создание документов из шаблонов используя минимум кода. Вся настройка будущего вида документа создается непосредственно в редакторе Excel.

Основными структурными блоками шаблонизатора являются подстановочные поля и итерируемые по наборам данных строки.

Подстановочные поля указываются непосредственно в ячейках. Для выделения их на фоне остального текста используются обрамляющие фигурные скобки {}.
Внутри фигурных скобок нужно записать выражение (формулу) для получение значение. Вычисленное выражение будет вставлено вместо поля.

В выражения можно использовать как переменные из контекста так и непосредственно данные с полей формы. Так же в выражениях можно использовать функции VBA.
Доступен вывод штрих кода в формате: CODE128, EAN13, QRCode (если в проект включен модуль mdQRCodegen)
Доступна вставка изображений, как из БД (из поля с типом вложение) так и из файла.

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

Источником для набора данных могут выступать:
  • SQL запросы;
  • Запросы как объекты Access (параметры подставляются из контекста);
  • Источники данных для форм.

В архиве есть пример шаблона "Контракт2.xlsx", что бы его вывести в заполненном виде - откройте на стартовой странице "Открыть форму с контрактами" и нажмите на кнопку "Карточка контракта".
Вложения
Тип файла: zip RTFReport.zip (929.2 Кб, 121 просмотров)
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
05.03.2025, 10:14
Запуск базы данных из определённой папки

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

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

Хорошая новость заключается в том, что настроить такую функцию безопасности относительно просто, и для этого потребуется всего несколько строк кода!

Жестко заданный путь к папке

Мы можем просто сравнить текущий путь к базе данных с указанным путём, и если они не совпадают, то закрыть базу данных. Для этого мы можем использовать такую процедуру, как:

Visual Basic
1
2
3
4
5
6
7
8
9
10
Public Function IsRunningInDesignatedFolder() As Boolean
 Const sDesignatedFolder = "C:\Databases\CARDA\Demos\Security"
 
 If CurrentProject.Path <> sDesignatedFolder Then
 'MsgBox "This database must be run from the designated folder.", vbCritical Or vbOKOnly
 Application.Quit
 End If
 
 IsRunningInDesignatedFolder = True
End Function
Более динамичный подход

В некоторых случаях мы можем не захотеть использовать жестко заданный путь. Возможно, мы хотим использовать динамический путь, например, к папке «Документы» пользователя, AppData, … В таких случаях нам нужно лишь внести небольшое изменение в исходный код, что-то вроде:

Папка с Документами

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Public Function IsRunningFromDocuments() As Boolean
 Dim sDesignatedFolder As String
 
 sDesignatedFolder = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%UserProfile%\Documents\InventoryDb")
 If CurrentProject.Path <> sDesignatedFolder Then
 'MsgBox "This database must be run from the designated folder.", vbCritical Or vbOKOnly
 Application.Quit
 End If
 
 IsRunningInDesignatedFolder = True
End Function
Локальная папка данных приложения пользователя

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Public Function IsRunningFromLocalAppData() As Boolean
 Dim sDesignatedFolder As String
 
 sDesignatedFolder = CreateObject("WScript.Shell").ExpandEnvironmentStrings("%LocalAppData%\InventoryDb")
 If CurrentProject.Path <> sDesignatedFolder Then
 'MsgBox "This database must be run from the designated folder.", vbCritical Or vbOKOnly
 Application.Quit
 End If
 
 IsRunningInDesignatedFolder = True
End Function
Запуск кода как часть запуска базы данных

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

Вызов этого как часть процедуры AutoExec
Запускаем его при открытии ‘Display Form’ базы данных

Ниже приведен шаблон общего подхода, который можно использовать для макроса AutoExec. Я использую свой макрос AutoExec для запуска кода общедоступной функции StartUp, которую я помещаю в отдельный модуль. Функция StartUp выглядит примерно так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Function StartUp()
 'Check User is allowed
 
 'Check Designated Folder
 Call IsRunningInDesignatedFolder
 
 'Compact Db
 
 'Backup Db
 
 'Relink Tables
 
 'Launch Login or Menu
End Function
Как видите, проверка папки была бы одной из первых вещей, которые я бы сделал после запуска кода.

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

Можно сделать, так, чтобы база запускалась везде, кроме определённой папки. Для этого нам надо просто инвертировать проверку.

Visual Basic
1
2
3
4
5
6
7
8
9
10
Public Function IsRunningInDesignatedFolder() As Boolean
 Const sDesignatedFolder = "\\Server1\Finance"
 
 If CurrentProject.Path = sDesignatedFolder Then
 'MsgBox "This database cannot be run from within the current folder.", vbCritical Or vbOKOnly
 Application.Quit
 End If
 
 IsRunningInDesignatedFolder = True
End Function
Если немного покопаться с определением пути, то можно задать, запуск или запрет на запуск базы с определённого диска.

По мотивам статьи Дэниеля Пино

Взято здесь
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
19.03.2025, 14:10
Нашел в архивах
Автор: Аюпов Рустем (AKA Ayupov_r)

Бывает что очень не хватает места на форме: хочется уместить много информации и чтобы при этом форма не выглядела "перегруженной" контролами. Стандартные средства (вкладки или разрывы страниц) не позволяют выбирать информацию для одновременного просмотра. Например, я хочу, чтобы отображались поля с первой, третьей и четвертой вкладки (если используются вкладки-tabs) одновременно и только те поля, которые заполнены данными, но с вкладками такой фокус не пройдёт. Решение подсказал интерфейс windows - помните, в "папках" windows слева, есть список типичных задач, который сворачивается, разворачивается и индивидуален для каждого вида папки? Вот это я и решил реализовать для решения своей задачи. В прилагаемом примере: 1)сворачиваются-разворачиваются listbox-ы, но можно использовать естественно любой другой элемент управления (в работающей базе у меня - подчиненные формы); 2)не показана возможность при загрузке формы показывать "заполненные" элементы в развернутом виде (но это реализуется просто, если кому нужно - выложу пример); 3 в принципе количество "сворачиваемых-разворачиваемых" элементов управления можно использовать как переменную в цикле.
Наверняка я не первый сделал это в аксесе, но мне примеры пока не встречались (да и не искал, чг).


Пример можно так же отнести к топику Дизайн интерфейса Access
Вложения
Тип файла: rar interface_1_.rar (14.6 Кб, 53 просмотров)
1
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
19.03.2025, 14:29
Опять же архивы
Автор: Андрей Викторович (AKA Oxa)

Вот вырвал из своей старой работы, может пригодиться. Классы для создания панелей. Код имеет ошибки - не правильно работает с набором закладок и группой. Описание в модуле класса clsCollectionPanels.
Если честно штука не совсем клеевая, так как давно написанная, но спасибо. И в примере нет, но необходимо в событии выгрузки формы ОБЯЗАТЕЛЬНО сделать:
Visual Basic
1
Set m_Panels = Nothing
иначе из-за того что класс хранит ссылку на форму будут утечки памяти и если версия access ниже 2000 то опс...


Интересная вещь.
Пример можно так же отнести к топику Дизайн интерфейса Access
Вложения
Тип файла: rar Panel.rar (41.7 Кб, 40 просмотров)
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
19.03.2025, 14:35
Рисунки к предыдущему посту.






0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.03.2025, 14:35

Кто занимался работой с timer поделитесь пожалуйста наработками интеренсыми
Например есть форма и на форме кнопка закрыть нажимая кнопку закрыть идет отсчет 10 9 8... и когда доходит 0 то закрывается программа ,...

Делимся.
Доброго времени суток всем посетителям этой темы!=) Хочу попросить вас поделиться самой откровенной информацией по нескольким...

Делимся vpn)
Ребят, накидайте vpn серверов работающих на просторах СНГ.

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

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


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

Или воспользуйтесь поиском по форуму:
260
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru