powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / интересные факты / наблюдения / анализ чужих и собственных решений
25 сообщений из 280, страница 3 из 12
интересные факты / наблюдения / анализ чужих и собственных решений
    #37251424
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я когда-то написал вот здесь как можно в запросах в режиме конструктора создавать алиасы (псевдонимы) таблиц не заходя в режим SQL. В справочнике MS Access 2003 есть такая статья "Создание псевдонимов таблиц в запросе (ADP)", где собственно и написано о псевдонимах.
Примечание. Сведения в данном разделе относятся только к проектам Microsoft Access (.adp).

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

Необходимо создать инструкцию в области SQL, которая будет более короткой и простой для чтения.
При частом обращении в запросе к имени таблицы, представления или функции, например к полным именам столбцов, необходимо быть уверенным, что не превышен предел количества знаков в запросе.
При работе с несколькими копиями одной и той же таблицы, представления или функции (например в самообъединении) необходимо указать ссылку на одну из копий.
Например, можно создать псевдоним "e" для таблицы employee_information, а затем использовать "e" при ссылке на нее.

В окне базы данных в списке Объекты нажмите кнопку Запросы , выберите запрос, который нужно открыть, и на панели инструментов окна базы данных нажмите кнопку Конструктор.
В области схемы щелкните правой кнопкой таблицу, представление или функцию, для которой необходимо создать псевдоним, и выберите в контекстном меню команду Свойства.
В диалоговом окне Свойства введите псевдоним в поле Псевдоним.
При создании псевдонима таблицы конструктор запросов подставит псевдоним вместо соответствующего имени таблицы в столбце «Таблица» в области сетки.

Примечание. Если для таблицы создан псевдоним, то при ссылке на таблицу в инструкции SQL необходимо использовать именно псевдоним (использовать оригинальное имя таблицы нельзя).

В справочнике написано, что данный способ относится только к проектам adp. Но на самом деле и в обычных mdb файлах подобным образом также возможно создавать псевдонимы. (См. рисунок)
Там в свойствах помимо "Псевдоним" есть ещё другое не менее интересное свойство "Источник", где можно указать путь любой другой базы и тогда Access будет тянуть информацию из указанной базы. Например, напишем так: "C:\Test.mdb", после этого смотрим в режиме SQL текст запроса.
Код: plaintext
SELECT * FROM [C:\Test.mdb].MSysObjects AS O
В справочниках Accessа я не встретил ни одного умопинания о том, как надо написать в данное свойство текст подключения, чтобы достать таблицу или представление из другой СУБД, например из MS SQL Server. Оказывается всё очень просто. Нужно написать так (это пожалуй самый простой текст подключения):
Код: plaintext
ODBC;DSN=НазваниеDSN;Database=НазваниеБД;
Можно также указывать логин и пароль здесь же:
Код: plaintext
ODBC;DSN=НазваниеDSN;Database=НазваниеБД;UID=SA;PWD= 123456 
Таким образом можно достать только таблицу или представление из другой СУБД, а вот другие объекты БД (функция, хранимая процедура и т.д.) нельзя. Запрос в таких случаях работает так, как если бы он был линкованной таблицей и станет обновляемым, если конечно же имеется первичный ключ / уникальный индекс.
Текст запроса в режиме SQL выглядит примерно так:
Код: plaintext
SELECT * FROM [ODBC;DSN=НазваниеDSN;Database=НазваниеБД;UID=SA;PWD= 123456 ].dbo.Table1 AS T
Здесь название владельца / схемы "dbo" можно пропустить.
Есть ещё одна альтернатива: предложение 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
SELECT * FROM Table1 IN ЛюбоеСловоНоТолькоБезПробеловИЖелательноБезПлохихСимволов 'ODBC;DSN=НазваниеDSN;Database=НазваниеБД;UID=SA;PWD=123456'
Код: plaintext
SELECT * FROM Table1 IN "" [ODBC;DSN=НазваниеDSN;Database=НазваниеБД;UID=SA;PWD= 123456 ]
Как вы видите кавычки, апострофы, квадратные скобки можно использовать вперемежку.
Но в то же время также можно текст подключения разделить на 2 части и указать отдельно. Типа так:
Код: plaintext
SELECT * FROM Table1 IN 'Database=НазваниеБД' [ODBC;DSN=НазваниеDSN;UID=SA;PWD= 123456 ]
При этом если указан логин и пароль, то следует их указать во 2-части текста подключения.
Если логин и пароль пользователя не указан, а также отсутствует параметр " Trusted_Connection=Yes ", то при первом запуске запроса выходит диалоговое окно, куда и следует ввести логин и пароль для доступа к серверу.

