|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Хотел бы поделиться с некоторыми своими наблюдениями, обнаруженными фактами. Хотелось бы осуществить что-то вроде «обмен мнений». В и-нете много нестандартных решений казалось бы на первый взгляд «нереальных» задач. Когда начинаешь анализировать коды, то иной раз голова идёт кругом от длинного листинга, а чтобы разобраться иной раз необходимо потратить длительное время. Но разбираться в коде хочется. Хочу начать с запросов. Есть в этом форуме несколько интересных топиков о запросах. Вот некоторые из них: - Самоправка запроса - access сам меняет запрос - Социологическое исследование: Как народ хранит запросы? и т.д., и т.д. Этот список можно продолжать достаточно долго. А собственно, почему так происходит, почему Access самопроизвольно меняет SQL текстовку запроса? На сей счёт у меня появилась версия-гипотеза. Я, конечно, не уверен в том, что мои догадки верны, хочу обсуждать с уважаемым гуру! Я считаю главной причиной «всех бед» это системная таблица « MSysQueries »! Кстати, есть интересная статейка, где как раз описываются некоторые детали данной таблицы: Как достать SQL запрос из *.mdb без MS Access Чтобы правильнее объяснить то, что я имею ввиду, пожалуй, следует произвести следующий эксперимент: Создаём простой запрос и назовем «Query1» Код: plaintext
Код: plaintext
Далее, вручную поменяем название 1-запроса как «Q1». С помощью VBA смотрим текст запроса «Query2». Код: plaintext
SQL текст запроса не изменился, хотя мы название 1-запроса поменяли. А теперь откроем запрос «Query2» в режиме таблицы (можно вручную, а можно программно открывать, эффект – одинаковый). Access не будет ругаться, что не может найти «Query1». Ещё раз запустим процедуру TestQuerySQL. Вуаля! В SQL тексте запроса «Query1» исчез, вместо него «Q1». А как это произошло? Именно благодаря системной таблице «MSysQueries»! Помимо системных таблиц видимо Access где-то «запоминает» старое и новое название объекта после переименования. А перед открытием запроса, скорее всего перепроверяет не изменились ли названия объектов, которых использует данный запрос. Если да, то автоматически сам же подправляет. Вообщем-то всё это скорее сделано для «начинающих» пользователей, которые могут изменить названия объектов базы, но при этом могут и забыть подправить запросы. Системная таблица «MSysQueries» разбивает запросы на поля и это означает, что не только название таблиц и запросов, используемые внутри определённого запроса, но и название полей имеет тот же эффект. Т.е. пусть «Таблица1» имеет поле «Поле1». Пишем такой простой запрос «Запрос1»: Код: plaintext
Но не все запросы имеют такой эффект. А именно следующие виды запросов в системной таблице «MSysQueries» вообще не разбиваются на отдельные поля: - запрос на объединение; - запрос к серверу - запрос на управление - вложенный (внутренний) и подчинённый запрос. «Запрос1» перепишем следующим образом: Код: plaintext
А вот теперь «Запрос1» у нас не будет работать правильно. Если откроете его, то Access воспримет «П1» как параметр, а не как название поля! Видать не с проста Microsoft такие виды запросов как «Объединение», «К серверу», «Управление» отделил в своем интерфейсе отдельно как «Запрос SQL». Так как ими в основном пользуются не новички, а продвинутые пользователи, то и автоматическая корректировка посчитали излишней. Итак, почему же Access самопроизвольно меняет SQL текстовку запроса? Потому что так Accessу более удобнее зафиксировать поля в системной таблице «MSysQueries». Здесь не хотелось бы использовать термин «оптимизатор запросов», ибо здесь не идёт в буквальном смысле оптимизация запросов, а скорее всего происходит «помощь чайникам». Может я сильно ошибаюсь по поводу полного отсутствия оптимизации, может и в правду хоть что-то Access наподобие SQL Server оптимизирует. Но очень часто после такой «оптимизации» сложные фильтры запроса получаются чересчур замудрёнными и порой некорректными. С одного раза даже и не понятно, что и как же запрос фильтрует. Здесь также хочу отметить, почему же вложенных запросов Access 2003 и ранние версии отмечает внутри квадратных скобок. Дело в том, что когда Вы во внутри запроса соединяете более двух таблиц / запросов через INNER, LEFT, RIGHT JOIN, то отдельные части Access заключает в обычные скобки и всё, что находится во внутри этих обычных скобок Access разбивает и размещает у себя в таблице «MSysQueries». А вот когда Accessу как бы «нет необходимости» в разбивке (т.е. случай с вложенным запросом), то для «своего удобства» отмечает эту часть SQL текста особым образом. Ну и здесь есть косяк: так сказать «оптимизатор запросов» (который «оптимизирует» SQL текст запроса для размещения в таблице «MSysQueries») видимо сначала анализирует текст и отмечает ту часть, которую не надо разбивать, квадратными скобками. Ну а если уже в тексте есть оные, то тут разработчики видимо толком не объяснили «оптимизатору» как анализировать такие тексты. Т.к. «оптимизатор» не знает, что делать, то и предпочитает ругаться. Но начиная с Access 2007 слегка такой «порядок вещей» был изменён разработчиками. Теперь «оптимизатор» не пишет квадратные скобки в SQL тексте, а держит «в уме» в момент фиксации SQL текста в системной таблице «MSysQueries». А когда кто-то изменит запрос, то и «оптимизатору» нечего ругаться, ибо в тексте изначально нет квадратных скобок. P.S. Надеюсь, народ начнёт критиковать мой топик и спорить. Как известно в спорах рождается истина. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2011, 15:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как оптимизировать запросы? Как известно, существуют проверенные со временем старинные «лекарства», позволяющие повысить быстродействие запросов. Вот некоторые из них: - по возможности вместо «HAVING» использовать «WHERE». Иногда требуется фильтровать данные после групповых функций таких как «MIN», «MAX», «AVG» и т.д. В таких случаях, увы фильтровать данные с помощью «WHERE» нельзя, придётся использовать «HAVING». А в остальных случаях нецелесообразно использование «HAVING». - по возможности не использовать статистических функций по подмножеству, таких как Dsum, Dcount и т.д. В некоторых случаях если требуется обновляемость запроса, то приходится использовать подобные функции. - по возможности не использовать подчинённые запросы на стороне «WHERE» или «HAVING». Иногда бизнес логика все же требует использование подчинённых запросов. - если нет необходимости сортировки, то не применять ORDER BY. Помимо этих способов Microsoft рекомендует: - по чаще сжимать базу; - использовать индексацию полей и т.д., и т.п. Всем всё это известно. Ничего нового. А вот про IIF почти ни слова! Что мы знаем про IIF? Если открыть справочник Access 2003, то там написано следующее: Функция IIf всегда вычисляет и truepart, и falsepart, хотя возвращает только одно из них. Из-за этого могут возникнуть нежелательные побочные эффекты. Например, если в falsepart произошла ошибка при делении на ноль, эта ошибка возникнет, даже если выражение будет оценено как True. Все эти слова оказались справедливы только для VBA, а вот для JET они не справедливы! Недавно Sator Arepo предоставил наиубедительнейший пример в другом топике. Код: plaintext
Код: plaintext
Из этого следует одна очень полезная фитча: Если в фильтре WHERE использованы несколько условий AND и OR, то вместо них можно использовать IIF и тогда запрос будет работать чуть быстрее. Пример: Вместо следующих условий Код: plaintext
Код: plaintext
При этом рекомендуется расположить условия наибольшего отбора выше по веткам IIF, тогда запрос станет наиболее оптимальным. Условия отбора AND в IIF надо писать с точностью до наоборот, т.е. если Вам нужно условие Field1 > 1, то следует писать IIf(Field1 <= 1, False, а в самом конце True (как указано в примере). А вот условие OR придётся писать через = примерно так: Допустим требуется фильтровать данные по следующим условиям: Код: plaintext
Код: plaintext
Функция IIF имеет ещё одно преимущество: Если использовать достаточно сложные условия отбора, то после сохранения запроса так сказать «оптимизатор» самопроизвольно «подтасует» условия так, как ему удобно (см. мой пост выше). А вот в случае IIF порядок проверки условий гарантированно не будет изменен «оптимизатором». ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2011, 15:31 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Иногда бывает полезным установить CHECK CONTRSTRAINT к определенной таблице, который может сверять данные одной таблицы с другой. Для этого вовсе не обязательно включать опцию " Синтаксис для SQL Server (ANSI 92) ". Но в этом случае придётся установить его программно. Пример: Допустим, у нас есть таблица "Контракт", где есть поле "КодКонтракта" и "Сумма", а также есть таблица "Спецификация", где есть поля: "КодКонтракта", "КодТовара", "Цена", "Количество". Если умножить "Цена" и "Количество" товара, то получим стоимость одной позиции товара. Предположим нам нужно установить ограничение: общая сумма всех позиций по одному контракту не должна превышать сумму контракта. Как это сделать? Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Ну и чтобы удалить ограничение нужно запустить такой код: Код: plaintext 1. 2. 3. 4. 5.
P.S. Ну а вообще конечно лучше использовать VBA функции, чтобы получить больше возможностей (Триггер Бенедикта). Я вышеуказанными примерами лишь подчеркнул, что включение опции " Синтаксис для SQL Server (ANSI 92) " вовсе не обязательное и как видите кириллица (по крайнем мере в А2003) проходит без проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2011, 07:11 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, А вот это уже интересно. Только насколько это оптимальнее чем другие способы (доп. поле в запросе(форме), рекордсет через подобную sql-строку, Dsum и т.д.)? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2011, 07:48 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvk, Вы на уровне базы устанавливаете ограничение. Кто-нибудь даже если создаст линкованную таблицу в "чужой базе" и попытается внести "неправильные" изменения, то уже не сможет. Правда есть маленький нюанс: предметное "ругательство" (наподобие Validation Text) не возможно установить. Для этого ИМХО триггер Бенедикта лучче! Кстати, удаление таблицы также невозможно до тех пор, пока существует CONSTRAINT. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2011, 08:05 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, 1. Тоесть сообщение выдать нельзя никакое? А разве здесь error не обрабатывается?(?) 2. Что касается удаления - пофиг, кто интересно свои рабочие таблицы с данными удаляет? Только маньяк какой-нибудь.. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2011, 09:12 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Интересные факты. Всем известно, что любой запрос в MS Access может иметь максимум 255 полей. А вот в запросах на объединение (UNION) ограничение иное: Общее количество полей каждого блока запроса в сумме не должно превышать 255! Т.е. если 1-блок запроса содержит 128 полей и 2-блок запроса также имеет 128 полей, то Access будет ругаться, т.к. 128+128=256 (больше 255)!!! Пример (этот запрос не пройдёт): Код: plaintext 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.
Если в запросе на объединение имеется поле МЕМО, где имеется значение больше 255 символов, то Access вернет только первые 255 символов. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 13:03 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
авторЕсли в запросе на объединение имеется поле МЕМО, где имеется значение больше 255 символов, то Access вернет только первые 255 символов. Расшифруйте, пожалуйста. По моим наблюдениям, если в 1-й запрос включить мемо поле, то запрос с юнионом не режет длину строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 13:58 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenИнтересные факты. о! сколько нам открытий чудных... (с) studierenОбщее количество полей каждого блока запроса в сумме не должно превышать 255! формулировочка ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 13:58 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Guest33авторЕсли в запросе на объединение имеется поле МЕМО, где имеется значение больше 255 символов, то Access вернет только первые 255 символов. Расшифруйте, пожалуйста. По моим наблюдениям, если в 1-й запрос включить мемо поле, то запрос с юнионом не режет длину строки. Прошу прощения, что не уточнил деталь: - если используете UNION ALL, то Access не режит. - а вот если просто UNION, то Access покажет только первые 255 символов! Вот теперь кажется описал полностью! полиномstudierenОбщее количество полей каждого блока запроса в сумме не должно превышать 255! формулировочка Ну хорошо, может быть написано не совсем правильно. Ну мысль я надеюсь Вы правильно поняли? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 14:22 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenНу мысль я надеюсь Вы правильно поняли? не с первого раза :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 17:20 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Вообще-то про особенность ограничения 255 полей в запросах на объединение решил здесь написать после того, как прочёл топик Too many fields defined. В этом топике есть такой запрос: Код: plaintext
Автор также сообщает, что "в главной таблице 83 поля". Как мы видим в каждом блоке запросов есть дополнительное поле "Part_all", стало быть каждый блок имеет 84 поля. Всего блоков 10, в итоге мы имеем 84*10=840. А это гораздо больше чем 255!!!! Вот именно поэтому и Access ругается " Too many fields defined ". Вывод: в запросах на объединение нежелательно использовать "*", лучше явно указать только необходимые поля! В том топике есть ссылка на интересный сайт, где имеется вот такая информация: Tables: "Too many fields defined" error message (Q) When I try to save a table, I keep getting the error message "Too many fields defined". What\'s causing this to come up? (A) Access keeps an internal count of total number of fields in a table and has a limit of 255 fields per table. Each time you modify a field or add a field, this count increases by 1. When you delete a field, Access does NOT reset this counter. So it\'s possible for you to have less than 255 fields and still get this error message. If your field count is less than 255, just compact the database again which should reset the internal field count counter. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 19:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, неплохо было бы вам проштудировать давний топик ФАК: А знаете ли вы, что... и то, чего там не хватает, добавить. В одном месте хранить все. Желательно было бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 20:17 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 20:36 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
mds_world, Не знал, что есть топик "А знаете ли Вы ..." :)) И что в результате? Опять закроют мой топик? Если это так, то жаль! :(( ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 20:41 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
8060studieren, относительно количества полей в UNION можно посмотреть в этом и следующем за ним постах. Спасибо за ссылку! Значит я ошибся. Бывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 20:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenmds_world, Не знал, что есть топик "А знаете ли Вы ..." :)) И что в результате? Опять закроют мой топик ? Если это так, то жаль! :(( Вовсе нет! Я, во всяком случае этого делать не собираюсь. Вопрос ведь иначе ставится - в аксе есть много различных особенностей, подмеченных разными авторами. Желающему программировать в этой среде полезно их знать. Но поиск затруднителен. Хотя бы потому, что не знаешь, что искать. А когда все собрано в одном месте удобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2011, 20:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
mds_world, Есть "золотые топики". Они одни, слово "золотые" встречается крайне редко на форуме. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2011, 02:46 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А2003 Странную вещЧ я сейчас обнаружил. Допустим есть такой запрос Код: plaintext
Можно его переписать вот так Код: plaintext
Код: plaintext 1.
Продолжил эксперимент и написал вот такой запрос: Код: plaintext 1. 2.
Обычно Access не терпит PARAMETERS во вложенных запросах. А здесь парадокс - пашет как надо! И здесь квадратные скобки никак нельзя заменить на обычные скобки! P.S. Смотрю на всё это и диву дивлюсь: сколько же ещё секреты спрятаны за семью замками. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2011, 11:06 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Просьба тем, у кого есть А2007 или А2010: не могли бы протестировать вот эти запросы? К сожалению у меня в наличии нет таких версий под рукой. Код: plaintext
Код: plaintext 1.
Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2011, 11:19 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Уже достаточно причин для ухода с MDB в ADP ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2011, 11:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenСтранную вещЧ я сейчас обнаружил. Вот здесь пример "странного" запроса без всяких наворотов (в двух постах ниже эта "странность" обсуждается). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2011, 11:32 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
П-ЛУже достаточно причин для ухода с MDB в ADP У меня пока нет ни одной, кроме личного интереса. А будущий переход на акс2010 разве это позволит сделать? p.s. извиняюсь за оффтопик. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2011, 12:13 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если в А2007 написать вот такой запрос в режиме SQL и затем открыть его в режиме таблицы, то запрос работает: Код: plaintext 1. 2.
Но!!! Если сохранить запрос, то Access текст SQL меняет до неузнаваемости! Код: plaintext 1.
Да!!! Дела!!! В А2010 не смог экспериментировать из-за не имения, но подозреваю, что там дела обстоят аналогично. Попробовал экспериментировать с перекрестным запросом в А2007: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2011, 09:46 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2011, 09:56 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#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 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Я когда-то написал вот здесь как можно в запросах в режиме конструктора создавать алиасы (псевдонимы) таблиц не заходя в режим SQL. В справочнике MS Access 2003 есть такая статья "Создание псевдонимов таблиц в запросе (ADP)", где собственно и написано о псевдонимах. Примечание. Сведения в данном разделе относятся только к проектам Microsoft Access (.adp). Псевдонимы создаются для облегчения работы с именами таблиц, представлений или функций. Использование псевдонимов является полезным в следующих случаях. Необходимо создать инструкцию в области SQL, которая будет более короткой и простой для чтения. При частом обращении в запросе к имени таблицы, представления или функции, например к полным именам столбцов, необходимо быть уверенным, что не превышен предел количества знаков в запросе. При работе с несколькими копиями одной и той же таблицы, представления или функции (например в самообъединении) необходимо указать ссылку на одну из копий. Например, можно создать псевдоним "e" для таблицы employee_information, а затем использовать "e" при ссылке на нее. В окне базы данных в списке Объекты нажмите кнопку Запросы , выберите запрос, который нужно открыть, и на панели инструментов окна базы данных нажмите кнопку Конструктор. В области схемы щелкните правой кнопкой таблицу, представление или функцию, для которой необходимо создать псевдоним, и выберите в контекстном меню команду Свойства. В диалоговом окне Свойства введите псевдоним в поле Псевдоним. При создании псевдонима таблицы конструктор запросов подставит псевдоним вместо соответствующего имени таблицы в столбце «Таблица» в области сетки. Примечание. Если для таблицы создан псевдоним, то при ссылке на таблицу в инструкции SQL необходимо использовать именно псевдоним (использовать оригинальное имя таблицы нельзя). В справочнике написано, что данный способ относится только к проектам adp. Но на самом деле и в обычных mdb файлах подобным образом также возможно создавать псевдонимы. (См. рисунок) Там в свойствах помимо "Псевдоним" есть ещё другое не менее интересное свойство "Источник", где можно указать путь любой другой базы и тогда Access будет тянуть информацию из указанной базы. Например, напишем так: "C:\Test.mdb", после этого смотрим в режиме SQL текст запроса. Код: plaintext
Код: plaintext
Код: plaintext
Текст запроса в режиме SQL выглядит примерно так: Код: plaintext
Есть ещё одна альтернатива: предложение IN, с помощью которого также возможно достать таблицы или представления из MS SQL Server (предполагаю, что и с другими видами СУБД дела обстоят аналогичным образом). Но тут есть небольшие сюрпризы, о которых нигде не пишут (во всяком случае я не нашёл). Сначала цитата из справочника: Предложение IN Определяет таблицы в любой внешней базе данных, с которой ядро базы данных Microsoft Jet может установить связь, например в базе данных dBASE, Paradox или внешней базе данных с ядром Microsoft® Jet. Синтаксис Чтобы определить результирующую таблицу: [SELECT | INSERT] INTO назначение IN {путь | ["путь" "тип"] | ["" [тип; DATABASE = путь]]} Чтобы определить исходную таблицу: FROM выражение IN {путь | ["путь" "тип"] | ["" [тип; DATABASE = путь]]} Ниже перечислены аргументы инструкции SELECT, содержащей предложение IN: Элемент Описание назначение Имя внешней таблицы, в которую добавляются данные. выражение Имена одной или нескольких таблиц, из которых отбираются данные. Это выражение может быть именем отдельной таблицы, именем сохраненного запроса или результатом операции INNER JOIN, LEFT JOIN или RIGHT JOIN. путь Полный путь к каталогу или файлу, в котором находится таблица. тип Имя типа базы данных, в которой создана таблица, если база данных несовместима со стандартом Microsoft Jet (например, dBASE III, dBASE IV, Paradox 3.x или Paradox 4.x). Дополнительные сведения С помощью предложения IN можно одновременно подключиться только к одной внешней базе данных. В некоторых случаях аргумент путь задает ссылку на каталог, содержащий файлы базы данных. Например, во время работы с таблицами баз данных dBASE, Microsoft FoxPro® или Paradox аргумент путь задает ссылку на каталог, содержащий файлы .dbf или .db. Имя файла таблицы извлекается из аргументов назначение или выражение. Чтобы определить базу данных, несовместимую со стандартом Microsoft Jet, следует добавить к ее имени знак точки с запятой (;) и заключить имя в одинарные (' ') или прямые (" ") кавычки. Например, 'dBASE IV;' или "dBASE IV;". Кроме того, для описания внешней базы данных можно использовать зарезервированное слово DATABASE. Например, следующие строки описывают одну и ту же таблицу: ... FROM Таблица IN "" [dBASE IV; DATABASE=C:\DBASE\DATA\SALES;]; ... FROM Таблица IN "C:\DBASE\DATA\SALES" "dBASE IV;" Там же есть примеры подключения (но только почему-то о MS SQL Server ни слова!): Предложение IN, примеры В следующей таблице демонстрируется использование предложения IN для отбора данных из внешней базы данных. В примерах предполагается, что таблица «Клиенты» сохраняется во внешней базе данных. База данных Инструкция SQL База данных Microsoft® Jet SELECT КодКлиента FROM Клиенты IN Заказы.mdb WHERE КодКлиента Like "A*"; dBASE III или IV. Для отбора данных из таблицы dBASE III, замените "dBASE III;" на "dBASE IV;". SELECT КодКлиента FROM Клиенты IN "C:\DBASE\DATA\SALES" "dBASE IV;" WHERE КодКлиента Like "A*"; dBASE III или IV в синтаксисе Database. SELECT КодКлиента FROM Клиенты IN "" [dBASE IV; Database=C:\DBASE\DATA\SALES;] WHERE КодКлиента Like "A*"; Paradox 3.x или 4.x. Для отбора данных из таблицы Paradox версии 3.x, замените "Paradox 3.x;" на "Paradox 4.x;". SELECT КодКлиента FROM Клиенты IN "C:\PARADOX\DATA\SALES" "Paradox 4.x;" WHERE КодКлиента Like "A*"; Paradox 3.x или 4.x в синтаксисе Database. SELECT КодКлиента FROM Клиенты IN "" [Paradox 4.x;Database=C:\PARADOX\DATA\SALES;] WHERE КодКлиента Like "A*"; Книга Microsoft Excel SELECT КодКлиента, Название FROM [Клиенты$] IN "c:\documents\xldata.xls" "EXCEL 5.0;" WHERE КодКлиента Like "A*" ORDER BY КодКлиента; Именованный диапазон электронной таблицы SELECT КодКлиента, Название FROM ДиапазонКлиенты IN "c:\documents\xldata.xls" "EXCEL 5.0;" WHERE КодКлиента Like "A*" ORDER BY КодКлиента; Как же следует указать текст подключения в предложениях IN, чтобы получить данные из определённой таблицы или представления? Сначала укажем пустую строку (либо 2 апострофа '', либо 2 кавычки "", либо 2 квадратные скобки []) или же любое слово, но без пробелов и только потом текст подключения. Текст подключения также следует написать либо внутри апострофов, либо кавычек, либо квадратных скобок. Вот варианты Код: plaintext
Код: plaintext
Но в то же время также можно текст подключения разделить на 2 части и указать отдельно. Типа так: Код: plaintext
Если логин и пароль пользователя не указан, а также отсутствует параметр " Trusted_Connection=Yes ", то при первом запуске запроса выходит диалоговое окно, куда и следует ввести логин и пароль для доступа к серверу. P.S. Может кто-нибудь подскажет ссылку на "официальную" литературу, где можно прочесть о всех нюансах предложения IN? А может кто-то уже досконально изучил данный предмет и знает многие-многие нюансы / особенности / "секреты"? Не поделитесь? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2011, 20:07 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren Код: plaintext
Большое спасибо за проведённое исследование. Я в Access'е уже редко, пробовал в Word (в VBA), не получилось. Ставлю любую типичную ошибку, например, fgd = 0, при попытке компиляции выдаёт ошибку, сохраняю, выхожу, захожу снова - натыкаюсь на не нужный мне модуль. В 2007 версии Word, по-моему, эта особенность исправлена, и там можно попадать сразу в последний исправленный модуль. Наверное, это годится для Access. Впрочем, всё по той же ссылке YBW, а затем и я, обнаружили, что способ Serge Gavrilov работает, а он, видимо, взял откуда-то с другого сайта, судя по комментариям в этом Add-In'е. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 14:05 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindВпрочем, всё по той же ссылке YBW, а затем и я, обнаружили, что способ Serge Gavrilov работает, а он, видимо, взял откуда-то с другого сайта, судя по комментариям в этом Add-In'е. Что я взял с другого сайта? Комментарии в каком Add-In? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 14:40 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Serge Gavrilov, Сохранение позиции в модуле Забыл дописать, что нужно написать 2 bat-файла: install.bat: Код: plaintext
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 15:08 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindSerge Gavrilov, Сохранение позиции в модуле там вообще нет комментариев ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 15:52 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindstudieren Код: plaintext
Большое спасибо за проведённое исследование. Я в Access'е уже редко, пробовал в Word (в VBA), не получилось. Ставлю любую типичную ошибку, например, fgd = 0, при попытке компиляции выдаёт ошибку, сохраняю, выхожу, захожу снова - натыкаюсь на не нужный мне модуль. В 2007 версии Word, по-моему, эта особенность исправлена, и там можно попадать сразу в последний исправленный модуль. Наверное, это годится для Access. Впрочем, всё по той же ссылке YBW, а затем и я, обнаружили, что способ Serge Gavrilov работает, а он, видимо, взял откуда-то с другого сайта, судя по комментариям в этом Add-In'е. День добрый, CoolMind! Сначала не понял о чём речь, а потом вспомнил. Да, действительно я написал особенность А2003. После Вашего сообщения попробовал в Excel 2003, там тоже такой "трюк" не проходит, в смысле не попадаем в "ошибочный" модуль. Значит это касается только А2003. А вообще я так и не понял, почему и по какому принципу некоторые модули внутри A2003 открыты, когда мы первый раз запускаем, а некоторые закрыты. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 16:11 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Serge Gavrilovтам вообще нет комментариев Connect.Dsr: Код: plaintext 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 16:16 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А вот еще интересный "факт"... 1. Снял флаг отображения с таблицами и проч. Файл->Параметры->Текущая база данных->снять галку Область перехода->Перегрузить БД 2. Убрал встроенные меню MSAccess (Property базы "AllowFullMenus"). 3. Вижу результат как на прикрепленном файле (все в порядке, все закрыто). 4. См. след пост т.к. не знаю как 2 картинки прикрепить... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 17:01 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Теперь правым кликом на кнопочку "микрософт", выбираем пункт "Настройка панели быстрого доступа" и вуаля. Спрашивается, за что боролся? Может кто знает, как закрыть этоти "лаз" от пользователей? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 17:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindSerge Gavrilovтам вообще нет комментариев Connect.Dsr: Код: plaintext 1. 2. 3. 4. 5. 6.
А как эти комментарии, которые вы приводите, указывают, что что-то взято с какого-то сайта? Если бы вы когда-либо писали Addin-ы на VB6, то знали бы, что эти комментарии появляются "автоматом" при создании нового проекта, если шаблоном был выбран Addin. Попробуйте. Если я добавляю комментарии, то в основном пишу их тоже на английском. Если использую чей-то код, то стараюсь приводить в комментариях источник, откуда он взят. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.05.2011, 23:02 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Lockpickup, Я просто переименовал формат файла "accdb" на "accdr", т.е. сделал как бы "Runtime" и у меня получился "не активный" меню (см. картинку). Не вариант? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2011, 07:50 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Serge Gavrilov, действительно, с этим трудно спорить, поэтому я и написал слово "видимо". Извините, пожалуйста. Очень рад, что это Ваш код, и он очень помогает в работе. Добрый день, studieren! Ваш метод тоже очень удобен для случая Access, потому что при установке Add-In во всех Офисных приложениях по окончании работы будет задаваться вопрос о сохранении. Для Access это и так общепринято, а вот для Word было бы не очень удобно, поэтому я обычно запускаю install.bat перед сохранением позиции, а по окончании - uninstall.bat. Требуется редко, но метко. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2011, 08:21 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
CoolMindSerge Gavrilov, действительно, с этим трудно спорить, поэтому я и написал слово "видимо". Извините, пожалуйста. Очень рад, что это Ваш код, и он очень помогает в работе. Хорошо, а код был приведен в качестве примера возможного решения... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2011, 09:28 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, очень даже вариант!! Благодарствую. Только я переименовал .accde в .accdr. И, что очень приятно, там нет панельки "Область навигации". ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2011, 10:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Чтобы узнать как долго работает Windows можно воспользоваться вот таким кодом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Код взял отсюда и слегка переделал. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2011, 15:34 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Application.ADOConnectString - Что это? В хелпе нет, в объект бровсере нет, в подсказке (после точки) не возникает. На форуме - один пост ( 7301856 ). Зачем он? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.05.2011, 23:49 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Guest33...в объект бровсере нет, в подсказке (после точки) не возникает... Есть, включите в Object Browser "Show Hidden Memberы" ... |
|||
:
Нравится:
Не нравится:
|
|||
19.05.2011, 01:13 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Интересный факт: Если во внутреннем запросе использовать какую-нибудь VBA функцию, но при этом во внешнем запросе не ссылаться на данное поле (столбец) в фильтрах и в сортировках, иначе говоря если бестолково использовать VBA функцию во внутреннем запросе, то Access полностью ИГНОРИРУЕТ данную функцию, словно её там нет. Чтобы было более понятно приведу такой пример. Создаю такую функцию Код: plaintext 1. 2.
Код: plaintext 1. 2.
А вот при таком запросе замучает MsgBoxами! Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2011, 13:50 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Ещё одна деталь: Данное утверждение оказывается верно и для запросов внутри запроса. Т.е. если мы используем какой-нибудь запрос (скажем "Запрос1") как источник данных для другого запроса и при этом в первом запросе использованы VBA функции, которых мы не используем во втором запросе, то и в таких случаях Access игнорирует VBA функцию. Сохраним такой запрос под именем "Запрос1": Код: plaintext 1.
Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2011, 14:05 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, А тут и не должно быть его, ведь select name, а не test. И вообще с сохранёнными и несохранёнными запросами много фишек, одни только вычисляемые поля чего стоят. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2011, 03:25 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Можно ли создать такой запрос с параметром, который возвращает список названий запросов, содержащих определенный фрагмент SQL текста? Да, можно и на самом деле всё очень просто. Вот один из вариантов: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
А если у кого-то есть ещё более простое решение, please поделитесь. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2011, 08:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если в файле mdb имеются несколько таблиц, присоединённых через ODBC (linked table) к различным базам данных из разной СУБД, то при первом обращении к такой таблице появляется специальное диалоговое окно, куда пользователь должен ввести логин и пароль. Видимо Access где-то запоминает логин и пароль пользователя, т.к. при повторном обращении к одной и той же таблице уже не спрашивает аутентификацию. Ну а если открыть другую таблицу, присоединённой к другой СУБД, то вновь появится диалоговое окно для аутентификации. Допустим, логин и пароль пользователя абсолютно одинаковый для всех БД из разных СУБД. Как же сделать так, чтобы Access спрашивал логин и пароль пользователя только один раз? Я как-то уже спрашивал этот вопрос вот здесь, где уважаемый Ё подсказал достаточно оригинальный способ решения проблемы. Для этого в Accessе создаём рабочую группу, где следует создать идентификационные данные пользователя (логин и пароль) аналогичные с другими СУБД. Обязательно также следует запаролить пользователя "Admin" иначе при открытии файла Access не будет спрашивать пароль. Когда мы откроем и введём логин и пароль для Accessа, то этого будет достаточно, больше при обращении присоединённых таблиц аутентификация пользователя не требуется. Всё вроде бы нормально работает. Но!!! Начиная с А2007 теперь Microsoft отказывается от рабочей группы (файл mdw). Вообще-то у рабочей группы была ещё 1 полезная особенность: можно было защитить не только таблицы и запросы, но и такие объекты базы как формы и отчёты. Теперь, увы, они беззащитны. Но это уже другая тема. Как же теперь поступить, если файл в формате А2007 или даже А2010? Один из самых простых способов решения это «временные запросы к серверу». Для этого сначала создаём форму, где требуется ввести логин и пароль пользователя. Для поля «пароль» ставим маску ввода «PASSWORD». Теперь создаём «временный» запрос таким образом: Код: plaintext
После всего этого можно без проблем открыть любую присоединённую таблицу и при этом не вводить идентифицирующие данные пользователя. P.S. Прилагаю mdb файл (в формате A2003), где есть форма «Authentication». Там есть ещё одна дополнительная таблица «USys_DefaultUser», которая необходима для определения логина пользователя по умолчанию. Программа запоминает логин последнего пользователя в данной таблице и при следующем запуске Acccessа по умолчанию логин будет появляться. Разумеется, и с помощью API функций можно узнать последнего пользователя, но на мой взгляд данное решение более простое. Можете импортировать форму «Authentication» и таблицу «USys_DefaultUser» в свою базу. Только не забудьте в модуле формы заменить «НазваниеDSN» и «НазваниеБД» на реальное значение, ну и саму форму можно повесить на стартап. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.05.2011, 20:27 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Прилагаю файл "FindObject.mdb" (в формате А2003), где есть форма "FindObject", с помощью которой можно: - найти объект БД по фрагменту названия - удалить объект БД (для этого нужно выбрать из списка название объекта и нажать на DELETE) - получить некоторые свойства объекта (например названия полей таблицы / запроса) - поиск запроса по фрагменту SQL текста запроса (3-закладка) - выбрать объект в окне БД (кнопка "очки", можно нажать на Alt+7) - открыть объект в режиме конструктора ("линейка", Alt + 8) - открыть / запустить объект ("!", Alt + 9) В реальных базах, где могут быть множества объектов, данная форма очень помогает быстро найти любой объект. Также рекомендуется создать макрос "AUTOKEYS", где следует назначить на определенную клавишу вызов формы "FindObject", к примеру F4. Т.к. данная форма опирается на системную таблицу MSysObjects, которая отсутствует в adp, она применима только в "mdb" и в "accdb" файлах (проверено в А2007, там тоже работает). Когда мы вручную удаляем таблицу или запрос, Access на самом деле не удаляет, а переименовывает объект типа так "~TMPCLP456161". С помощью формы "FindObject" можно окончательно удалить объект из базы. P.S. Может быть кому-то пригодиться. Жду замечаний и критики от аудитории. Если найдёте косяк, please пишите. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2011, 21:22 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Слегка улучшил файл "FindObject.mdb" и исправил некоторые ошибки. Теперь можно заменить программно фрагмент SQL текста запроса. Например, если Вы переименовали таблицу, то теперь программно можете переделать все запросы, которые в своём тексте ссылаются на переименованную таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2011, 18:28 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
В хелпе как-то "мелко" написано по поводу таблицы "MSysConf". Примечание. Сведения в данном разделе относятся только к базам данных Microsoft Access (.mdb). Важно При создании таблицы «MSysConf» необходимо правильно выполнить ее настройку, иначе подключение к таблице базы данных SQL (База данных SQL. База данных, для управления которой используется язык SQL (Structured Query Language).) будет невозможно. При администрировании базы данных SQL, в качестве клиентского интерфейса для работы с которой используется Microsoft Access, можно создать в базе данных SQL таблицу с именем «MSysConf», помогающую управлять взаимодействием этих двух приложений. Таблица «MSysConf» имеет две функции. - Позволяет отключать средство, обеспечивающее пользователям возможность сохранять в клиентской базе данных Microsoft Access имя и пароль для подключения к связанной базе данных SQL. - Оптимизирует способ заполнения Microsoft Access записей в фоновом режиме при простое, позволяя задать количество одновременно загружаемых строк данных и время задержки (в секундах) между загрузками. Если таблица «MSysConf» не создана, Microsoft Access использует стандартные значения: 100 записей с загрузкой через каждые 10 секунд. Структура таблицы «MSysConf» Таблица «MSysConf» базы данных SQL должна иметь следующую структуру. Имя столбца Тип данных Пустое значение Config Тип данных, соответствующий 2-байтовому целому числу НетchValue VARCHAR(255) Да nValue Тип данных, соответствующий 4-байтовому целому числу Дапримечания VARCHAR(255) Да Примечание. Если в используемом источнике данных учитывается регистр знаков, имена таблицы и столбцов должны вводиться точно так, как они написаны. Данные в таблице «MSysConf» В таблице «MSysConf» допустимы три записи. В следующей таблице перечислены значения, которые следует ввести в поля «Config» и «nValue». Остальные столбцы зарезервированы для дальнейшего использования, и их содержимое игнорируется. Config nValue Результат 101 0 Запрет локального хранения сетевого имени и пароля связанной таблицы. 101 1 Разрешение локального хранения сетевого имени и пароля связанной таблицы. 102 D D — время задержки в секундах между операциями загрузки. 103 N N — число загружаемых строк. Примечание. Более длительное время задержки снижает загруженность сети, но увеличивает время, в течение которого данные открыты только для чтения (если сервер использует блокировку, допускающую только чтение). Создал на стороне SQL Server таблицу "MSysConf", но особой разницы не почувствовал. Ввёл значения 101, 0 в соответствующие поля "Config" и "nValue". Однако во всех линкованных таблицах и запросах к серверу, где заранее были сохранены логин и пароль пользователя не удалились. :) Когда создаю новую линкованную таблицу с помощью мастера, то обычно Access спрашивал сохранить ли логин и пароль. После этого перестал спрашивать. И это Microsoft называет "Запрет локального хранения сетевого имени и пароля связанной таблицы" ? Ну и "время задержки", а также "число загружаемых строк" также не совсем понятны. Я поэкспериментировал, но особой разницы не заметил. Кто нибудь может подробно объяснить об этой таблице? В каких случаях она может быть действительно полезной? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2011, 19:20 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
попробуй скачать файл отсюда или найди его на msdn или support.microsoft.com http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=492885&msg=4900746 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.07.2011, 20:01 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
сосед-акцессник, Спасибки Вам и "бабай". Интересный файл, там много чего интересного подробно написано. Читаю и изучаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.07.2011, 09:07 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как программно отправить на печать только определенные страницы отчета с заданным количеством экземпляров? Допустим, имеется отчёт с несколькими страницами. Скажем - 100 страниц. Нам нужно напечатать все страницы начиная с 10 по 20 в 2-х экземплярах. Как это сделать программно? Для этого создадим следующую VBA функцию: Код: plaintext 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.
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
12.07.2011, 15:26 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Очепятка в предыдущем посте. :) Вместо "Intiger" читать как "Integer" в параметрах функции. Как известно в VBA есть стандартный MsgBox. В принципе и в библиотеке "WSript.Shell" есть свой MsgBox. Код: plaintext
Есть также у Win API свой MsgBox. Код: plaintext
MsgBox в WinAPI и в WSript.Shell в отличии от стандартного MsgBox в VBA не модальный, т.е. даже когда Вы получаете MsgBox и ещё не нажали на кнопку, то Вы можете параллельно запускать любую процедуру/функцию и VBA параллельно будет выполнять. Но только клавиша F11 при этом не работает. :) P.S. Случайно наткнулся на топик MsgBox на нерусском в русской версии win и MA?, где уважаемый Бенедикт предложил способ вывода текста MsgBox на любом языке (хоть на арабском). Код уважаемого Бенедикта Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2011, 10:20 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Чтобы в запросах произвести условную сортировку, т.е. если выполняется 1-условие, то 1-блок данных сортируется первым, если 2-условие, то 2-блок и т.д., обычно пользуются функцией IIf. Что-то вроде этого: Код: plaintext 1. 2.
Код: plaintext 1. 2.
Код: plaintext 1. 2.
Есть ещё 1 нюанс: если таблица не "родная" для Access, а линкованная через ODBC (скажем таблица SQL Server), то такой номер не проходит, произойдёт ошибка: Код: plaintext 1. 2.
В таком случае специально нужно использовать функцию, которая отсутствует на стороне SQL Server, и тогда запрос будет работать на УРА: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 14:17 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Вот здесь показан способ перехвата нажатия на кнопку меню. В качестве примера показан случай перехвата сортировки: Код, который ловит событие нажатие кнопки сортировки 1. включите ссылку на библиотеку офис 2. в начале модуля формы : Private WithEvents SortACBtn As Office.CommandBarButton Private WithEvents SortDeBtn As Office.CommandBarButton Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Там же имеется таблица с указанием ID контролов меню. Я по аналогии попробовал блокировать FIND (найти), т.е. если пользователь захочет найти запись, то я программно хочу заменить "Поиск" на "Фильтр", ибо как известно поиск работает значительно медленнее чем фильтр. Но почему-то код, прекрасно блокирующий сортировку, не хочет блокировать поиск. Что здесь не так? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Видимо здесь проблема с Id контрола. Как найти правильный Id? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2011, 13:26 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
С id=141 клик кнопки меню отлавливает, а комбинацию Ctrl+F - фиг. (А2003) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2011, 14:57 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
nord-woolfС id=141 клик кнопки меню отлавливает, а комбинацию Ctrl+F - фиг. (А2003) Thank you! :-)) Ну тогда сделаю 141 для перехвата меню и параллельно буду перехватывать комбинацию клавиш Ctrl + F. Ещё 1 вопрос: можно ли переделать данный код так, чтобы возможно было позднее связывание, т.е. без подключения к MS Office? Пробовал разные варианты, но что-то у меня не получается. P.S. А как обстоят дела в А2007 и в А2010? Был бы признателен ежели кто-нибудь напишет будет ли работать данный код в этих версиях. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 07:19 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, С подпиской на события позднее связывание не годится. Нужна типизированная переменная соответствующего класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 08:47 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если хотим узнать версию Windows, вызвав диалоговое окно "About", то можем использовать вот такой код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Оказывается в данном диалоговом окне можно кое-что добавить. Что то вроде этого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Правда маловато текста умещается. Для заголовка и первой строки - всего лишь 1 строка, а для "середины" - 2 строки. :) Здесь же можно ещё добавить иконку. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2011, 12:53 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, А для чего это? Просто интересно, подумал, подумал и не нашёл применения. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2011, 02:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvk, Просто "спортивный интерес". Оказывается и такое возможно. :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2011, 07:18 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Есть 1 топик: Вопросы по форматированию полей . Там вопрос № 1 гласит так: В "Word"е имеется возможность выравнивания текста по ширине (в VBA ".ParagraphFormat.Alignment = wdAlignParagraphJustify"). В "Access"е также имеется свойство полей "Выравнивание текста" (TextAlign), где можно присвоить значение 4 (Distribute), после чего текст будет выровнен по ширине. Но имеется один недостаток: если последняя строка состоит из 1 или 2 слов, то Access расширит текст чуть ли не по буквам. А это в официальных документах (таких как контракт) не допустимо! Как же сделать так, чтобы последнюю строку "Access" не трогал так же как в "Word"е? В этом топике есть пост nord-wolf 9510505 , где в приложенном файле имеется код, который и расширяет текст. Однако есть небольшие недостатки: I) если текст имеет перевод строки (Chr(13) + Chr(10)), то выглядит отчёт немного не так как надо; II) высота поля должна быть неизменной, ну а если в деталях отчёта будет выходить несколько записей и если высота полей нефиксированная, то в отчёте будет выходить либо пустота между записями (если мы увеличили с запасом высоту поля), либо "пропадают" строки (что конечно же не допустимо). Проблема в том, что если свойство поля "Visible" = False, то высота поля станет неизменной даже если свойство "Расширение" (CanGrow) имеет значение "Да". 2-проблему можно решить только в том случае, если сделать фон и шрифт поля прозрачным и тогда можно будет свойство поля "Вывод на экран" (Visible) указать как true. К сожалению, я пока не смог решить это. А вот для того, чтобы решить 1-проблему я немного изменил код nord-wolf (главное изменение: я не стал расширять текст, а расширил пробелы между текстами как это делает Word) и у меня получился такой вариант: Этот код можно разместить в модуле. Код: plaintext 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. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119.
А в модуле отчёта можно указать примерно такой код Код: plaintext 1. 2. 3.
P.S. Код в принципе рабочий. Как только смогу решить и 2-проблему выложу здесь. Наверное Бенедикт или кто-то ещё из экспертов знает как сделать фон поля и шрифт сделать прозрачным, а не белым. Если подскажите как это сделать, был бы признателен. :) И ещё! Спасибо nord-wolf за его код. Если у кого-то более "продвинутый код", please поделитесь! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2011, 10:47 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Не помню откуда, но как то мне попался код, который запрещает открытие одной и той же базы 2 раза. А код достаточно простой, многократно использовал в разных проектах и ничего, работает. :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2011, 07:36 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Бывают случаи, когда в подчинённой таблице необходимо ввести не все значения ключевого поля главной таблицы, а избранные. В таких случаях часто в главной таблице создают дополнительное поле - некий признак: если признак соответствует каким-то требованиям, то значения ключевого поля только данной записи может быть в подчинённой таблице. Чтобы было более понятно приведу пример: Допустим есть таблица "tblCustomer", где ключевое поле "CustomerID". Есть также подчинённая таблица "tblBonus", где также имеется поле "CustomerID", куда необходимо ввести код не любого клиента, а только "VIP" клиентов. В таких случаях часто программисты создают дополнительное логическое поле "VIP" в таблице "tblCustomer" и создают Check Constraint (или триггер если таблицы находятся в "реальных" РСУБД), чтобы контролировать ввод клиентов из категории "VIP". А в Access многие вообще не возятся с Check Constraint, а в включают проверку на событие BeforeUpdate. А существует ли другой способ без Check Constraint, триггеров и проверок на событие BeforeUpdate, но чтобы "железно" гарантировать ввод избранных значений ключевого поля (например, только VIP клиентов)? Оказывается есть и для этого зачастую даже не требуется создание отдельного поля - признак в главной таблице. Итак, следует создать дополнительную таблицу "tblVIP", где будет единственное поле "CustomerID" и необходимо связать с главной таблицей "tblCustomer" по принципу "один к одному", при этом таблица "tblCustomer" должна находиться "левее". В таблицу "tblVIP" будем вводить код только VIP клиентов. А подчинённую таблицу "tblBonus" необходимо связать не с главной таблицей "tblCustomer", а с таблицей "tblVIP". Вот теперь без всяких Check Constraint, "триггеров" и проверок на событие BeforeUpdate "железно" можем гарантировать "избранных" значений ключевого поля. P.S. Связь "1 к 1" редко бывает полезным, но этот случай пожалуй исключение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2011, 08:06 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Часто на форуме спрашивают как перевернуть текст на 90 градусов. (Сам тоже как-то спрашивал :), но теперь-то знаю как это просто.) В Аксессе есть конечно свойство "По вертикали", но оно переворачивает текст на 270 градусов. Как же всё-таки перевернуть на 90 градусов? Как правило, переворачивать текст следует в заголовках столбцов отчёта (т.е. в надписях, находящихся в верхнем колонтитуле или же в заголовке отчёта). А в самих деталях отчёта редко такое требуется. Самый простейший способ это создание нужного заголовка в виде таблицы в MS Excel. После этого просто копируем таблицу и в отчете Аксесса в режиме конструктора в верхнем колонтитуле или же в заголовке отчёта вставим из буфера обмена. Всё просто и ни одной строчки кода! :) Есть конечно сложные коды Лебенса (мне посоветовали тогда именно их 9504909 ), но зачем когда имеется самый простой способ. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 14:59 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Komil_, а вот тут можно и спотыкнуться, когда параметры страницы менять будешь ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2011, 15:28 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Я раньше думал, что основное преимущество ADO перед DAO заключается в универсальности подключения к любой СУБД, находясь где угодно. Да хоть в Excel'е или в Word'е можем подключаться к Oracle, MySQL и т.п., а не только Access или SQL Server. Я раньше полагал, что DAO предназначен только для работы в Access и минуя ее не может подключится к другим СУБД. В смысле в Access'е создаём линкованную таблицу или запрос к серверу и только потом можем работать в других СУБД. Но как я понял позже, я ошибся, DAO тоже умеет работать с другими СУБД, минуя Access, главное - на клиентском компьютере должны быть соответствующие драйверы. Ещё одним большим сюрпризом для меня стало то, что объект RecordSet в DAO умеет работать и "чужим" синтаксисом (словно запрос к серверу), а не только синтаксисом Jet SQL. Но только для этого придётся "колдовать" и "шаманить" слегка. :) Из-за чистого спортивного интереса стал экспериментировать в DAO. Вот примерчик как можно подключиться к SQL Server (данный код можно использовать и в Excel'е): Код: plaintext 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.
Возникает вопрос: а в чём всё-таки бесспорное преимущество ADO от DAO? Что же умеет ADO чего не умеет DAO? Я знаю только то, что ADO "почти всё" умеет в стандарте ANSI92 SQL даже если сама база не переведена в этот стандарт (т.е. умеет запускать некоторые запросы на управления, которых DAO не может запускать без перехода в этот стандарт). Ну и сам Microsoft вроде бы грозился убрать DAO в будущих версиях, мол устаревшая технология. По крайнем мере в А2007 пока DAO жив (из-за не имения А2010 не знаю как там). А ещё в чём же преимущество? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 09:55 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren....................... Возникает вопрос: а в чём всё-таки бесспорное преимущество ADO от DAO? Что же умеет ADO чего не умеет DAO? Я знаю только то, что ADO "почти всё" умеет в стандарте ANSI92 SQL даже если сама база не переведена в этот стандарт (т.е. умеет запускать некоторые запросы на управления, которых DAO не может запускать без перехода в этот стандарт). Ну и сам Microsoft вроде бы грозился убрать DAO в будущих версиях, мол устаревшая технология. По крайнем мере в А2007 пока DAO жив (из-за не имения А2010 не знаю как там). А ещё в чём же преимущество? Да какой смысл разбирать две устаревшие технологии доступа к данным? Из спортивного интереса если только? Могу подкинуть одно преимущество ADO (если конечно, не ошибаюсь): multiple recordsets. Эта возможность мне помогла добиться выполнения скрипта из нескольких SQL-команд в Jet-e, когда создавал для себя нечто вроде Query Analyzer. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 11:09 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если не ошибаюсь, второй вариант ОДБС подключения (через опенконнект) называется ODBC direct и в А2010 не поддерживается. Обнаружил, когда для пробы переводил свою программу с А2003 на А2010 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 13:09 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Sator ArepoДа какой смысл разбирать две устаревшие технологии доступа к данным? Разве технология ADO (ADODB/ADOX) уже устарела? У нее есть альтернатива? Sator ArepoМогу подкинуть одно преимущество ADO (если конечно, не ошибаюсь): multiple recordsets. Вы имеете ввиду NextRecordset или что-то другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 13:20 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenSator ArepoДа какой смысл разбирать две устаревшие технологии доступа к данным? Разве технология ADO (ADODB/ADOX) уже устарела? У нее есть альтернатива? Sator ArepoМогу подкинуть одно преимущество ADO (если конечно, не ошибаюсь): multiple recordsets. Вы имеете ввиду NextRecordset или что-то другое? Да, NextRecordset. Насчет "устаревшие" - может и погорячился. Альтернатив DAO/ADO для Аксесса в любом случае нет. Дык и Аксесс уже дедушка на пенсии - ADO.Net не для него. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 13:35 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Вообще-то и в DAO есть NextRecordSet. Значит единственное преимущество (по крайнем мере другого пока не вижу) - это умение запускать спец запросов на управление (например, создание Check Constraint). Ну если ошибаюсь и всё-таки есть что-то, please напишите. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 13:50 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenВообще-то и в DAO есть NextRecordSet. Значит единственное преимущество (по крайнем мере другого пока не вижу) - это умение запускать спец запросов на управление (например, создание Check Constraint). Ну если ошибаюсь и всё-таки есть что-то, please напишите. А чего желтым цветом-то? Спасибо, я не знал - т.к. необходимости не было, а когда начинал изучать Аксесс, вовсю пропогандировался ADO. Одно из многочисленных обсуждений http://www.accessmonster.com/Uwe/Forum.aspx/access-ado/1780/ADO-vs-DAO ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 13:52 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenВообще-то и в DAO есть NextRecordSet. Значит единственное преимущество (по крайнем мере другого пока не вижу) - это умение запускать спец запросов на управление (например, создание Check Constraint). Ну если ошибаюсь и всё-таки есть что-то, please напишите. вот еще интересное обсуждение http://blogs.msdn.com/b/michkap/archive/2007/07/13/3849288.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 13:57 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Sator Arepo, Спасибо! Хорошие ссылки. Читаю и изучаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2011, 14:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Чтобы использовать регулярные выражения я создал такую функцию: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 1.
Код: plaintext 1.
Код: plaintext 1.
А вот в VBA и в Jet SQL эти символы не входят в данный диапазон. Код: plaintext 1. 2. 3.
Код: plaintext
Пробую так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2011, 11:38 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Столкнулся как-то с одной проблемой: есть таблица с несколькими полями, из которых в соответствии с требованиями бизнес правил 4 поля (условно назову Field1, Field2, Field3, Field4) должны были всегда либо заполнены, либо пустые, т.е. частичное заполнение не допускается. Тогда я на стороне SQL Server создал вот такой Check Constraint: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Т.е. идея данного Check Constraint состоит в том, что в случае заполнения всех полей или наоборот не заполнения всегда получим в сумме 10, а если хотя бы одно поле не заполнено, тогда как остальные поля заполнены, то уже сумма никак не получится 10. Конечно можно было бы переписать данный код и таким образом: Код: plaintext 1. 2. 3.
Есть ли у кого-нибудь другая более "продвинутая" идея, более красивое решение? Вот пример красивого решения другой проблемы: если нам нужно отфильтровать данные за текущий месяц, то можно использовать вот такой код а запросах: Код: plaintext
Код: plaintext
Код: plaintext
Вот и думаю, а может действительно есть более "красивый" и эффектный Check Constraint? P.S. Вопрос чисто из разряда "спортивный интерес". :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 09:51 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenТ.е. идея данного Check Constraint состоит в том, что в случае заполнения всех полей или наоборот не заполнения всегда получим в сумме 10, а если хотя бы одно поле не заполнено, тогда как остальные поля заполнены, то уже сумма никак не получится 10. Можно сэкономить 8 вызовов функций (4 раза IIF, 4 раза IsNull): Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 10:22 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwrqwr, Хороший вариант. :) А вот в SQL Server наверное без CASE WHEN ... THEN ... перевести нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 10:37 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, так в последнем варианте ведь нет iif или case. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 10:41 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenА вот в SQL Server наверное без CASE WHEN ... THEN ... перевести нельзя?Напрямую нельзя, т.к. там нет логического типа данных, а в Access - есть, да еще и участвующий в неявных преобразованиях (в 0 или -1). ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 10:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenСтолкнулся как-то с одной проблемой: есть таблица с несколькими полями, из которых в соответствии с требованиями бизнес правил 4 поля (условно назову Field1, Field2, Field3, Field4) должны были всегда либо заполнены, либо пустые, т.е. частичное заполнение не допускается. Тогда я на стороне SQL Server создал вот такой Check Constraint: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Т.е. идея данного Check Constraint состоит в том, что в случае заполнения всех полей или наоборот не заполнения всегда получим в сумме 10, а если хотя бы одно поле не заполнено, тогда как остальные поля заполнены, то уже сумма никак не получится 10. Конечно можно было бы переписать данный код и таким образом: Код: plaintext 1. 2. 3.
Есть ли у кого-нибудь другая более "продвинутая" идея, более красивое решение? ... Термины вроде "красивое" и "изящное" плохи тем, что предполагают наличие развитых навыков мышления и надежную систему оценок среди любителей красоты. Разумно понизить градус и заменить красивое на прикольное. Есть ли варианты прикольнее? Если 4 поля числовые, то все заполнены можно сформулировать так (sgn(a)*sgn(b)*sgn(c)*sgn(d)) is not null (в расчете на то, что sgn в jet сможет принять null-значения) а все пропущены так (a+b+c+d) is Null для строковых полей можно записать что-то такое все заполнены (sgn(len(a))*sgn(len(b))*sgn(len(c))*sgn(len(d))) is null все пропущены (a+b+c+d) is Null или (len(a)+len(b)+len(c)+len(d)) is Null в принципе, вариант для строк м.б. применим и для чисел. Выбирая между прикольными и нормальными вариантами можно руководствоваться 1)решением о том, какой из вариантов наиболее прямо выражает намеренеия создателя 2) какой из вариантов выглядит привлекательнее с точки зрения последующего сопровождения. как-то так... ясно ли читателю, почему создатель написал (sgn(a)*sgn(b)*sgn(c)*sgn(d)) is not null а не (a*b*c*d) is not null ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 11:30 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
опечатка, д.б. так все заполнены (sgn(len(a))*sgn(len(b))*sgn(len(c))*sgn(len(d))) is not null ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 11:31 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
врядли это чем-то лучше уже предложенного ... просто - "в копилку" )) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 11:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ёврядли это чем-то лучше хуже =) Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 11:56 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwrqwrёврядли это чем-то лучше хуже =) Код: plaintext 1.
хмм, даа )) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:02 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А чем решение в лоб хуже Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:03 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А чем решение в лоб хуже Код: plaintext 1. 2. 3. 4. 5.
Так чересчур понятнее получается, не по "индусский". ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:07 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А чем решение в лоб хуже Код: plaintext 1. 2. 3. 4. 5.
слишком явно выражает намерения создателя. Противно даже сопровождать такое надменное проявление образования. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:08 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
согласен. не по-людски получилось :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2011, 12:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как известно, Mid (Mid$) это функция, которая извлекает часть текста. Как-то мне попался код, где функция Mid "вела себя" не так, как обычная VBA функция. Mid принимала значение, а не возвращала как обычные функции (хотя в справочнике Access'а об этом тоже написано, но я как в справочнике особо не рылся до этого, поэтому для меня было полным неожиданностью этот факт). Вот примерчик: Код: plaintext 1. 2. 3. 4. 5. 6.
Т.е. если часть символов в самом тексте надо заменить другими символами, то можно использовать Mid, но только не с правой стороны знака равенства как обычно, а с левой. А вот Left и Right или другие текстовые функции не обладают таким "даром". После этого случая я стал искать ещё другие функции, которые могли бы работать как с правой стороны, так и с левой стороны знака равенства (=), т.е. принимать значения, а не только возвращать. Нашёл ещё 2 функции: это Date (или VBA.Date() ) Time (или VBA.Time() ). Эти функции возвращают не только текущую дату и время, но и могут изменить дату и время компьютера (если пользователь имеет права администратора). Больше пока не нашёл встроенных функций, возвращающих и принимающих параметров. Может быть кто-то подскажет, есть ли ещё такие функции? Чисто экспериментально выяснил, что пользовательские функции, возвращающие некоторые виды объектных переменных (к сожалению не всех видов), обладают таким свойством. Вот примерчик из Excel'а: Копируем значение ячейки "A1" в "A2". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 19:52 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, без обид - чисто для справки...:)) хелпА97 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 20:13 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ZezaMstudieren, без обид - чисто для справки...:)) Дык, вроде коллега studieren именно это и сказал... Но зато: studierenЧисто экспериментально выяснил, что пользовательские функции, возвращающие некоторые виды объектных переменных (к сожалению не всех видов), обладают таким свойством. Вот примерчик из Excel'а: Копируем значение ячейки "A1" в "A2". Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Здесь ничего чудесного нет. Главное то, что объект Range имеет свойство по умолчанию Value. Поэтому если мы ставим такой объект слева от знака присваивания, то мы фактически присваиваем что-то его свойству Value. Точно так же можно поступить, например, с объектом Control. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 20:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Владимир Саныч... Здесь ничего чудесного нет. Главное то, что объект Range имеет свойство по умолчанию Value. Поэтому если мы ставим такой объект слева от знака присваивания, то мы фактически присваиваем что-то его свойству Value. Точно так же можно поступить, например, с объектом Control. Добрый вечер уважаемый Саныч! Вы не знаете почему такой эффект возможен только с теми пользовательскими функциями, которые возвращают объектный переменный? Вот если функция возвращает число, дату, текст или ещё что-то, то её уже невозможно использовать с левой стороны. Да и что касается свойства объекта по умолчанию, я думаю Вы правы на все 100 %. :) P.S. Цена вопроса чисто "спортивный интерес", не более того. :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 20:43 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Ну и главный вопрос: есть ли ещё такие "универсальные" функции помимо Mid, Date и Time? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 20:49 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenВы не знаете почему такой эффект возможен только с теми пользовательскими функциями, которые возвращают объектный переменный? Вот если функция возвращает число, дату, текст или ещё что-то, то её уже невозможно использовать с левой стороны. Мне казалось, что я именно на этот вопрос сейчас отвечал, но попробую еще раз. Когда мы пишем оператор присваивания, в котором слева стоит объектная переменная, но в нем нет слова Set, то присваивание идет не самому объекту , а его умолчательному свойству. Если это свойство не read-only, то это работает. Даже если сам объект получен как результат обращения к функции. studierenНу и главный вопрос: есть ли ещё такие "универсальные" функции помимо Mid, Date и Time? Увы, не знаю. Сам пользуюсь таким образом только функцией Mid. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 21:02 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, MSDNVisual Basic имеет функцию Mid и оператор Mid. Оба этих элемента влияют на указанное число знаков в строке, но функция Mid возвращает знаки, в то время как оператор Mid заменяет символы. Дополнительные сведения см. в разделе Оператор Mid. http://msdn.microsoft.com/ru-ru/library/05e63829(v=vs.90).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 21:14 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Sator Arepostudieren, MSDNVisual Basic имеет функцию Mid и оператор Mid. Оба этих элемента влияют на указанное число знаков в строке, но функция Mid возвращает знаки, в то время как оператор Mid заменяет символы. Дополнительные сведения см. в разделе Оператор Mid. http://msdn.microsoft.com/ru-ru/library/05e63829(v=vs.90).aspx +1 тоже самое и касательно Time / Date Time The Time keyword is used in these contexts: Time Function Time Statement --------------- Time Function Returns a Variant (Date) indicating the current system time. Syntax Time Remarks To set the system time, use the Time statement. --------------------------------- Time Statement Sets the system time. Syntax Time = time The required time argument is any numeric expression, string expression, or any combination, that can represent a time. Remarks If time is a string, Time attempts to convert it to a time using the time separators you specified for your system. If it can't be converted to a valid time, an error occurs. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 22:15 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren... Может быть кто-то подскажет, есть ли ещё такие функции? ... [/src] в VBA еще Calendar Посмотрите в просмотрщик объектов. Date и Time - там описаны не как функции, а как property. Раз не сказано, что read-only property, значит могут как отдавать так и принимать значения. Если для для объекта определено одновременно и свойство get и свойство set/let? то имя свойства может быть как слева так и справа в операторе присваивания значения. Mid с левой стороны присвоения - это "настоящий" statement. Настоящие statement-ы являются частью языка, описаны в справке и в библиотеке типов VBA не представлены. ( Как не представлен, например, statement Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] ) По поводу функций, возвращающих объекты, повторюсь за Санычем: Умение оказаться с левой стороны не их собственное свойство и не свойство всех объектов вообще, а только таких объектов, для которых заявлены "свойства по умолчанию". Если для объекта не определено свойство по умолчанию, то возвращающая его функция не может оказаться слева. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 23:36 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
авторЕсли для объекта не определено свойство по умолчанию, то возвращающая его функция не может оказаться слева. подразумавается - в обсуждаемом контексте не может, т.е. не может без дополнительных квалификаторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2011, 23:40 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
just another tutor... Если для объекта не определено свойство по умолчанию, то возвращающая его функция не может оказаться слева. Не так категорично. Может, но с явным указанием свойства объекта. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:00 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Долго писал, сори. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:01 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
just another tutorв VBA еще Calendar Посмотрите в просмотрщик объектов. Date и Time - там описаны не как функции, а как property. Раз не сказано, что read-only property, значит могут как отдавать так и принимать значения. Если для для объекта определено одновременно и свойство get и свойство set/let? то имя свойства может быть как слева так и справа в операторе присваивания значения. Этак можно и до обычных переменных дойти. Dim a As Integer a = 8 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:03 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Владимир Саныч... обычных переменных ... :) А через функцию с "обычной" переменной не "дойдем". ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:15 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
авторЭтак можно и до обычных переменных дойти можно и дойти, если это по какой-то причине плохо или хорошо. Пока мне не удается расшифровать смысл твоего высказывания. так написать можно Код: plaintext 1.
а так нельзя авторDim a As Integer 8=a и так нельзя авторDim a As Integer 8=a Хорошо было бы определиться - что нам необходимо сделать: осудить самы возможность использования Date и Time в качестве приемника значения или научиться понимать, что происходит или может происходить, когда кто-то способен выступать в качестве приемника значения. Подвох во всей этой истории только в том, что Mid = a&b&c - не имеет ничего общего с Date = #литерал или выражение# хотя и выглядит похожим образом ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:17 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
nord-woolfВладимир Саныч... обычных переменных ... :) А через функцию с "обычной" переменной не "дойдем". Once more, please? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:18 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
автори так нельзя автор Dim a As Integer 8=a подразумевалось Dim 8 As Integer 8=a ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:20 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
2 Владимир Саныч, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
just another tutorможно и дойти, если это по какой-то причине плохо или хорошо. Пока мне не удается расшифровать смысл твоего высказывания. Мы ищем вещи, которые обычно используются справа, но допускают и использование слева, что может явиться сюрпризом для неискушенных. Функция (например, Mid) этому критерию отвечает. Переменная, даже если она является свойством объекта, - вряд ли. just another tutorа так нельзя авторDim a As Integer 8=a Нет, про константы я такого не говорил. Хотя сюрприз тоже был бы, если бы. just another tutorи так нельзя авторDim a As Integer 8=a У меня дежа-вю или тут действительно написано два раза одно и то же? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
иподразумевалось Dim 8 As Integer 8=a Ну ваще. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:24 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
nord-woolf GetA = 5 А что, кому-то здесь неизвестно, что так нельзя? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:26 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Владимир Саныч, А я почем знаю? Я вот только сегодня узнал, что переменные бывают "обычными". Наверно и "необычные" бывают. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:35 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Тьфублин. Ну а как назвать переменную, чтобы было понятно, что имеется в виду именнопеременнаяанефункцияинесвойствоинеещечтонибудь? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:37 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
авторПеременная, даже если она является свойством объекта, - вряд ли. Я Вам как человек необразованный скажу. Остановиться, оно конечно, обязательно где-то надо. Иначе глупости не избежать. В Vba переменная-член класса и свойство могут вести себя сходным образом, но не являются синонимами. Это самостоятельные конструкты с несовпадающей семантикой. С публичными переменными-членами класса можно обходиться так, как показал nord-woolf Визуально это не должно вызывать вероятного удивления, в отличие от удивления, представленного в цитируемом тексте studierenВладимир Саныч... Здесь ничего чудесного нет. Главное то, что объект Range имеет свойство по умолчанию Value. Поэтому если мы ставим такой объект слева от знака присваивания, то мы фактически присваиваем что-то его свойству Value. Точно так же можно поступить, например, с объектом Control. Добрый вечер уважаемый Саныч! Вы не знаете почему такой эффект возможен только с теми пользовательскими функциями, которые возвращают объектный переменный? Вот если функция возвращает число, дату, текст или ещё что-то, то её уже невозможно использовать с левой стороны. Да и что касается свойства объекта по умолчанию, я думаю Вы правы на все 100 %. :) P.S. Цена вопроса чисто "спортивный интерес", не более того. :)) Если я правильно понимаю, предмет удивления - в отсутствии квалификации приемника. Тем самым в присутствии свойства по умолчанию. Иначе просто видно глазами - кто что кому присваивает. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:42 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Владимир Саныч, Ну надо-же по брюзжать на ночь глядя? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:46 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
just another tutorЯ Вам как человек необразованный А вот это не надо, это не надо. Я тут своей необразованностью много кого переплюну. just another tutorВ Vba переменная-член класса и свойство могут вести себя сходным образом, но не являются синонимами. Это понятно. Но очевидно, что свойство МОЖЕТ вести себя как переменная. Причем не где-нибудь, а в простейшем случае. Так что удивления тут не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:49 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
nord-woolfВладимир Саныч, Ну надо-же по брюзжать на ночь глядя? :) Да! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 00:49 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Владимир Саныч... Ну а как назвать переменную, чтобы было понятно, что имеется в виду именнопеременнаяанефункцияинесвойствоинеещечтонибудь? Может так?: Свойство, описанное переменной vs Свойство описанное процедурами(процедурой) свойств. ps. Все-все, ушел спать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 01:15 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
nord-woolfСвойство, описанное переменной Это в ответ на "переменная, а не свойство"? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2011, 02:03 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Чтобы превратить строку в тип данных "дата" нужно использовать функцию CDate или DateValue . Но тут есть одна засада: данные функции в зависимости от региональных настроек Windows возвращают разные результаты, а иногда вообще ошибку. Допустим, у нас есть строка в американском стиле и мы хотим в любом случае получить соответствующую дату. Я для этого создал функцию "ConvDate", где есть необязательный параметр "Style". Если в параметре указать "EN" или "English" или "US", то функция попытается преобразовать строку в дату сначала в американском стиле. Если не получится, то с помощью CDate. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
А вот и результат экспериментов: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2011, 10:03 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
(для текстов, совпадающих с текущей локалью) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
поищите - на форуме есть примеры, как подменить локаль на время выполнения процедуры ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2011, 11:37 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
booby(для текстов, совпадающих с текущей локалью) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
поищите - на форуме есть примеры, как подменить локаль на время выполнения процедуры Вы наверное не поняли мой пост. Я попытался создать универсальную функцию, которая по возможности все строки в любом формате превращает в дату вне зависимости от настройки Windows. К примеру, допустим у Вас Windows настроен на русскую интерпретацию даты, но в тоже время у Вас строка на английский лад. Как Вы собираетесь преобразовать строку? Пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2011, 12:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Вы правы. я действительно не понял. Не рассмотрел ваш код. Это одна сторона монеты. Другие стороны состоят вот в чем: 1) Вы заставили на русской локали работать Код: plaintext
Код: plaintext
Подразумевается, что английский язык всегда установлен. Сможете тем же способом заставить, без установленного немецкого, правильно отработать Код: plaintext
Код: plaintext
Код: plaintext
2) то что Код: plaintext 1. 2.
5 марта, а не 3 мая. PS Это не претензии. Ваша функция хорошая. Другое дело, что я, как пользователь "библиотечного кода", предпочел бы функцию с явно задаваемым форматом преобразования и, может быть, явными языковыми идентификаторами в качестве параметров. В любом случае спасибо. Поведение eval в этом месте любобытно и малоизвестно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2011, 14:00 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
boobyДругое дело, что я, как пользователь "библиотечного кода", предпочел бы функцию с явно задаваемым форматом преобразования и, может быть, явными языковыми идентификаторами в качестве параметров. Забыл написать 1 деталь. В SQL Server если в строке указать дату в формате 'yyyymmdd', то вне зависимости от настроек сервера всегда дата будет интерпретироваться одинаково: Код: plaintext
Такое же свойство имеется и у Access / VBA, но только чуть-чуть по другому. Если в строке указать дату в формате "yyyy-mm-dd" (вместо "-" также допускается пробел или слеш "/"), то вне зависимости от региональных настроек функция CDate и Datevalue (да и DateAdd) возвращает ВСЕГДА одинаковую дату. Код: plaintext 1. 2. 3. 4. 5.
Код: plaintext
P.S. Как не странно, но в FAQе об этом вообще ни слова. И там не указана ещё одна деталь: даты в Access / VBA можно указать и таким образом: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2011, 08:46 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Чтобы открыть отчёт в режиме предварительного просмотра и при этом сразу же задать масштаб обычно поступают так: Код: vbnet 1. 2.
Здесь вместо "acCmdZoom100" можно также использовать другие стандартные масштабы (например acCmdZoom75 или acCmdZoom150). А как же задать нестандартный масштаб? Ну например 125%? Как то случайно мне попался файл, где использовался скрытое (недокументированное) свойство отчёта "ZoomControl", с помощью которого можно задать любой нестандартный масштаб. Код: vbnet 1. 2.
Но только есть 1 недостаток: внутри модуля отчёта этот код нельзя использовать (т.е. невозможно повесить на open или activate), только и только нужно "со стороны" сразу после OpenReport. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.03.2012, 07:58 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Иногда бывает полезным программно "поймать событие" нажатия команды штатного меню. Например, перед сжатием базы целесообразно удалить ненужные таблицы (скажем "Ошибки вставки", "Admin - 00" и т.д.) и "временные" запросы ("Запрос1", "Запрос2" и т.п.). Как же сделать это? Вот здесь я написал случай преобразования MDB файла на MDE. Теперь попробую "поймать сжатие" базы. В первую очередь конечно же не забываем включить библиотеку "Microsoft Office XX Object Library". (вместо XX нужная версия офиса). Итак, если у нас есть скрытая форма, открывающаяся в момент старта базы, то в модуль формы пишем так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Если же у нас нет такой формы, то этот же код можно повесить в модуль "класс", которого следует "запускать" в момент старта базы (ну скажем в макросе "AUTOEXEC" запускаем некую VBA функция, которая и будет запускать класс). Правда в этом случае вместо "Form_Load()" следует написать "НазваниеКласса_Initialize()". :) Итак, по этой же схеме можно поймать все штатные команды меню Access'а. Осталось выяснить Id код для каждой команды. Для "Создать MDE-файл..." Id = 2073, для "Сжать и восстановить базу данных" Id = 2071. А для других команд какой Id? Для этого запускаем вот такой код и узнаем Id: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Правда есть маленький нюанс: если в названии команды есть горячая клавиша (нижнее подчеркивание буквы), то перед этой буквы не забываем вставить & когда InputBox будет спрашивать фрагмент названия команды. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2012, 11:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Покопался в своих архивах. нашел вот такую табличку по кодам меню. (см. прил. файл) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.04.2012, 16:14 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ALEXIS_22, Thank you very much! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2012, 07:06 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Чуть выше (а именно вот здесь 12324615 ) я написал, что свойство "ZoomControl" нельзя использовать внутри модуля отчёта. Ну нельзя так нельзя! Но если очень хочется, то можно. :) Правда не без танцев с бубнами. :) Чисто из-за "спортивного интереса" решил всё-таки попробовать заставить работать "ZoomControl". Если повесить код "Me.ZoomControl = 125" на событие "Report_Activate", то происходит следующее: Когда мы отчёт открываем первый раз, то Access ругается. Но зато потом, когда отчёт теряет фокус и обратно получает фокус, то уже не ругается. Стало быть перед "Me.ZoomControl = 125" следует добавить "On Error Resume Next". Однако, мы не получим моментального результата - масштаба 125% при первом же открытии отчёта. Как же всё таки получить моментального такого эффекта? Итак, в модуль базы (не в модуль отчёта, а в отдельный модуль) добавляем вот такой код: Код: vbnet 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.
Далее, в модуле отчёта пишем так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Для получения "почти" моментального эффекта я взял 0,1 секунд (красным отметил 100). Если у Вас "тяжёлый" отчёт, то возможно придётся "чуть-чуть" добавить. P.S. В принципе если требуется запуск какой-либо процедуры, но при этом не дожидаясь завершить первоначальную процедуру, а потом спустя некоторое время продолжить работу второй процедуры, то можно использовать такую схему работы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2012, 08:30 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как-то недавно пробегал топик, где шла речь о спец. форматах. Там ещё и база была приложена с примером. Если в текстовое поле (именно только текстовое!) указать формат ">[синий]" (или blue в английских версиях), то в режиме таблицы данное поле будет окрашено синим цветом (в хелпе есть перечень цветов: Black, Blue, Green, Cyan, Red, Magenta, Yellow, White). Что интересно если написать без ">", то такого эффекта не будет. Правда если указать цвет вместе с ">", то будет побочный эффект: все буквы будут прописными. Соответственно можно заменить на "<", но тогда буквы строчные. А чтобы таких "побочных" эффектов не было, то нужно указать либо "!", либо "@" вместо ">", либо даже так "><" (последний вариант ещё хоть как-то логичный :) ). Почему так, почему именно эти символы я так и не понял. Может кто-нибудь знает причину? Есть ли ещё "загадочные" форматы? Не условные форматы (с ними вроде нет "загадочности") и не "красный цвет для отрицательных чисел", а какой-нибудь не очевидный формат? :) Странно, но ещё можно написать и так: !@[Синий][Красный] Тогда получим красный цвет, т.е. цвет, указанный последним в "списке". ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 10:37 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, Лови ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 10:56 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvk Да это интересно. Только для числовых полей и полей с датами не получилось. Там другое выражение для задания формата? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 14:10 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ALEXIS_22, о чём речь? если поковыряться, то можно всё сделать; можно и на форуме кстати поискать, как раз с числами что-то видел ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 14:17 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ALEXIS_22, Я сам тоже не знаю. Вот поэтому и спросил. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 14:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren Просто раскрасить поля в запросе это одно. Но практическая ценность будет намного выше если как-то задавать формат в зависимости от значения в поле. Пока не выходит. Через iif пробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 15:15 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ALEXIS_22, конкретно задачу кто-нибудь поставит? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 16:14 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvkALEXIS_22, конкретно задачу кто-нибудь поставит? Я вот что вспомнил. Вот так можно форматировать поля с разными типами данных: Код: vbnet 1.
- текстовый, Код: vbnet 1.
- числовой, Код: vbnet 1.
- дата \ время Дело в том, как задать формат поля в зависимости от содержащегося в нем значения? Для числового поля черные-положительные, красные отрицательные. Это понятно. А вот допустим для текста вывести в одном поле в таблице или в запросе "Красный" - красным цветом, "Зеленый" - зеленым. Вот это как, я не знаю. И думаю возможно ли такое вообще Иначе зачем майкрософту Format Condition например? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 17:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ALEXIS_22Дело в том, как задать формат поля в зависимости от содержащегося в нем значения? Для числового поля черные-положительные, красные отрицательные. Это понятно. А вот допустим для текста вывести в одном поле в таблице или в запросе "Красный" - красным цветом, "Зеленый" - зеленым. Вот это как, я не знаю. И думаю возможно ли такое вообще Иначе зачем майкрософту Format Condition например? Ну так "условное форматирование" ещё никто не отменял. :) В отчётах например есть событие "форматирование", там в зависимости от значения поля можно и цветами баловаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 20:16 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren Да, в отчетах это без проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 20:31 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ALEXIS_22studieren Просто раскрасить поля в запросе это одно. Но практическая ценность будет намного выше если как-то задавать формат в зависимости от значения в поле. Пока не выходит. Через iif пробую. если разговор о ленточных формах - то нет проблем. расскрасить можно как угодно ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2012, 21:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
вадяесли разговор о ленточных формах - то нет проблем. расскрасить можно как угодно Да мне обычного условного форматирования для ленточных форм хватало (как правило). Если не хватало то FlexGrid использовал. Кажется видел где-то пример раскраски для ленточных форм без УФ. Там действительно ограничений 3 условий нет. Возвращаясь к основной теме про форматирование полей в запросе\таблице. Совершенно недавно видел пример использования такого форматирования полей в запросе для создания "цветных" ListBox и ComboBox. Даже его скачал. Первый раз открыл - подивился оригинальности, далее отложил. В свете этой теме решил к нему вернуться. И как не старался более эти цветные поля увидеть не смог. Значения в полях списка, к которым были применены форматы просто не видны. Пробовал в ACSE 2003 (SP3). Если кто-то из обитателей форума знает о каком примере идет речь поделитесь были ли у кого с ним какие-то проблемы с реализацией такого списка. Весь комизм текущей ситуации заключается в том, что я сейчас не имею возможности этот пример приложить. Попробую немного позже в инете снова его взять. Тогда приложу. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 15:14 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 18:33 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
13-й квартал ALEXIS_22, 12190877? Ну да! Он самый. У меня на одном компе отработал, на двух других нет. Сейчас сижу далеко. В инет урывками поглядываю. Офиса здесь нет, проверить еще раз не могу. Только у себя - завтра к вечеру. Как говорит Осьменоги - "ыыы-ыы-ы" ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2012, 18:51 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Вот здесь есть старинный код, с помощью которого можно узнать список названия компьютеров, подключённых к указанному файлу базы данных. Sub ShowUserRosterMultipleUsers() Dim cn As New ADODB.Connection Dim cn2 As New ADODB.Connection Dim rs As New ADODB.Recordset Dim i, j As Long cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Open "Data Source=c:\Northwind.mdb" cn2.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=c:\Northwind.mdb" ' The user roster is exposed as a provider-specific schema rowset ' in the Jet 4 OLE DB provider. You have to use a GUID to ' reference the schema, as provider-specific schemas are not ' listed in ADO's type library for schema rowsets Set rs = cn.OpenSchema(adSchemaProviderSpecific, _ , "{947bb102-5d43-11d1-bdbf-00c04fb92675}") 'Output the list of all users in the current database. Debug.Print rs.Fields(0).Name, "", rs.Fields(1).Name, _ "", rs.Fields(2).Name, rs.Fields(3).Name While Not rs.EOF Debug.Print rs.Fields(0), rs.Fields(1), _ rs.Fields(2), rs.Fields(3) rs.MoveNext Wend End Sub Даже при аварийном завершении видимо Access успевает "отметится" как вылетевший и поэтому в списке пользователей не выходит (что вообщем-то хорошо!). Но!!! Если всё-таки Access не успеет подать сигнал о завершении, к примеру если внезапно вырубить от электропитания или выдернуть сетевой шнур (что не сделаешь ради эксперимента ), то из списка всё-таки не будет уходить. Я решил в конце вместо "Debug.Print" склеить в строковую переменную и выдать сообщение через MsgBox. Типа так: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Вот тут к моему удивлению обнаружил, что получаю имя компьютера только 1-пользователя! И ничего более! Начал экспериментировать и выяснять причину. Оказывается "rs.Fields(0)" здесь возвращает имя компьютера и сразу же за ним символ Chr(0) и далее ровно столько пробелов, чтобы в общей сложности должно получиться 32 символа. И у этого символа Chr(0) (так сказать vbNullChar) есть странная особенность: все символы после Chr(0) при вызове MsgBox или InputBox пропадают. Код: vbnet 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.04.2012, 09:06 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Создал запрос, где в параметрах сразу назначаю значение с помощью DLookUp: Код: sql 1. 2. 3.
Сохранил и дал название "Запрос1". Вот теперь в так называемых "статистических функциях по подмножеству" (таких как DCount, DLookUp и т.д.) не возможно использовать этот запрос. Код: vbnet 1.
!--------------------------- Microsoft Visual Basic --------------------------- Run-time error '2001': Предыдущая операция прервана пользователем. --------------------------- ОК Справка --------------------------- А если использовать этих функций не в параметрах, а в SELECT или WHERE, то такой ошибки не получаем: Код: sql 1. 2. 3.
Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.05.2012, 12:50 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Все программисты MS Access (да и не только Access) всячески стараются не работать с таблицами или запросами напрямую, в смысле не дают прямой доступ пользователям к таблицам / запросам. Почему? Ответ очевиден, полное отсутствие программного контроля, т.е. отсутствие "событий". Когда база разрастается, и там появляются множества таблиц справочников, то создавать отдельную форму на все таблицы (или запросы) порой нет времени (или просто лень). Когда "вручную" открываем таблицу (или запрос), то действительно сталкиваемся полным отсутствием всяких событий, на которых реагирует программа. Но если открывать программно, то оказывается, хотя бы на время можно искусственно создавать событие! Приведу такой пример: допустим, пользователь работает с какой-то формой и там есть некий код справочника. Появилась необходимость ввода нового кода справочника. Что он должен делать? Открыть таблицу справочников и добавить новую запись. Находясь в форме, он может дважды щёлкнуть поле для кода справочника и тут программа может открыть таблицу, причём параллельно создать некоторые события таблицы. Ну скажем "BeforeUpdate", "AfterUpdate", "OnClose" и т.д. Делается это очень и очень просто. Для эксперимента создаём процедуру, где открываем таблицу и создаём временные события для таблицы. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
После закрытия таблицы, увы, все эти события исчезнут. Разумеется, вместо "MsgBox" можно написать собственную функцию, да и вместо таблицы можно и запрос на выборку точно таким же образом открывать. Тогда и можно программно контролировать, словно работаем с табличной формой. P.S. Я конечно же не рекламирую работу с таблицами и запросами напрямую. Я тоже сторонник закрытия доступа к рядовым пользователям. Но иногда если есть необходимость, то могу поступать именно таким образом, т.е. программно открыть, чтобы программно же и контролировать действия пользователя. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 09:29 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, табличную форму для справочника сделать -> 3 - 5 минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 12:32 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvkstudieren, табличную форму для справочника сделать -> 3 - 5 минут. Не это главное. Вы, наверное, в курсе, что в качестве SourceObject подчиненной формы можно использовать таблицу или запрос? Это бывает очень удобно использовать. Из одной формы можно сделать множество справочников. Решение studieren позволяет создавать события для такой подчиненной формы. Это, по крайней мере, интересно. А для профессионала дополнительный инструмент. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 14:57 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Старый ворчун, Старый ворчунчто в качестве SourceObject подчиненной формы можно использовать таблицу или запрос я такой вариант не приемлю, мне он не нравится. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 15:26 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvkСтарый ворчун, Старый ворчунчто в качестве SourceObject подчиненной формы можно использовать таблицу или запрос я такой вариант не приемлю, мне он не нравится. Но вам же никто и ничего не навязывал, не так ли? Вы в праве делать базы так как вам нравится. А studieren делится своими наблюдениями и открытиями с другими, что заслуживает только одобрения. И вообще, кто тут старый ворчун? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 15:57 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvkСтарый ворчун, Старый ворчунчто в качестве SourceObject подчиненной формы можно использовать таблицу или запрос я такой вариант не приемлю, мне он не нравится. Эта тема уже обсуждалась и тоже нашла яростных противников 12336735 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 16:03 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Старый ворчунalvkСтарый ворчун, пропущено... я такой вариант не приемлю, мне он не нравится. Но вам же никто и ничего не навязывал, не так ли? Вы в праве делать базы так как вам нравится. А studieren делится своими наблюдениями и открытиями с другими, что заслуживает только одобрения. И вообще, кто тут старый ворчун? :) Ага не навязывал: "Вы наверное в курсе ... это удобно использовать..." (c) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 16:09 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Guest33alvkСтарый ворчун, пропущено... я такой вариант не приемлю, мне он не нравится. Эта тема уже обсуждалась и тоже нашла яростных противников 12336735 "обсуждалось" - сильно сказано, скорее не удосужилась обсуждения . ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 16:11 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvk"обсуждалось" - сильно сказано, скорее не удосужилась обсуждения. Ну, приведите доводы против кроме: я такой вариант не приемлю, мне он не нравится. (довод за - уже был: одна фома на все справочники) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 16:21 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvkАга не навязывал: "Вы наверное в курсе ... это удобно использовать..." (c) Зачем вы занимаетесь подтасовкой? Несолидно. Я не вижу навязывания в своих словах. Тем более никакого навязывания не было в топике studieren. Но что-то заставило вас поворчать на его публикацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 16:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Guest33alvk"обсуждалось" - сильно сказано, скорее не удосужилась обсуждения. Ну, приведите доводы против кроме: я такой вариант не приемлю, мне он не нравится. (довод за - уже был: одна фома на все справочники) это уже лучше делать в отдельном топике Старый ворчунНо что-то заставило вас поворчать на его публикацию. вообще-то высказать свою точку зрения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.06.2012, 16:46 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Guest33alvk"обсуждалось" - сильно сказано, скорее не удосужилась обсуждения. Ну, приведите доводы против кроме: я такой вариант не приемлю, мне он не нравится. (довод за - уже был: одна фома на все справочники) кушайте не обляпайтесь http://www.sql.ru/forum/actualthread.aspx?tid=945915 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2012, 02:48 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
alvkкушайте не обляпайтесь http://www.sql.ru/forum/actualthread.aspx?tid=945915 это не проблема, ничто не мешает сохранять ширину столбцов и восстанавливать их при открытии. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2012, 08:30 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Я раньше (до того, как узнал о форуме sql.ru) не знал, что в окне отладки можно получить значение любой функции поставив перед ней просто вопросительный знак. Код: vbnet 1. 2.
Не давно прочёл в одной книге, что не только вопросительный знак, ну и следующие варианты дают аналогичный эффект. Код: vbnet 1. 2. 3. 4. 5. 6.
Ну конечно "?" самый короткий, а значит самый "оптимальный". :-) Ну не это меня больше всего удивило. Казалось бы какой сюрприз может дать простое "окно отладки"? Оказывается (а это действительно для меня было неожиданностью) в окне отладки можно поменять значение любой переменной во время исполнения процедуры. Т.е. я имею ввиду вот что! Допустим, у нас есть вот такая процедура: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Во время тестирования процедуры, когда нажимая на F8 пошагово проверяем тот или иной код этот трюк может оказаться очень даже полезным. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2012, 15:33 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, ты описываешь использование окна отладки в контексте "подменить значение объявленной переменной". того же эффекта можно добиваться в окнах locals и watches. Окно же отладки может чуть-чуть больше просто набери в окне отладки (вне контекста исполнения какой-либо процедуры и без всяких знаков вопроса) z = 20 MsgBox z на офисном форуме есть люди, которые используют окно отладки просто для написания программ. Т.е. пишут в этом окне текст так, как писали бы его в "процедуре", тут же просматривая результат выполнения. Вроде того - открыл форму (лист excel и т.д.) и пишешь нужный код обработки, тут же, непосредственно глазками наблюдая - что именно делает твой код с формой/листом/итп по мере написания кода, кажой его строки в отдельности. Получив результат, копи-пастом помещаешь его в процедуру и , по вкусу, добавляешь объявления переменных. немало больших любителей как-то так с офисом обходиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2012, 01:01 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
пехтоstudieren, ты описываешь использование окна отладки в контексте "подменить значение объявленной переменной". того же эффекта можно добиваться в окнах locals и watches . Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2012, 07:58 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как известно, в формах Access'а можно создать "виртуальную" RecordSet как с помощью DAO, так и ADO. В файлах mdb / accdb по умолчанию применяется DAO. Так если в RecordSource формы укажем название таблицы или запроса в таких базах, то Access применяет технологию DAO. Но в принципе и в таких базах можно применить ADO Recordset и при этом не потерять обновляемость записей. Что это даёт? 1). Любую форму созданную в mdb / accdb файлах можно импортировать в adp и наоборот, при этом Access будет работать одинаково нормально и там, и там! 2). В adp файлах также появиться возможность достучаться к любой базе минуя linked server, а не только к SQL Server. Главное – был бы соответствующий доступ! 3). Есть такие типы данных в SQL Server как: numeric(n, m), decimal(n, m), bigint, date, money. Если в таблице SQL Server использованы эти типы данных, то после "обычной" линковки, то в файлах mdb / accdb будут проблемы с обновлением данных. Т.е. если в форме укажем в качестве RecordSource название линкованной таблицы, то уже либо невозможно внести изменение в таблице, либо саму таблицу / форму вообще невозможно даже открыть. Ну а если в RecordSource формы подсучить ADO Recordset, то как не странно таких проблем вообще не будет! 4). Если у Вас стоит Office ниже 2010, ну а SQL Server 2005 и выше, есть такая особенность: если создать схему данных отличной от "dbo" и назначить владельцем (а точнее "передать защищаемых сущностей между схемами") этой таблицы указать данную схему, то в файле adp невозможно даже открыть таблицу и соответственно связанную форму. Пример: Создаём схему на стороне SQL Server Код: sql 1. 2. 3. 4.
После этого таблицу "Test.tblTest" в adp файле невозможно открыть. Ну а если к форме подсучить ADO Recordset, то как не странно можно и открыть, и править данные без проблем. 5). Можно вообще удалить все линкованные таблицы и все запросы в mdb / accdb файлах, а adp файл сделать "неподключаемым", т.е. сделать его как бы "без таблиц и запросов", но при открытии формы сразу подключаться к любой базе. Иначе говоря, полностью убрать доступ к таблицам и запросам у пользователей. Итак, как для этого нужно с помощью ADO подключаться? Для получения обновляемой таблицы Access в форме применяем вот такой код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
А для получения обновляемой таблицы SQL Server применяем этот же код, но только, разумеется, с другой строкой подключения. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
P.S. Есть очень интересная статья "AccessConnection и связанные с ним новые возможности форм mdb" по данной теме. Идея взята из данной статьи. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2012, 18:03 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как снять бекап базы данных в SQL Server, при чём достаточно снять копию файла ".mdf" и ".ldf"? Т.е. сложный бекап, где можно откатить базу по состоянию на n-дату не требуется. Для решение этой задачи необходимо временно выключить SQL Server "по хорошему". :) В первую очередь я решил получить список Win. служб с помощью WMI и посмотреть там как "обзывается" SQL Server. :) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Здесь "Win32_Service" имеет следующие "поля". Название поля Тип данныхAcceptPause booleanAcceptStop booleanCaption stringCheckPoint uint32CreationClassName stringDescription stringDesktopInteract booleanDisplayName stringErrorControl stringExitCode uint32InstallDate datetimeName stringPathName stringProcessId uint32ServiceSpecificExitCode uint32ServiceType stringStarted booleanStartMode stringStartName stringState stringStatus stringSystemCreationClassName stringSystemName stringTagId uint32WaitHint uint32 К примеру, чтобы сократить "записи" возвращаемого запроса, можно применить и такой запрос: Код: sql 1.
Потом создал VBA функцию, которая включает/выключает любую указанную службу. Код: vbnet 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.
Здесь параметр функции "ToStart" если имеет значение True, то включает службу, а если False, то наоборот выключает. Ну и потом создал VBA процедуру, которая сначала выключает службу " MSSQL$MSSQLSERVER2008 " (здесь у меня "MSSQLSERVER2008" это название инстанса). Затем копирует нужные файлы ".mdf" и ".ldf" на резервную папку и в конце обратно включает SQL Server. P.S. Разумеется чтобы провернуть всё это необходимо иметь права администратора. P.S.S. А нет ли решение ещё более "продвинутое"? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2012, 12:59 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenКак снять бекап базы данных в SQL Server, при чём достаточно снять копию файла ".mdf" и ".ldf"? я, вот, не понял смысл бекапирования файлов БД ... почему не бекап, в смысле BACKUP DATABASE ? сервер останавливать - не надо, с правами - проще (backupoperator), нуу, и хранение, файлом, файла лога, который может быть "ни-себе-чего-размером", тоже не айс ... зы по WMI, конечно интересно вот, в тему, думаю будет интересно - http://www.msadmin.ru/index.php?option=com_content&view=article&id=8:scripts4&catid=4:scripts&Itemid=5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2012, 13:24 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwerty112я, вот, не понял смысл бекапирования файлов БД ... почему не бекап, в смысле BACKUP DATABASE ? сервер останавливать - не надо, с правами - проще (backupoperator) Почему то у меня после "штатного" BACKUP DATABASE размер файла "mdf" растёт неимоверно. Я так понимаю, сервер видимо внутри файла хранит "точку возврата" после каждого бекапа. В смысле возможность восстановление базы по состоянию на n-дату. А в тех базах, о которых я тут написал, как только снимаю копию, предыдущая версия на проч теряет смысл, она просто из-за ненадобности перестает быть полезной. Ну если Вы знаете секрет "тупого" бекапа (как в моём случае), после которого база не растёт из-за бекапа, please подскажите. Я не селен в SQL Server. P.S. А за ссылку WMI спс. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2012, 15:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2012, 16:10 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
?????, За скрипт спасибо. Попробую на работе. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2012, 16:28 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Прочитайте в bol про модели восстановления. У мсскл сервера возможности бекапирования перекрывают ваши хотелки - научитесь ими пользоваться. Вы изобретаете велосипед с квадратными колесами. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.08.2012, 21:07 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Сделал в одной форме кнопко для просмотра адреса: Почемучто Яндех не хочет кушать русскую букву "Я", я придумал менять её на "Z", умный Яндех кушает и правильно находит... Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2012, 13:12 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Чтобы узнать существование файла иногда используют вот такой код: Код: vbnet 1.
Dir имеет ряд недостатков. Вот здесь 1415057 и постом ниже пишут как раз о недостатках Dir. Я случайно обнаружил ещё 1 недостаток. Если файл "скрытый", т.е. свойство "Hidden" = True, то Dir на отрез его не видит. :-) Поэтому сам использую простой код: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Другой вариант предлагает Старый Ворчун: Как проверить сущесвование фала? Вообще то у VBA есть разные функции помимо FileLen (к примеру FileDateTime), но что странно эти функции (кроме GetAttr) почему то не "различают" папку от файла. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 12:19 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenЯ случайно обнаружил ещё 1 недостаток. Если файл "скрытый", т.е. свойство "Hidden" = True, то Dir на отрез его не видит. :-)в функции dir можно указать attributes ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 12:32 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Старый ворчун, Да, точно. Прозевал 2-параметр функции. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 13:33 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Когда в проекте имеется битая ссылка (reference), то такие функции как Left, Right, Mid перестают работать (FAQ: А почему у меня не работает... Q1). Я заметил и такую закономерность: Если перед Left, Right, Mid поставить " VBA. ", т.е. так Код: vbnet 1.
то даже при битом референсе программа уже не ругается. P.S. Для одного проекта (когда программа 1-раз устанавливается у юзера) как раз это "фишка" помогла мне. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2012, 15:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если зайти в ---> Панель управления –> Администрирование –> Источники данных и попытаться настроить пользовательский ODBC, то винда выдаст ошибку 196. Это происходит потому, что вызывается настройщик для 32х разрядной системы. Для того чтобы вызвать настройщик для 64-х битной винды нужно найти файл: %WINDIR%\SysWOW64\odbccad32.exe и запустить его. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.09.2012, 16:33 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenЧтобы узнать существование файла иногда используют вот такой код: Код: vbnet 1.
... Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Другой вариант предлагает Старый Ворчун: Как проверить сущесвование фала? Есть ещё 1 "штатный", но только слегка скрытый способ: Код: vbnet 1. 2. 3. 4.
Тут "On Error Resume Next" нужен на всякий случай, типа "сеть недоступен" и т.д., и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2012, 16:19 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Ой, очепятка. :) Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.09.2012, 16:20 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Я тут слегка опять ошибся, не добавил "магический ключ" для "WizHook". Код: vbnet 1. 2. 3. 4. 5.
Провел такой эксперимент: от самого минимального (-2147483648) до самого максимального (2147483647) целого числа типа long программно перебрал все значения для ключа "WizHook". Только и только в случае 51488399 WizHook работает нормально. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.09.2012, 07:51 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Я как-то на лесенке (вот здесь 13162105 ) задал вопрос "как программно поменять папку в окне диалога". В смысле программно подменить папку таким образом, чтобы при нажатии Ctrl+O оказаться в нужной папке. Но при этом опцию "Default Database Directory" не трогать, чтобы другие базы не пострадали. Проблему мог бы решить и простой код ChDir, который по описанию хелпа как раз таки должен был изменить текущую папку. Но проблема в том, что ChDir совсем не влияет на Ctrl+O. Решение оказывается всё-таки существует. Вот и сам код, которого я в тот момент искал: Код: vbnet 1.
Свойство "CurrentDirectory" оказывается не только для чтения, но и для записи. Оно как раз таки влияет на Ctrl+O. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2012, 13:08 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
А2003. Наткнулся чисто случайно на такую вещь. Если поменять свойство базы данных "ANSI Query Mode" на True (оказывается такое свойство по умолчанию существует для mdb файлов), Код: vbnet 1.
то в "Сервис" ==> "Параметры" во вкладке "Синтаксис для SQL Server (ANSI 92)" появляется птичка там, где "текущая база данных". После этого попробовал вот такой код: Код: vbnet 1. 2.
Как видно из результата пока что ANSI 92 "не вступил в силу". :) По идее если стоит галка SQL Server (ANSI 92), то вместо "*" должен работать "%". Когда программно меняю свойство "ANSI Query Mode", то такой номер поначалу не проходит. Но как только перезагружаю БД, то проходит. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2012, 14:15 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenТолько и только в случае 51488399 WizHook работает нормально. 735770 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2012, 14:18 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Есть такой dll файл, который находится по умолчанию вот здесь "C:\WINDOWS\system32\FM20.DLL". Когда его подключаем к проекту VBA, то появляется референс "Microsoft Forms 2.0 Object Library". По названию понятно, что работает с формами VBA (но не формами MS Access). Есть полезная особенность этой библиотеки: помимо прочего работает с буфером обмена (clipboard). Может прочесть из буфера (метод GetFromClipboard) или наоборот скопировать в буфер (PutInClipboard). Вот примерчик из help'a: GetFromClipboard Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
PutInClipboard Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Решил найти способ позднего подключения к этой библиотеке, чтобы не быть зависимым от версии офиса / ОС и т.д. Нашёл только 1 способ: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вместо таинственного "заклинания" new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69} другую более понятную "формулировку" не нашёл. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2012, 10:14 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Код: vbnet 1. 2.
http://www.cpearson.com/excel/Clipboard.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2012, 10:47 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
сорри. я недопонял/не прочитал текст. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2012, 10:57 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenВместо таинственного "заклинания" new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69} другую более понятную "формулировку" не нашёл. :) А нет другой формулировки. Посмотрел в "OLE/COM Object Viewer" Может свой класс? У Гетца есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2012, 14:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenРешил найти способ позднего подключения к этой библиотеке, чтобы не быть зависимым от версии офиса / ОС и т.д. Нашёл только 1 способ: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вместо таинственного "заклинания" new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69} другую более понятную "формулировку" не нашёл. :)Нет ProgID у MSForms.DataObject. Желающие могут добавить в реестр пару строк Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2012, 00:19 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ЦЦаНет ProgID у MSForms.DataObject. Желающие могут добавить в реестр+ пару строк Код: plaintext 1. 2. 3. 4. 5.
Я так понимаю теоретически можно создать любую ветку в Win регистре да хоть "Чёрт знает что" по аналогию, ну а потом в VBA создавать CreateObject("Чёрт знает что")! Забавно!!! Но что самое главное работает!!! :) ЦЦа, Большое СПАСИБО за наводку! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2012, 09:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, А какой смысл создавать ProgId если его нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2012, 11:01 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, Если нужен объект, то можно создать его и через CLSID, что успешно проделывается в твоём коде. А если нет класса, то в любом случае не поможет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2012, 11:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Панургstudieren, А какой смысл создавать ProgId если его нет? Да по приколу можно в своем проекте везде создавать объект CreateObject("Хрень") и работать с ним. Если кто-нибудь и скопирует саму базу, то там (в других компах) конечно всё это не будет работать. P.S. Это так сказать из той оперы что-то вроде "пригвоздить проект на основе серийного номера харда". :) P.S.S. Я не сторонник радикальной защиты файла БД, а просто можно оказывается и так защитить кое-что в своей базе. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.10.2012, 12:06 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Bryk_AlienЕсли зайти в ---> Панель управления –> Администрирование –> Источники данных и попытаться настроить пользовательский ODBC, то винда выдаст ошибку 196. Это происходит потому, что вызывается настройщик для 32х разрядной системы. Для того чтобы вызвать настройщик для 64-х битной винды нужно найти файл: %WINDIR%\SysWOW64\odbccad32.exe и запустить его. Случайно наткнулся на блог Как настроить MS Access ODBC драйвер на windows7 x64 или vista x64 Там как раз об этом идёт речь. Текст блогаОднажды возникла проблема при установке одной программы, та программа требовала настроить ODBC драйвер (microsoft access driver) на windows 7. При входе в "Источники данных (ODBC)" можно было только добавить драйвер SQL Server'а. Требуемого драйвера не было. Я перерыл множество инструкций и форумов прежде чем нашел совет, который мне помог. Вот он "How to Use Microsoft Access ODBC drivers for Vista x64/ Windows 7 x64". Оказывается в Vista/Windows7 x64 есть две копии odbcad32.exe, один из них находится в "C:\Windows\syswow64\ ", а другой в "C:\Windows\system32\". Открывая как обычно "Источники данных (ODBC)" через "панель управления — администрирование", мы открываем второй вариант odbcad32.exe, то есть тот, который располагается в "C:\Windows\system32\" и у нас нет нужного нам драйвера ODBC! Необходимо открыть вот этот файл "C:\Windows\syswow64\odbcad32.exe". Там без особых проблем можно установить MS Access ODBC driver. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.10.2012, 10:28 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Создал обычный текстовый файл "V.vbs" и написал внутри простой код: Код: vbnet 1.
Когда запускаю, то программа ругается. Error: Type mismatch: 'Format' Code: 800A000D Source: Microsoft VBScript runtime error Как же так? Попробовал вот такой код в VBA, который вызывает VBScript: Код: vbnet 1. 2. 3. 4. 5.
И опять программа ругается: Type mismatch: 'Format' Это что же получается? Банальная функция Format в VB скриптах работает как-то не так? Может как-то "по особому" надо "объяснить" ему как нужно работать с датой? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 11:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 12:11 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ЦЦа, Я так понимаю у VBScript нет такой функции Format??? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 12:15 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, msgbox другой ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 12:25 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ILL HEADstudieren, msgbox другойтам где Формат написал - там кнопки прописываются. а Формата кажысь нет. тебе влом скачать ВБСу хелп с тырнета? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 12:27 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, Format-ов в VBS не один на все случаи, а 4: FormatCurrency FormatDateTime FormatNumber FormatPercent ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 12:35 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ЦЦа, Мне вообще-то нужно было дату превратить в 'yyyymmdd', чтобы отправить запрос к SQL Server. Поэтому решил использовать Format, но как-то не подумал (и не проверил), что у VBScript нету такой функции. :) Это я по инерции пользователя VBA. :-) Ну нет, значит нет. Буду использовать самопальную функцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 12:49 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ILL HEADstudieren, msgbox другой VBScript умеет работать с Msgbox. Можете проверить. :) ILL HEADтебе влом скачать ВБСу хелп с тырнета? Да не влом. У меня вот здесь C:\Program Files\Microsoft Office\OFFICE11\1049\VBSCRIP5.CHM "по умолчанию" уже был хелп, видимо когда устанавливал офис там в дистрибутиве уже был. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 12:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, сильно извиняюсь. поразил приступ косоглазия. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.11.2012, 21:00 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если нужно заменить 2 и более подряд идущие пробелы на 1 пробел, то можно воспользоваться Replace скажем так: Код: vbnet 1.
Но что делать если подряд идут 4 или 5 пробелов, а по условиям задачи требуется, чтобы между слов оставался не более одного пробела? Ведь после замены в таком случае все равно останутся 2 и более пробелов. Когда-то в таких случаях я пользовался циклом: продолжал до тех пор пока длина строки переставала сокращаться. Но после изучения регулярных выражений понял, что есть более изящное решение. :) А код такой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
В принципе вместо пробела (там где отмечено красным цветом) можно использовать и другой символ или даже группа символов. Отличие от простейшего Replace заключается в том, что за 1 раз заменяются все 2 и более пробела на 1, в связи с чем вовсе не требуется цикла. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2012, 20:20 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenНо что делать если подряд идут 4 или 5 пробелов, а по условиям задачи требуется, чтобы между слов оставался не более одного пробела? Ведь после замены в таком случае все равно останутся 2 и более пробелов. Регулярки - это хорошо и универсально, но хочу вставить 5 копеек в защиту риплейса. :) N вложенных риплейсов заменяют на один пробелы, количеством не более, чем (2^N). То есть, если мы уверены, что имеем не более 16-ти пробелов подряд - нам гарантировано хватает 4 риплейсов: Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2012, 22:08 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, проверил на досуге .... тож вариант Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2012, 22:36 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwrqwr... N вложенных риплейсов заменяют на один пробелы, количеством не более , чем (2^N). ... Мне удалось (с разбегу) заменить 38 пробелов 4 риплейсами. Подозреваю, это не предел. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2012, 22:43 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
nord-woolfqwrqwr... N вложенных риплейсов заменяют на один пробелы, количеством не более , чем (2^N). ... Мне удалось (с разбегу) заменить 38 пробелов 4 риплейсами. Подозреваю, это не предел. :) Если пройти подобный инстанс, состоящий, к примеру, из 808 пробелов, то их останется ещё больше ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2012, 23:14 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
от 808 пробелов осталось всего 6. :) Код: vbnet 1. 2.
"Рабочий" диапазон до 40 пробелов подряд. Потом врет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2012, 00:15 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
nord-woolf, а Автор сказал 16 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2012, 00:25 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
!??nord-woolf, а Автор сказал 16 Зонуды, блин. Вообще-то всегда можно уложиться и в три риплейса. Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2012, 09:30 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Вот еще интересный факт, свойство таблицы, замеченное в ms access 2007. Называется "Отслеживание строк." Попробуйте активировать данное свойство, не работает. Это рудимент для сервера?: ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2012, 09:59 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwrqwrВообще-то всегда можно уложиться и в три риплейса. Код: vbnet 1. 2.
Чрезвычайно оригинальное решение. А как заставить в REPLACE работать постановочных знаков (wildcard)? Вообще такое возможно? Сам я думаю, что нет. Но глядя на то, как здесь лихо справляются с трудными задачами, думаю у знатоков может есть "секретные" приёмы? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2012, 11:59 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, Код: vbnet 1.
Судя по тому, что буквально не "по хэлпам", то Статик здесь осмысленно? Для чего? Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2012, 22:41 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
!??, Ой, ошибочка вышла. Я эту функцию использовал для одного запроса и там в конце у меня не было "Set objRegExp = Nothing". Я вот в конце обнулить переменного не забыл, но зато в начале забыл заменить "Static" на "Dim". :) Конечно же функция должна выглядеть так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Спасибо за поправку. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2012, 07:46 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если хотите использовать эту же функцию в запросах, то функция должна выглядеть так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
Но честно говоря всё-таки идея qwrqwr намного лучше, ибо там вообще не требуется использование какого-либо объекта. Более того, при таком раскладе функция получается более универсальной как для самой VBA, так и для запросов. Код: vbnet 1. 2. 3. 4.
Да и прямо в самом запросе можно 3 Replace'а подсучить. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2012, 08:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Обнаружил одну странность Access'а (2003). Запускаю вот такой запрос Код: sql 1.
Здесь "@Version" как бы неявно объявленный параметр. Как и подобает в таких случаях Access спрашивает значение параметра, что в общем-то логично. Но как только стоит мне объявить (как "хороший" мальчик), то здесь происходит чудеса. Код: sql 1. 2.
Теперь Access НЕ спрашивает значение, а сразу показывает свою версию. Я понимаю, что использовать ключевые слова не есть хорошо, но почему в первом варианте он не показывает версию Access'а? Вот тут не совсем понятно. И вообще, какие зарезервированные слова ведут себя подобным образом? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2012, 11:13 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Кажется начал понимать в чём тут дело. ИМХО все свойства объекта "Application" имеют такую особенность. Код: sql 1. 2.
Забавно! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2012, 11:27 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
нда, интересно... :) studieren... И вообще, какие зарезервированные слова ведут себя подобным образом? похоже, любые проперти Access.Application так можно "достать" Код: sql 1. 2.
@Visible@UserControl-1-1 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2012, 11:28 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwerty112, Ну надо же, первый раз обогнал qwerty112 по нажатию кнопок. Тока написал, а он тут как тут. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2012, 11:31 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
qwerty112похоже, любые проперти Access.Application так можно "достать" но "работает" или в сохр.запросах, или через Application.DoCmd что в общем-то и "ожидалось" ... Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2012, 11:36 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
В Excel'е есть очень полезная штука "QueryTable", с помощью которой можно импортировать данные из любой СУБД. Создаём запрос к серверу и получаем данные. Вот что делать если запрос с параметром? Раньше я в программе динамически создавал запрос и в свойство CommandText подменял текст запроса каждый раз. Вчера как-то решил по приколу поменять примерно вот такого рода текст для СУБД SQL Server: Код: sql 1.
Решил попробовать обновить запрос "вручную" и очень удивился, когда Excel не вернул ошибку, а стал спрашивать значение параметра! Мне и в голову не приходило, что можно в Excel'е соорудить запрос с параметром, да так, чтобы у юзера программа сама стала бы спрашивать значения и при этом без единого кода. Соответственно я и не искал в help'е и где-нибудь в и-нете что-либо подобное. А тут такое! :) Короче, эксперименты показали, что вместо константное значение для параметра можно просто проставлять вопросительные знаки и каждый знак Excel понимает как очередной параметр. Код: sql 1.
Можно оказывается программно вставить более предметную подсказку типа "Введите код клиента". Например так: Код: vbnet 1. 2.
Более того можно сделать ссылку на определённую ячейку, чтобы Excel не спрашивал значение параметра, а сразу брал значение с указанной ячейки. Для этого вместо значения нужно написать что-то вроде "=Лист1!A1" и вуаля! Ну и много, много чего можно ещё нарыть в help'е. :) P.S. Ну извиняйте ежли баян! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 14:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
У меня офис 2003. Там выходит вот такое диалоговое окно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 14:24 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenУ меня офис 2003. Там выходит вот такое диалоговое окно. studieren, похоже, когда-то стоял 2007, а это, судя по датапикеру, какие-то обломки от него остались ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 14:30 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
!??studierenУ меня офис 2003. Там выходит вот такое диалоговое окно. studieren, похоже, когда-то стоял 2007, а это, судя по датапикеру, какие-то обломки от него остались Вроде никогда не устанавливал офис 2007. Разве что в виртуалку. Ну это окно я получил с "боевого коня", а там строго 2003. Сейчас у соседей попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 14:35 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
!??studierenУ меня офис 2003. Там выходит вот такое диалоговое окно. studieren, похоже, когда-то стоял 2007, а это, судя по датапикеру, какие-то обломки от него остались Только что проверил у соседей, у которых отродясь НИКОГДА не был установлен офис 2007 вообще. Точь в точь такое же диалоговое окно. Так что на обломки не похоже. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 14:42 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenВот что делать если запрос с параметром? тут было ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2012, 14:52 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Всем известно, что если скопировать текст из окна редактора VBA и при этом если язык клавиатуры не "русский", то кириллица после вставки текста превращается в крякозябру. Как-то тестировал кусочек кода в Excel'е (там в отличии от Access открываем новую книгу и не сохранив сам файл можем сразу тестировать код). Не посмотрев на язык клавиатуры скопировал в базу и сохранил, а Excel файл разумеется не сохранил. :) Там название некоторых объектов, комментарии и тексты Msgbox, в общем все превратилось в неудобочитаемый текст. :) Раньше не знал о существовании такого простого трюка. Оказывается весь этот текст можно скопировать в Word и там "Сервис" ==> "Исправить поврежденный текст" и вуаля! Весь текст опять "нормальный"! Ну и это не всё! Прилагаю файл "CodePage.reg", которого нужно просто запустить и согласиться с тем, чтобы некоторые Win реестры изменились. текст файлаWindows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage] "1250"="c_1251.nls" "1251"="c_1251.nls" "1252"="c_1251.nls" "1253"="c_1251.nls" "1254"="c_1251.nls" "1255"="c_1251.nls" [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\EUDCCodeRange] "Unicode"="E000-F8FF" После этого обязательно нужно перезагрузить Windows. Если у Вас Win XP, то теперь смело можете копировать и вставить тексты из VBA и наоборот, и при этом совсем можно игнорировать раскладку клавиатуры. "Крякозябры" не появятся. P.S. У меня в ноутбуке Win 7. Увы, там этот номер почему-то не проходит. Кто-нибудь знает как заставить Win 7 работать так как надо со шрифтами / Unicode и прочие, прочие, прочие ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 13:50 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Блин сам файл не сцепился с первого разу. Исправляю. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 13:51 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studierenБлин сам файл не сцепился с первого разу. Исправляю. :)А ведь и вправду - юбилей ( клац ) 10 лет - круглая дата ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 14:40 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
адв, Честно говоря я не знал (собственно и не искал), что в форуме уже были темы о реестре "[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]". Ну если Вы всё знаете может подскажите что нужно исправить в Win 7, чтобы и там можно было копировать любой текст из VBA? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:25 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, под вин7 не работаю, только тестирую. Не подскажу, к сожалению, ибо не сталкивался с проблемой. зы. А где я писал, что всё знаю? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2012, 15:35 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Есть у контролов (textbox, combobox) форм свойство "KeyboardLanguage" (Язык клавиатуры). Если поставить там "English", то при получении фокуса данным контролом язык клавиатуры сразу переходит на английский. Штука очень полезная, но вот беда! Совсем не работает в табличной форме. Выкрутился так: В свойство "OnGotFocus" (Получение фокуса) написал: Код: vbnet 1.
Здесь 67699721 так сказать "InputLocaleID" для английского языка, если верить вот этой статье . Ну а для русского языка - 68748313. Допустим мы не знаем этот код для других языков. Как же узнать? Всё очень и очень просто. Сначала вручную сами переводим язык клавиатура на нужный язык и после этого в окне отладки пишем так: Код: vbnet 1. 2.
После чего и получим нужный код "InputLocaleID". P.S. А в табличных формах есть ли другой способ перевода языка клавиатуры? Только вот Win API не самое лучшее решение, т.к. в зависимости от 32- или 64-разрядной ОС код может сработать, а может и нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2013, 14:51 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren..., т.к. в зависимости от 32- или 64-разрядной ОС код может сработать, а может и нет. дико сорю нам посчатливилось досталось -- 'безвременье' рицепт - - ждать....) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.01.2013, 14:59 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Как-то я уже спрашивал вот здесь 11371576 вопрос, который звучит примерно так: Если у формы источником записей служит таблица, линкованная через ODBC в SQL Server, то как можно поймать текст сообщения об ошибке именно сервера? P.S. Версия: А2003, формат: mdb. Нашёл по теме вот такую статью ACC2000: Cannot Trap Specific ODBC Errors on OnOpen Property of a Form Там как раз таки написано о причине данной проблемы: ODBC error messages normally consist of two components. The first component is error 3146, whose description is: ODBC--Call failed The server-specific error information is contained in the second component, from which you can retrieve an error number and a description such as: [Microsoft][ODBC SQL Server Driver][SQL Server] <Server-specific error message> (#<error number>) Ну и совсем слегка переделал тот код и у меня получился следующее: Код: vbnet 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. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2013, 10:52 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Весь код, который я "спрятал" под спойлер нужно держать в отдельном модуле. Ну а в форме на событие BeforeUpdate пишем так: Код: vbnet 1. 2. 3.
или в свойство "До обновления" пишем так: =BeforeUpdateOfForm([Form]) Вопрос: А нет ли каких-либо подвох в этом коде? Ну я имею ввиду нет ли там косяков и не будет ли где-то поджидать "сюрприз"? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2013, 10:57 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Интересный факт я обнаружил. Если мы переменную величину объявляем как Integer, Date и т.д., то переменная ведёт себя также соответственно как Integer, Date и т.д., но некоим образом не как Variant. По идее всё так. Но! Бывает оказывается и исключение! :) Если в модуле объявляем переменную как Private или через Dim, то тут происходит нечто необычное. Код: vbnet 1. 2.
Теперь если в окне отладки просто запустить вот такой код, то MsgBox как не странно будет пустым. Код: vbnet 1. 2.
Если же проверить их на IsEmpty, то тут выясняется что IsEmpty(I) = True. Вот если этих же переменных объявить как Public, то уже MsgBox не пустой. Что это даёт в таком случае? Бывает иногда полезным узнать программным путём "использована" ли переменная (т.е. задавали ли мы хоть какое-либо значение). Если тип Variant, то достаточно было просто проверить IsEmpty, а вот с другими типами IsEmpty всегда возвращал False. Оказывается бывает и исключение. :) P.S. Сильно извиняюсь если баян. Из-за лени не стал искать в нашем форуме или в гугле, а сразу здесь же опубликовал. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2013, 13:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Странно! Если я в окне отладки пытаюсь передать строковую значению, то почему-то у меня VBA не ругается. Код: vbnet 1.
Как так? Значит если мы объявляем переменную как Private или Dim, то уже не имеет значение какой у него тип, всё равно будет как Varinant? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2013, 13:35 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Даже если у вас в модуле написано "option explicit", то для окна "immediate" это свойство не установлено. Возможно, что только по умолчанию, и где-то можно переключить, не важно. Так вот, если переменная на момент попытки её использования еще ни разу не была использована (читай, инициализирована), то создаётся новая переменная уровня окна immediate с типом variant. Со всеми вытекающими. В общем-то, предсказуемое поведение ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2013, 13:54 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Т.е. если переменные выше уровнем не удалось найти в памяти, то происходит примерно следующее: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2013, 13:57 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
ййййй, Упппс! Привык куски своих кодов проверять в окне отладки. Как-то не подумал, что окно отладки не видит эти переменные. :) Случайно "наткнулся" при проверке очередного своего кода и не разобрался. Первом делом подумал, что это такая особенность VBA. :) Реально sorry! :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.05.2013, 14:29 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Создал нижеследующий простейший код (Property) в MS Access и в MS Excel / Word: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Если запускаю вот такой код в окне отладки MS Access, то ошибки не возникает и программа возвращает значение, а вот в Excel / Word ругается: Код: vbnet 1. 2.
Run по разному работает в разных продуктах офиса? P.S. Мне нужно было передать значение какой-либо переменной БД, находясь извне (т.е. в чужой среде) и потом в MS Access прочесть это значение. Конечно можно просто сохранить это значение в какой-либо таблице и в MS Access прочесть это. Но хотелось бы избежать создание лишних таблиц. Во время эксперимента и выяснил, что Run по разному работает в разных офисных продуктах. В связи с чем ещё 1 вопрос: как народ поступает в таких случаях? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2013, 11:59 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Условное форматирование Access 2010 Условное форматирование в акцесс 2003 было ограничено тремя вариантами Как вы, наверное, уже знаете, в 2010 акцессе это ограничение было убрано (причём, довольно коряво). Это выражается в том, что через удобный интерфейс можно добавить хоть 100500 вариантов условного форматирования для поля. Лично я, когда проверял, остановился на 25 вариантах... Но, если вы попытаетесь считать или добавить условные форматирования посредством VBA, вам будут доступны только первые три варианта. Попытка обратиться к остальным вызовет ошибку. Ковыряясь во внутренностях контрола, в наборе Properties я обнаружил 2 свойства: № 128 - ConditionFormat № 129 - ConditionFormat14 Оба эти Properties-а имеют формат битового поля. Только в первом случае свойство хранит информацию о первых трёх уровнях форматирования, а во втором случае - массив данных о всех условных форматированиях, которые можно присвоить контролу. Для набора из пяти свойств, данные могут выглядеть так: Массив данных в Hex Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Если этот массив данных присвоить какому-нибудь элементу в соответствующее свойство, то этот элемент станет обладать соответствующим набором условных форматирований. Так же можно передавать набор форматирований от одного контрола - другому: Код: vbnet 1.
Может, кому пригодится... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2013, 16:12 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Bryk_Alien Условное форматирование Access 2010 Это бы в Недокументированные фичи http://www.sql.ru/forum/47491 и в Баги http://www.sql.ru/forum/85650 ... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2013, 16:18 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Есть топик Саныча «Узнать программно, послан ли отчет на принтер или на предпросмотр?» . Там есть решение, суть которого – повесить на событие Format заголовка отчёта примерно вот такой код: Код: vbnet 1. 2. 3. 4. 5. 6. 7.
Когда отравляем на печать отчёта «DoCmd.OpenReport» вызывает ошибку. Как это работает не совсем понятно. Всё бы ничего, но только у меня возникла проблема. Есть у меня одна база данных, где «DoCmd.OpenReport» не возвращает ошибку, даже если с режима предварительного просмотра отчёт отправляем на печать. Вроде бы файл не испорчен, попробовал импортировать в новую базу, да и попробовал удалить все модули и воссоздать заново их (у Joss есть специальная программка, которая так и делает). Короче ничего не помогло, после чего попробовал пойти другим путём. На печать мы можем отправить двумя способами: 1) сначала открыв отчёт в режиме предварительного просмотра и затем нажимая на Ctrl+P. 2) сразу отправляем на печать. Код: vbnet 1.
Случай № 1. Если открываем отчёт в режиме предварительного просмотра, то в заголовке отчёта 1 раз происходит событие «Format» и если отправляем этот же отчёт на печать, то и данное событие совершается уже 2-раз. Стало быть, если установим глобальный счётчик внутри модуля отчёта или какую-нибудь метку, то при совершении повторного события будем знать, что отчёт отправлен на печать. Причём, даже если отчёт отправлен на печать не полностью, а только некоторые страницы (не обязательно начиная с первой стр.), то всё равно повторно происходит событие «ReportHeader_Format». Итак, повторное совершение события «ReportHeader_Format» информирует нас об отправке на печать отчёта. Случай № 2. При открытии отчёта в режиме предварительного просмотра совершается событие «Activate», а при отправке на печать без предварительного просмотра это событие не происходит вовсе. В общем-то, логично! Стало быть, на момент «Activate» ставим метку о том, что отчёт активирован и на момент закрытия отчёта «Close» смотрим, не был ли отчёт активирован. Если отчёт был активирован, то ничего не делаем внутри события «Close». А если всё таки активации не произошло, то тогда смотрим, не был ли заголовок отчёта отформатирован хотя бы раз. Если не был, то это означает, что отчёт не открыт вовсе (ну например, из-за отсутствия данных после фильтра). А если был, то отчёт отправлен на печать без предварительного просмотра. Вот и код: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
P.S. А не прозевал ли я какую-нибудь подвоху? В смысле бывают ли случаи, когда этот код не работает? У кого какие мысли? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2014, 15:50 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, капельку подправил ваш код, а то событие срабатывало даже в момент предпросмотра (на радость всё работает даже при "поднятии" экземпляра класса отчета :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2014, 17:18 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, А вот так уже не работает :( ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2014, 11:45 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, поправил, теперь и в последнем случае всё нормально отрабатывает (да, всёж ФАК иногда перечитывать надо .... )))))) чешу "репу")))) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2014, 16:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если подключить в референсах VBA " C:\WINDOWS\system32\scrrun.dll " (у меня Win XP, в других версиях возможно месторасположение файла чуть-чуть другое), то в списке библиотек появится " Microsoft Scripting Runtime ". Теперь нажимаю F2 и в " Object Browser " выбираю библиотеку " Scripting ". Выбираю из списка любую интересующую меня функцию и нажимаю F1, чтобы прочесть справочный материал. Всё время у меня выходило пустое окно. Есть один замечательный топик "Программно получить список классов и всех членов этого класса из библиотеки в References" , где есть код, с помощью которого можно получить много интересных свойств библиотек. Например, " MetodHelp ". Так вот, попробовал я и этот файл " C:\WINDOWS\system32\scrrun.dll " анализировать, так у него оказывается свойство " MetodHelp " = " C:\WINDOWS\system32\VBENLR98.CHM ". Смотрю я в свой компьютер и не нахожу этот файл. Поэтому и у меня пустое окно. Нашёл в и-нете вот здесь этот файл и поместил в папку " C:\WINDOWS\system32 ". Пустое окно исчезло, то вместо него компьютер начал ругаться. Как я понял из "ругани" компа, видимо этот файл был изначально предназначен для Windows 98, а у меня Windows XP. В инете нашёл вот такой топик Associate a help file with a library in the VBA object brower . Как я понял из данного топика файл был переименован " VBLR6.CHM " и находится совсем в другом месте (в моём случае вот здесь " C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\1033\VBLR6.CHM "). Скопировал я этот файл и разместил копию в папке " C:\WINDOWS\system32 ", да и переименовал как " VBENLR98.CHM ". И О ЧУДО!!!!! Программа совершенно перестала ругаться и самое главное начала открывать нужный справочный материал. P.S. Сколько же библиотек якобы "без справочного материала"? Microsoft видимо много раз переименовал и переместил в разные папки, да так, что приходится искать очень долго, чтобы найти. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2014, 14:06 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Вывод: Если вместо справочного материала получаем пустое окно, то предварительно с помощью нижеуказанной функции узнаём полное название и местоположение справочного файла. Код: vbnet 1. 2. 3. 4. 5. 6. 7.
P.S. Чтобы функция заработала, разумеется, нужно заранее зарегистрировать файл tlbinf32.dll . После этого ищем этот файл в нужной папке. Если нет его там, то находим и размещаем туда. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2014, 14:34 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Дано: А2003, Win XP. Есть такой тип данных "date" в SQL Server (если не ошибаюсь начиная с версией 2005 появился этот тип данных). Когда линкую таблицу, то Access воспринимает этот тип как текст, а не дата. Причина как оказывается в драйвере. Если использовать драйвер "SQL Server", то так и происходит. Ну а если использовать более "свежий" драйвер "SQL Server Native Client 10.0", вот там "date" как дата. Ну и другие типы данных вроде бы читаются без проблем. (Недавно был топик, где об этом и было написано). Вот только одна проблема. Если тип данных "varchar( Max )", то этот драйвер теперь совсем "плохо читает" (почему-то не показывает первые 255 символов). Сталкивался ли кто-либо с такой проблемой? Может в строке подключения что-то надо "подкрутить"? Экспериментирую с различными строками подключения, пока безрезультатно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.08.2014, 10:23 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
studieren, получить строку значений столбца запроса (сконкатенировать столбец) можно , подключив библиотеку Excel и использовав функцию Transpose из этой библиотеки , тогда эту операцию можно записать одной строкой Код: vbnet 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 09:53 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
guest_rusimport, очень спорное решение. Гораздо проще получить строку через ADO (GetString), ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 10:51 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
\\\\guest_rusimport, очень спорное решение. Гораздо проще получить строку через ADO (GetString), ИМХО. не понял , а спорить то тут о чем ? :) есть такой вариант , и он работает :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 12:04 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
guest_rusimport...не понял , а спорить то тут о чем ? ...Это не спор, это (см. название топика) анализ чужих решений... ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 12:49 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
\\\\, ну, тогда уж надо было указать достоинства , недостатки, сравнить с другими вариантами :) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2014, 16:17 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Для решения одной специфической задачи мне пришлось группировать записи и умножить значения, а не просуммировать. Дело в том, что существует агрегатная функция суммирования (SUM), а вот умножения (Multiply) – нет. Как быть? Есть несколько способов решения данной задачи. Вариант №1. Нужно в VBA функции динамически создать SQL текст запроса (перебирая циклом) и перед запуском самого запроса подменить текст. Что-то вроде этого: Код: sql 1. 2. 3. 4.
Данный метод хорош, когда речь идёт о сравнительно небольшом количестве записей. Если же речь идёт о сотни тысяч, а то и более записей, то этот метод не годится. Во-первых, слишком долго будет программа обрабатывать циклом записи и во-вторых, SQL текст запроса не бесконечный, миллион символов не переварит. Вариант №2. Создаём VBA функцию, которая циклом перебирает значения по указанному ID и умножает значения. А в тексте запроса просто указываем название VBA функции. Метод хорош, но для большого количества записей будет требовать много времени на обработку. Вариант №3. Создаём VBA функцию, которая также циклом перебирает значения по указанному ID и превратив числовое значение в текстовое будет сцеплять их. Что-то вроде «2*115*17» для каждого ID. А в тексте запроса указываем название VBA функции, при этом обернув полученное значение дополнительной функцией EVAL. Этот метод хуже, чем вариант №2. Кроме того, из-за режима «печосницы» (SandboxMode) функция EVAL может и не работать у всех. Вариант №4. На просторах интернета я встретил самую необычную и изящную идею. Тот, кто додумался до этого, просто гений! Я бы сам никогда не додумался. Метод настолько очаровал меня, что я решил поделиться им. Оказывается агрегатной функции SUM вполне достаточно! Но вот только придётся изощряться. Дело в том, что сумма логарифмов с одинаковым основанием равняется как раз таки логарифму точно с таким основанием, но с умножением значений. Т.е.: LN(A1) + LN(A2) + … + LN(An) = LN(A1*A2*…*An) Чтобы избавиться от логарифма полученное таким образом значение потом нужно будет воздвигать в степень e. Правда тут есть нюансы: все умножаемые числа должны быть больше 0, а для этого придётся брать только абсолютное значение и параллельно ввести учёт знаков. Ну и в случае нулевого значения добавить «костыль». И так. Чтобы было более понятно о чём речь создаём таблицу в VBA и добавляем тестовые значения. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Вот теперь и запускаем вот такой запрос: Код: sql 1. 2. 3. 4.
Выражение « (-1)^(SUM(IIf(Val<0,1,0))) » необходимо чтобы следить за знаком (в случае если окажется отрицательное число). Выражение « MIN(IIf(Val=0, 0, 1)) » необходимо для выяснения нет ли 0 среди умножаемых значений. Как то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2020, 10:11 |
|
интересные факты / наблюдения / анализ чужих и собственных решений
|
|||
---|---|---|---|
#18+
Если Вы точно знаете, что среди значений нет нуля и все числа всегда положительные, то и текст запроса будет проще. Код: sql 1. 2. 3. 4.
P.S. Конечно же нужно учесть при этом, что если умножаемых чисел слишком много или же сами числа достаточно огромные, то может возникнуть ошибка переполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2020, 10:19 |
|
|
start [/forum/topic.php?all=1&fid=45&tid=1610226]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
216ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 331ms |
0 / 0 |