|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Во всех продуктах Microsoft Office можно закрыть текущий пользовательский объект нажатием клавиши Ctrl+W. В MS Access также работает данное сочетание клавиши (например, если хотим закрыть открытую таблицу, запрос, форму и т.д.). Но вот в режиме "Runtime", увы, не работает. Пришлось создать макрос "AUTOKEYS", где в столбце "Имя макроса" (Macro Name) ввел ^w , а в столбце "Макрокоманда" (Action) - Закрыть (в английских версиях - Close ) и при этом свойства данной команды "Тип объекта" и "Имя объекта" оставил пустыми, чтобы макрос сработал на все виды объектов БД. Что интересно, даже если мы работаем в русской раскладке клавиатуры, то при нажатии Ctrl+ц (w получается как ц), то макрос все равно реагирует. Может быть у кого-нибудь есть иное решение как в режиме "Runtime" заставить работать сочетание клавиш Ctrl+W без макроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2011, 07:17 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, Ctrl+F4? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2011, 08:31 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindstudieren, Ctrl+F4? Спасибо, так тоже работает. :) А вот почему не работает Ctrl+w в чистом виде в Runtime, это загадка разработчиков. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2011, 08:46 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, :) Может быть, Ctrl+W они оставили за другой комбинацией или вообще забыли? Хотел написать своё наблюдение. Когда открываете редактор VBA, вы автоматически попадаете в последний из добавленных модулей (или модулей форм). Всегда один и тот же, если не добавляли новых. Это к топику: Сохранение позиции в модуле . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2011, 09:14 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMind, Проверил на всех проектах, действительно первом делом попадаем в последний из добавленных модулей. Не обращал на это внимание, теперь буду знать. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2011, 09:25 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как запретить ввод определенных символов в контролах формы? Я случайно наткнулся на такой простой, но оригинальный код. Может быть кому-то пригодится: Код: plaintext 1. 2. 3. 4. 5.
Если юзер попробует ввести любой символ из шаблона "!@#$%^&*()_+=", то контрол формы просто будет игнорировать. Источник: Hayder Access ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2011, 08:32 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindstudieren, Ctrl+F4? Небольшая поправочка: С помощью Ctrl+F4 можно закрыть любой активный объект базы точно также как и Ctrl+W. Но чисто экспериментально обнаружил, что если свойство формы "Всплывающее окно" (PopUp) имеет значение True, то с помощью Ctrl+F4 невозможно закрыть форму. А вот если форма - модальное окно (т.е. свойство "Modal = True"), то с помощью Ctrl+F4 можно закрыть её. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2011, 08:41 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Функция Format для параметра Null, в отличие от некоторых стандартных функций, возвращает не Null, а "". Из-за этого невозможно корректно обработать случай Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2011, 14:13 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Прошу прощения, способ таков: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2011, 14:20 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindФункция Format для параметра Null, в отличие от некоторых стандартных функций, возвращает не Null, а "". Из-за этого невозможно корректно обработать случай Код: plaintext 1.
Как для VBA, так и для JET SQL данное утверждение справедливо. Код: plaintext 1. 2. 3. 4.
Спасибки. :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2011, 15:11 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как получить набор записей (Recordset) от запроса с параметрами? Допустим у нас есть "Запрос1", у которого 2 параметра "Число", "Дата". С помощью DAO набор записей можно получить так: Код: plaintext 1. 2. 3. 4. 5. 6.
Чтобы сократить код можно вообще обойтись и без Querydef. Код: plaintext 1. 2. 3. 4. 5.
Здесь вместо ключевого слово "PARAMETERS" можно использовать "PROCEDURE". Эффект будет одинаковым. При этом название, тип и значение параметров запроса должны быть ПОЛНОСТЬЮ указаны после ключевого слова "PARAMETERS" (или "PROCEDURE"). Так если запрос имеет 3 параметра, а мы указали только 2, то Access будет ругаться. Вместо "TABLE (Запрос1)" можно использовать более традиционное выражение "SELECT * FROM Запрос1". А вот в случае с ADODB синтаксис будет другой, больше похож на синтаксис MS SQL Server. Код: plaintext 1. 2. 3. 4. 5.
Здесь как Вы видите нужно перед названием параметра обязательно добавить "@" (в стиле MS SQL Server), иначе Access будет ругаться. В принципе можно и пропустить название параметров, в этом случае следует строго соблюдать последовательность параметров. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2011, 19:29 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Недавно обнаружил, что в запросах можно получить значение свойств некоторых объектов VBA (не все свойства конечно, но кое-что можно!). Вот примерчик: Код: plaintext 1. 2. 3. 4. 5.
Можно оказывается получить и "длинные" свойства, т.е. чтобы добраться до нужного свойства приходится "беспокоить" несколько объектов, типа так: Код: plaintext
При этом если нам необходимо использовать скобки, кавычки или апострофы для того, чтобы добраться до свойство объекта, то Access будет ругаться. Поэтому так не катит: Код: plaintext
Что делать в таких случаях? Оказывается можно использовать EVAL. Вот примерчик: Код: plaintext
Что это даёт нам? Внутри запроса можно динамически создавать запрос. Да и не только это! Конечно можно внутри запроса использовать VBA функцию, которая динамически сформирует SQL текст запроса. Но я заинтересовался именно этим способом из-за mde / accde формата, где рядовой пользователь сам также сможет смастерить динамический запрос. Иногда это бывает полезным. Конечно можно использовать так сказать статистические функции (DSum, DCount и т.д.). Но этот способ всё-таки более мощнее, ибо даёт возможность обратиться к разным источникам данных в зависимости от параметра. Чтобы было более понятнее покажу простой пример: Код: plaintext 1. 2. 3. 4. 5.
P.S. Всё что здесь я написал, смог обнаружить чисто экспериментально, а не по книжкам. Если у кого-то есть ссылка на соответствующую литературу или какие-то замечания, please, напишите. Буду очень признателен! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 15:59 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Ошибся по поводу статистических функций. :) Там тоже в динамике можно оказывается обращаться к разным источникам. В смысле текст подменять. Сорю однако! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2011, 16:09 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Забавная функция Eval !!! Оказывается с её помощью даже в обычных запросах на выборку можно вносить изменения в объектах БД. Т.е. совершать следующие операции: - удалить таблицу / запрос (DROP); - удалить данные из таблицы / запроса (DELETE); - добавить новые записи (INSERT) - изменить записи (UPDATE). И этим возможности функции не исчерпаны!!! Допустим у нас есть таблица "Table1", где имеются поля "Num" (числовое), "Text" (Текстовое). Вот примерчик для запроса на выборку данных: Код: plaintext 1. 2. 3.
" CurrentDB.Execute " внутри Eval всегда возвращает Null или ошибку. Здесь Eval внутри IIf нужен не для фильтра, а для запуска запроса на добавление. Т.к. условие IIf не выполняется, то запускается следующий блок (ложь), где уже запускается запрос на обновление. Eval можно вписать почти где угодно внутри текста запроса (после SELECT / WHERE / GROUP BY / Order By), . В принципе как я уже написал, можно даже удалить таблицу или запрос. Но так как "DROP TABLE" и "DROP PROCEDURE" нельзя использовать в обычных запросах, внутри Eval не следует использовать "CurrentDB.Execute". В таких случаях следует использовать "CurrentProject.Connection.Execute". Правда чтобы избежать сообщение об ошибке придётся чуть-чуть изощряться. Вот примерчик: Допустим у нас есть запрос "Запрос1", которого следует удалить. Сначала следует проверить существование запроса, если существует, то только тогда удалить. Код: plaintext 1. 2.
Здесь "ActiveConnection" в принципе не столь важен, он необходим для того чтобы избежать сообщение об ошибке. Если запрос не существует, то не следует запускать Eval в данном случае. Именно поэтому потребовался IIF. Примерно таким же образом можно запускать Execute на создание таблицы или запроса. Можно с помощью Eval даже запустить программу находясь внутри запроса! Например так: Код: plaintext 1. 2.
Есть ещё 1 особенность: если мы используем Eval или даже пользовательской VBA функции, предназначенной для открытия объекта БД (Docmd.OpenTable, Docmd.OpenQuery, Docmd.OpenForm и т.д.), то Access будет ругаться и никак не будет открывать объект. P.S. Всё что я здесь написал про Eval можно было бы реализовать с помощью пользовательской VBA функции, что конечно же более естественно и разумно! Но я здесь просто попытался показать некоторые возможности Eval и что теоретически одним запросом можно совершать много операций словно хранимая процедура MS SQL Server. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2011, 11:31 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenЗабавная функция Eval !!! Оказывается с её помощью даже в обычных запросах на выборку можно вносить изменения в объектах БД. Т.е. совершать следующие операции: - удалить таблицу / запрос (DROP); - удалить данные из таблицы / запроса (DELETE); - добавить новые записи (INSERT) - изменить записи (UPDATE). И этим возможности функции не исчерпаны!!! ................... Такое использование функции Eval напоминает мину-ловушку. Невинный с виду предмет оказывается убийственным. Просто селект, вызывающий изменение объектов - идея того же порядка, ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.04.2011, 12:42 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindХотел написать своё наблюдение. Когда открываете редактор VBA, вы автоматически попадаете в последний из добавленных модулей (или модулей форм). Всегда один и тот же, если не добавляли новых. Это к топику: Сохранение позиции в модуле . Случайно сегодня обнаружил такую закономерность. Допустим, мы хотим любой произвольный модуль (в том числе и модуль формы) отметить как модуль, автоматически загружаемый при первом же открытии VBA редактора. Что для этого надо делать? CoolMind предложил свой вариант, который работает. Но оказывается есть и другой способ. Открываем нужный модуль, специально вводим какой-нибудь ошибочный код во времени исполнения, из-за которого нельзя откомпилировать проект. Скажем такой код: Код: plaintext
Вот так вот. P.S. Обнаружено эмпирически, случайно. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.04.2011, 17:34 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Я вот здесь нашёл простую функцию, которая преобразует байтовое число в бинарное выражение. Сам код выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вроде простая функция. Проверил, работает. Но меня сначала удивила вот эта часть кода: b And 2 ^ i Для меня было не понятно, как это вообще работает. Ведь если b не равно 0, значит он как бы True, ну и 2 ^ i всегда не 0. Значит если b не 0, то выражение должно вернуть True. Действительно попробовал вот такой запрос, который возвращает всегда True: Код: plaintext
Код: plaintext 1.
helpThe And operator also performs a bitwise comparison of identically positioned bits in two numeric expressions and sets the corresponding bit in result ... Давным-давно не открыл справочник про AND, вот и забыл, что And ещё и совершает побитовое сравнение. Я не нашёл аналогичную функцию или оператор в Jet SQL для побитового сравнения. Если кто-нибудь подскажет, буду признателен. А вот в MS SQL Server аналогичную функцию можно написать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 12:10 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenДействительно попробовал вот такой запрос, который возвращает всегда True: Код: plaintext
Код: plaintext 1.
если в свойствах БД установить "синтаксис для СКЛ Сервер" то такой же результат (как в VBA), можно получить в запросе Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 12:19 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Уважаемый Ё! Вы как всегда на высоте. Спасибочки ОГРОМНОЕ за науку!!! Попробовал так, как Вы посоветовали (правда, слегка по другому): Код: plaintext 1.
Не знал, что есть "BAND" (а не просто "AND"). Мой справочник молчит как партизан про этот оператор. А где можно почитать о нём? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 12:26 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren... Не знал, что есть "BAND" (а не просто "AND"). Мой справочник молчит как партизан про этот оператор. А где можно почитать о нём? ...чесно говоря - я тоже про него (BAND) - узнал только здесь на форуме, а в литературе - нигде не сталкивался... ))) там их несколько подобных Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 12:32 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Собственно "бинарные" числа бывают иногда полезными, чтобы спрятать секретные свойства БД. Ну скажем так: Можно создать таблицу, где будут хранится значения секретных свойств. Саму таблицу можно назвать как "~TMPCLP..." (вместо точек какое-нибудь слово или символы), чтобы таблицу невозможно было бы увидеть "штатными" инструментами Access. В этой таблице ключевое поле будет "ID", где будут числа 2^n (т.е. 1, 2, 4, 8, и т.д.), ну и дополнительные поля, где будут "секретные" свойства различных объектов (всё что угодно, да хоть дата истечения срока эксплуатации БД для определённой группы пользователей или серийные номера жёстких дисков пользователей, у кого есть право пользоваться программой и т.п.). Далее, ещё одна таблица для настроек, где и будет поле с неким числом для настройки, скажем, пользовательского интерфейса. К примеру, если там число 7 (т.е. 1+2+4), то первые три записи из секретной таблицы будут относится к таблице "Настройка". Напрямую связать эти 2 таблицы обычном запросом при отключённом SQL ANSI 92 будет невозможно, поэтому не все продвинутые пользователи поймут что к чему. Можно внутри VBA с помощью "CurrentProject.Connection.Execute" запустить запрос и узнать какие свойства доступны для данного кода настройки. Что-то вроде этого запроса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2011, 14:29 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Сегодня обнаружил такую закономерность: Допустим, у нас есть таблица в какой-либо СУБД (скажем в MS SQL Server), где есть необязательное логическое поле (некое поле X bit Null). Ещё одна важная деталь: поле "X" не имеет значение по умолчанию! Пусть даже в данной таблице есть уникальный ключ (можно даже счётчик или можно даже timestamp). Теперь в Accessе (в mdb | accdb файле) линкуем таблицу через ODBC. Для эксперимента введём одну запись и сохраним, но при этом не трогаем поле "X" и тем самым в данном поле сохраним значение Null. Вот теперь данную запись невозможно не удалить, не вносить изменения, Access постоянно будет ругаться (см. картинку). Есть мнение: Видимо Access перед тем, как изменить или удалить данные сверяет «старые» данные и при такой сверки допускает значения только «True» и «False» для логических полей. Видать «кудесники» из Microsoftа забыли, что необязательные логические поля могут иметь значение «Null». Скорее всего, при сверке «старых» данных с «новыми» Access пользуется каким-то внутренним запросом, где фильтрует данные и получает пустой набор записей, когда логическое поле Null. Вот и Access «предполагает», что раз невозможно «достать» и сверять «старые» и «новые» записи, то кто-то уже заблокировал / изменил запись. Как лечить? Не пользуйтесь НЕ обязательными логическими полями или хотя бы обеспечьте всегда значение по умолчанию. А ещё лучше вместо логического поля использовать байтовое целое число (tinyint / byte). P.S. Вот ещё 1 топик, где показаны очень интересные случаи. FAQ: Проблемы при работе с ADP/ADE ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2011, 21:26 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Оказывается у Message box есть одна особенность: когда выходит сообщение (не важно мы сами в программе вызвали или же программа сама сообщает о чём-то, например об ошибке), то можно нажать на Ctrl+C или Shift+Insert и тем самым скопировать в буфер обмена текст самого сообщения. Я раньше всегда "фотографировал" и вставлял в этом форуме рисунок Message Boxа. И какого было моё изумление, когда случайно обнаружил, что Ctrl+C работает. На всякий случай пролистал "официальный" help от Microsoftа, но там по этому поводу ничего не нашёл. Может как всегда "надёжно спрятали" где-то в недрах хелпа или может забыли. P.S. Если баян, то уж извиняйте. Думаю для многих новичков всё-таки это новость. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2011, 09:02 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Когда-то (я уже не помню в каком топике) Анатолий из Киева предложил очень интересную функцию Message Boxа, где после истечения n секунд если пользователь не нажмёт на кнопку, то сообщение само закрывается. Вот собственно сама функция: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Здесь вместо стандартного для VBA функции MsgBox использован объект "WScript.Shell" и его метод "PopUp". Оказывается и у этого способа можно скопировать текст самого сообщения в буфер обмена, когда выходит сообщение. А вот когда аварийно останавливается программа и выходит не совсем "красивое" сообщение, то увы, я не смог скопировать в буфер обмена. Пришлось "фотографировать" (см. картинку). P.S. А какие сообщения можно таким образом скопировать в буфер обмена, а какие нет никто не подскажет? Был бы признателен. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2011, 09:39 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Не большое уточнение. Вот эти слова, отмеченные красным цветом, всё-таки оказались лишними, я тут немного ошибся: studieren...(не важно мы сами в программе вызвали или же программа сама сообщает о чём-то, например об ошибке)... Если мы перехватываем ошибку и сами "красиво" сообщаем пользователю в MsgBox, то можно копировать текст сообщения. Ну а если программа сама сообщает об ошибке (к примеру запускаем запрос с ошибкой), то сообщение в лучшем случае можно "фотографировать", а копировать нельзя. Увы, Inputbox, пользовательская диалоговая форма и многое другое - "не копируемые". Я всё больше думаю, что только пользовательский MsgBox имеет такую особенность. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2011, 13:38 |
|
|
start [/forum/topic.php?fid=45&msg=37228352&tid=1610226]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 132ms |
0 / 0 |