Архив рубрики: Коддинг

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

Запуск SQL запросов из VBA для Access и Excel

sql-fun
sql-fun
В различных ситуация требуется какое либо действие сделать с БД с помощью SQL запросов, и при написании программы зачастую требуется это сделать из VBA кода. Для этого я использую различные схемы, в зависимости от сложности запроса и поставленной задачи.
, где для всех примеров myBD это объявленная наша БД, например через Dim myBD As Database и последующей Set myBD = CurrentDb , как пример для Access

 

1 — Запуск запросов через QueryDef, ИМХО — использую для ODBC:
Для первого варианта средствами Access делаем обычный запрос  с нужными нами действиями или несколько связанных между собой и запускаем его строчкой ниже. Вообще QueryDef является одним из лучших методов по запуску и выполнению (да запуск сохраненных SQl запросов через него, это далеко не все что он может) запросов в базах данных использующих драйвер ODBC.
myBD.QueryDefs(«ИМЯ_ЗАПРОСА»).Execute
или делаем непосредственный запуск запроса
myBD.QueryDefs.Execute «DELETE * FROM MyTabl»

 

2 — Запуск запросов через RecordSet, ИМХО — использую для ADO:
Этот вариант у меня прижился больше для Excel когда к БД подключаюсь через ADO драйвер, и требуется например сохранить данные в бд, через запрос (Помидорами не кидать, знаю что сам RecordSet позволяет это делать — тут просто пример как можно запустить запрос через него)
Set rs = cmd.Execute(«DELETE * FROM MyTabl», , adExecuteNoRecords)

 

3 — Непосредственный запуск запросов
ИМХО — использовать стоит в основном внутри Access и довольно редко, для мелких задач, а для всего отсльаного лучше через QueryDef:
DoCmd.RunSQL «DELETE * FROM MyTabl»
myBD.Execute «DELETE * FROM MyTabl»

При выполнении SQL запроса из VBA кода, в месте где пишется условие, при использовании сравнения LIKE нужно использовать символ %, а не когда требуется сравнивать какую то часть текста, а не точное сравнение. При этом если запустить запрос с * например в Access,  то он отработает нормально. Если не знать эту особенность, то ошибку можно долго искать в коде.

Правильно :  SELECT * FROM table WHERE pole LIKE «%Условие%»

НеправильноSELECT * FROM table WHERE pole LIKE «*Условие*»

 

Стандартные функции обработки типов данных в VBA и VB

 
В программировании существуют данные различных типов, и периодически необходимо или перевести данные из одного типа в другой, или проверить данные какого типа мы используем в данный момент…
Давайте разбираться:
В VB, VBA существуют встроенные функции для перевода вида функция («текст_данных»), соответственно провести преобразование возможно только если выбранный формат поддерживается этими данными:
 
CBool() — логические True, False
CByte() — числа от 0 до 255
CCur() — чисел для точных вычислений (4 знака после запятой)
CDate() — дата
CDbl() — чисел двойной точности (с «,»)
CDec() — чисел с мега точностью до 28 цифрами в дробной части (с «,»)
CInt() — целых чисел от -32768 до 32767
CLng() — целых чисел от -2147483648 до 2147483647
CSng() — чисел одинарной точности (с «,»)
CStr() — строковые значения
CVar() — любого типа данных
 
Существуют также и специфические функция преобразования:
Str() — строковые значения (в отличии от CStr() является строковым представлением только чисел и для них резервирует 1 ячейку под символ знака «-» у отрицательных чисел и » » для положительных, как разделитель понимает только «.»)
Val() — число (является функцией которая в тексте слева на право ищет число и вытаскивает только первый попавшийся набор цифр до 1 строкового символа, но 1 точку воспринимает как разделитель)
Также можно проверить являются ли данные тем или иным форматом (типом), так же возможно ли автопреобразование к этому типу. Например текстовое поле 542 при проверки IsNumeric(«542») выдаест TRUE.
IsNumeric() — числовым
IsDate() — датой
IsEmpty() — пустым значением
IsError() — будет ли ошибка во время выполнения
IsMissing() — были ли переданы при вызове процедуры необязательные аргументы типа Variant
IsNull() — нулевое значение (Значение Null указывает, что переменная типа Variant не содержит допустимых данных)
IsObject() — объект или тип класса
IsArray() — массив
Hex() — 16-тиричное обозначение числа
Oct() — 8-миричное обозначение числа