P.S. Может кто-нибудь подскажет ссылку на "официальную" литературу, где можно прочесть о всех нюансах предложения IN? А может кто-то уже досконально изучил данный предмет и знает многие-многие нюансы / особенности / "секреты"? Не поделитесь?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37254943
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studieren
Код: plaintext
With CurrentDB.QueryDefs("")

Большое спасибо за проведённое исследование.
Я в Access'е уже редко, пробовал в Word (в VBA), не получилось. Ставлю любую типичную ошибку, например, fgd = 0, при попытке компиляции выдаёт ошибку, сохраняю, выхожу, захожу снова - натыкаюсь на не нужный мне модуль. В 2007 версии Word, по-моему, эта особенность исправлена, и там можно попадать сразу в последний исправленный модуль.
Наверное, это годится для Access.
Впрочем, всё по той же ссылке YBW, а затем и я, обнаружили, что способ Serge Gavrilov работает, а он, видимо, взял откуда-то с другого сайта, судя по комментариям в этом Add-In'е.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37255058
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindВпрочем, всё по той же ссылке YBW, а затем и я, обнаружили, что способ Serge Gavrilov работает, а он, видимо, взял откуда-то с другого сайта, судя по комментариям в этом Add-In'е.
Что я взял с другого сайта? Комментарии в каком Add-In?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37255153
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov, Сохранение позиции в модуле
Забыл дописать, что нужно написать 2 bat-файла:
install.bat:
Код: plaintext
@regsvr32 bin\CodePositionRestore.dll -s
uninstall.bat:
Код: plaintext
@regsvr32 bin\CodePositionRestore.dll -u -s
и положить их в папку SavePos, запускать по желанию.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37255304
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindSerge Gavrilov, Сохранение позиции в модуле
там вообще нет комментариев
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37255374
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindstudieren
Код: plaintext
With CurrentDB.QueryDefs("")

Большое спасибо за проведённое исследование.
Я в Access'е уже редко, пробовал в Word (в VBA), не получилось. Ставлю любую типичную ошибку, например, fgd = 0, при попытке компиляции выдаёт ошибку, сохраняю, выхожу, захожу снова - натыкаюсь на не нужный мне модуль. В 2007 версии Word, по-моему, эта особенность исправлена, и там можно попадать сразу в последний исправленный модуль.
Наверное, это годится для Access.
Впрочем, всё по той же ссылке YBW, а затем и я, обнаружили, что способ Serge Gavrilov работает, а он, видимо, взял откуда-то с другого сайта, судя по комментариям в этом Add-In'е.

День добрый, CoolMind!
Сначала не понял о чём речь, а потом вспомнил. Да, действительно я написал особенность А2003. После Вашего сообщения попробовал в Excel 2003, там тоже такой "трюк" не проходит, в смысле не попадаем в "ошибочный" модуль. Значит это касается только А2003.
А вообще я так и не понял, почему и по какому принципу некоторые модули внутри A2003 открыты, когда мы первый раз запускаем, а некоторые закрыты.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37255389
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
   Description     =   "Save and restore  cursor position in VBA Code"
   DisplayName     =   "Save and restore cursor position in VBA Code"
   AppName         =   "Visual Basic for Applications IDE"

.................

Public VBEInstance           As VBIDE.VBE
Private mfrmWatcher          As VB.Form
'------------------------------------------------------
'this method adds the Add-In to VB
'------------------------------------------------------
Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
    On Error GoTo error_handler
    
    'save the vbe instance
    Set VBEInstance = Application
    Set mfrmWatcher = New frmWatcher
    
    Set mfrmWatcher.VBEInstance = Me.VBEInstance
    mfrmWatcher.Timer1.Interval =  100 
    
    Exit Sub
    
error_handler:
    
    MsgBox Err.Description
    
End Sub

'------------------------------------------------------
'this method removes the Add-In from VB
'------------------------------------------------------
Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
    Unload mfrmWatcher
End Sub
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37255524
Lockpickup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот еще интересный "факт"...

1. Снял флаг отображения с таблицами и проч.
Файл->Параметры->Текущая база данных->снять галку Область перехода->Перегрузить БД
2. Убрал встроенные меню MSAccess (Property базы "AllowFullMenus").
3. Вижу результат как на прикрепленном файле (все в порядке, все закрыто).
4. См. след пост т.к. не знаю как 2 картинки прикрепить...
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37255534
Lockpickup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь правым кликом на кнопочку "микрософт", выбираем пункт "Настройка панели быстрого доступа" и вуаля.
Спрашивается, за что боролся?
Может кто знает, как закрыть этоти "лаз" от пользователей?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37256037
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindSerge Gavrilovтам вообще нет комментариев
Connect.Dsr:
Код: plaintext
1.
2.
3.
4.
5.
6.
'------------------------------------------------------
'this method adds the Add-In to VB
'------------------------------------------------------
'------------------------------------------------------
'this method removes the Add-In from VB
'------------------------------------------------------
Я имел в виду мои комментарии.
А как эти комментарии, которые вы приводите, указывают, что что-то взято с какого-то сайта?
Если бы вы когда-либо писали Addin-ы на VB6, то знали бы, что эти комментарии появляются "автоматом" при создании нового проекта, если шаблоном был выбран Addin. Попробуйте.

Если я добавляю комментарии, то в основном пишу их тоже на английском.
Если использую чей-то код, то стараюсь приводить в комментариях источник, откуда он взят.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37256218
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lockpickup,

Я просто переименовал формат файла "accdb" на "accdr", т.е. сделал как бы "Runtime" и у меня получился "не активный" меню (см. картинку).
Не вариант?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37256236
Фотография CoolMind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serge Gavrilov, действительно, с этим трудно спорить, поэтому я и написал слово "видимо". Извините, пожалуйста. Очень рад, что это Ваш код, и он очень помогает в работе.

Добрый день, studieren! Ваш метод тоже очень удобен для случая Access, потому что при установке Add-In во всех Офисных приложениях по окончании работы будет задаваться вопрос о сохранении. Для Access это и так общепринято, а вот для Word было бы не очень удобно, поэтому я обычно запускаю install.bat перед сохранением позиции, а по окончании - uninstall.bat. Требуется редко, но метко.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37256302
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CoolMindSerge Gavrilov, действительно, с этим трудно спорить, поэтому я и написал слово "видимо". Извините, пожалуйста. Очень рад, что это Ваш код, и он очень помогает в работе.
Хорошо, а код был приведен в качестве примера возможного решения...
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37256397
Lockpickup
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
studieren, очень даже вариант!! Благодарствую.

Только я переименовал .accde в .accdr.
И, что очень приятно, там нет панельки "Область навигации".
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37259420
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы узнать как долго работает Windows можно воспользоваться вот таким кодом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub HowLongWindowsWork()
    Dim lngTotal As Long
    Dim intHour As Integer, intMinute As Integer, intSecond As Integer
    
    lngTotal = Format(GetTickCount() /  1000 , "0") 'всего секунд
    intHour = Int(lngTotal /  3600 )
    lngTotal = lngTotal - CLng(intHour) *  3600 
    intMinute = Int(lngTotal /  60 )
    intSecond = lngTotal - CLng(intMinute) *  60 

    MsgBox "Ваш компьютер работает в эту загрузку " & Str(intHour) & " час. " & _
        Str(intMinute) & " мин. " & Str(intSecond) & " сек.", vbInformation
End Sub

Код взял отсюда и слегка переделал.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37268385
Guest33
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Application.ADOConnectString - Что это? В хелпе нет, в объект бровсере нет, в подсказке (после точки) не возникает. На форуме - один пост ( 7301856 ). Зачем он?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub test_application_adoconnectstring()
Dim r As New ADODB.Recordset

r.Open "select count(*) from marks", _
       Application.ADOConnectString & ";User ID=Admin; Password=", _
       adOpenStatic, _
       adLockReadOnly
Debug.Print r( 0 )
r.Close: Set r = Nothing
End Sub
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37268474
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Guest33...в объект бровсере нет, в подсказке (после точки) не возникает...
Есть, включите в Object Browser "Show Hidden Memberы"
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37276569
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересный факт:
Если во внутреннем запросе использовать какую-нибудь VBA функцию, но при этом во внешнем запросе не ссылаться на данное поле (столбец) в фильтрах и в сортировках, иначе говоря если бестолково использовать VBA функцию во внутреннем запросе, то Access полностью ИГНОРИРУЕТ данную функцию, словно её там нет.
Чтобы было более понятно приведу такой пример.
Создаю такую функцию
Код: plaintext
1.
2.
Function Test(str As String)
   MsgBox str
End Function
А теперь запускаю вот такой запрос
Код: plaintext
1.
2.
Select Name From
(SELECT Name, Test(Name) AS X
FROM MSysObjects) AS O;
Access ни разу не будет давать MsgBox!!!
А вот при таком запросе замучает MsgBoxами!
Код: plaintext
1.
2.
3.
Select Name From
(SELECT Name, Test(Name) AS X
FROM MSysObjects) AS O
Order By X;
Вообщем-то это логично и даже совсем не плохо. Access экономит ресурсы там, где это возможно. Я предполагаю, что со звёздочками "*" дела обстоят аналогично, т.е. даже если во внутренним запросе используем звёздочку "*", то скорее всего Access будет "обращать внимание" только на нужные поля, а остальных будет игнорировать.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37276605
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё одна деталь:
Данное утверждение оказывается верно и для запросов внутри запроса. Т.е. если мы используем какой-нибудь запрос (скажем "Запрос1") как источник данных для другого запроса и при этом в первом запросе использованы VBA функции, которых мы не используем во втором запросе, то и в таких случаях Access игнорирует VBA функцию.
Сохраним такой запрос под именем "Запрос1":
Код: plaintext
1.
SELECT Name, Test(Name) AS X
FROM MSysObjects
Теперь запускаем другой запрос
Код: plaintext
1.
SELECT Name
FROM Запрос1
Опять ни одного MsgBox! :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37277687
alvk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studieren,

А тут и не должно быть его, ведь select name, а не test. И вообще с сохранёнными и несохранёнными запросами много фишек, одни только вычисляемые поля чего стоят.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37277779
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли создать такой запрос с параметром, который возвращает список названий запросов, содержащих определенный фрагмент SQL текста?
Да, можно и на самом деле всё очень просто. Вот один из вариантов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
PARAMETERS Fragment Text (  255  );
SELECT Qry.Query, Qry.SQL_Text
FROM [TABLE
    (SELECT O.Name AS Query, Eval("CurrentDB.Querydefs('" & O.Name & "').SQL") AS SQL_Text
    FROM MSysObjects AS O
    WHERE O.Type =  5 
    ORDER BY O.Name)]. AS Qry
WHERE IsNull(Fragment) OR SQL_Text Like ('*' & Fragment & '*');
Здесь если не укажем фрагмент SQL текста запроса, то получим весь список запросов.


А если у кого-то есть ещё более простое решение, please поделитесь. :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37286253
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в файле mdb имеются несколько таблиц, присоединённых через ODBC (linked table) к различным базам данных из разной СУБД, то при первом обращении к такой таблице появляется специальное диалоговое окно, куда пользователь должен ввести логин и пароль. Видимо Access где-то запоминает логин и пароль пользователя, т.к. при повторном обращении к одной и той же таблице уже не спрашивает аутентификацию. Ну а если открыть другую таблицу, присоединённой к другой СУБД, то вновь появится диалоговое окно для аутентификации.
Допустим, логин и пароль пользователя абсолютно одинаковый для всех БД из разных СУБД.
Как же сделать так, чтобы Access спрашивал логин и пароль пользователя только один раз?
Я как-то уже спрашивал этот вопрос вот здесь, где уважаемый Ё подсказал достаточно оригинальный способ решения проблемы.
Для этого в Accessе создаём рабочую группу, где следует создать идентификационные данные пользователя (логин и пароль) аналогичные с другими СУБД. Обязательно также следует запаролить пользователя "Admin" иначе при открытии файла Access не будет спрашивать пароль. Когда мы откроем и введём логин и пароль для Accessа, то этого будет достаточно, больше при обращении присоединённых таблиц аутентификация пользователя не требуется.
Всё вроде бы нормально работает. Но!!!
Начиная с А2007 теперь Microsoft отказывается от рабочей группы (файл mdw). Вообще-то у рабочей группы была ещё 1 полезная особенность: можно было защитить не только таблицы и запросы, но и такие объекты базы как формы и отчёты. Теперь, увы, они беззащитны. Но это уже другая тема.
Как же теперь поступить, если файл в формате А2007 или даже А2010?
Один из самых простых способов решения это «временные запросы к серверу».
Для этого сначала создаём форму, где требуется ввести логин и пароль пользователя. Для поля «пароль» ставим маску ввода «PASSWORD». Теперь создаём «временный» запрос таким образом:
Код: plaintext
Dim xQuery As DAO.QueryDef\nDim strSQL As String\nDim strCnn As String\nDim i As Byte, blnCheck As Boolean\n\n\' Сначала на всякий случай следует проверить введен ли логин пользователя\nIf IsNull(txbUser.Value)=True Then\n    MsgBox "Введите логин пользователя.", vbInformation\n    txbUser.Setfocus\n    Exit Sub\nEnd If\n\' Создаём временный запрос.\nSet xQuery = CurrentDB.CreateQueryDef("")\n\' Чтобы долго не ждать можно время ожидания сократить до 1 секунды.\n\' Как не странно, если пропустить этот код, то Access почему-то при первом\n\' запуске может зависать где-то на 15-20 секунд. Вроде бы запрос простейший,\n\' никаких сложных вычислений, но всё же!\nxQuery.ODBCTimeout =  1 \n\nstrSQL = "SELECT 1 AS Test;"\nOn Error Resume Next\n\' Для примера попробуем присоединиться к 3 БД.\nFor i =  1  To  3 \n    strCnn = "ODBC;DSN=" & Choose(i, _\n        "НазваниеDSN1;Database=НазваниеБД1;", _\n        "НазваниеDSN2;Database=НазваниеБД2;", _\n        "НазваниеDSN3;Database=НазваниеБД3;") & _\n        "UID=" & txbUser.Value & ";PWD=" & txbPassword.Value & ";"\n    xQuery.Connect = strCnn\n    xQuery.SQL = strSQL\n    blnCheck = xQuery.Openrecordset.Fields( 0 ).Value\n    If Err.Number <>  0  Then\n        MsgBox "Введены неверные идентификационные данные пользователя!", vbExclamation\n        Exit Sub\n    End If\nNext i\nxQuery.Close\nSet xQuery = Nothing

После всего этого можно без проблем открыть любую присоединённую таблицу и при этом не вводить идентифицирующие данные пользователя.

P.S. Прилагаю mdb файл (в формате A2003), где есть форма «Authentication». Там есть ещё одна дополнительная таблица «USys_DefaultUser», которая необходима для определения логина пользователя по умолчанию. Программа запоминает логин последнего пользователя в данной таблице и при следующем запуске Acccessа по умолчанию логин будет появляться. Разумеется, и с помощью API функций можно узнать последнего пользователя, но на мой взгляд данное решение более простое.
Можете импортировать форму «Authentication» и таблицу «USys_DefaultUser» в свою базу. Только не забудьте в модуле формы заменить «НазваниеDSN» и «НазваниеБД» на реальное значение, ну и саму форму можно повесить на стартап.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37318799
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прилагаю файл "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 пишите.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37345257
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слегка улучшил файл "FindObject.mdb" и исправил некоторые ошибки.
Теперь можно заменить программно фрагмент SQL текста запроса. Например, если Вы переименовали таблицу, то теперь программно можете переделать все запросы, которые в своём тексте ссылаются на переименованную таблицу.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #37345281
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В хелпе как-то "мелко" написано по поводу таблицы "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 называет "Запрет локального хранения сетевого имени и пароля связанной таблицы" ?
Ну и "время задержки", а также "число загружаемых строк" также не совсем понятны. Я поэкспериментировал, но особой разницы не заметил. Кто нибудь может подробно объяснить об этой таблице? В каких случаях она может быть действительно полезной?
...
Рейтинг: 0 / 0
25 сообщений из 280, страница 3 из 12
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / интересные факты / наблюдения / анализ чужих и собственных решений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]