Рассылка статей | Программирование и готовые решения
Leadersoft.ru

Рассылка статей

Программирование и готовые решения

В этом разделе сайта дается информация от https://leadersoft.ru о статьях по программированию, ответах на вопросы и др. Статьи рассылаются подписчикам и публикуются на разных сервисах. Возможно некоторая информация устарела и ссылки не работают, но эти сведения могут быть полезны, если Вы серьезно занимаетесь разработкой баз данных

Выпуск 31. Русский Office XP

Русский Office XP
     Приблизительно в сентябре месяце выйдет русская версия Office XP. Сразу же возникает вопрос, а что нового нам приготовила компания Microsoft. Благодаря Сергею Алпатову и Кириллу Жучкову (Microsoft) у меня есть betta версия данной программы. За что им большое спасибо.
    Но прежде, чем приступать к изучению нового офиса, я посмотрел литературу по этой тематике. Удивительно, но одну книга уже появилась. Надо отметить, что скорость с которой она была выпущена вызывает уважение, хотя авторы и не стали себя сильно загружать описанием серьезных новинок данной программы. Например, я не нашел в описании методы создания и управление смарт-тегами, а поэтому и название книги не запомнил.
 
   Ниже перечислены некоторые новинки в программе Office XP.
    1. Теперь число запусков офиса ограничено. При первом запуске программы обязательно требуется регистрация через Интернет (возможна регистрация и по телефону, но в Betta версии этой функции нет). Сама регистрации очень простая, достаточно ввести только страну (остальные параметры не обязательны). Процесс происходит очень быстро в течение нескольких секунд. Вот данные из тестирования при которой требуется повторная регистрация офиса:
   - изменение операционной системы (изменялась ОС Win 98 на Win Me),
   - изменение конфигурации оборудования (изменялось название системной папки).

   2. Изменился интерфейс программы. Вид кнопок, списков, панелей и других объектов изменен. Появилась справа управляющая панель (для быстрого доступа к командам). На главную панель базы данных выведен список для поиска  (не надо нажимать F1). Но вся документация по программированию осталась на английском языке. Так что тем, кто еще не работал в Access 2000, придется привыкать к этому. Из-за того, что это betta версия, возможно поэтому нового к описанию по VBA добавлено немного.

    3. Формат файлов Access 2000 и Access 2002 изменился. Но это не так уж страшно. Access открывает без проблем файлы mde и mdb 2000 версии. У меня возникли некоторые проблемы при работе с библиотечными функциями. Напомню, что из Access можно быстро открыть (без запуска процесса) формы, отчеты из других файлов mdb и mde. Но эту проблему я думаю решить можно, если подойти к ней более детально.
   
    4. Конечно интересно знать, как сильно изменился заголовок базы данных Access 2000 по отношению к Access 2002. С помощью программы la_prot.mdb определено, что пароль базы остался на старом месте, т.е. смещение его равно 67 байтам (наверное, кто-нибудь свой день рождения (1967) запрограммировал - шутка). Таким образом, надеяться на защиту базы данных с помощью пароля не приходится. А также можно сделать вывод, что изменения в структуре файла не повлияли сильно на заголовок.

    5. Конвертировать базу данных можно сразу для 3 версий 97, 2000, 2002.

    6. Появилось новое понятие: смарт-теги. Что это такое? На первый взгляд - это обычная ссылка. Отличие лишь в том, что она подчеркивается не сплошной, а пунктирной линией. При наведении мышкой на ссылку, появляется неразвернутый список со значком i. При нажатии на него появляется список команд, которые Вы можете выполнить. Итак даю новое понятие. Smart Tag- это интеллектуальный список, который распознается приложениями Microsoft Word, Excel, Internet Explorer и т.п., и позволяет выполнить команды пользователя. Главное отличие от обычной ссылки - это возможность выполнения не одной, а нескольких команд. Вот несколько примеров смарт тегов, которые удалось посмотреть без каких-либо проблем:
  a) Word. При вводе любой даты в документ, например, 21.01.2001 автоматически Word распознает дату и определяет его, как смарт тэг (список). Теперь, Вы сможете выбрать из списка команду, например, "Назначить собрание для сотрудников". После выбора ее запускается приложение Outlook и выполняются необходимые действия.
  б) Интернет. После открытия web страницы в Internet Explorer можно вызвать смарт тэг с большим количеством ссылок на сайты в Интернете.
  Структура объекта. Чаще всего примеры по смарт тэгам состоят из библиотеки *.dll и строки реестра *.reg. Для регистрации библиотеки вы запускаете команду: regsrv32 x.dll, а для прописки в реестре дважды щелкаете на файл x.reg. После этого реестр выглядит примерно так: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Common\Smart Tag\Actions\x
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Common\Smart Tag\Recognizers\x
  Итоги. Можно сказать, что структура смарт тэгов напоминает чем-то ActiveX элементы. В принципе, имитировать его на экране можно и другими средствами, потребуется больше программного кода. Естественно возникают вопросы, как он работает с базой данных (пример есть, но не тестировался), можно ли разместить его на web странице (для Unix хостинга) и т.п.

    P.S. Стоит ли покупать новый офис, это должен решить каждый сам. Ваше решение будет зависеть не только от возможностей программы, но и от стоимости лицензии, от типа компьютеров, применяемых на предприятии, квалификации пользователей. Ведь сейчас примерно 60-70% еще используют Access 97, да и техника требует обновления.

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

Ответы на вопросы


    Большое спасибо Дмитрию Чернову за ответы подписчикам. В конце каждого вопроса дается ссылка на страницу в Интернете, по которой Вы сможете добавить свои комментарии по данной теме. При открытии конференции измененные темы появляются на первом плане.


Вопрос 231(09.02.2001) У меня возник такой вопрос. Вы как то упоминали что можно использовать полезные функции из *.dll Мне необходимо разобрать SQL выражение, т.е. вытащить из него все имена таблиц/запросов и их полей. Причем меня не устраивает системная таблица "MSysQueries" , т.к. в ней не разбираются например "UNION" конструкции. Я подозреваю, что где то в недрах системных dll - ей, есть то что мне нужно,
ведь разбирается как то Аccess с вручную написанными SQL-выражениями. Мне кажется, даже если вам и не приходилось сталкиваться с похожей проблемой, она вас заинтересует.
  Ответ. Конкретной информации по использованию dll функций по разбору SQL запросов у меня нет. Но, то что Вы собираетесь сделать - это небольшой микро-компилятор. Тема достаточно сложная и "скандальная". Лучше для этого освоить язык С++, т.к. придется часто работать с указателями на строки (*p++). Далее можно создать свою небольшую dll библиотеку, используя открытые коды из какого-нибудь компилятора. Например, начните работу с изучения книги Д. Хендрикс "Компилятор языка СИ для микроЭВМ". Перевод с английского А.А. Батнера под редакцией Б.А. Кузьмина (Москва, "Радио и связь", 1989, 238 стр.).
   Материал книги изложен довольно кратко и по существу. В книге рассматриваются вопросы создания компилятора С (точнее Смолл СИ). Даются исходные коды компилятора на С.
   • В ч.1 рассматриваются основные понятия трансляции программ. В ней представлен беглый обзор, затрагивающий центральный процессор, машинный язык, язык ассемблера и использование ассемблеров, загрузчиков и компоновщиков программ.
  • В ч.2 рассматривается сам язык Смолл-СИ. Описываются элементы языка, начиная с простых и кончая более сложными, например, goto, if, switch, while, for, return и т.п.
  • В ч.3 описывается собственно компилятор. Здесь рассматриваются принципы организации ввода, вывода, стандартные функции, вызов компилятора, генерация кода, даются соображения по увеличению эффективности программ и т.п.
Вопрос 300(27.03.2001) Что нужно сделать, чтобы в форму можно было заносить информацию из Интернета, т.е. чтобы она была динамическая и потом на основе введенных данных предоставлять отчет. И можно ли, вообще, сделать доступ к базе через Интернет с разными правами доступа?
   Ответ. Обычным способом разместить базу данных (mdb файл) в Интернете не получиться. Например, если у провайдера в качестве операционной системы используется Unix, то файлы Access распознаваться не будут. В этом случае,
  1. Вы можете создать форму с использованием объекта InternetExplorer, а на сайте разместить скрипт (*.cgi, *.pl), который будет управлять базой данных (например, файлом *.txt,*.dbf.) Используя такую связку, Вы сможете закачивать информацию в Вашу базу данных mdb.
  2. Можно присоединить папку в Интернете к Вашему компьютеру, но это будет слишком медленная связь.
  3. Можно найти NT-провайдера, тогда доступ к базе данных можно сделать, используя технологию ADO. Все запросы будут обрабатываться на сервере провайдера, и Вы также сможете управлять правами доступа. Но такая связь стоит дороже, чем Unix хостинг.
  4. Можно сделать так, что каждая запись базы данных будет сохраняться в виде htm файла и доступ к папкам и файлам на сайте будете определять Вы сами, используя скрипты.
  5. Можно написать программу, которая будет сбрасывать данные в текстовый файл и по ftp закачивать на сервер.
  P.S. Идей может быть очень много, важно найти из них правильную и грамотно ее реализовать.  
Вопрос 325(20.04.2001) Я использую Access 97 больше года. Я знаю SQL, создаю макросы, формы и т.д., но в Access 2000 у меня возникла по созданию формы следующего характера: после команды Save и задания имени формы, созданная форма реагировала на Exit окном Save as и впадала в цикл  (задание имени формы, форма не закрывается....). Я почти уверена, что у на данном компьютере просто установлен некачественный Office.
   Ответ. Офис здесь может быть и не причем, если ранее у Вас не было проблем с Access 2000. У вас возможно база данных близка к разрушению (потеряны связи некоторых объектов). Это происходит при частом редактировании и сохранении объектов базы. В этом случае, желательно все VBA-объекты "сбросить" в отдельные *.bas файлы, далее создать новую базу, а потом их восстановить в ней.   
Вопрос 326(20.04.2001) Возможно - ли каким-либо образом установить блокировку на удаление в таблице(типа триггера в SQL Server).
   Ответ. Триггер-это хранимая процедура, которая автоматически выполняется при вставке, обновлении или удалении записи таблицы (напоминает события формы). У таблицы Access нет событий, поэтому назначить Вам блокировку на таблицу не удастся. Но для расширенной работы с записями Вы можете создать форму, связать ее с таблицей, указать необходимые события и свойства, например, блокировку записей. После этого остается только открыть ее в табличном виде. Посмотрите пример 13 в файле la_form1.mdb, там описано как управлять подчиненной формой в виде таблицы.    
Вопрос 354(15.05.2001) Подскажите, пожалуйста, где в реестре можно посмотреть с какими графическими форматами дружит ACCESS-2000, JPEG, например?
   Ответ. Наберите в команде поиска реестра Global_GraphicsFilters_BMP или GraphicsFiltersFolder и Вы найдете в реестре настройки графики. Раздел реестра: HKEY_CLASSES_ROOT\Installer\Features\...
Файлы фильтров
{8ACBDD56-9340-11D2-900A-00805F9B1201}  bmpimp32.flt
{8ACBDD80-9340-11D2-900A-00805F9B1201}  cdrimp32.flt
{8ACBDDAA-9340-11D2-900A-00805F9B1201} cgmimp32.flt
{8ACBE03B-9340-11D2-900A-00805F9B1201}  emfimp32.flt
{8ACBE08F-9340-11D2-900A-00805F9B1201} epsimp32.flt
{8ACBE0B9-9340-11D2-900A-00805F9B1201} fpx32.flt
{8ACBE1AF-9340-11D2-900A-00805F9B1201} gifimp32.flt
{8ACBE1C4-9340-11D2-900A-00805F9B1201} jpegim32.flt
Вопрос 357(15.05.2001) Как грамотно освобождать память от переменной типа объектов Database & Recordset a) использование Nothing б) использование Close
   Дмитрий Чернов. Можно использовать следующий шаблон Sub ...
Dim db as Database
Dim rs as DAO.Recordset
 Set db = CurrentDB
Set rs = db.OpenRecordset(...)
...
rs.Close
set rs = Nothing
db.Close
set db = Nothing
end sub
 Единственное замечание: в теле процедуры старайтесь избегать применения оператора Exit sub. Например, if условие then exit sub Тогда завершающая часть процедуры не будет выполняться.
   Виктор Конюков . Если Вы определили переменную внутри программы как локальную, то при выходе из функции она "должна автоматически уничтожаться". Но лучше всегда принудительно закрывать переменную (особенно при работе с файлами), т.к. это может привести к непред��казуемым последствиям.
Вопрос 368(21.05.2001) Как инсталлировать access, чтобы он работал в сети? Какие DLL файлы должны находится на локальных компьютерах?
   Дмитрий Чернов. Так же как и для работы на локальном компьютере. Ничего дополнительного устанавливать не надо. Компьютер должен находиться в сети. Один из компьютеров в сети должен выполнять роль "сервера БД", т.е. на нем будут хранится файлы БД. С остальных компьютеров будет осуществляться доступ к данным. Естественно на всех компьютерах (с которых осуществляется доступ к данным) должен быть установлен Access и файл приложения связанный с БД.
Вопрос 369(21.05.2001) Как объединить данные из нескольких полей в одном поле?
   Дмитрий Чернов. Такое возможно только для неизменяемых полей, например в отчетах в свойстве поля Данные указываешь: [Поле1] & " " & [Поле2] & ... & [ПолеN]
   Виктор Конюков. Не забывайте в начале строки ставить знак равенства: =[Field1] & " "
Вопрос 378(25.05.2001)   Так ли уж тяжело преобразовывать задачи созданные в Access 2, в последующие версии этой СУБД. (задачи содержат множество макросов и вставок на VB)
    Дмитрий Чернов. Преобразование Acces2 -> Access97 не вызывало серьезных проблем. Хотя некоторая несовместимость есть. Некоторые вещи придется подправлять ручками. В основном это VBA модули.
Вопрос 383(07.06.2001)   Может быть вы подскажете, как в коде обратиться к количеству записей, полученных в результате запроса Access.
    Дмитрий Чернов. Надо написать следующее:
Dim rs as DAO.Recordset
set rs = CurrentDb.OpenRecordset("Запрос")
rs.MoveLast
rs.MoveFirst
iCount = rs.RecordCount
Вопрос 388(13.06.2001)   Пытался в отчете использовать в качестве источника поля подобную конструкцию: [Name]+chr(13)+[Surname]. В результате в отчете получается Фамилия, квадрат и имя и все в одну строчку. При переносе простым копированием в Word получаю все как надо: фамилию на одной строке, или на следующей в этой же ячейке. Почему Access этого не делает?
    Дмитрий Чернов. Насколько я понимаю, надо записать следующим образом: [Name] & chr$(13) & chr$(10) & [Surname]
   Виктор Конюков . При вводе данных в поле конструктора отчета может появиться сообщение, что функцию chr(13) нельзя применить. В этом случае надо ввести данные в поле в две строки. Для этого после первой кавычки нажмите Shift+Enter, а далее продолжите ввод. Выглядит это в конструкторе так:
=[Name] & "
" & [Surface]
Вопрос 389(13.06.2001)   Возможно ли в Access 2000 в одной базе два разных отчета печатать на разной бумаге (например альбом А4 и портрет А3)
    Дмитрий Чернов. Насколько я понимаю, должно быть возможно. Только это действительно должны быть два разных отчета. Правда при работе в 2000 я с этими задачами не сталкивался. Было раньше. Главное чтобы драйвер принтера поддерживал все нужные Вам форматы.
   Виктор Конюков . Да это возможно, формат отчета выбираете в конструкторе "Параметры страницы". И если драйвер принтера поддерживает листы А3 и А4, то Вы сможете сохранить отчеты для разных форматов. Смотрите также информацию в предыдущих выпусках подписки.
Вопрос 399(22.06.2001)    Подскажите, как при импорте всех таблиц из одного mdb в другой функцией TransferDatabase указать, что необходимо при импорте сохранять связи между таблицами (структуру данных)? Дело в том, что при разработке БД я часто провожу изменения в формах, запросах, не трогая структуры, а затем пересылаю исправленный mdb по почте. При этом хочу сделать кнопочку, по которой пользователи могли бы перенести данные из старой версии БД (данные в которой к этому времени пользователь изменил) в новую версию.
    Дмитрий Чернов. Для этого вовсе не надо делать никаких кнопочек. База разделяется на два файла. В одном собственно база данных, т.е. таблицы и связи между ними (схема данных), в другом весь интерфейс твоего приложения: формы, отчеты и модули. При изменения проводятся только в файле интерфейса и он передается пользователю. Данные на его компьютере сохраняются. Придется только обновить связи таблиц между файлами (что можно сделать вручную, а можно написать небольшую программу), при этом в большинстве случаев даже кнопочки нажимать не придется. Кстати, в дальнейшем, при переходе к многопользовательской работе с БД в данном случае не будет проблем.
   Виктор Конюков . При импорте таблиц в другую базу, таблицы передаются последовательно, поэтому связи между ними не учитываются. Следовательно Вам необходимо написать программу, которая будет копировать не только таблицы, но и связи между ними (необходимые функции для этого есть в Access). Но все же лучше использовать метод предложенный Дмитрием.
Вопрос 400(22.06.2001)   Проблема следующего плана когда проводится сортировка по возрастанию например то отсортированное не соответствует положению букв в алфавите( да и вообще может идти в перемешку). Причем вначале было все нормально, то же с поиском ввожу поиск например like "*нпп*" в SQL запросе, а находится почти все подряд
   Дмитрий Чернов. Как мне кажется проблема возникает при попытке сжимать/восстанавливать базу под версией Access, которая не поддерживает русский язык (у меня в Access97 после сжатия в RunTime версии). Решение следующее: создать новую базу данных и импортировать все таблицы, данные и связи между таблицами из старой.
Вопрос 419(03.08.2001)   Я пытаюсь делать базы на Access-97, хотя у меня и установлен Access-2000,  он 97 уже зарекомендовал себя с наилучшей стороны по стабильности работы и русскому хэлпу. В нашем городке, где мало достойной литературы, второе замечание очень важно. В Интернете я набрел на Ваш сайт, и почерпнул на нем очень много полезной в моей работе информации, приемов, решений. Но все решения созданы под 2000 и многие не работают по 97. Перед мной стоит следующая задача: в Access-97 из формы нажатием кнопки создать из шаблона документа Word документ , в котором заполнить таблицу необходимой информацией из формы абонента. В вашем примере "la_automat.mdb",  есть прекрасное решение данной  задачи, но только под 2000 Access, и я его не могу адаптировать его под 97, не хватает знаний.
    Ответ. Файл la_automat.mdb использует новые средства Access 2000 (клиенты автоматизации), так что в Access 97 такие решения работать не будут. Можно попытаться решить проблему другими средствами, но в этом случае код программы будет очень сложным.

Выпуск 29. ActiveX. Ftp-доступ

Коды для Access 2000
     26.04.2001. Добавлен новый пример 3 в файл: la_activex.mdb. Подробно рассказывается о получении файлов с Интернета для базы данных.

Работа. Сообщение из конференции
 1000 руб за готовое решение ! (Сергей Анисимов) 25.04.2001 Нужна помощь.
1. Функция вызова удаленного соединения через модем с другим компьютером в фоновом режиме.
2. Функция запуска другого процесса, обрабатывающего базы данных на текущем и удаленном компьютере в фоновом режиме.
3. Закрытие процесса и удаленного соединения.
   Ответ. В принципе решение найти можно, оно чем-то аналогично приведенному ниже по ftp-доступу (только надо использовать другой элемент). Опубликуйте email, возможно кто-то и откликнется

Ответы на вопросы

Вопрос 3. Имеем: - доступ по HTTP протоколу к текстовому файлу: httр://путь.../имя_файла.txt Необходимо: - регулярно копировать этот файл для дальнейшей обработки копии в автоматическом режиме, т.е. с обработкой ошибок в случае недоступности исходного файла.
  Ответ. Копирование txt файлов с Интернета на диск, а далее в базу данных проводится с помощью ActiveX элемента Microsoft Internet Transfer. Имя файла библиотеки: msinet.ocx. Для регистрации в базе данных используйте методы изложенные в примере 1 файла: la_activex.mdb. Для начала определим новый класс с событиями для того, чтобы можно было контролировать процесс загрузки.
1. Назовем его, например, MicrosoftInet.
Public WithEvents ftp As inet ' Определяем переменную для доступа к ftp серверу

' == Обрабатываем сообщения при изменении статуса загрузки данных
Private Sub ftp_StateChanged(ByVal State As Integer)
Select Case State
Case icConnecting: funPrintProgress "Поиск соединения ..."
Case icConnected: funPrintProgress "Установлено соединение"
Case icRequesting: funPrintProgress "Запрос ..."
Case icResponseReceived: funPrintProgress "Получено ..."
Case icResponseCompleted: funPrintProgress "Данные загружены"
Case icError:
  funPrintProgress ftp.ResponseInfo
  If ftp.ResponseCode = 80 Then 'Пример обработки кода ошибки
  End If
End Select
End Sub

2. Созданный класс позволяет нам определять загрузку сразу нескольких файлов. О том как сделать загрузку для 1 файла указано ниже

' == Инициализация объектов происходит при открытии формы
Private Sub Form_Open(Cancel As Integer)
Set ftpInet = New MicrosoftInet ' Создаем новый объект
Set ftpInet.ftp = Me.ftp.Object ' Присваиваем
End Sub

' == Обрабатываем событие загрузки формы
Private Sub butLoad_Click()
Dim strCommand As String
On Error GoTo 999

' Очищаем окно диалога
funPrintProgress ""

' Создаем строку для выполнения команды
strCommand = "GET " & Me.ftpSource & " " & Me.ftpDest

' Запускаем на выполнение команду Get
ftpInet.ftp.Execute CStr(Me.ftpUrl), strCommand
Exit Sub
999:
funPrintProgress Err.Description
Err.Clear
End Sub

' == Создаем функцию для сообщений
Public Sub funPrintProgress(myMsg As String)
If myMsg = "" Then
Me.progress = "" ' Инициализация сообщений
Me.progress.SetFocus
Else
Me.progress = Me.progress & myMsg & vbNewLine
End If
DoEvents
End Sub
P.S. Вот коротко и все о загрузке данных через ftp сервер. Полную версию работы программы найдете в файле la_activeX.mdb
Вопрос 305(3.04.2000) Можно ли заставить функцию Rnd работать с буквами?
  Ответ. Напрямую использовать символы нельзя. Функция Rnd возвращает случайное число типа Single (4 байта), а не массив символов. Следовательно надо написать функцию конвертации ее в строку.

   Вопросы из конференции.
Вопрос А9 ЕСТЬ КУЧА БАЗ НА ДИСКЕТАХ, ОДИНАКОВАЯ СТРУКТУРА НО РАЗНЫЕ ДИЛЕРЫ И СООТВЕТСТВЕННО РАЗНЫЕ ДАННЫЕ. НА КАЖДОЙ ДИСКЕТЕ КАЖДАЯ ЗАЯВКА ДИЛЕРА ИДЕНТИФИЦИРОВАНА. В ПОЛЕ ИМЯ ТАБЛ ЗАЯВКИ ПРОПИСАНО ФИО КОНКРЕТНОГО ДИЛЕРА. ЕСТЬ БАЗА УПРАВЛЕНИЯ ЭТИМИ БАЗОЧКАМИ. НЕОБХОДИМО В ФОРМЕ УВИДЕТЬ ЧЬЮ ДИСКЕТУ СОБИРАЮСЬ ОБРАБАТЫВАТЬ (ВСТАВИЛА В ДИСКОВОД). БАЗУ ЗАКРЫВАТЬ И ОТКРЫВАТЬ НЕ ХОЧУ. ИЗ ФОРМЫ ВЫХОДИТЬ НЕ ХОЧУ. ХОЧУ МЕНЯТЬ ДИСКЕТЫ И ВИДИТЬ СМЕНЯЮЩИЕСЯ ФИО ДИЛЕРОВ. ПО ЭТОМУ ФИО ИДЕТ СВЯЗЬ С БАЗОЙ ФОКС-ПРО.
   Ответ. Каждая дискета имеет свою метку. Вам надо присвоить им свое название. Как программно определить метку тома указано в примере 2 файла la_api.mdb
Вопрос А8 Имеются присоединенные DBF-таблицы с различными видами кодировок. Необходимо их обрабатывать для получения результирующих значений.
Смена вида кодировок возможна в regedite если-бы не проблема- перезагрузка. Второй вид прописать в регистре профили -однако есть проблема если сделать как написано в HELP то
при запуске Access не видит профиль. А посему просьба если есть у кого в качестве примера написать ветви в регистре и строку вызова. А может кто предложит третий вариант? Буду
признателен.
   Ответ. Перезагрузку можно попробовать обойти. Для этого, изменив в реестре кодировку, запустить еще один процесс access, и из него загрузить данные. Смена кодировки написана в разделе dbase.

 

Выпуск 28. Microsoft Access.Net

Новости сайта
    28.03.2001. Вышла новая версия 4.4 программы "Курс 2000", т.к. изменилась база данных в Центральном банке России. Программа бесплатная, поэтому в ней дана в упрощенном виде дана диагностика соединения. Например, могут возникнуть проблемы при подключении через прокси - сервер. Но у Вас есть возможность купить за 50$ специальный класс "IntenetCBR" в cbr.mdb файле. Установив его в свою программу, Вы можете полностью управлять подключением и получением данных из ЦБР и загрузкой валют в Вашу базу данных.
 12.03.2001. Добавлены ссылки на сайты, предлагающие работу программистам по теме: Access Developer
 17.03.2001. Добавлена система поиска информации по сайту.

Бесплатные коды для Access 2000
      06.04.2001. Добавлен оригинальный пример по отчетам в Access. По новому рассматривается проблема создания и управления отчетами из mde файла. Коротко о методе: a) отчет создается из mde(mdb) файла, б) в качестве источника данных применяется сложный перекрестный запрос, в) при форматировании полей применяется Excel, г) вместо самого отчета в базе данных сохраняется его снимок. Пример будет полезен тем, кто серьезно занимается базами данных. Автор метода: Малютин Николай, объем mdb файла с документацией: 309 кб.
     24.04.2001. Открыт новый файл в программах: la_activex.mdb. Добавлено 2 примера: 1) Регистрация ActiveX, 2) Элемент анимации: Direct Animation

Введение в тему Access.Net
   При работе с базой данных всегда интересует методы и средства, которые у  Microsoft получат дальнейшее развитие. Побывав на последней конференции (12.04.2001) "Microsoft.NET" (Microsoft-dot-Net), выяснилось, что сейчас компания усиленно работает над интернет-платформой ".NET" (дот нет). Бюджет ее - 5 млд. долларов. Работают над ней более 5000 тысяч программистов, в том числе и над Office.Net. Сказать сейчас, что из себя будет представлять этот продукт невозможно, но некоторые факты изложенные ниже будут интересны для дальнейшего анализа и применения.
   1. Приложения (Applications) будут называться управляемыми (Managed Applications). Запуск осуществляется их не из Windows, а через среду .NET FrameWork, чтобы обеспечить совместимость с разными протоколами, языками, устройствами, работающими под управлением операционных систем.
   3. В качестве языка программирования используется новый язык С# (C Sharp). Аналог языка - С++.
   4. Com/Com+ из-за некоторых сложностей программирования должны уступить место другим компонентам, основанных на открытых стандартах языка XML и протокола SOAP
   5. Язык Visual Basic и многие другие Perl, Cobol, Pascal и т.п.  будут компилироваться в "нейтральный" язык MSIL (Microsoft Intermediate Language), кроме С#. Далее язык MSIL переводится в "родной" код платформы не сразу, а по мере необходимости, и может содержать DLL библиотеки и другие ресурсы.
   6. Поддержка языка Java остается в программных продуктах. Но так, как Java довольно ресурсоемкое средство и зависит от произвольных решений одной компании, то у него появятся конкуренты.
   7. ADO.NET, ASP.NET, XML получат дальнейшее развитие и пока сохраняют устойчивые позиции у компании.

Ответы на вопросы

Вопрос 252(26.02.2000) (Рассылка 25, дополнение)   Мне необходимо заархивировать резервную копию базы данных. Для этого я использую функцию shell, но эта функция запускает программу в другом процессе. Значит я не могу (или не знаю как) отследить завершение процесса архивации, т.е. shell запустил программу rar.exe она начала архивировать файл, а моя собственная программа выполняется дальше. Хотя мне необходимо дождаться, когда же завершится процесс архивации и на жестком диске появится файл архива. Как решить эту проблему? Вообще есть ли другие функции для запуска программ из VBA?
  Ответ 3. Оригинальное решение к двум предыдущим решениям с использованием API-интерфейса дает Игорь Лебедев
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As
Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As
Long, lpExitCode As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long

Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const STILL_ACTIVE = &H103

Public Sub Execute(ByVal ExecStr As String)
    Dim ProcessID As Long
    Dim ProcessHandle As Long
    Dim ProcessExitCode As Long

    ProcessID = Shell(ExecStr, vbMinimizedNoFocus)
   ' ожидаем завершения процесса
    ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
    If ProcessHandle <> 0 Then
        Do
            Call GetExitCodeProcess(ProcessHandle, ProcessExitCode)
            If ProcessExitCode <> STILL_ACTIVE Then
                Exit Do
            End If
            DoEvents
        Loop
        Call CloseHandle(ProcessHandle)
    End If
End Sub
Вопрос 256(27.02.2000) Вопрос по Access97: как можно реализовать механизм временной таблицы, т.е. некоей таблицы, которая создается для каждого пользователя индивидуально при входе в программу и удаляется после окончания сеанса работы пользователя. Была сделана попытка реализовать это с помощью создания таблицы при открытии главной формы и удаления при ее закрытии, но проблема в том, что если закрывается полностью все база, но открыта форма, использующая временную таблицу, то генерируется ошибка при попытке Access удалить <занятую> таблицу. В результате Access все-таки закрывается, но не удаленные временные таблицы накапливаются в базе.
  Ответ 1. Временные таблицы - это неправильный подход к проектированию, надо избегать их появления в базе данных, иначе возникнут проблемы в будущем.
  Ответ 2. В событии закрытия главной формы вставьте проверку на наличие открытых объектов: форм, таблиц и т.п. Если объекты открыты, закройте их, а далее удаляйте ненужные таблицы. Если объекты невозможно удалить, дайте сообщение и отмените закрытие формы.
  Ответ 3. При открытии главной формы удаляйте все временные таблицы, созданные ранее.
Вопрос 259(01.03.2000) Мне необходимо сохранить данные, которые рассчитываются в поле формы в другую таблицу, а как это сделать, я не знаю. Или по другому, мне необходимо взять данные из предыдущей записи, прибавить к ним что-нибудь и сохранить вычисление в текущей таблице.
  Ответ. Вариантов может быть много. Сделайте один запрос на получение информации. Он должен возвращать одно значение (поле). Теперь этот запрос вставьте в другой обновляемый запрос. Если это сложно, то используйте VBA. Откройте два разных запроса, один на чтение, другой на запись. Организуйте поиск, добавление, изменение и т.д. и т.п. Примеров на сайте и в справке очень много.
Вопрос 280(12.03.2000) Помогите, пожалуйста, в такой ситуации:
В свойствах Формы1 перехват клавиш стоит "да". По KeyDown обрабатывается:
Sub SmthDown (KeyCode As Integer)
Select Case 55 'Клавиша "7"
            DoCmd OpenForm... - Открывает Форму2
       Case ...
Все работает, но при возникновении ошибки (любой, к примеру  открытия Формы2), после выдачи MsgBox  в поле, где была нажата клавиша (к примеру 7) заносится нажатая клавиша - т.е. было значение 21432 - стало 7. Существуют ли способ "силком" очистить буфер клавиатуры, или придется извращаться - запрашивать Screen.ActiveControl.ControlName, узнавать значение ActiveControl, если ошибка Формы2 - то разрешать изменить поле Формы1 - типа клавишу нажали - а потом восстанавливать значение поля Формы1 из запомненного?
   Ответ.
   Select Case 55 'Клавиша "7"
      KeyCode = 0
      DoCmd OpenForm... - Открывает Форму2
Вопрос 297(26.03.2000) В Access не совсем новичок. Но есть проблема, которую пока не могу решить. Как открыть базу на машине клиента, если она находится в серверной директории read - only ? Ясно, что проблема в создании пресловутого ldb файла. Можно ли как-то обойти эту проблему.
   Ответ. Не знаю какие установлены у Вас привилегии пользователя, но если Вы попробуете открыть базу данных на диске CDRom (только чтение), то база данных откроется и файл ldb создаваться не будет. Вот пример для эксперимента, каталог должен иметь права на запись. Откройте базу и поставьте на файл ldb флажок только чтение. Теперь файл удаляться не будет. Далее защищайте директорию.
Вопрос 328(20.04.2000) Возможно - ли в качестве источника данных отчета или формы использовать массив.
   Вы можете использовать таблицу, запрос, или строку SQL. Массив строк (текст1;текст 2; ...) может применятся в объектах формы, например, в списке.
Вопрос 329(20.04.2000) У нашего директора есть такой маленький
компьютер JORDANA 690 (Среда Windows CE Platform SDK) на который ACCESS не устанавливается. Возможно ли будет после покупки OFFICE Developer Tools мне скомпиллировать модуль из программы и установить его на этом компьютере.
   Ответ. Точный ответ на вопрос дать не могу, т.к. надо хорошо знать Windows CE. Эта OS отличается от Windows по своим возможностям. Могу только предположить, что из-за недостатка памяти на компьютере и некоторых библиотек Windows появятся проблемы при запуске или работе в Windows CE.
Вопрос 341(20.04.2000) Некоторые говорят, что использование названий таблиц и название полей русскими буквами сильно тормозит работе аксеса, и возможны большие ошибки, а некоторые же утверждают, что разницы нету - хоть на арабском пиши. Каков же правильный вывод. Даже если не использовать пробелов и букв ч и я. Также некоторые утверждают, что название индексов должны отличаться от имен полей, и тем более должны быть английскими буквами без пробелов, а некоторые говорят, что разницы нету.
Каков же правильный вывод. И еще: Говорят что название функций и процедур также должны быть английскими, что якобы они работают гладко (конечно, если они сами сделаны гладко), чем на русском языке. Хотя NSA пишет их на русском (а может он просто делает это для удобства восприятия для тех, кто будет пользоваться ими) Вообще хотелось бы выслушать какая должна быть профессиональная база данных - если взять условие, что с английским туго!
   Ответ. Конечно, если у Вас таблицы и поля будут состоять из 1 буквы скорость такой базы будет выше, т.к. требуется меньше памяти для загрузки программы. Например, запрос "SELECT f FROM t" работает быстрее, чем "SELECT [Фамилия директора предприятия] FROM [Таблица реквизитов организации]". Но с другой стороны, в первом запросе не хватает информации, а в другом ее явный перебор. Так что надо писать кратко, но информативно. Использование пробелов, русского текста в названии таблиц и полей не принципиально. Функции в VBA все же лучше давать на английском, т.к. хлопот будет меньше (при работе с разными версиями баз данных, а также при работе с большими базами). При этом надо учесть, что больше всего VB программ написано на английском языке и следовательно разработчики компилятора лучше всего адаптировали его к этому языку, локальные версии всегда имеют проблемы.
  Вывод. Поля, таблицы используйте на русском, а функции пишите на английском. Названия элементов выбирайте короткие, но понятные.
  Ответ 2. Андрей Беляков. Насколько я разобрался с Access 2, там запросы хранятся в предкомпилированной форме, по крайней мере - после первого использования - точно. Т.е. в обоих случаях имена полей заменены некоторым ID. Эти ID целочисленные одинаковые по размеру. Почему один из них должен обрабатываться медленнее? Адаптация компилятора под язык? В смысле - под набор букв языка? Никогда не видел такой адаптации. Компилятор, точнее его лексический анализатор, принимает определенный набор последо��ательностей символов(букв). Количество размер принимаемого множества символов влияет только на размер лексического анализатора, но никак не сказывается на быстродействии. Вот пример (извините за Си - на Бейсике это обычно не пишут):
...
Decision decision[][];
unsigned char * pText, ch, CurrentState;
...
// получение очередной буквы
ch = *pText++;
// и перевод анализатора в следующее состояние
CurrentState = decision[CurrentState][ch];
...
  Ответ 3. Виктор Конюков. 1. Создайте одинаковые по принципу базы данных с длинными запросами и короткими. Размеры их будут отличаться (даже для mde), а следовательно
загружаться и выполняться будут по разному.
2. Попытайтесь вызывать из SQL функцию (конвертор цены в текст) на русском языке - будут ошибки, но не сразу (надо редактировать формы, еще что-то делать ...). Это проверено неоднократно. Требуется перегрузка всей базы данных или замена ключевых слов на английский текст, тогда ошибка исчезает. Категорически не советую в больших базах использовать функции на русском языке. В локальных версиях всегда ошибок больше из-за проблем, связанных с кодировками символов.
3. Давно известно, что корректно обрабатываются компилятором, а именно, ключевые слова (не данные) состоящие из символов от 32-127 символов, посмотрите на htm - страницы (там нет поддержки расширенного набора символов (128-255) ), т.к. другие могут восприниматься как управляющие символы.
   Ответ 4 (дискуссия с  Андреем Беляковым)
> 1. Создайте одинаковые по принципу базы данных с длинными запросами и короткими. Размеры их будут отличаться (даже для mde), а следовательно загружаться и выполняться будут по разному.
Разумеется, размер текста запроса, будет разный. И запрос с длинными названиями полей будет занимать больше места. Но(!) только  до предкомпиляции. Предкомпилированные версии будут совпадать с точностью до ID полей. Сама база, из-за размера, будет открываться по-другому, но работать должно с одинаковой скоростью. Исключение - первое выполнение.
С MDE не экспериментировал - не нужно было, поэтому судить не берусь. Могу только предположить, что MDE содержит и текстовый, и предкомпилированный варианты запроса.

> 2. Попытайтесь вызывать из SQL функцию (конвертор цены в текст) на русском языке - будут ошибки, но не сразу (надо редактировать формы, еще что-то делать ...). Это проверено неоднократно.
Стандартный SQL не поддерживает вызов пользовательских функций. То, что реализовала MS в Access - расширение возможностей, нигде более не поддерживаемое. Я этим стараюсь не пользоваться.

> Требуется перегрузка всей базы данных или замена слов на английский текст, тогда ошибка исчезает.
Не сталкивался - нормально работаю на английском. А вот с чем сталкивался, так это с такой шуткой. В одной из таблиц есть пользовательское поле с названием TableID (так по задаче было удобно). Поле нормально создается. Без проблем можно модифицировать его содержимое в табличном режиме. Выборка тоже происходит нормально. А вот при модификации SQL-запросами выдается ошибка... Пару дней возился, пока не выяснил, что дело именно в названии этого поля.

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

> В локальных версиях всегда ошибок больше из-за различных кодировок символов.
Больше проблем с локализацией, а не ошибок из-за различных кодировок.

> 3. Давно известно, что корректно обрабатываются компилятором, а именно, ключевые слова (не данные) состоящие из символов от 32-127 символов, посмотрите на htm - страницы (примеров много), т.к. другие могут восприниматься как управляющие символы.
Перечитайте это еще раз. Компилятор либо примет строку символов - если она удовлетворяет грамматике используемого языка, либо выдаст ошибку. За качество диагностики не ручаюсь - сильно зависит от разработчика. Но за что ручаюсь, так это за то, что скорость работы лексического анализатора компилятора не зависит от того, какие именно символы поступают на вход. Лишь бы удовлетворяли языку. Размер анализатора - другой вопрос.
    P.S. Виктор Конюков. Для тех, кто интересуется как работает компилятор советую посмотреть книгу Д. Хендрикс "Компилятор языка СИ для микроЭВМ", перевод с английского А.А. Батнера под редакцией Б.А. Кузьмина (Москва, "Радио и связь", 1989, 238 стр.). Исходные тексты прилагаются.
Вопрос 342(20.04.2000) Как правильно использовать элементы ActiveX.
   Ответ. В базе данных подписки есть несколько вопросов по использованию AсtiveX элементов, позже на них будут даны ответы. Для начала рассмотрим небольшой пример по управлению элементом Direct Animation. Назначение этого элемента - создание анимации в приложениях.
   1. Сначала выясняем из документации имя файла элемента. В нашем случае это - danim.dll. Другие элементы могут иметь и другое расширение, например, ocx, tlb, olb и т.п.

   2. Далее надо зарегистрировать этот элемент в системе, используя команду Windows regsvr32.exe danim.dll или из VBA - References.AddFromFile danim.dll. Если файлы находятся не в системной папке, то нужно указывать их полный путь. Детально этот процесс рассмотрен в примере 1 файла la_activex.mdb

  3. На следующем этапе создаем свой класс объекта. Это удобно не только для обработки, но и дополнения элемента своими свойствами. Элементы ActiveX разрабатывают компактно (минимум свойств), чтобы можно было их быстро загружать из Интернета.

  4. Создаем класс MicrosoftDA и записываем в него код
' Определяем объектную переменную
Public WithEvents da As DAViewerControl ' Подсоединяем к ней события

 ' Определяем функцию для начала анимации
Private Sub da_Start()
  ...
End Sub

   5. Создаем новую форму, помещаем в нее ActiveX элемент с именем ma
   6. Далее описываем события открытия формы и закрытия
Private Sub Form_Open(Cancel As Integer)
Set anim = New MicrosoftDA ' Создаем новый объект
Set anim.da = Me.ma.Object ' Привязываем его к форме
funCreateAnimation ' Определяем функцию создания анимации
End Sub

' Освобождаем ресурсы при закрытии формы
Private Sub Form_Close()
Set anim = Nothing
End Sub

   7. Описываем функцию
Public Sub funCreateAnimation()
   Dim mlib As DAStatics ' Библиотека анимации
   ...
   ' Определяем библиотеку
   Set mlib = anim.da.meterlibrary

   ' Создаем спрайт для анимации
   Set Surface2 = mlib.NewDrawingSurface()
   With Surface2
.      FillStyle 1
.      FillColor mlib.ColorRgb(1, 0, 0)
.      FillPath mlib.Oval(100, 100)
       ...
       Set Image1 = .Image
   End With

   ' Создаем в библиотеке ось вращения
   With mlib
       Set AxisStart = .Point2(-200, 0)
       ...
   End With

   ' Устанавливаем ось вращения
    Set Rotation = mlib.Rotate3RateDegrees(AxisLine, 180).Duration(7).ParallelTransform2
    ...

    ' Масштабируем образ, т.е. метры переводим в точки
    anim.da.Image = Image2.Transform(mlib.Scale2(1# / 10000#, 1# / 10000#))
End Sub
  
    8. На последнем этапе создаем кнопку для запуска анимации
Private Sub butStart_Click()
   anim.da.Start
End Sub
   P.S. Вот в основном и все основные действия по работе с ActiveX элементами. Сложно разобраться бывает с событиями, но для их определения надо использовать браузер объектов или техническую документацию к ActiveX. Полностью описание функций дано в файле la_activex.mdb (пример 2)

   Далее даются некоторые несложные вопросы из конференции на сайте, которые могут быть полезны начинающим разработчикам.
Вопрос А7 Вот у меня есть форма, на ней ListBox и раскрывающийся список фикс. значений(Запрос№1, …., Запрос№4). Требуется генерировать ListBox в зависимости от запроса, который мы выбираем. Причём генерировать не в смысле сортировать или фильтровать уже вставленные поля по значению элемента поля со списком, а пихать туда результаты запросов, будущих и настоящих. Источники данных будут всё время разными, причём ещё будут меняться кол-во и ширина столбцов и другие параметры.
На поле со списком у меня процедура после обновления(не работает):
Private Sub spisok_AfterUpdate()
Select Case Me!spisok.Value
Case Me!spisok.Value = "Запрос№1"
   Ответ. Для формирования своего списка с любым источником данных лучше использовать событие: spisok_Enter. Таким образом, каждый раз при входе в поле Вы будете иметь возможность назначить ему свой источник данных. Если по логике программы список надо устанавливать в другом месте, то тогда при входе в поле надо включать команду requery:
Private Sub spisok_Enter()
  Me.spisok.Requery
End Sub
Вопрос А6 Помогите ра��обраться, существует ли в Access возможность автоматической подстановки значения вычисляемого поля в таблицу БД. Например: я вычисляю сумму чисел 2+2, а сумма должна оказаться в таблице "Вычисления" в поле "Сумма".
   Ответ. В Access существует 2 варианта таблиц. 1 вариант - это когда Вы создаете таблицу в конструкторе. Событий у такого объекта мало (1 событие - значение по умолчанию с ограниченными функциями и 2 - работа со списком), поэтому свою функцию по обработке полей в таблице можно вставить в запрос списка, но это слишком сложно. Чаще всего поступают по другому, создают форму из таблицы, а потом открывают ее в табличном режиме: DoCmd.OpenForm "",acFormDS. У такого объекта есть все события формы, а сам вид остается табличный. Так что попробуйте пойти этим путем.
Вопрос А5 Есть модуль (смотри ниже) который осуществляет перевод числового значения денежного формата в прописной, т.е. 40,50р. -> сорок рублей 50 копеек, но при вводе значения от 40 000,00р. до 99 999,99р. выдаёт ошибку: Run-time error '6':
Overflow Помогите разобраться это глюк MS Access(Версия из Офис2000) или самого модуля.
...
intMillion = Int(curSumma / 1000000)
...
   Ответ. Когда выдается ошибка переполнения, то надо сразу проверять операции с плавающей точкой. В вашем случае слишком "тяжело" для процессора решается задача деления. Я бы попытался изменить все числа Int на Long (50% увеличения скорости), а также сделал бы замену вычислений с плавающей точкой на целочисленное деление. Например, intMillion = Int(curSumma / 1000000) заменил бы на intMillion = CLng(curSumma) \ 1000000.
   P.S. Можете воспользоваться модулем N16 для перевода числа в пропись из файла la_form1.mdb.
Вопрос А4 Скачал ваше учебное пособие "Лекции по Microsoft Access2000" и так как я полный ч... в VB с самого начала возник такой вопрос. Где нужно описывать глобальные переменные, просто не могу понять структуру VB, конкретно в Access (C или Pascal есть главная программа).
   Ответ. Действительно, когда открываешь Access нет главной программы. Все модули равнозначны. Таким образом, для описания глобальной переменной можно взять любой модуль Access, например, "Лекция 01 - введение"
Вопрос А3 База создана в русскоязычной версии Access на английском языке, могут ли быть проблемы при запуске этой базы в англоязычной версии Access.
   Ответ. Да могут быть проблемы. Например, некоторые параметры отчета содержат данные на русском языке (их не видно) .
Вопрос А2 При внесение изменений в отчеты, меняются параметры страницы на значение 25,4мм (значение по умолчанию), где можно изменить это значение, либо каким программным способом это значение можно поменять.
   Ответ. Смотрите меню: Файл-Параметры страницы-Страница. В первых версиях Офиса 2000 возможно изменение ориентации отчета. Для этого посмотрите ранние статьи рассылки по программированию в Access.
Вопрос А1 Имею базу в А2000 состоящую из двух файлов (таблицы и
связанные с ними формы). Но при попытке преобразования файла с формами в .MDE получаю ошибку "Приложение 'Microsoft Access' не смогло создать базу данных MDE". Помогите разобраться в чём причина этой ошибки и когда она возникает
   Ответ. Проверьте соединение файла с таблицами и наличие ссылок в модулях. Если связей или ссылок (например, ADO) нет, то mde создаваться не будет. Возможны также ошибки в VBA модулях файла. Найти их можно путем создания нового файла и экспорта туда всех объектов.

 

Выпуск 27. Пароль Access 2000


Новости
   20.03.2001. Толмачева Галина  добавила новый ответ к вопросу 224 (Объединение-сортировка, 25 выпуск)
   13.03.2001. Андрей Беляков добавил дополнительные ответы на вопросы 264 (Стаж, 26 выпуск). 267 (Оптимизация, 26 выпуск).
   11.03.2001. Alexander Apazidi добавил свою точку зрения на вопросы 264 (Стаж, 26 выпуск). 269 (акции, 26 выпуск), а также по уроку (UDA, 21 выпуск).

Ответы на вопросы


Вопрос 9. Как подключиться к БД MSDE, которая находится в сети на отдельном сервере (под WIN. 98, WIN. NT)
  Ответ. Вопросы подключения базы данных к разным провайдерам лучше всего изучать в графическом интерфейсе, т.е. создав файл udl. Так Вы сможете точно определить название параметров соединения и их значение через кнопку "Проверить подключение" (возьмите для исследований файл la_ado.udl). Как программно управлять соединением подробно описано в файле: la_ado.mdb (2 и 6 пример). Внимательно также прочитайте ответ на вопрос 10.
Вопрос 10. Где в проекте БД можно применять файлы строки подключения (Microsoft Data Link.udi). Как это реализовать в программном коде.
   Ответ. Возможно Вы имеете ввиду не файл *.udi, а файл *.udl. Он создается в проводнике Windows (правая клавиша - для Win98). Сама по себе его структура не очень сложная. Для просмотра внутренней части файла используйте пример 5 из la_prot.mdb. Далее дается пример байтов файла la_ado.udl с дополнительными пробелами, точка в некоторых случаях означает управляющие символы < chr(32). Вот весь файл.  яю[.o.l.e.d.b.].....;. .E.v.e.r.y.t.h.i.n.g. .a.f.t.e.r. .t.h.i.s. .l.i.n.e. .i.s. .a.n..O.L.E. .D.B..i.n.i.t.s.t.r.i.n.g..... P.r.o.v.i.d.e.r. = .M.i.c.r.o.s.o.f.t...J.e.t.. .O.L.E.D.B...4...0.; .M.o.d.e. = .R.e.a.d. |.W.r.i.t.e. |.S.h.a.r.e. .D.e.n.y. .N.o.n.e.;. P.e.r.s.i.s.t. .S.e.c.u.r.i.t.y. .I.n.f.o. = .F.a.l.s.e......
    После конвертации всего файла из Unicode в asci-строку Вы получите следующий пример:
chr(63) & "[oledb]" & vbCrLf & "; Everything after this line is an OLE DB initstring" & vbCrLf &
"Provider=Microsoft.Jet.OLEDB.4.0;Mode=Read|Write|Share Deny None;Persist Security Info=False" & vbCrLf & vbNullChar
   В начале файла идет байт 63, далее идут строки, имеющие символы конца строки chr(13) и chr(10). Весь файл заканчивается нулевым байтом chr(0). Ну прямо как в С++. После такой информации можно самому научиться создавать файлы udl очень быстро. Естественно файл может иметь и другие параметры, поэтому нужна отладка его структуры. Для подключения dll к базе данных проверено два варианта.
' 1 вариант
cnn.Open
cnn.Properties("Extended Properties") = "File Name=" & CodeProject.Path & "\la_ado.udl"
' 2 вариант
cnn.Open "File Name=" & CodeProject.Path & "\la_ado.udl"
Можно также использовать и графический интерфейс для редактирования. Установите ссылку на oledb32.dll. Далее можно писать код:
  Dim myLinks As MSDASC.DataLinks ' Переменная
  Set myLinks = New MSDASC.DataLinks 'Создаем объект
  myLinks.hWnd = Application.hWndAccessApp ' Выбираем родительское окно
  If myLinks.PromptEdit(cnn) = True Then ' Обрабатываем кнопку OK
PS. Вообще все примеры рассмотрены в файле: (см. la_ado.mdb). Там есть разные варианты подключения. Функция чтения файла udl написана (6 пример), можно написать и функцию сохранения.
Вопрос 54. Подскажите, пожалуйста, как снять защиту с файла, созданного под ACCESS 2000.
  Ответ. Существует несколько программ, которые снимают пароль с файлов Access. Вот адреса сайтов. www.lostpassword.com, www.elcomsoft.com и другие. В основном они показывают пароль длиной от 2-16 символов (зависит от версии программы). Можно было ограничиться этим ответом, но так как мы занимаемся детально вопросами программирования и защиты базы данных рассмотрим его более серьезно.
   Описание алгоритма пароля для Access 2000 у меня нет, хотя кусочки информации по шифрованию Аccess 97 в англоязычном Интернете есть. Сущность информации в том, что пароль шифруется простейшим алгоритмом XOR и его смещение от начала файла = 67 байт. Но этих данных явно недостаточно для расшифровки. Поэтому, попробуем составить программу, которая сама проанализирует пароль. Сущность предложенного метода заключается в многократном сравнении файлов с паролями и без них, и поиске закономерностей. Все результаты эксперимента сохраняются в таблице и используются для анализа пароля. Примеры программ для определения пароля Access 2000 записаны в 7 примере файла: la_prot.mdb
    Таким образом, мы сможем определить а) длину пароля; б) смещение пароля от начала файла; в) позицию меняющихся байтов г) маску пароля (слово для расшифровки). Используя функцию  funAnalysisPassword, можно получить следующую информацию.
   1. Cмещение пароля от начала файла 67 байт.
   2. Маска пароля составляет 40 байт (длина пароля 20 символов)
   3. Байты маски:
 [67 - 69]       055 056 212 156 250 163 206
 040 230 118 038 138 096 049 004 123 054
 144 226 223 177 018 100 019 067 170 063
 177 051 081 241 121 091 247 037 124 042
 ...
 [115-117]
    Байты Маски [67-69] меняются в зависимости от даты, установленной на компьютере. Например, на 17.03.2001 = 228,107,236. Проверено, что 67 байт - меняется ежедневно, 68 байт - ежегодно, а 69 байт имеет еще более длительный период изменения. Байты [115-117] меняются при каждом создании базы данных. Отсюда можно сделать - что это байты, которые сохраняют некоторую информацию по дате создания базы данных.
   4. Алгоритм шифрования XOR.
Пример зашифровки: p XOR m = ?.
Пример расшифровки: ? XOR m = p. В примерах используются следующие обозначения: p-байт пароля базы данных, m - байт маски пароля, ? - зашифрованный байт.
   5. Символы хранятся в формате UNICODE, т.е 2 байта на символ, поэтому необходимо провести конвертацию строки пароля. Это делается так: password=StrConv(s, vbFromUnicode)
   Таким образом, для нахождения пароля достаточно определить байты 67-69, используя информацию из байтов 115-117. Задачка очень интересная и оригинальная, так что подумайте немного сами. В приводимых же примерах la_prot маска пароля определялась по другому, приблизительно. Для этого смотрите функцию funGetMaskPassword. Сущность метода. а) читаем дату создания файла FileDateTime(myDataBase), б) устанавливаем время  Time = timeDB, в) создаем незащищенную базу и читаем маску в массив, г) возвращаем текущее время и удаляем лишние файлы.
   После того как файл расшифровывался, запускалась программа для тестирования пароля. Используя эту программу, можно находить некоторые байты пароля обычным перебором символов. Код ее приведен ниже:
Public Function funTestPassword(strMdb As String, strPassword As String) As Boolean
Dim cnn As New ADODB.Connection
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strMdb & ";Mode=Read;Jet OLEDB:Database Password=" & strPassword
cnn.Open
' Далее идет проверка на ошибку
   PS. В примере 7 (la_prot.mdb) Вы найдете и другие функции, работающие с паролем. Использование их необязательно, т.к. если Вы знаете пароль, то его можно удалить или изменить, используя Access, но для проверки разных алгоритмов могут пригодиться.
Вопрос 59 (14.11.2000). Вот столкнулся с такой проблемой. Как по Access 97 (из своей программы) вызвать - Диспетчер связанных таблиц? Как в Access 2.0 делается знаю, но в 97 это уже не проходит.
   Ответ. Варианты создания диспетчера таблиц есть на сайте, подойдут и для Access 97. Для Access 2000 можно запустить команду: Application.CommandBars("Menu Bar").FindControl(, 3996, , , True).Execute
   PS: Команда будет работать в том случае, если у Вас есть связанные таблицы, и Диспетчер связанных таблиц установлен при инсталляции Access.
Вопрос 216(06.02.2000) В Вашей рассылке я прочитал, что Вы боретесь со сложной проблемой ускорения загрузки форм при работе с большими таблицами. О каком замедлении загрузки формы идет речь? Я создал программным способом файл на 50000 записей. Его размер оказался равным примерно 17 мегабайт. Форма связанная с этим файлом загружалась практически  мгновенно, так же сразу отображались данные, а количество записей высвечивалось примерно через 1.5 - 2 секунды. Все работало достаточно быстро, причем у меня довольно средний компьютер( PII 433Mhz 64Mb Access2000)
   Ответ. В Microsoft умные специалисты работают. Открыть быстро базу данных размером в 17 или 100 мегабайт для них не проблема. Так, что эту задачу они хорошо решили. Таким образом, открывая базу в несколько мегабайт, происходит чтение лишь нескольких индексированных записей, а не всего файла (вспомните механизм заполнения запросов и значение счетчика rst.RecordCount после открытия). Но чтобы глубже понять проблему, с ней надо серьезно поработать и провести несколько экспериментов.
    Во первых, научитесь использовать api-функцию timeGetTime(), которая имеет более точный результат (измеряет время в миллисекундах с момента запуска Windows), чем Time() в Access.  Вставьте ее в ваш пример для событий формы Open, Activate и определите время загрузки. Оно и будет минимальным.
    Во вторых, создайте новую базу данных путем копирования старой и добавьте в главную форму подчиненную, а также несколько списков, которые будут базироваться на запросах из вашего 17 мегабайтного файла, например, select * from where [Фамилия]='Иванов'. Запустите тест, и определите время загрузки.
    Так вот, проводя эти эксперименты, и сохраняя в свойствах базы данных минимальное и максимальное время загрузки, можно сделать таймер, который будет показывать загрузку формы. Очень полезно для тех, кто работает с большими базами в сети. Так что, труд Ваш по проведению исследований будет не напрасен.
    P.S. Желательно (для чистоты эксперимента) перед запуском формы Access, перегружать Windows, чтобы не было кэширования данных. В примере 6 файла: la_api.mdb Вы найдете применение функции  timeGetTime() указанной в ответе.
Вопрос 252(26.02.2000)   Я пытаюсь создать кнопки с помощью мастера(Command Button Wizard) в ACCESS, иногда в самом начале он меня предупреждает что "Can`t find any library or object" или что "Visual Basic" не смог создать кнопку!!!
  Ответ. Проблема решается переустановкой офиса начисто, или смотрите частичную переустановку Access в вопросе 266. Конечно, можно повторно, под другим именем, зарегистрировать мастер, и посмотреть, как он сможет работать. Пример на эту тему будет дан позже.
Вопрос 258(27.02.2000) Допустим я вставляю запись в таблицу с помощью INSERT INTO  в таблице есть первичный ключ значение которого назначается самим Access как мне гарантированно узнать значение этого ключа после выполнения запроса для вставки данных в подчиненные таблицы (я не могу полагаться на max значение ключа поскольку кто-то еще мог выполнить подобный запрос, а делать дополнительное поле с уникальным значением  - как-то некрасиво)
  Ответ.  Вопрос не очень сложный, и решается через применение специального запроса: SELECT @@identity. Я добавил пример 3 на эту тему в файл: la_query.mdb. А можно ли определить значения счетчика новой записи, которая еще не добавлена в базу? Попробуйте решить этот вопрос.
PS. О счетчиках уже много говорили, почитайте на эту тему информацию в рассылках.
Вопрос 266(05.03.2000) Моя база в Access 97 - сетевая. Один из пользователей совершает некоторое действие (сам не знаю какое) и бах- в одной из таблиц появляется "зарезервированная ошибка-1601" и у записи появляется значок "закрыто". Такое уже было несколько раз. Сегодня я победил проблему, удалив таблицу и ее связи, в которой были ошибки и вернувшись к резервной копии. Однако, меня тревожит тот факт, что я не могу увидеть причину сбоя. В предыдущий раз я решил, что это нарушение условий блокировки. Тогда я установил пессимистическую блокировку на каждой копии интерфейса. Но видно это не помогло. Ошибка в другом. Сейчас у пользователя у которого появились ошибки переустанавливают "МС офис". Может причина сбоя некорректная работа самого Аccess'a?
  Ответ. Ошибку на логику поймать очень сложно, поэтому для определения проблемы надо в программах на Access всегда вести журнал событий, тогда можно будет восстановить историю ее возникновения. Во вторых, офис переустанавливать бессмысленно, т.к. реестр не восстанавливается к первоначальному состоянию (некоторые отсутствующие файлы hlp, dll, ocx офис восстанавливает сам). Самое лучшее - это установить начисто Windows, а потом Office и сохранить реестр (system.dat, user.dat). Если внешних программ много, то можно сохранять реестр после каждой установки ПО в отдельных папках. Когда начинаются сбои, и возможная причина - это неправильная работа Access или новой программы, просто перепишите файлы из архива в системную папку.
Вопрос 270(07.03.2000) В некоторых рассылках отвечающие пишут письма с позиции гуру, обучающего молодых наставников. Я думаю это не совсем правильно, тем более эти гуру иногда дают неправильные ответы (что особенно забавно чит��ть профессионалу). BTW, я не разделяю Вашей уверенности насчет дефицита специалистов по Access. Надо понимать, что Access это довольно лимитированная СУБД, и более менее серьезные и устойчивые приложения создать в Access невозможно. Маркетинговая ниша Access - это БД начального уровня или хранилище данных для Excel, когда возможностей Excel уже не хватает. В подтверждение своих слов могу привести ряд случаем когда организации
заменяют свои старые Access DB на готовые решения типа 1C, etc. Если Вы не согласны, не могли бы Вы мне написать как Вы видите будущее специалиста по Access, как он может заработать себе на хлеб (мне кажется это постоянный путь freelancer'a , т.е. свободного художника, ходящего от фирмы к фирме).
   Ответ 1. "О замечаниях". Ваши замечания касаются в основном мелкого и среднего уровня проблем. Приведу пример. Если кто-то задает вопрос: "Как написать операцию деления?". То ему дадут ответ: A = B / C. Вы пытаетесь сказать, что это неправильно, так как С может быть равно нулю. Во первых, в вопросе это не уточняется, а с другой стороны это и так ясно, что нужна проверка на ошибку. Попробуйте решить элитную задачу: 1) Как отобразить отчет в подчиненной форме? 2) Как сбросить графический OLE объект из таблицы в jpg формат? 3) Как снять защиту с объектов базы данных? и т.п. Лишь только так можно себя причислить к профессионалам, а комментировать написанное любой может. У нас в стране много любителей поговорить, а способных дать оригинальное решение (и не только в программах ) - мало. Иначе мы бы жили давно уже в преуспевающей стране.
   Ответ 2. "О готовых решениях". Странно, с одной стороны Вы себя считаете профи, а с другой боитесь, что уже кто-то все разработал и делать ничего не придется. Уровень автоматизации в стране очень низкий, при этом всегда "готовое решение" надо настраивать, дорабатывать, изменять, исправлять ошибки, дополнять и развивать. После покупки большинство не знают, что делать с "готовыми решениями". Приглашать специалистов по ним - дорого (20$ час), дорабатывать их самим - сложно. Вот многие и останавливаются на Access, чтобы хоть как-то двигаться вперед, а не стоять на месте. (Смотрите информацию в разделе "Работа").
   Ответ 3. "О специалистах". Во первых, не надо никуда бегать. Если кому-то нужно разработать базу, он всегда найдет возможность связаться с вами. Во вторых, из разнообразных разговоров по Access можно сказать, что экономика у нас просыпается. Были интересные предложения не только со стороны торговых предприятий, но и производственных. В третьих, перспективным в Access я вижу создание универсальных баз данных так, чтобы можно было использовать их с минимальными изменениями в сети предприятия и в Интернете. Будущее также лежит за созданием различных приложений для экспорта/импорта данных в Outlook, Word, Excel и другие программы.
Вопрос 271(07.03.2000) У меня установлен ACCESS 2000 как часть MS OFFICEа. Есть база в dbf формате. Также установлен PARADOX 7. Так вот при установке связи с DBF файлом или при попытке импортировать файл в таблицу данные в ней предстают в виде непонятных символов, такое впечатление, что кодировка другая. Несколько дней назад все было ОК. EXEL читает нормально! Что делать???
  Ответ. На сайте есть раздел, посвященный этому вопросу, смотрите Подписка-Таблицы-dbase, настройка реестра. История возникновения этих проблем заключается в том, что текстовые переменные dbf файла могут храниться в разных кодировках ANSI и ОЕМ. При загрузке Access из реестра считывается информация о типе кодировки, после этого ядро Jet начинает отображать таблицу dbase в соответствии с данной настройкой. Отсюда можно сделать вывод, что возможно какая-то программа изменила информацию о кодах символов или появились проблемы с реестром. Таким образом,  надо попробовать восстановить/настроить реестр. Прочтите обязательно ответ к вопросу 266.
Вопрос 274(07.03.2000) Можно ли в выражениях SQL-запросов вводить переменные? И как?
  Ответ. Можно. Это легко почувствовать на примере 1 файла la_query.mdb. Откройте любой запрос на выборку и введите в квадратных скобках свою переменную. Каждый раз, после ввода символа Access анализирует запрос, и если найдет неизвестную переменную, то попросит ее ввести.
Вопрос 275(07.03.2000) Возможен ли в Access внешний ввод данных, например через input, или через специально созданную форму???
  Ответ. Данные можно ввести через встроенную форму InputBox. Она позволяет не только ввести данные, но и назначить строку ввода по умолчанию. Попробуйте вставить в программу следующий код, и Вам станет более понятно ее использование.
Dim strInput As String
strInput = InputBox("Надо читать справку?", "Сложный вопрос", "Ответ. Надо, но матушка Лень замучила")
MsgBox strInput
Вопрос 276(07.03.2000) Возможно ли создание макроса как в Word Excel?
   Макрос в Word или Excel - это подпрограмма на Бэйсике, сохраняющая информацию о некоторых действиях при редактировании документа. В Access макросом называют набор из одной или более известных макрокоманд, которые при желании можно записать в модуль. Таким образом, хотя и в офисных приложениях запись макросов осуществляется по разному, но сущность одна - составить быстро VBA программу, не вникая в азы программирования.
Вопрос 277(07.03.2000) Можно ли программно менять в запросе условие отбора записей?
  Ответ. Можно. В примере 1 файла la_query.mdb это делается после каждого ввода символа. Изучите его работу, а также в справке значение слова Recordset.
Вопрос 279(07.03.2000) Не могли ли вы прислать названия пунктов меню (команд) на языке VB и способ их вызова в программе.? Не подскажете где можно найти в Интернете русское описание и примеры кода по пред. вопросу?
   Ответ. Для того, чтобы определить некоторый пункт меню скачайте с сайта программу la_menu.mdb. Там Вы найдете пример 6, где подробно показано как получить код для каждой команды из меню. Вы выбираете панель из списка и программа рассчитает коды команд для нее. Запуск команды меню достаточно простой. Например, чтобы вызвать пункт меню "Сервис\Схема данных" достаточно запустить команду:
• CommandBars("Menu Bar").FindControl(, 523, , , True).Execute (общий случай) или
• CommandBars("Tools").Controls("С&хема данных...").Execute (частный случай)
Вопрос 281(12.03.2000) Можно ли из БД выдрать из всех таблиц, только те записи, которые изменились. Это необходимо для проведения резервного копирования БД. Есть ли варианты кроме тупого сравнения всех записей.
   Ответ. Если сохранение делаете один раз в день, то лучше ввести поле-флажок в сохраняемую таблицу. Например, после редактирования записи, это поле автоматически будет заполнятся временем или принимать значение True. При работе в пакетном режиме, можно использовать и статус записи. Например, так:
Do Until rst.EOF
     If rst.Status = adRecModified Then
        ...
     End If
     rst.MoveNext
Loop
Информацию об обновлении самой таблицы можно получить следующим образом: CurrentDb.TableDefs("Моя таблица").LastUpdated. Вариантов придумать можно много, думайте ...
Вопрос 283(14.03.2000) С чем может быть связана такая проблема. Иногда никак не удается запустить мастера создания форм или запросов. То они нормально работают, то они просто не запускаются. Не могу понять закономерности. Помогите пожалуйста советом.
  Ответ. Описание мастеров дано в реестре. В одной из рассылок говорилось об этом. Запуск мастера осуществляется через файл mde (например, office\1049\acwzmain.mde). Можно попробовать зарегистрировать свой мастер под другим именем и запустить его. Для этого нужно проводить эксперименты. Проблема решается правильной установкой Windows (желательно версии 98 и выше) + Office. Информация по сохранению/восстановлению реестра дана в вопросе 266.
Вопрос 284(16.03.2000) Столкнулся с такой неприятностью: при слиянии данных Access с документом Word возникает ошибка: "База данных была
приведена пользователем Admin на компьютере Константин в состояние, препятствующее ее открытию или блокировке" (это мой компьютер, я работаю локально) Справка расшифровывает  ошибку 3734: "Такая ошибка возникает, когда используется  пассивное управление отключением или подключением. Эта ошибка указывает, что другой пользователь перевел базу  данных в состояние, не позволяющее другим пользователям открывать ее.". В параметрах Access у меня стоит "Общий доступ"; "при открытии предоставлять права пользователя". Блокировка записей или ее отсутствие не влияет на результат. Примечательно, что на простеньком примере, моделирующем ситуацию, все проходит гладко: документ открывается, данные импортируются, ошибки и открытия второй копии базы не происходит.
Дополнительно: Работаю в Access 2000. Данные для слияния предоставляет запрос из 4-х таблиц, отбирая необходимые строки по условиям соответствия текущей строке в форме.
Слияние с Wordом необходимо, поскольку в файле содержится шаблон договора, а из базы берется информация для заполнения полей данных контрагента. Выполненное обычным
отчетом Access, как мне кажется, будет выглядеть менее привлекательно, нужно будет решать проблему с длиной строк в зависимости от длины данных. Подскажите, пожалуйста, как выйти из этой ситуации, в литературе указан именно этот способ (конечно, без возможных проблем)
   Ответ. Если при работе с базой данных возникают проблемы с доступом к записям базы данных, то данные надо кэшировать. Например, используйте GetRow для ввода данных в массив, далее подключитесь к Word и заполните таблицу (примеры la_array.mdb и la_automat.mdb). Если через DAO невозможно открыть запрос попробуйте ADO. ADO допускает больше вариантов создания наборов записей. Например, используя курсор Forward-only, Вы создадите ограниченный набор записей (т.е., состоящий из тех записей, которые были в базе на момент создания запроса). Он также допускает только движение вперед по набору. Для эксперимента возьмите пример 5 по ADO (la_ado.mdb)
Вопрос 285(16.03.2000) Собираюсь на выезд. Собираюсь заняться и базами данных. Есть ли смысл, по Вашему мнению, ограничиться только MS Access 2000 и все, как более простым и не вызывает ли этот продукт аллергии за бугром, как к примеру. FrontPage?
   Ответ. Маловато, наверное, будет у Вас шансов найти работу, если только поверхностно изучите  Access. Требуются специалисты умеющие применять базу данных в разных направлениях  (ASP, Word, Excel и т.п.) Вот пример на применение  Access и Word. Работу надо сделать за 2 месяца. Сможете понять, как решить проблему, значит Вам уже давно надо зарабатывать валюту, а не рубли.
Access Developer   
Standards Development Section manages the client standard specifications and supplemental specifications in a prototype Microsoft Access based content management system. This prototype application contains both the specifications and some meta data for the specifications. The last Supplemental Specification (100-200 pages) was published from this prototype with a lot of effort.

This project is to begin conversion of this prototype into a pilot application that can more efficiently publish the upcoming Supplemental Specification. The source documents, created in Microsoft Word, must be decomposed and loaded into the new pilot Access database. This initial upgrade needs to be complete by May 1, 2001 in order to publish the 2001 version of the Supplemental Specifications.

The Bureau needs to do a state-of-the-technology investigation of content management tools so that the pilot application can be built toward a potential enterprise direction, or at least a suitable market direction. The results of this investigation will help us structure the pilot, and determine if there are more suitable tools in the market for managing this publication and the cross-referenced documents. This project will not acquire content management software, nor does it intent to do an enterprise-wide content management investigation.

 

Выпуск 26. Запросы на объединение таблиц

С праздником !
   Поздравляю прекрасную половину подписчиков с праздником 8 Марта. Желаю большого личного счастья, море цветов, кучу подарков, теплых и нежных слов, а также прекрасного настроения в эти дни. Второй половине - желаю проявить побольше изобретательности и щедрости при подготовке праздника.
Новости
  • Малютин Николай дал дополнительные интересные ответы на вопросы 239 (26 выпуск) - клавиатура, 252(26 выпуск) - архивация. 
  • Alexander Tumarov добавил свою точку зрения на проблемы 237 вопроса (26 выпуск)
  • Добавлена ссылка на конвертор AccessToVB: 243 (26 выпуск, mdb->exe)

Access 2000. Урок 7. Выборка из нескольких таблиц

    Конечно, разрабатывая базу данных Вам потребуется создавать запросы не только из одной, а из двух и более таблиц. Разработку таких запросов желательно начинать не с конструктора запросов, а с детальной проработки схемы связей таблиц. В этом случае, Вам придется меньше времени потратить на подготовку самих запросов, т.к. ядро Access в этом случает будет автоматически формировать в конструкторе запросов связи между таблицами.
   Можно предложить 3 (наиболее употребительных) способа объединения таблиц.
   Во первых, с использованием слова WHERE.
   Во вторых, с использованием слов INNER[1], LEFT[2], RIGHT[3] и JOIN[4]
   В третьих, с использованием слова UNION[5]. 
Примеры использования приведены в таблице. Желательно их смотреть через проводник запросов файла la_query.mdb
Название SQL - запрос
WHERE объединение SELECT Курс.Дата, Сумма.Название, Сумма.Сумма, Курс.Курс FROM Курс, Сумма WHERE Курс.Дата = Сумма.Дата
INNER объединение SELECT Курс.Дата, Сумма.Название, Сумма.Сумма, Курс.Курс, [Сумма]/[Курс] AS USD FROM Курс INNER JOIN Сумма ON Курс.Дата = Сумма.Дата
LEFT объединение SELECT Курс.Дата, Сумма.Название, Сумма.Сумма, Курс.Курс, [Сумма]/[Курс] AS USD FROM Курс LEFT JOIN Сумма ON Курс.Дата = Сумма.Дата
RIGHT объединение SELECT Курс.Дата, Сумма.Название, Сумма.Сумма, Курс.Курс, [Сумма]/[Курс] AS USD FROM Курс RIGHT JOIN Сумма ON Курс.Дата < Сумма.Дата
UNION объединение SELECT Сумма.Название, Сумма.Сумма FROM [Сумма]
UNION SELECT "$ от " & Дата as Название, Курс as Сумма FROM [Курс]
    P.S. Домашнее задание.
   1. Большинство разработчиков используют при объединении таблиц только равенство полей, попробуйте задать в проводнике различные уcловия <, >, between для ключей. Это поможет Вам более детально разобраться в структуре запросов.
   2. При решении задачи в предыдущем уроке невозможно создать запрос с использованием всех предложенных слов. Решение заключается в создании нескольких запросов и объединении их с помощью UNION.
Словарь
  • [1] INNER (внутри) - выбираются только уникальные записи совпадающие с ключами таблиц
  • [2] LEFT (слева) - все данные берутся из таблицы СЛЕВА, а из правой таблицы ведется отбор по ключевым полям.
  • [3] RIGHT (справа) - все данные берутся из таблицы СПРАВА, а из левой ведется отбор по ключевым полям
  • [4] JOIN (объединить) - слово применяется для отбора записей по словам INNER, LEFT, RIGHT
  • [5] UNION (объединить) - слово применяется для объединения таблиц без использования ключевых полей.

Ответы на вопросы


 На вопросы отвечает также и  Малютин Николай.

Вопрос 62 (15.11.2000). После установки Office 2000 в новом Access исчез мастер построения выражений. Скажем, если в конструкторе форм выбрать некий элемент управления и встать в его окошко свойств "Данные", то кнопочка мастера там даже не появляется. Аналогично этот мастер исчез из контекстного меню в модулях VBA. Замечу, что Access у меня установлен полностью.
  Ответ. Не знаю почему у Вас удалены управляющие элементы меню, но их можно восстановить командой Reset. Например, CommandBars("Строка меню").Reset
Вопрос 116 (06.12.2000). Как предотвратить несанкционированный доступ к объектам программы и коду перед ее распространением?
  Ответ. Теоретически никак, потому что существуют декомпиляторы, которые могут перехватить любое событие вызываемое msaccess.exe. Чаще всего программу переводят в mde формат. Если это не возможно, то надо по возможности некоторые программы на бэйсике перевести в DLL библиотеки и использовать доступ к ним. Установка паролей, защита объектов по уровню доступа (администратор, группа, пользователь) не очень эффективна.
Вопрос 175(09.01.2000) На MS SQL Server (7.0) имеется процедура добавления/изменения/удаления данных в трех связанных таблицах в зависимости от добавляемой/изменяемой строки в четвертой. Процедура вызывается из модуля не связанной с источником данных формы. Процедура работает, данные изменяются согласно заложенному алгоритму, отлаживалась с/без Access (97 SR2) при пустых/небольших таблицах. Модуль отрабатывает без ошибок и предупреждений. Файл БД закрывается нормально, сжатие/восстановление проблем не вызывает. ODBC (Access 4.00.35.13, SQL 3.70.06.23), win95, winNT. Если процедура не вызывалась, и БД и Access закрываются как положено, в противном случае закрывается только БД. Может, посоветуете, где с бубном попрыгать?
  Вопрос снят. if me.child_form.option_button then. 
Вопрос 206(31.01.2000) Хочу повысить свой уровень владения акцессом, и поэтому ищу - где можно пройти курсы обучения по А97 - А2000. Интересуют только краткосрочные в любом городе. Рекомендации и советы очень желательны.
  Ответ. К сожалению рекомендацию, в какие курсы лучше всего вкладывать деньги, дать не могу. Попытайте удачу сами.
Вопрос 257(27.02.2000) Возможно ли программно вставлять данные из clipboard'а в форму, а именно в TextBox?
  Можно, пример дан в файле la_api.mdb.
Вопрос 262(01.03.2000) Можно ли из модуля закрыть текущую базу данных и открыть другую. Это нужно для создания резервной копии текущей базы. Перед копированием необходимо ее сжать, а это невозможно сделать пока она открыта. Поэтому я
планировал открыть другую вспомогательную базу, где есть модуль сжимающий основную базу и копирующий ее на ZIP. Возможно есть другое решение этого вопроса?
  Ответ. Малютин Николай. Совсем не обязательно прекращать работу в БД, можно воспользоваться функцией CopyFile
Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" _
(ByVal lpExistingFileName As String, ByVal lpNewFileName As String, _
ByVal bFailIfExists As Long) As Long

' процедура копирует исходный файл БД в новый с именем ( на усмотрение)
' и сжимаем новый файл БД с помощью ключа командной строки

Public Sub CopyF(strPath As String)
Dim strNewFile As String
On Error GoTo Er_Sub
strNewFile = Left(strPath, Len(strPath) - 4) & "_Copy_" & Date &
Right(strPath, 4)
CopyFile strPath, strNewFile, 1
Shell ("msaccess.exe " & Chr(34) & strNewFile & Chr(34) & " /compact")
Exit Sub
Er_Sub:
End Sub

' Пример вызова:
Private Sub command1_Click()
Call CopyF(CurrentProject.Path & "\" & CurrentProject.Name)
End Sub
Вопрос 264(01.03.2000) Я делаю базу данных для школы, где есть такое поле, как "Стаж". Но так как я до этого не сталкивался с Access'ом, у меня возникает
такой вопрос: как сделать чтобы стаж автоматически увеличивался на 1 по истечении года, а то исправлять вручную каждому работнику слишком долго.
  Ответ 1. Создайте запрос на обновление. Например, так:
Set dbs = CurrentDb 'Выбираем БД
sqlDate = Format(Date, "\#mm\/dd\/yyyy\#") 'Подготавливаем дату
dbs.Execute "UPDATE Таблица SET Таблица.Стаж = [Стаж]+1 WHERE [Дата]<=" & sqlDate
  Ответ 2. Alexander Apazidi Вместо отдельной колонки [стаж] нужно сделать колонку [hire_date (дата приема)] , а стаж можно вычислять в запросе как select date()-hire_date from employees. Тогда не нужно будет обновлять стаж каждый год, месяц, etc.
  Ответ 3. Андрей Беляков При том решении вопроса, которое предложено вами, будет нужно контролировать количество выполнений этого запроса. Это будет много сложнее, чем менять 50-60 записей "в ручную" Лучше решение - хранить дату найма и считать, что надо, каждый раз: SELECT DateDiff("y",[EmplDate],Now()) AS YearsEmploee FROM Table;
Вопрос 267(05.03.2000) Я столкнулся с такой проблемой. Попросили меня написать БД по учету заготовок на складе. Я создал следующие таблицы: - КаталогЗаготовок (Код, Название), - ПриходныеДокументыЗаголовки (Код, НомерДокумента, ДатаДокумента), -ПриходныеДокументыТаблица(Код, НомерДокумента - код в таблице
ПриходныеДокументыЗаголовки, КодЗаготовки - код в таблице КаталогЗаготовок, Количество),  -по тому же принципу создал таблицы для расходного документа,
-главная таблица -Регистр заготовок (Код, Заготовка - код в таблице КаталогЗаготовок, Документ - Номер приходного или расходного документа, ТипДокумента, Количество - по документу). Теперь, для получения остатков я создал запрос, который суммирует/вычитает движение заготовок по Регистру. Все работает безукоризненно, но страшно медленно. Я думаю, что неправильно организовал Регистр, а как сделать правильно не знаю. Можете что-нибудь сказать по этому поводу? Буду очень признателен за информацию.
  Ответ 1. Вопросы оптимизация кода достаточно сложные. Надо пересматривать не только таблицы, но vba-код. Это может сделать качественно только профессионал. Самый лучший способ нанять мастера по Access (хотя бы для разработки таблиц). С другой стороны, если нет такой возможности, то прочтите хотя бы информацию в предыдущих выпусках рассылки.
  Ответ 2. Андрей Беляков. Для того, чтобы это работало быстро, надо _иметь_ остатки в отдельной таблице остатков и корректировать их при внесении нового приходно/расходного документа.
Вопрос 268(05.03.2000) Если вам не тяжело, то ответьте, пожалуйста, но один вопросик ... он до легкий, но все же ... можно ли в ТАБЛИЦЕ (А не запросе) сделать например суммирование столбцов находящихся в данной таблице ... без использования запроса ... ? ! ?
   Ответ. По правилам ведения реляционных баз данных в таблицах не должно быть повторяющих значений, а Вы целую колонку пытаетесь заполнить повторяющимся "мусором". Так, что задача не имеет практической ценности. С другой стороны, она может быть интересна на олимпиаде по программированию для школьников или студентов. Попробуйте предложить ее им.
Вопрос 269(05.03.2000) Не могли бы Вы помочь мне решить одну несложную задачку по базам данных. Дело в том, что сейчас я занимаюсь проектированием
базы данных ЭЛЕКТРОННЫЕ ТОРГИ, так вот, у меня есть список акций, котирующихся на бирже в одной таблице, и список котировок во времени в другой. Задача состоит в том, что мне нужно вывести в запросе пять последних котировок по каждой из бумаг. По-видимому, здесь нужно воспользоваться предикатом TOP и писать что-то вроде SELECT TOP 5 ...,
однако вся беда в том, что таким образом я могу выбрать либо пять последних котировок по заранее заданной акции, либо вообще пять последних котировок из всех имеющихся, а как выбрать пять последних котировок по каждой из бумаг я пока не придумал. Причем список
котируемых бумаг может изменяться
   Ответ 1. Алгоритм решения задачи такой. Составьте общий запрос на объединение 2 таблиц (я думаю, что это не сложно). Далее отсортируйте его по времени торгов в порядке убывания (ORDER BY [Время] DESC). Теперь можно вставить и предикат ТОP. Он равен [Число акций]*5. Отсортировав отчет по названию акций, Вы и получите искомое решение задачи. Могут быть и другие варианты, например, с использованием в запросе слова BETWEEN или WHERE.
   Ответ 2. Alexander Apazidi Если объединить две таблицы и выбрать select top [число_акций*5] мы получим не последние пять котировок по акциям а именно [число_акций*5] последних котировок. Необязательно чтобы все акции за один период времени поменяли свои котировки именно пять раз. Пример:  Пусть у нас будут две акции: MSFT (Microsoft NASDAQ),CSCO (Cisco NASDAQ).  Если в период с 10:00 До 10:45 по MSFT было 2 сделки, а по CSCO было 8 сделок то select top 10 from [something order by [sale_date] desc вернет 10 котировок, среди которых 2 MSFT и 8 CSCO (а должно быть 5 MSFTx5 CSCO).
Правильный вариант: select shares.name,(select top 5 rate from rates where rate.share=shares.name) as Rate from shares

 

Выпуск 25. Ответы на вопросы



Ответы на вопросы

На вопросы отвечают: Макеев Игорь и Малютин Николай. Дополнительно на вопросы (182 и 183) предыдущего выпуска 25 ответили Анатолий Лящук и Михаил Белодед. Они опубликованы на сайте в архиве статей подписки.

Вопрос 203(30.01.2000) Подскажите, пожалуйста, можно ли пользоваться общим справочником с сервера, если на двух машинах стоит одна БД, как это сделать, есть ли пример?
   Ответ 1. Игорь В. Макеев Можно. Хелп - "Связанные таблицы"
   Ответ 2. Виктор Конюков. Как сделать диспетчер связанных таблиц написано в примере 18 файла la_form1.mdb
Вопрос 205(31.01.2000) У меня вот такой вопрос: как можно установить курсор активной записи при клике на ней или при переходе стрелками в форме, которая находится в режиме таблицы и источник записей - это запрос из связанных таблиц ?
Нужно передать значение конкретного поля активной записи (визуально активной) как параметр открытия другой формы.
   Ответ. Игорь В. Макеев Это можно сделать через "аргументыОткрытия" (OpenArgs)
DoCmd.OpenForm "Форма", , , , , , Me.Поле. При этом ссылка на поле формы - это как раз и есть ссылка на это поле активной записи.
Вопрос 207(31.01.2000) Со времен работы с DBED (это такой досовский редактор dbf файлов:) у меня  осталась ностальгия по моментальному переключению между табличным видом данных и "колоночной формой", т.е. вот табличный вид:
Фирма Телефон Факс Адрес Директор
ABC 00001 000011 Street1 John Smith
XYZ 00002 000022 Street2 Mary Kay
Ну и т.д.
Теперь я делаю скроллинг по этой таблице пока курсор не доходит до названия
фирмы XYZ, жму Enter и опа - получаю колоночную форму типа:
Фирма XYZ
Телефон 00002
Факс 000022
Адрес Street2
Директор Mary Kay
А как бы это столь же просто и быстро сделать в Access?? (т.е. скроллинг и
переключением между таблицей и колоночной формой с данными из той строки,
где был курсор при нажатии на Enter).
   Ответ. Малютин Николай Создайте копию формы  как простую форму, а из исходной открывайте вторую форму с передачей в качестве аргумента номера записи
Private Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii = 13 Then
DoCmd.OpenForm "Форма1_1", acNormal, , , , , Me.CurrentRecord
Form_Форма1_1.SetFocus
Me.Visible = False
End If
Вопрос 209(01.02.2000) Не знаю точно правильно ли я поступаю, но хочу сделать так: есть таблица | дата | товар | кол-во | откуда | куда | необходимо динамически вычислять кол-во товара на складе - имя задается в combobox. добавил в таблицу еще одно поле кол-во1 с отрицательными значениями равными кол-во. сделал два запроса (т.к. в одном не получается) с группировкой и ф-ей SUM.

strSQLK = "SELECT Товар,Откуда, SUM(колво) AS всегоО " & _
"FROM проводки " & _
"GROUP BY Товар,Откуда " & _
"HAVING Откуда = '" & cboИнфо.Text & "' "

With rstКПроводки
Set .ActiveConnection = cnnSklad
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
.Source = strSQLK
.Open
End With

strSQLO = "SELECT Товар,Куда, SUM(колво1Î) AS всегоК " & _
"FROM проводки " & _
"GROUP BY Товар,Куда " & _
"HAVING Куда = '" & cboИнфо.Text & "' "

With rstОПроводки
Set .ActiveConnection = cnnSklad
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockReadOnly
.Source = strSQLO
.Open
End With

Теперь необходимо из первого вычитать второе и получать кол-во товара на складе. Но как это делать я не знаю. Хотелось чтобы все происходило динамически. Если знаете ответ буду очень благодарен. Если этот путь невозможен, то подскажите другой, но есть одно условие - должна быть возможность вводить проводки задним числом, потому и пытаюсь вести подсчет динамически.
    Ответ. Малютин Николай Начал изучать работу с Access примерно с такого же вопроса
Вопрос 217(06.02.2000) С какими максимальными размерами баз данных Вам приходилось сталкиваться? Есть ли какой-нибудь предел в размере БД после которого Аксесс может работать не корректно?
   Ответ. Игорь В. Макеев По документации MSA 97 1 Гб (2Гб - 2000) для одного mdb.
Вопрос 218(06.02.2000) Я считаю, что данные должны быть в одном файле а программа в другом. Сделав новую версию программы, я поменяю только файл программы. Что Вы думаете об этом способе.
   Ответ. Игорь В. Макеев Хороший и рекомендуемый способ.
Вопрос 221(06.02.2000) Недавно я написал программу для моего друга. Но она у него не пошла. Толком что произошло, он  объяснить не смог. (общаемся мы только по email) У него английский Windows и английский Access, у меня эти программы на русском.
Могла ли проблема быть в том, что у нас программы разноязычные? Все имена в моей программе я делал английскими буквами.
  Ответ. Конечно, в базе данных сохраняется информация по алфавиту. Для контроля Вы можете использовать пример из la_prot.mdb для просмотра бинарной структуры файла.
Вопрос 224(06.02.2000) Есть два запроса, которые отбирают из разных таблиц числовые поля. При указании сортировки в запросах по этим полям они сортируются как числовые. Мне необходимо объединить два запроса для вывода этих данных в списке, что я и сделал запросом на объединение. Но теперь числовое поле сортируется как текстовое. Как мне его отсортировать как числовое?
   Ответ 1. Игорь В. Макеев В принципе, такого быть не должно, но можно попробовать явно привести данные к нужному типу CLng, CDbl и т.п.
   Ответ 2. Толмачева Галина. Если при объединении двух (или нескольких) запросов явно не перечислять поля, а указывать выбор всех полей (SELECT * FROM таблица), то в объединяемых запросах порядок следования полей должен быть одинаковым. Если порядок нарушен, то происходит объединение разных полей, и если одно из них символьное, то и результат получим символьный. По самим данным это не сразу видно, т.к. скорее всего в данных символьного поля были цифры.
Вопрос 226(06.02.2000) Большое количество кнопок в ленточной форме не только загромождает ее, но и нередко приводит к ошибкам пользователей. Прекрасным выходом был бы перенос всех кнопок в меню, вызываемое нажатием правой кнопки мышки, но я не знаю, существует ли такая возможность в Access (у меня Access97). Не могли бы Вы подсказать, реализуема ли подобная идея, и если да, то как.
   Ответ. Игорь В. Макеев Help "Контекстное меню", CommandBarControl
Вопрос 228(07.02.2000) В Ассеss 2.0 был макрос Autokey, в Help'е к Ассеss 2000 написано, что для этих целей теперь надо применять "обработку событий по типам объектов", но пример не написан. Огромная просьба написать пример обработки события "нажатие клавиши", например "1". Чтобы, к примеру, по нажатию "1" печаталась текущая форма.
   Ответ. Игорь В. Макеев Private Sub Form_KeyPress(KeyAscii As Integer)
 On Error Resume Next
 If KeyAscii = 49 Then DoCmd.PrintOut acPrintAll: KeyAscii = 0
End Sub
Только свойство формы «Перехват нажатия клавиш» (KeyPreview) надо в True установить
Вопрос 237(14.02.2000) Сейчас у меня появились проблемы с Access~ом, хочу спросить Вашего совета, как специалиста, что мне делать, а то я уже вторую неделю не могу спокойно работать. Программа постоянна сбоит, т. е. возникает какая-то критическая ошибка в результате которой ее приходится закрывать. Один раз мне удалось решить эту проблемы, я изменил в одном месте цепочку подчинений в форме и после
этого все заработало. Но на этом проблемы не закончились. По мере развития базы данных все равно опять время от времени сбоило.  Началось с того, что мне при нажатии Alt-F4 мне было не закрыть само окно программы, закрывалась только база данных. (Это было только с последней версией базы.) Сам же Access после этого было не закрыть ни какими силами,
 только через Ctrl-Alt-Del через снятие задачи. (Что бы это значило?) При более ранних версиях все закрывалось нормально. Короче, все кончилось все тем, что при открытии одной из форм мой Norton Crash Guard сразу же сообщает о сбое и предлагает сейвится, чего вообще по моим понятиям при нормальной программе быть не может, в любом случае форма должна открываться. Пробовал я перегнать все элементы базы данных в новый файл, таблицы и запросы перегнал, как только пробую перегонять формы, опять фатальная ошибка, Access сообщает что не хватает памяти, в общем работать нельзя.    Другие же программы вроде бы работают нормально. Скажите мне пожалуйста, этот Access 97 априори такой глючный,
или тут дело в моей системе или чем-то другом. Еще, скажите? пожалуйста, если база данных в принципе читается, то обязательно ли это означает, что на нормальной системе с ней можно будет работать, или может быть, что файл все равно испорчен. И можно ли избавится от
этих проблем, если перейти на Access 2000.
   Ответ 1. Игорь В. Макеев По поводу критических ошибок: поставить все SP, попробовать другой дистрибутив, пересоздать базу. По поводу невыхода: проверить закрытие и уничтожение всех объектов. Для логических полей использовать явное сравнение с True (False), т.е. If Me.chkBox = True then ... Для групп переключателей использовать Value. А иногда достаточно просто пересоздать базу.
  Ответ 2. Stanislaw Girman Если можно, дополнение к ответу мастера: У меня тоже был такой глюк давно, еще когда я был "меньше ростом". Действительно, для начала нужно прочитать книгу Алена Голуба про "Веревку достаточной длины, чтобы выстрелить себе в ногу ...", а также посмотреть какие требования к программисту ;-) появились в VB7(ака vb.net). И, самое главное, помогло исправление всех меток в кодах модулей класса форм на уникальные (да и в остальных всяческих модулях тоже). Не секрет, что все используют метки для безусловных переходов, особенно при обработке ошибок. Так вот, если эти метки в разных процедурах будут одинаковыми, то, вроде казалось бы, ничего страшного - компиллер будет "прыгать" по ним нормально на уровне процедур, но все-таки, поверьте, так делать не стоит !!!! Как только я все это исправил, база перестала без разрешения отваливаться и Dr.Watson навсегда забыл про Access.
  Ответ 3. Alexander Tumarov Я бы в добавок к написанному посоветовал бы проверить использование ActiveX элементов. В особенности от так называемых Third-party производителей. Многие пользователи создают такие элементы только на время жизни формы, и естественно при закрытии оной элемент должен быть уничтожен. Если элемент содержит ошибку то вполне возможна описанная в вопросе ситуация. При подобной проблеме перенос на Access 2000 проблемы не решит.
Вопрос 239(15.02.2000) Уважаемые профессионалы! Посоветуйте Чайнику - в FOXе есть оператор Set Carry to (перенос значения из поля предыдущей записи в такое же поле текущей, коротко так называемое поле повторения). Однако, в VBA этого в упор не  вижу (может это бревно в глазу...)
   Ответ 1. Игорь В. Макеев  В VBA этого нет.
   Ответ 2. Малютин Николай Самый простой способ - воспользоваться сочетаниями клавиш: Ctrl + '  (одинарная кавычка) - вставка в текущее поле значения из аналогичного поля предыдущей записи Ctrl+ " (двойная кавычка) - тоже самое. И использовать SendKeys
Все бы хорошо, но в программе это корректно работает с "английской" раскладкой, поэтому
придется усложнить. Пример применения:
' функция возвращает состояние текущей раскладки клавиатуры
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias
"GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
' функция устанавливает нужную раскладку
Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As
Long, ByVal flags As Long) As Long
' функция устанавливает нужную раскладку

Private Sub Form_Current()
Me.ID.SetFocus
End Sub

Private Sub ID_LostFocus()
If Me.ID.Text = "" Then Call PastePrev
End Sub

Private Sub PastePrev()
Dim strTemp As String
strTemp = String(9, 0)
GetKeyboardLayoutName (strTemp)
If InStr(strTemp, "409") = 0 Then
ActivateKeyboardLayout 1, 0    ' если раскладка не английская, то меняем на следующую
SendKeys "^'", True ' именно код клавиши <Ctrl> - "^" не позволяет напрямую использовать сочетание клавиш при вызове SendKeys  при русской раскладке
ActivateKeyboardLayout 1, 0    ' и восстанавливаем состояние раскладки (естественно, это корректно, если на машине установлены две раскладки - RUS и EN)
Else
SendKeys "^'", True
End If
Вопрос 241(16.02.2000) Не подскажете как программировать поле со списком из VBA. Например,
Select Case Primer ' Поле в форме
Case 1 ' Условие в поле формы
Ниспадающий список в соответствием с условием 1
Case 2
Ниспадающий список в соответствием с условием 2
Case 3
Ниспадающий список в соответствием с условием 3
End select
Ответ. Код поместите в событие списка Вход (Enter)
Private Sub ПолеСоСписком57_Enter()
   Select Case Primer ' Поле в форме
     Case 1 ' Условие в поле формы
         Me.ПолеСоСписком57.RowSource = "SELECT * FROM [Таблица1] WHERE [Primer]=" & Primer
     Case 2
         Me.ПолеСоСписком57.RowSource = "SELECT * FROM [Таблица1]"
     End select
End Sub
Вопрос 243(22.02.2000)   Существует ли программа, которая конвертит mdb файл в какой-нибудь обычный формат? А то есть файл .mdb, а ставить MSAccess ради того, чтобы прочитать этот файл не очень хочется.
   Ответ 1. Есть конвертор, который преобразует файл mdb в  файлы Visual Basic. Правда для серьезных баз данных это сделать не удастся. Связано это с тем, что базы данных имеют сложную структуру и для их корректной работы требуется специальная среда, включающая много dll-библиотек и других файлов. Например, для Delphi необходимо ставить BDE, для Access Jet, MSDE, IIS (Internet Information Sever для доступа из Интернета) и т.д. и т.п.
   Ответ 2. Ссылка: http://google.yahoo.com/bin/query?p=accesstovb&hc=0&hs=1
Вопрос 244(22.02.2000)   Как  в  запросе  в Between задать "с начала текущего месяца"? Юзер. Access-2000. Windows98
   Ответ. Надо использовать функции Date, DateSerial и американский формат. Например так, WHERE ([Дата] Between DateSerial(Year(Date()),Month(Date()),1) And #2/20/2005#). Пример вставлен в файл: la_query.mdb
Вопрос 245(22.02.2000)   Скажите как можно получить архивы всех FAQ и статей опубликованных на liac.
   Ответ. Сейчас нет такой возможности считать весь архив вопросов и статей без загрузки всего сайта, но база данных по ним обязательно будет сделана.
Вопрос 246(22.02.2000)   Еще, если Вас не затруднит, скажите пару слов, чем Access 2000 лучше в плане разработки приложения Access 97, и какие наиболее существенные полезные возможности там добавились. А то я не знаю, имеет ли смысл переходить на новую версию и какие преимущества это может дать.
  Ответ. Все функции перечислить сложно, но кое-что вспомнить можно: 
  1. DB. Увеличилась надежность базы данных по сравнению с Access 97.
  2. DB. Ядро Jet теперь можно заменить на MSDE (SQL Server). Удобно в плане перехода на SQL сервер.
  3. DB. Возможно сохранить базу данных в предыдущем формате (Access 97) при разумном проектировании.
  4. DB. Появилась опция автоматического сжатия базы данных при закрытии.
  5. DB. Можно отпечатать схему связей таблиц базы данных.
  6. DB. Ядро базы данных Jet хранит данные в формате Unicode.
  7. DB. База данных тесно интегрирована с ActiveX Data Objects (ADO), хотя и DAO работает отлично.
  8. DB. Используя функцию AutoCorrect можно изменить объект (поле) во всех формах, отчетах и запросах.
  7. VBA. Собственный локализованный редактор программных модулей заменен на VBA 6.
  9. VBA. Введены новые функции: StrRev(реверс строки), Split (разбор строки) и др.
  10. Формы. Добавлены правила условного форматирования для полей.
  11. Internet. Добавлены страницы доступа к данным.
  12. Internet. Активно используется язык XML (eXtensible Markup Language)
Вопрос 250(26.02.2000)     Ребята  у  вас  еся  зеркало  сайта,  а то у меня что-то загрузка идет оччччень туговато! :-(  если нет то могу предоставить место.
Вопрос 251(26.02.2000)   Как долго на сервере leadersoft.ru будут технические проблемы. Нет ли у Вашего сайта зеркала. Нельзя ли по почте получить бесплатные примеры форм, отчетов, программ и т.д.
Вопрос 253(26.02.2000)   Мне очень понравился Ваш сайт и то, какие базы Вы делаете. Однако я уже третий день не могу скачать бесплатные коды на ACCESS 2000. Все время пишется, что файл не доступен из-за загруженности сервера. Почему, он все время загружен? И когда мне можно будет скачать эти примеры?
   Ответ 1. Спасибо за помощь.
   Ответ 2. У сайта появился новый адрес: www.leadersoft.ru. Попробуйте скачать оттуда.
   Ответ 3. Проблемы загрузки файлов с сайта www.leadersoft.ru решить может только провайдер, а именно, компания ORC. Она ведет новый проект - newmail.ru (nm.ru). Настроить качественно работу newmail они не могут. Обращался неоднократно службу технической поддержки. Я так понимаю, что это новый интернет-бизнес (им также занимается сайт boom.ru). Цель бизнеса - раскрутить сайт и получить прибыль из рекламы на основном сайте или "заставить" владельцев ресурсов из-за технических проблем перейти на платный хостинг.
   Ответ 4. Несколько слов о хостинге у нас в России и за рубежом. Возможно эта информация Вам пригодиться для открытия своего бизнеса в Интернете. Найти лучший бесплатный хостинг в Рунете невозможно. Интересных предложений много, но ответственности ни какой. Зарегистрировать свой домен можно даже не имея паспорта, нужна только доверенность от мамы. Сам лично слышал, как консультировали по такой проблеме в РосНИИРОС.
   С другой стороны, на англоязычных сайтах есть интересные и бесплатные ресурсы. Например, bigfoot.com. За все время использования я получил только два предупреждения от них. Первое сообщение о том, что они установили в декабре 2000 новую антиспамерскую защиту (возможны проблемы доставки писем), а также сообщение по поводу вируса "LOVE BUG" (обратили внимание на то, что он рассылается через Microsoft Outlook).
   Конечно, рано или поздно Вас заинтересует возможность размещать свои Access базы данных в Интернете, чтобы оттуда можно было брать информацию. Для этого надо найти NT-хостинг. Связано это с тем, что для работы с mdb файлом и управлением ASP страницами требуется установить IIS сервер. Интересное предложение предлагает: www.readyhosting.com за 99$ в год. Вот оно: • 500MB Web Space, • Free New Domain Registration, • Unmetered Data Transfer, • Unlimited Email, • Unlimited Email Aliases, • Unlimited Autoresponders, • Web-Based Email, • Toll-Free Technical Support, • 24 Hour FTP Access, • 99.9% Uptime Guarantee, • 30 Day Money-Back Guarantee, • ASP Support, • Live Statistics, • FrontPage 2000 Extensions, • Cold Fusion 4.5, • Database Access, • CGI/Perl, • ASP Mail Component, • ASPEmail Component, • DevMailer Component, • Instant Setup!, • Password Protected Directories, • Daily Backups, • Custom 404 Error Page, • Server Side Includes (.stm, .shtm, .shtml), • RealAudio/Video, • PHP Server Extensions, • SSL Security, • E-commerce Shopping Cart by Cart32.com, • Control Panel, • SQL Server 2000, • ASP Simple Upload Component
   На 1 сервере они размещают не более 250 сайтов. Правда некоторые вещи мне не понравились. Например, то что нельзя будет хранить архивы программ или mp3 файлов. Но лучше сами прочтите FAQ сайта или напишите им письмо.
Вопрос 252(26.02.2000)   Мне необходимо заархивировать резервную копию базы данных. Для этого я использую функцию shell, но эта функция запускает программу в другом процессе. Значит я не могу (или не знаю как) отследить завершение процесса архивации, т.е. shell запустил программу rar.exe она начала архивировать файл, а моя собственная программа выполняется дальше. Хотя мне необходимо дождаться, когда же завершится процесс архивации и на жестком диске появится файл архива. Как решить эту проблему? Вообще есть ли другие функции для запуска программ из VBA?
  Ответ 1. Организуйте замкнутый цикл и проверяйте в нем наличие файла. Для корректной работы и выхода из программы добавьте DoEvents, тогда можно принудительно выйти из цикла по нажатию кнопки. Пример,
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
Do While Not fs.FileExists("a.zip")
DoEvents
Loop
  Ответ 2. Малютин Николай. Пример решения этой задачи путем создания процесса описан на http://am.rusimport.ru/MsAccess/
  Ответ 3. Игорь Лебедев
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As
Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As
Long, lpExitCode As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long)
As Long

Public Const PROCESS_QUERY_INFORMATION = &H400
Public Const STILL_ACTIVE = &H103

Public Sub Execute(ByVal ExecStr As String)
    Dim ProcessID As Long
    Dim ProcessHandle As Long
    Dim ProcessExitCode As Long

    ProcessID = Shell(ExecStr, vbMinimizedNoFocus)
    ' ожидаем завершения процесса
    ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessID)
    If ProcessHandle <> 0 Then
        Do
            Call GetExitCodeProcess(ProcessHandle, ProcessExitCode)
            If ProcessExitCode <> STILL_ACTIVE Then
                Exit Do
            End If
            DoEvents
        Loop
        Call CloseHandle(ProcessHandle)
    End If
End Sub
Вопрос 254(26.02.2000) Нельзя ли поподробнее рассказать о процессе защиты программы в РосАПО.
   Ответ. РосАПО - это Российское агентство по правовой охране программ для ЭВМ, баз данных и топологий интегральных схем. Текущее название организации: Роспатент. Телефон +007-095-240-6354 (47-27 местный). Адрес. Бережковская набережная, д.25, стр. 1/А (проезд м. Киевская, тр. 17,34, авт. 91, 119 ~ 4 остановка "Библиотека"). Для грамотной регистрации программы желательно приобрести брошюру (Информационный бюллетень официальной регистрации), в которой дано полное описание законов и процесса регистрации. Для регистрации программы Вам потребуется:
   a) Заявление. На специальном бланке (форма РП) Вам нужно впечатать название программы, имя заявителя и другие сведения.
   б) Депонирующие материалы. Сюда входит реферат (название программы, имя заявителя, дата создания, назначение, технические характеристики, язык программирования, тип ЭВМ ), а также исходный текст программы (25 первых и 25 последних страниц). Оформление страниц: • формат бумаги A4, • черный текст, • поля: слева 20, сверху 17, далее по 7 мм. При желании можно добавить рисунки для идентификации форм.
   в) Пошлина. Стандартная регистрация длится 2 месяца и стоит 320 рублей для юридических лиц и 130 рублей для частных лиц. Вы можете ускорить регистрацию, если дополнительно внесете 1000 рублей (процедура регистрации длится всего 1 месяц), а если 2000 рублей - то все сделают за 5 дней. Оплата осуществляется через банк, который находится рядом с Роспатентом.
  P.S. Конечно, найти в базе данных начало и конец Вашей программы будет сложно, поэтому даю маленький совет, лучше берите код от каждой формы и модуля и удаляйте комментарии.

 

Выпуск 24. Запросы на выборку

Описание: в рассылке рассказывается о запросах на выборку из одной таблицы, даются ответы на вопросы по подписке.

Новые бизнес программы
   "Морские тарифы" Программа  предназначена  для быстрого  просмотра  и анализа коммерческой стоимости  перевозки  из  одного  пункта в  другой. В  справочники  пользователь  вносит  морские порты (PORTS), условия перевозки груза (TERMS OF SHIPMENT),стоимость (тариф)  доставки  груза  до определенного  пункта на  авто (ONCARRIGE  TRUCK) и по ж/д  (ONCARRIGE RAIL)  и  морские  тарифы  по экспорту  и по  импорту (FREIGHT) Затем  кнопкой TARIFFS  вызывается  форма  в  которой  есть 2 "окошка"  в них  из справочника  выбираются порты  назначения. В  форме видны  ставки   перевозок  из  одного  порта  в другой  с  общей суммой расчетов.
  "Товарно-транспортная накладная на перевозку" Товарно-транспортная накладная применяется в программах по перевозкам. Вы можете использовать ее для создания специальных аналитических и торговых программ в автомобильном и контейнерном  бизнесе.

 

Access 2000. Урок 6. Запросы на выборку из таблицы
    Самыми распространенными и простыми запросами SQL в базе данных являются запросы на выборку. Отличают их по ключевому слову SELECT[1]. Эти запросы применяют тогда, когда необходимо отобрать часть записей из одной или нескольких таблиц. Наиболее часто запросы применяют в формах, списках и модулях. Вот несколько примеров на данную тему.
 1. Форма.  Me.RecordSource = "SELECT * FROM [Данные]" (явное указание запроса)
 2. Список. Me.ПолеСоСписком1.RowSource = запросSQL (запрос считывается из базы данных).
 3. Модуль. Set rst = dbs.OpenRecordset(strSQL) (запрос берется из текстовой переменной, где strSQL="SELECT * FROM [Пример 05]")
     Ниже приводятся запросы на выборку для одной таблицы. Естественно, что эти примеры лучше изучать на практике. Для этого скачайте программу: la_query.mdb. Запустите пример 1 и,  изменяя содержание запроса, например, добавляя ключевые слова, Вы будете видеть результат в списке формы. Если запрос будет неправильным, то список будет пустой. А теперь изучите запросы.
Название SQL - запрос
Выборка без указания таблиц SELECT "Ура!", "Вперед!" as Лозунг
Выборка всех записей из таблицы SELECT * FROM [Данные]
Выборка всех записей из колонки SELECT ALL [Книга] FROM [Данные]
Выборка 1 поля с указанием источника SELECT [T5].КурсUSD From [Данные] AS [T5];
Выборка с условием для разных полей SELECT * FROM [Данные] WHERE [Дата]=#11/15/2000# and ([Книга]='Война и Мир') and ([СуммаРуб]=500);
Выборка с вычислением результата SELECT *, "USD=" & Format([СуммаРуб]/[КурсUSD],"0.00") as [СуммаUSD] FROM [Данные];
Выборка с сортировкой /вверх, вниз/ SELECT * FROM [Данные] ORDER BY [СуммаРуб] ASC, [КурсUSD] DESC;
Выборка 1 записи SELECT TOP 1 * FROM [Данные];
Выборка 25 % записей SELECT TOP 25 PERCENT * FROM [Данные] ORDER BY КурсUSD DESC;
Выборка уникальных записей /книг/ SELECT DISTINCT [Книга] FROM [Данные];
Выборка максимального числа SELECT Max(КурсUSD) as MaxUSD From [Данные];
Выборка среднего числа SELECT Avg(КурсUSD) as Средний From [Данные];
Выборка минимального числа SELECT Min(КурсUSD) as Минимальный From [Данные];
Выборка первого числа SELECT First(КурсUSD) as Первый From [Данные];
Выборка последнего числа SELECT Last(КурсUSD) as Последний From [Данные];
Выборка суммы SELECT Sum(СуммаРуб) as Сумма From [Данные];
Выборка c подсчетом строк SELECT Count(КурсUSD) as Кол_во From [Данные];
Выборка из закрытой таблицы SELECT * FROM [Данные] WITH OWNERACCESS OPTION
Выборка c группировкой SELECT First(Книга) as Книги, avg(СуммаРуб) as [Средняя Цена] FROM [Данные] GROUP BY Книга
Выборка после группировки SELECT First(Книга) as Книги, Avg(СуммаРуб) as [Средняя Цена] FROM [Данные] GROUP BY Книга HAVING Avg(СуммаРуб)>350
    При разработке запросов Вам потребуются много разных слов, например, *, ALL, AS, FROM, ASC, DESC, TOP, PERCENT, DISTINCT, MAX, MIN, SUM, AVG, FIRST, LAST, COUNT, ORDER BY, WITH OWNERACCESS OPTION,GROUP BY, HAVING. Описание их дано в словаре и в справочной системе.
    Домашнее задание. Попробуйте составить работающий запрос с использованием всех этих слов. Если сможете, то значит Вы отлично знаете тему.
Словарь
  • [1] SELECT  (выбрать) - выбирает столбцы для запроса
  • [2] FROM (из) - слово определяет имя таблицы или запроса
  • [3] *, ALL (все) - слова определяют вариант отбора записей
  • [4] TOP (верх), PERCENT (процент) - слова необходимы для получения нескольких записей из таблиц
  • [5] AS (как) - слово используется для нового названия поля или таблицы
  • [6] DISTINCT (отличающийся) - слово применяется для отбора только уникальных записей из колонки
  • [7] WHERE (где) - слово для отбора записей по условному выражению
  • [8] ORDER BY, ASC, DESC - слова используются для сортировки записей по возрастанию и убыванию
  • [9] GROUP BY, HAVING - первые слова используются для группировки, а третье для отбора записей уже после вычислений (HAVING аналог WHERE)
  • [10] MAX, MIN, FIRST, LAST - функции группировки для получения максимального, минимального, первого и последнего числа в выборке.
  • [11] SUM, AVG - функции группировки, которые вычисляют сумму, среднее значение и количество записей запроса
  • [12] WITH OWNERACCESS OPTION - используется для получения записей из таблицы, которая создана другим пользователем и защищена от просмотра

Ответы на вопросы


   Сегодня на вопросы отвечают профессионалы: Макеев Игорь и Малютин Николай. И так, если Вы отвечаете за внедрение и разработку программ, то возьмите на заметку их адреса. Возможно Вам потребуется быстро и профессионально разработать базу данных, то обратитесь к ним. От себя могу добавить, что Вы получите не только качественную, но и надежную, не требующую переработки, структуру базы данных.

Вопрос 177(15.01.2000) Пожалуйста, помогите советом. В Office 97 Acsess 97 содержал шаблоны баз для создания каталогов книг, видеокассет и т.п. для дома, а в Office 2000 Acsess 2000 я такого не нашёл. Подскажите как быть, где достать подобные русские шаблоны, есть ли они в настройках Acsess 2000 и как их вытащить оттуда.
   Ответ 1. Игорь В. Макеев (http://home.tula.net/mebelmassiv) А если сконвертировать из Office 97?
   Ответ 2. Виктор Конюков. Чтобы вытащить мастер из Access 97 в Access 2000 придется "поломать голову". Сам я этого не делал, т.к. особой нужды в этом не было. Поэтому гарантировать, что у Вас все получится не могу. А теперь о технологии сохранения мастеров в реестре Access.
    Откройте раздел Form Wizard. В нем описаны все мастера форм, которые вызываются из Access. Аналогично существуют разделы для таблиц, отчетов и встроенных в них элементов управления. Вот так описаны параметры формы:
  • Bitmap - путь к файлу bmp (рисунок на форме мастера)
  • BitmapID - индентификатор изображения в файле Msaccess.exe
  • Datasource Required - источник данных для мастера
  • Description - описание мастера
  • Function - имя функции для активизации мастера
  • Index - позиция мастера в списке мастеров
  • InternalID - указатель того, что мастер встроен в Access
  • Library  - определяет путь к библиотечной базе данных (acwzmain.mde)
  Скопировать библиотечные файлы из Access 97 у Вас получиться. Прописать в реестре все параметры тоже несложно. Но как можно можно вытащить информацию из mde (или есть ли его замена) сказать сложно.
Вопрос 182(23.01.2000) Имеются две таблицы (фирмы и телефоны), связь один-ко-многим. Необходимо добавлять информацию в обе таблицы через SQL-запрос. С добавлением данных в таблицу о фирмах сложностей нет, некоторые трудности связаны со второй таблицей (различное количество записей, которые нужно добавлять). Я вижу здесь два варианта:
1) При заполнении формы данные о телефонах заносятся во временную таблицу. После выполнения запроса на добавление, записи из временной таблицы удаляются. Временная таблица храниться постоянно.
2) Временная таблица создается при заполнении формы и удаляется после выполнения запроса.
Т.е. в первом способе - удаляются только временные записи, во втором - временная таблица.
Вопрос:
Правильно ли я рассуждаю. Если да то какой способ лучше. Есть ли более изящный и грамотный способ (я думаю, что есть).
P.S. Я пробовал оба способа. И в том, и в другом случае база достаточно быстро увеличивается в размере.
   Ответ 1. Игорь В. Макеев Вынести временные таблицы в отдельную базу-шаблон и в начале работы копировать ее, использовать копию, которую после удалять.
   Ответ 2. Виктор Конюков. Иногда во временной базе данных в записях ставят флажок (bool или date & time), который после сеанса редактирования очищают запросом на обновление, но все записи никогда не удаляют. Вообще для таких простых действий создавать временную таблицу слишком расточительно. Многие после сеанса автоматически архивируют базу, и если она разрушилась, то восстанавливают ее из копии.
   Ответ 3. Анатолий Лящук. Как вариант можно разнести код и данные по разным mdb файлам. В файле с таблицами (фирмы и телефоны) хранить только эти таблицы, а в файле с програмой (формы, модули etc) создавать временные таблицы. Поскольку этот файл будет иметь разумный размер, то после окончания работы его можно компактировать. Но лучшим решением мне кажеться вообще не создавать временных таблиц, а попытаться обойтись массивом и лист-боксом.
Вопрос 183(23.01.2000) Необходимо, чтобы в поле отчета (в том случае, если данные не удовлетворяют какому-либо условию), менялся цвет фона. Я воспользовался примером 19 в La_form1 - однако ничего не выходит. Суть проблемы: если значение в поле отчета (к примеру, название города) не совпадает с МОСКВА и при этом не совпадает с КРАСНОДАР, а также, если поле пустое (Null) - фон должен стать серым. Как это можно сделать? Пример моей безграмотно составленного условия:
.FormatConditions.Add acFieldValue, acNotEqual, "МОСКВА" And "КРАСНОДАР".
   Ответ 1. Малютин Николай Вообще-то конструкция с And здесь не применима, используйте два фильтра (FormatConditions.Add acFieldValue, acEqual, "МОСКВА" ). Хотя в отчетах подобное не проходит - надо либо использовать средства конструктора, либо формировать отчет "вручную"
   Ответ 2. Михаил Белодед, ICQ#13794939
Я бы это решил так:
Private Sub ОбластьДанных_Format(Cancel As Integer, FormatCount As Integer)
If Me![оц] = 2 Then
Me![оц].BackColor = RGB(255, 0, 0)
ElseIf Me![оц] = 5 Then
Me![оц].BackColor = RGB(0, 255, 0)
Else
Me![оц].BackColor = RGB(0, 0, 255)
End If
End Sub
     P.S. Правда есть одно замечание: до тех пор, пока я в конструкторе для этого поля не прописал цвет, отличный от других полей, модуль выполнялся (я пошагово проверял), но цвет в отчете был белым! А как только поменял в конструкторе - все сразу заработало.
Вопрос 184(23.01.2000) Вопрос состоит в автоматическом создании резервной копии базы данных, не прерывая работы пользователей. Если таблицы и остальные элементы управления находятся в одной базе, то просто импортируются таблицы в другую базу. Но подобной механизм не работает, если таблицы в одной базе, а элементы управления в другой. Просто скопировать базу в резервную нельзя так, как "файл открыт". Отдельного сервера нет, поэтому необходим механизм создания рез. копии из клиентской части.
   Ответ. Игорь В. Макеев Используй для копирования API:
Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
Вопрос 186(25.01.2000) Имею 2 строки в таблице (строк может быть и больше). Первые поля в строках одинаковые (числовые). Остальные текстовые. Можно ли эти  строки объединить в одну строку, чтобы данные, начиная со 2-го поля были объединены. т.е. первая строка дополнена второй?
   Ответ. Игорь В. Макеев В общем случае, ответ можно. Для более конкретного и подходящего ответа нужно хотя бы знать, куда потом пойдет эта строка? Иначе можно посоветовать открыть рекордсет и последовательно перебрать все записи.
Вопрос 188(25.01.2000) У меня есть таблица, состоящая из пяти полей, в Поле1 - буквенный код, например IDHT, необходимо разложить этот код следующим образом: в Поле2 должна быть буква I, в Поле3 - D, в Поле4 - H и в Поле5 - T.
   Ответ. Малютин Николай. Выполните после ввода данных в первое поле запрос на обновление:
Private Sub Form_AfterUpdate()
Call TableUpdate
End Sub
Private Sub TableUpdate()
Dim strSQL As String
strSQL = "UPDATE Таблица1 SET Таблица1.[1] = Left([Таблица1]![All],1)" & _
", Таблица1.[2] = Mid(Left([Таблица1]![All] & '    ',4),2,1), " & _
"Таблица1.[3] = Mid(Left([Таблица1]![All] & '    ',4),3,1), " & _
"Таблица1.[4] = Mid(Left([Таблица1]![All] & '    ',4),4,1)"
'данные добавляются пробелами до 4-х  символов
DoCmd.RunSQL strSQL
Me.Requery
DoCmd.GoToRecord , , acNewRec
End Sub
Вопрос 208(31.01.2000) Мне необходимо использовать следующую строку:DoCmd.RunSQL "SELECT * FROM [имя таблицы];" Однако Access2000 отвечает:"Run-time Error 2342 Для макрокоманды ЗапускЗапроса SQL требуется аргумент состоящий из инструкции SQL " Если эту строку заменить на: DoCmd.RunSQL "SELECT * FROM [имя таблицы] INTO [имя любой другой таблицы];" тогда всё ОК, но выходит несколько окон предупреждающих о том что столько-то записей будет помешено в новую таблицу и т.д., а мне это не надо.
   Ответ. Малютин Николай Да нет, Access понимает инструкцию запроса, но не знает что делать с результатами, ведь во втором случае у вас это четко указано. Измените конструкцию на "запрос на обновление" . А чтобы не выскакивали предупреждения - в "Сервис-Параметры-Правка и поиск" сбросьте флажки.
Вопрос 210(01.02.2000) Скажите пожалуйста, как можно из одной базы вызвать функцию из другой базы.  Причем эта функция использует таблицы во второй базе.
   Ответ 1. Игорь В. Макеев Например, подключить вторую базу в ссылках. Но следует учесть, что доступ к таблицам базы, содержащей функцию должен вестись через CodeDb (подробности в хелпе). Т.е. в подключаемой базе должно быть примерно так:
Dim rs As Recordset
Set rs = CodeDb.OpenRecordset("select field from table")
...
  Ответ 2. Виктор Конюков. Внимательно прочитайте "Лекции по Access", например, 3с
Вопрос 213(01.02.2000) Как сделать так, чтобы после обновления ленточной формы, активной оставалась та же запись, которая была активной и до обновления?
   Ответ 1. Игорь В. Макеев Например, запомнить ее ключ, а после requery найти ее в RecordsetClone по этому ключу и присвоить bookmark рекордсета, bookmark'у формы.
   Ответ 2. Виктор Конюков. Пример есть в формах: la_form.mdb или la_form1.mdb
Вопрос 214(05.02.2000) Скажите, пожалуйста, как я могу подцепить к базе созданной в Access 97 таблицы из базы Access 2000?
   Ответ. Игорь В. Макеев Из окна БД, не знаю, по-моему никак, а из кода можно подключив, в ссылках DAO 3.6 и далее как обычно:
 Dim db As DAO.Database, rs As DAO.Recordset
 Set db = DAO.DBEngine.OpenDatabase("C:\Мои документы\Access\2000\db1.mdb")
 Set rs = db.OpenRecordset("select * from tblTable")
Вопрос 220(06.02.2000) Я проверяю текстовое поле на пустоту так:
Dim s As TextBox
Set s = Me.txtMyPole 'txtMyPole это обычное текстовое поле
s.SetFocus
If s.Text = "" Then MsgBox ("Field 'txtMyPole' empty"): s = Nothing:
Существует ли другой способ? более простой
   Ответ 1. Игорь В. Макеев Может быть подойдет If IsNull(Me.Поле1) Or Trim(Me.Поле1) = "" Then MsgBox "Заполните поле"
   Ответ 2. Виктор Конюков. Есть специальная функция: nz.
Вопрос 225(06.02.2000) Я работаю с Access уже  некоторое время. Для себя и для отдела сделал некоторое количество баз данных. Теперь у меня огромное желание посмотреть и попробовать в работе Access 2000. Могу ли я безболезненно установить у себя на компьютере этот софт не трогая старый Access'97?
   Ответ 1. Игорь В. Макеев Да. Не обновляя, в другой каталог.
   Ответ 2. Виктор Конюков. При установке Access 2000 и Access 97 файлы старых и новых библиотек (dll) записываются в общую папку: SYSTEM. Таким образом, если Вам необходимо обеспечить работоспособность баз данных разных версий, то надо хорошо представлять, как подключаются и работают ссылки в базах данных. Иначе при конвертации, например, из Access 2000 в Access 97 база данных будет работать на Вашем компьютере, а там, где стоит только Access 97 - нет.
Вопрос 227(07.02.2000) Как отловить событие закрытия MS Access, чтобы занести в базу запись типа "Завершение сеанса в чч:мм"?
   Ответ. Игорь В. Макеев1. Сделать невидимую форму, открывать ее при запуске приложения, а по событию ее закрытия исполнять необходимый код. 2. Запретить кнопку закрытия в заголовке самого MSA и повесить закрывающий код на свою кнопку.
Вопрос 229(08.02.2000) Хотелось отфильтровать в форме данные по месяцу из выпадающего списка "Поле1": Есть поле "Дата" типа Дата-время. Испробовал варианты фильтров для формы: (Month(Таблица1.Дата)) = ([Поле1]) (Month(Таблица1.Дата)) = (Forms!Поле1) (Month(Таблица1.Дата)) = (Val ([Forms]![Поле1].SelText)) Значения для "Поле1" брал из списка или из отдельного запроса. При любых вариантах попытка включить фильтр приводит к появлению окошка, предлагающего ввести параметр "Поле1" или "Forms!Поле1" или
"[Forms]![Поле1].SelText". Если же в правой части равенства поставить какое-то фиксированное значение, 1, 2 и т. д., то фильтр работает. Что делать?
    Ответ. Игорь В. Макеев Me.Filter = "Month(Таблица1.Дата) = " & Me.Поле1
 Me.FilterOn = True
Вопрос 232(12.02.2000) Меня зовут Андрей и мне нужна квалифицированная помощь по MS Access. Суть проблемы заключается в следующем…Есть Форма, в ней – ПолеСоСписком. ИсточникСтрок для ПоляСоСписком – Запрос. Хотелось бы знать код VBA для следующего события: в Форме нажимается Кнопка, для которой установлена процедура обработки ее нажатия. Процедура должна изменить УсловиеОтбора в Запросе, из которого ПолеСоСписком берет значения, т.е. необходимо изменить SQL код в Запросе. Ну, а как это сделать, надеюсь, Вы мне поможете. P.S. Эта информация мне необходима не для коммерческих целей
   Ответ. Игорь В. Макеев 1. Если запрос сохраненный:
 Dim q As QueryDef
 Set q = CurrentDb.QueryDefs("Запрос2")
 q.SQL = "select * from tbl where id = 1"
 q.Close
 Set q = Nothing
 Me.ПолеСоСписком3.Requery
2. Если нет, программно формируем условие сразу в RowSource поля со списком.
Вопрос 233(12.02.2000) Очень интересно узнать - легко ли сломать MDE-файл. Я считала, что такой защиты достаточно, но после того как передала свою разработку в стороннюю фирму для  того, чтобы они ее просто посмотрели, они говорят, что вскрыли этот файл и изменяют его под себя самостоятельно. Что, естественно, меня сильно не обрадовало. Заранее благодарна за подсказку.
   Ответ 1. У меня нет корректных литературных слов, чтобы выразить мое мнение по поводу этой фирмы и поведению ее сотрудников.
   Ответ 2. Наверное такая программа существует, т.к. я несколько раз слышал о ее существовании из разных источников, но сам с ней не работал. Но, чтобы как-то Вас успокоить попытаюсь кратко рассказать о том, как работают современные компиляторы (читал однажды книгу "Как самому создать компилятор ?").
   На 1 этапе компилятор удаляет лишние пробелы и комментарии в Вашей программе.
   На 2 этапе происходит разбор текста и конвертация программы в ассемблерный вид.
   На 3 этапе он оптимизируют код, т.е. заменяет повторяющиеся строчки кода на собственные выражения, и тем самым уменьшает объем выполняемой программы.
   И так, отсюда следует, что полностью восстановить вашу программу и логику, конечно, не удастся. А если программа сложная, то и переделка кодов под свои невозможна, все равно структура программы сохраниться. Но лучше, прежде чем работать с сомнительными организациями запомните несколько правил:
  • во первых, "застолбите" программу, т.е. дайте описание того, что она может. Даже, если Вы опубликовали ее только в Интернете и не защитили текст в РосАПО, все равно будете считаться ее автором;
  • во вторых, прежде, чем передать mde - файл, вставьте в него побольше "мусора", т.е программ, которые не имеют ничего общего с вашим кодом;
  • в третьих, напишите часть программ на VB и сохраните их в DLL. Вызов функций из VBA осуществляется аналогично api интерфейсу (смотрите la_api.mdb);
  • в четвертых, если каждый раз вызывая свою dll-функцию делать в ней проверку на тип файла (смотрите пример 6 файла la_prot.mdb), то можно написать алгоритм, который будет вредить в хулиганам.
  • в пятых, лучше сделать документацию по программе и рассылать ее, чем рабочую версию файла.
Вопрос 235(13.02.2000) U menia ystanovleno WINDOWS2000Me posle insstaliacii Ofiice97 vce paketi rabotaiut krome Access97, oshibka pri zapuske Access "net Licenzii dlia Acces na ety Machin" pajalycta obisnite chto eto znachit?
   Ответ. Игорь В. Макеев Добавить в реестр:
[HKEY_CLASSES_ROOT\Licenses\8CC49940-3146-11CF-97A1-00AA00424A9F\Retail]
@="yubcdcprktpjtapmmfdacmupasbhscddncgp"
А на сайте MS, по-моему, есть патч на это дело.
Вопрос 236(13.02.2000) Давно ищу курсы по Аccess97-2000. Интересуют краткосрочное обучение - до недели. Кто проходил подобное - посоветуйте, или рекомендуйте, пожалуйста.
  Ответ. Чтобы минимально изучить базу данных Access 97 или 2000 на уровне пользователя нужно полгода. Если кто-то знает способ, как это можно сделать за 5 дней, пусть напишет. Рекомендации опубликую.
  От себя добавлю, что Билл Гейтс планирует в новой версии Word и Access (10-11) применить систему распознавания речи. Выглядит это примерно так. Вы диктуете текст. Компьютер понимает, проверяет и исправляет ваши фразы или программы, а затем записывает их в файл на диске. При таком идеальном способе работы с базой данных, ее вообще изучать не придется.
Вопрос 238(14.02.2000) Надеюсь, что Вам будет не очень затруднительно помочь мне решить следующий вопрос: В базе данных мне требуется организовать поиск по ключевому слову в тексте файлов расположенных в определенной
директории. Результат поиска возвращается в список. Как написать модуль? Буду рад если поможете! P.S.  Я  занимаюсь вопросами информационного права. Поэтому, если у Вас возникнет  юридический  вопрос  по  защите  программ  для  ЭВМ или баз данных, то я могу оказать Вам ответную консультацию.
   Ответ. Игорь В. Макеев  Читаем Help по FileSearch из библиотеки MS Office Object Library.
Используем примерно так:
  Dim i As Long
 Me.ПолеСоСписком3.RowSource = ""
 With Application.FileSearch
.NewSearch
.LookIn = "C:\Мои документы\word"
.TextOrProperty = "то, что ищем"
.FileType = msoFileTypeWordDocuments
.SearchSubFolders = True
.MatchTextExactly = False
If .Execute(msoSortByFileName) > 0 Then
For i = 1 To .FoundFiles.Count
Me.ПолеСоСписком3.RowSource = Me.ПолеСоСписком3.RowSource & .FoundFiles(i) & ";"
Next i
Else
MsgBox "Not found"
End If
 End With
Вопрос 240(16.02.2000) Я уже достаточно давно занимаюсь Access. До этого программировал на Borland Pascal for Windows и Delphi, немного знаю Visual C++. И вот недавно мне попался заказ на Access, в котором меня попросили изменить внешний вид окна.
(Окно должно быть примерно как в Norton Utilites for Windows, т.е. должна быть изменена рамка окна, все кнопки, заголовок и полосы прокрутки). Как я понял мне необходимо создать свой класс окна и изменить в нем стили. Но как и с помощью каких функций API это сделать я не знаю. Если вам не сложно пошлите мне программку на BPW или Delphi, которая это делает. Или на крайний случай просто список функций API, который мне надо применять. P.S. Зарание спасибо. P.P.S. Огромное спасибо за создание раздела работа на вашем сайте. С помощью
него я наконец-то нашел хорошую работу.
   Ответ. Подробно, как можно изменить стиль окна, написал Малютин Николай в примере N3 файла: la_graphics.mdb (модуль "Открытие")
   P.S. Я так понял, что Вы нашли работу в России по ссылке "Работа". Это, конечно, хорошо. Но многим будет интересно также знать, как найти работу по контракту за рубежом с помощью ссылки "Job". У меня был один звонок от посреднической фирмы в Москве, представляющей немецкую фирму, но больше контактов не было. Так вот, если ссылка "Job" кому-то помогла, черкните пару строк, буду очень признателен.
Вопрос 242(16.02.2000) Мы решили на удачу обратиться к Вам. Спасибо за вашу базу "Валюта" - мы ее используем в работе. Может быть Вы нам подскажете как выйти из положения.. Из-за некорректного (что ввели не знаем) ввода данных в подчиненную таблицу, таблица не открывается, не экспортируется, не открывается в конструкторе, не позволяет себя импортировать. В ней много данных, введенных с большим трудом (300 строк на 5 столбцах). Нам важно восстановить данные. Пустая таблица взамен "битой" устанавливается. Работаем в Access-2000.
    Ответ. Попробуйте: AccessRecovery  с сайта http://www.officerecovery.com/access/
Предложено: Игорь Каминский, ICQ: 1955144 (Взято из FAQ)

Выпуск 23. Динамические отчеты

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

Access 2000. Урок 5. Общая информация о запросах
    Запросы в Access - это временные таблицы (условное название), которые строятся на основе постоянных таблиц с использованием специального языка SQL[1]. Существует множество реализаций языка SQL, например, SQL-86, SQL-89, T-SQL (SQL Server). Мы будем изучать SQL Access c расширениями Jet 4 (ANSI стандарт).
    Запросы применяются в формах, отчетах или в промежуточных вычислениях, т.е. там, где нужен быстрый доступ к табличной информации. Ранее, когда не было SQL, все запросы строились достат��чно сложным образом, т.е. открывалась таблица (файл), далее находились нужные записи, считывались в промежуточную таблицу, потом файл закрывался. Теперь для получения данных из таблицы достаточно написать строку: SELECT * FROM [Товары] WHERE [Номер документа]=10. Это означает, что нужно выбрать из таблицы "Товары" записи, где "Номер документа" = 10. Кроме выборки каких-либо значений из таблиц базы данных существуют также запросы: на создание, удаление, обновление, добавление, объединение записей, полей или таблиц. К сложным запросам можно отнести и перекрестный запрос.
    Запросы SQL упрощают написание программы, но они существенно замедляют быстродействие базы данных. Существует правило, что запросы желательно сохранять на диске в явном виде, чем строить из VBA, но это не всегда возможно. И так, если можно использовать вместо запроса таблицу, то лучше использовать ее.
    О том, как использовать запросы при разработке базы данных, будет рассказано в следующих уроках.
Словарь
   • [1] SQL - SEQUEL, Structured English Query Language. Язык запросов предложен научно - исследовательской лабораторией IBM в начале 70 годов.

Ответы на вопросы


     Вопросы Вы можете задавать по email: или опубликовать на сайте в разделе "Доска объявлений".

Общий вопрос Как создать динамический отчет?
Вопрос 26. Разрабатывая в Access'97 задачи по Учету банковских операций и по Учету контрольно - измерительных приборов (КИП) столкнулась с трудностью создания отчета (на основе перекрестного запроса) с динамически меняющейся шириной границы (в зависимости от данных, входящих в заданный пользователем период). Например, в моем отчете - "Журнал-ордер" количество корреспондирующих счетов (заголовки столбцов) в каждый период различно, а общее их кол-во велико их полное размещение в "шапке" отчета не целесообразно (60 с лишним колонок! по числу счетов). Пока что я поменяла местами заголовки столбцов и строк (соответственно - дни месяца и счета). Отчет стал компактнее, однако не всем моим пользователям удобен такой вариант. Очень нужно создать "плавающую границу" в отчете. Посоветуйте, пожалуйста, как это реализовать программно?
Вопрос 52. Подскажите, пожалуйста, ответ на давно мучающий меня вопрос. Как сделать чтобы заголовки столбцов (PIVOT) перекрестного запроса выбирались бы из формы пользователем, или бы из отдельной таблицы, в которую бы пользователь их заносил?
Вопрос 78 (20.11.2000). Необходимо получить файл отчета в формате Word. При транспортировке отчета пропадают все линии. Как быть?
Вопрос 85 (21.11.2000). Возможно ли отчет сделать так, чтобы не только строки были динамическими, но и столбцы? Не знаю понятно ли я задал вопрос. То есть я хочу, чтобы столбцы печатались только по удовлетворению запроса что - ли, как строки (в конструкторе - это из поля).
Вопрос 129(15.12.2000) Объясните,  пожалуйста,  как сохранить отчёт в виде вордовского файла, без потери рамочек в таблицах?
Вопрос 138(20.12.2000) Просто огромная просьба, пожалуйста, покажите эти три примера на моих отчетах (в файле сопровождения): - отчет "Заявка" я пытался отправить по факсу с ПК; там же я пытался добавить еще раз надпись при печати (она мне постоянно debug и желтым строчку в процедуре) - в отчете "Товар в пути" я пытался вот так реализовать столбцы "динамически", т. е. по топорному вручную их тусуешь, а хотелось бы чтобы они работали как строки; здесь же - (для ясности картины) на основании чего строится отчет (кстати эту программу я строил на основе общедоступной "Склад" в Access2000, оставил форму с подформой и другие, а также переделал тоже другие составляющие) - это несколько таблиц "Товары", "Типы", "Закупки" и "Сделки"(они заполняются из формы и подформы), "Неделя выхода контейнера" и другие мелкие. На основе таблиц сначала простой запрос на выборку, потом на основе этого запроса сделал перекрестный (чтобы поменять строки и столбцы, теперь строки - это контейнера, столбцы - наименования товаров), потом на основе перекрестного сделал простой и на его основе уже отчет "Товар в пути". Надеюсь не утомил!!!
Вопрос 169(09.01.2000) Если кто знает, как создать отчет на основе перекрестного запроса, помогите, пожалуйста!!
Вопрос 185(25.01.2000) Мне нужно формировать договора в Word, с использованием очень большого количества полей. При создании запроса некоторые срабатывают (в основном с физическими лицами), а как начинаются названия организаций выдает ошибку: \"Слишком большая длина записи\" как это обойти ? может можно делать слияние с двумя таблицами ?
Вопрос 187(25.01.2000) 1. Существует некая таблица(Access2000), в которой поле Test(тип- объект OLE) имеет значение "Документ Word" (вставлен документ
MsWord2000), как программно обратится к содержимому этого документа, чтобы присвоить переменной strTextLine последовательно содержимое каждой
строки документа. Что нужно изменить в следующем куске:
Dim xlApp As Object
Dim MyXL As Object
Dim rst As Recordset
Set db = CurrentDb()
Set rst = db.OpenRecordset("таблица1", dbOpenDynaset)
CC:
With rst
.Edit
strFile = !Test
.Update
.Bookmark = .LastModified
End With
Set xlApp = CreateObject("word.application")
'необходимо задать для свойства Visible
'значение True, чтобы приложение было видимым
xlApp.Visible = -1
'Использование xlApp для доступа к другим
'объектам Microsoft Word
Set MyXL = GetObject(strFile)
Open (strFile) For Input As #1
Do While Not EOF(1)
Line Input #1, strTextLine
L = Len(strTextLine)
   Ответ. Группа вопросов 26, 52, 78, 85, 129, 138, 169, 185, 187 имеют общую проблему. Пользователи пытаются создать сложные отчеты средствами Access или экспортируют отчеты в Word. Попробуем взглянуть на проблему по другому и введем новое понятие "динамический отчет". К таким отчетам будем относить отчеты: а) которые могут формироваться на основе перекрестных запросов б) у которых нет четкого названия и количества полей в) в которых после форматирования документа надо вносить изменения в строки и столбцы, изменять шрифт и формулы у ячеек таблицы, менять форму линий таблицы. Таким образом, к динамическим отчетам будем относить отчеты, которые можно полностью изменить, удалить или перестроить из программы VBA.
   К сожалению построить такие отчеты только средствами Access у Вас не получиться из-за ограничений в базе данных.  Но, если использовать Word, то Вы сможете создавать очень сложные документы. Алгоритм решения проблемы следующий:
   • создаем шаблон документа, т.е. файл с расширением *.dot (например, la_automat.dot)
   • устанавливаем в шаблоне нужные закладки, т.е. где будет находиться название фирмы, корсчет, банк и таблица.
   • далее создаем документ Word из шаблона:
      Set app = New Word.Application 'Новое приложение Word
      app.Visible = True 'Отображаем документ
      app.Documents.Add "c:\la_automat.dot" 'Добавляем шаблон
   • Находим закладку "Фирма" и вставляем текст из формы:
     app.ActiveDocument..Bookmarks.Item("Фирма").Range.Text = Me("Фирма")
   • Далее ищем закладку таблицы:
      Set rng = app.ActiveDocument.Bookmarks("Таблица").Range
   • Вставляем таблицу в Word из Access, используя запрос:
      rng.InsertDatabase Connection:="Query ЗапросПримера04", DataSource:="c:\la_automat.mdb"
   • Форматируем всю таблицу:
      tbl.Range.Font.Size = 10 ' Выбираем шрифт
      tbl.AutoFormat wdTableFormatGrid8 ' Выбираем авто-формат
   • Если нам надо добавить строку или колонку используем метод Add, Например,
     tbl.Columns.Add tbl.Columns(1) ' Добавляем колонку в начало таблицы
     tbl.Rows.Add ' Добавляем строку в конец таблицы
   • В последнюю ячейку вставляем формулу:
      tbl.Cell(tbl.Rows.Count, 1).Formula "=SUM(ABOVE)"
   • На последнем этапе сохраняем документ или посылаем его на печать или факс.
    Вообще можно форматировать таблицу как угодно. Для этого существуют зоны отбора, форматы строк, все просто перечислить невозможно. Для более детальной информации посмотрите лучше файл: la_automat.mdb с примерами 2-4 и справочную систему.
   Дополнительные ответы к вопросам.
   (78) При экспорте линии отчета сохранить нельзя.
   (85) Отчет с ��еременным количеством полей по горизонтали можно сформировать следующими способами: с помощью рисования полей (есть пример на сайте), созданием в конструкторе лишних (невидимых) полей, созданием отчета Crystal Reports непосредственно в среде Microsoft Access, используя Add-in компоненты.
   (138) Пример, как послать факс из Access через SendObject есть на сайте. Существует способы рассылки факса через dde интерфейс, через установку принтера по умолчанию с использованием api-интерфейса и другие.
Вопрос 162(09.01.2000) Как программно добраться до буфера обмена Windows? В VB Clipboard.Gettext и т. д. В Accese (2000) не работает.
  В данном случае у VB есть класс Clipboard, а в Access нет, поэтому его надо придумать. В файле la_api.mdb посмотрите пример 4, который показывает как создать класс для работы с текстовым буфером Windows. Пример использования класса указан ниже.
  Dim buffer As New TextClipboard
  buffer.CopyText Nz(Me.myText) ' Копирование в буфер
  Me.myBuffer = buffer.GetText() ' Восстановление из буфера
Вопрос 164(09.01.2000) Каким образом в Access 2000 заставить "Помощник" отображать сообщения msgbox также, как и в Access 97. Т.е. показывать сообщения в ballon, с параметрами заданными в msgbox и соответственно получать значения в зависимости от нажатия кнопок "Ok" и т.д. В общем, чтобы стандартное окно сообщения показывал Помощник . В 97 это элементарно, а в 2000?
  Ответ. Как использовать "Помощник" в базе данных рассказано в программе "Лекции по Access". Вот пример с вызовом стандартного сообщения msgbox
Set bln = .NewBalloon 'Создаем Помощник
With bln
. Heading = "Вопрос 158" 'Устанавливаем заголовок
. Labels(1).Text = "Пункт 1" 'Включаем меню 1
. Labels(2).Text = "Пункт 2" 'Включаем меню 2
 .BalloonType = msoBalloonTypeButtons 'Устанавливаем тип меню
. Button = msoButtonSetNone 'Отключаем клавиши помощника
 Select Case .Show 'Реакция на выбор меню
    Case 1: MsgBox("Пункт 1") 'Назначаем 1 сообщение
    Case 2: MsgBox("Пункт 2") 'Назначаем 2 сообщение
 End Select 'Конец вариантов
End With
Вопрос 166(09.01.2000) У меня такая проблема в Access2000. Я использую такой код:
Dim dbs As Database
Dim rs As Recordset
Set dbs = OpenDatabase("Рейтинг банков.mdb")
Set rs = dbs.OpenRecordset("ПоказателиБанков", dbOpenTable)
На последней строке выдаётся ошибка:
Run-time error '13':
Time mismatch
При этом, Microsoft 3.6 DAO Object Library подключена. Пробовал схожий код для базы "Борей". Всё работает.
   Ответ. Программа написана у Вас правильно, но если кроме DAO установлена библиотека ADO, то может быть ошибка, т.к. recordset есть и в DAO и ADO. Решение проблемы заключается в следующем: a) Отключите лишние ссылки b) DAO разместите вверху c) Укажите явно объекты, например, DAO.Recordset
Вопрос 174(09.01.2000) Не могу отфильтровать записи в одном combobox'е "КодЗН" относительно другого combobox'а "КодПротез". Когда открываешь "КодЗН" работает связь, а вот обратно никак. (Взят из файла mdb)
  Ответ. У Вас отраслевая база данных. Вникать в отраслевые задачи без техзадания очень сложно. Вообще на сайте есть примеры работы с combobox. Еще чем могу помочь Вам, так это тем, что могу связать Вас с главврачем медицинского учреждения. Я помогал им сделать небольшой проект. Но из переписки ясно, что у них есть разные Access базы данных по медицинской отрасли. Возможно они Вам помогут.
Вопрос 176(09.01.2000) Такая проблема: Хочу я, значит, проверить значение поля в форме на наличие в нем чего-то смыслового...
Например, таким-вот образом:
Dim tempVar As Variant
tempVar = Form_add.Controls.Item(i).Value
If tempVar = Null Then
...
End If
А оно не проверяется, блин!.. Сразу перескакивает на Энд Иф!.. Хотя при дебаге показывает что tempVar = Null и поле действительно пустое... Обидно... Помогите, пожалста...
   Ответ. Для проверки на нулевое значение существует оператор IsNull, можно использовать Nz, или изменить переменную через & "". Также применяют On Error resume Next c проверкой Err.Number для сложных случаев.

 

Выпуск 21. ADO и другие сокращения в Access

Поздравление.
    Поздравляю всех с Новым годом! Желаю успехов в бизнесе и учебе, прекрасного настроения, финансового благополучия, а также исполнения всех желаний в Новом тысячелетии и 2001 году!
    "Новый год - это Новый миг. Новый год - это Новый сдвиг. Новый год - это Новые знания, новые здания и новый полет. Это шефа - БАА..ЛЬШОЕ задание, это шаг к процветанию, к победе. Вперед".
Введение.
    В этом выпуске рассказывается о некоторых понятиях, связанных с программированием базы данных и даются ответы на вопросы по Access.

Словарь
   • [1] RDO (Remote Data Objects) - объекты удаленных данных в Access 2.0
   • [2] DAO (Data Access Object) - объект доступа к данным для Access 97
   • [3] ADO (ActiveX Data Object) - новый взгляд на те же объекты доступа к данным
   • [4] ADOX (ActiveX Data Object Extensions for DDL and Security) - расширения ADO
   • [5] UDA (Universal Data Access) - стратегия универсального доступа к данным
   • [6] COM (Component Object Model) - модель единого объекта
   • [7] MSDE (Microsoft Data Engine) - аналог ядра SQL сервера, только попроще.
   • [8] OLE DB Provider  - средство доступа к данным
   • [9] JRO (Jet Replication Object) - объект репликации ядра Jet
   • [10] DOM (Document Object Model) - модель документного объекта
   • [11] XML (eXtensible Markup Language) - язык для работы с страницами доступа к данным
   • [12] MOD (Microsoft Office Developer) - продукт для профессионального разработчика офисных приложений.
   • [13] RVBA (Reddick VBA) - соглашения о наименованиях Реддика для VBA. Реддик - президент консалтинговой компании Gregory Reddick & Associates
   • [14] Венгерская нотация - удобное и понятное обозначение имен в программах. Ее изобретатель - венгр Чарльз Симони.

Ответы на вопросы


     

Вопрос 130(15.12.2000) В таблице имеются поля Дата и Примечание. Необходимо в запросе иметь строки, где дата идет из соответствующей строки таблицы, а рядом - примечание из предыдущей строки этой же таблицы, причем в последней строке и дата и примечание идут из одной последней записи.
  Для решения этой задачи используйте дополнительный запрос, т.е. поле в основном запросе сформируйте с использованием SQL, например, для a: select a from table1 where c=" & n.
Вопрос 131(15.12.2000) В форме имеются поля Тип оплаты и Номер квитанции (оба текстовые). Мне необходимо, чтобы если был выбран тип оплаты "квитанция", в поле номер квит. появлялся предыдущий номер квит. + 1, причем впереди номера всегда идет несколько нулей, например: 001234. Я задала следующую формулу: Format(Str(Val(DLast("Table","NumberKvit"))+1),"000000"), но нули впереди не появляются.
  У вас очень сложный алгоритм конвертации. Для перевода в строку существует функция CStr, для целых чисел: CLng. Попробуйте вариант: Format(CLng(DLast("Table","NumberKvit"))+1,"000000")
Вопрос 132(15.12.2000) С течением обстоятельств занимаюсь формированием базы данных в Access.(имею хобби - собираю информацию по истории пчеловодства и большая библиография) И база то всего "Библиографический каталог". Вопросов много, т к VBA мне не по зубам (скоро на пенсию), а помощи ждать не откуда - провинция. Но пока о запросах ведут себя уж очень странно. Начал создавать базу в Off97, потом перешел в
2000. Если формирую условие отбора для поиска по фамилии на одну букву "К*" со звездочкой, то результат нулевой, хотя поиск в форме дает положительный ответ. Далее еще интереснее. На другие буквы алфавита вроде лучше, но странности появляются в другом: если условие отбора ��остоит из трех букв - результат положительный, а если из четырех - то ничего не находит. В базе данные есть информация для этого условия. В параметрическом запросе тоже самое. пока не поставишь звездочку перед буквой, до тех пор нечего не находит, но звездочка дает много лишнего, а без нее не работает. Может я недостаточно ясно изложил - извини, пожалуйста.
У меня ПК 166, 64, Win98se? Off 2000 sr1. Если можно еще. Появилось желание создать свою страничку и выставить на ней этот каталог (эту базу), но как сделать, чтобы работали запросы и поиск в формах в html?
   (Ответ) 1. Есть хороший пример "Контекстного поиска" N03 файла la_form.mdb. Там для отбора записей применяется оператор Like, у меня все работает без проблем.  
   2. Для того, чтобы работали запросы и поиск в web страницах, то Вам надо изучить один из специальных языков программирования (например, java) или найти скрипт (программу) и добавить ее в свою страницу. У вас могут возникнуть проблемы с провайдером, т.к. все что связано с динамическими страницами должно быть оплачено.
Вопрос 133(15.12.2000) Я работаю в Access 97, но думаю, что и тут мой вопрос будет уместен. Я создал базу данных, в которой хранятся как текстовые, числовые данные так и графические изображения. Графика вводится в базу в поле OLE. Вся графическая информация создается в редакторе CorelXara 2.0 (до недавнего времени это был CorelXara1.5). После создания записи в таблицу и внесения в нее графического изображения распечатка чертежа на принтере из редактора CorelXara представляет собой качественную картинку. Проблема же заключается в том, что мне нужен отчет, где должен быть изображен соответствующий конкретной записи чертеж и на этот чертеж сверху нужно наложить текстовую информацию из других полей записи. Выход нашел в следующем: в отчете создал одно большое (на весь печатный лист) поле объекта OLE, где изображается соответствующая картинка, а уже сверху на это поле наложил другие поля, отображающие текст и числовые данные. При выводе отчета на экран получаю четкое изображение печатного листа с чертежом, текстом и числами. При выводе же этого отчета на печать происходит частичная потеря качества графического изображения. По моему мнению, Access выводит картинку, созданную в редакторе CorelXara в виде графического файла BMP. За счет этого и происходит потеря качества изображения. То есть, там, где должны быть более утонченные линии или более мелкая графическая запись текста, там при печати на принтер точки выкладываются через раз (как в шахматном порядке) и понижают качество изображения до невозможности прочитать графическую информацию. Возможно ли что-нибудь сделать для улучшения качества подачи графики на принтер именно через отчет? Заранее спасибо за ответ. Если необходимо, то могу прислать эту базу с таблицей и отчетом.
   (Oтвет) Насчет графики я бы сказал так: родным форматом для Access является  bmp. Все другие имеют некоторые проблемы. Я, например, заметил, что в формах в некоторых случаях неправильно отображается gif формат (изображение двоится). Поэтому, графические файлы лучше хранить во внешнем файле bmp формате. Если Вам нужно больше 256 цветов, то используйте jpg. Но тогда для вывода на печать лучше использовать Word. Для этого создается специальный шаблон в Word, далее Access и Word используются как сервер и клиент автоматизации (пример 2 la_automat.mdb). Задача не очень простая и требует нескольких дней на решение для профессионала.
Вопрос 134(15.12.2000) Можно ли сделать так, чтобы при завершении работы Access автоматически сжимал БД и желательно без перезапуска ?
  (Oтвет) 1. Сжатие открытой базы данных без перезапуска невозможно. Почему нельзя, посмотрите на структуру dbase файла до сжатия и после.
  2. Возможен вариант сжатия базы данных аналогично программе "Лекции по Access", там есть пример на эту тему.
Вопрос 135(15.12.2000) При попытке работы с "Лекции по Microsoft Access" (в виде Windows справки) возникла ошибка.  Работаю с оригинальным немецким Win98/NT и офисом. Можно ли решить мою проблему иным путем, чем установка русского виндовса и офиса?
   (Введение). Вопрос я думаю будут интересен для многих, особенно для тех, кто собирается работать за границей. Известно, что система кодировки в Access 2000 улучшилась. Используя Юникод, можно загрузить практически любой алфавит, даже если у Вас установлена только локальная версия офиса.
   (Ответ). В данном случае получается, что в справке Windows изменилась часть текста, хотя русские шрифты в Windows установлены. Почему это произошло, сразу ответить сложно. Для этого нужно проводить эксперименты.
   P.S. Для профи. Если у Вас есть любые мысли и предложения на эту тему пишите по email.
Вопрос 137(20.12.2000) Подскажите, пожалуйста, как в форме в одном из полей перед вводом новой цифры в поле значилась наибольшее число из ранее введенных или появлялось отдельным окном. Поле текстовое или цифровое, режим данных добавление. Это требуется чтобы пользователь ориентировался в вводимых числах и был в курсе наибольшего из них.
   (Ответ) Это проблема всегда возникает при вводе нового документа, например, накладной, платежки и т.п. Чтобы ее решить надо при обработке события "Текущая запись", при проверке новой записи, сделать запрос на получение максимального числа из таблицы и присвоить его номеру. Смотрите пример 12 в файле la_form1.mdb, я добавил код для такого случая. Нюанс заключается в том, что максимальное значение надо присваивать не числу, а его свойству DefaultValue. Иначе каждый раз, даже при случайном вызове новой записи, будет происходить добавление данных, что может быть и ненужно пользователю.
Private Sub Form_Current()
   If Me.NewRecord = True Then
       Me.Nдок.DefaultValue = 1 + funGetMaxNumber("SELECT Max([Nдок]) as NN FROM [Пример]")
   End If
End Sub
Вопрос 141(21.12.2000) Расскажите, пожалуйста, про поля со списком. Как нужно корректно создавать и формировать поля со списками?
   (Ответ) Примеры работы с полем-списком есть в архиве программ. Дополнительно как создавать их и управлять программным путем приведу позже.
Вопрос 142(21.12.2000) У меня такой вопрос! Есть поле таблицы с ценами. Это поле связано с   формой. Как сделать так, что при вводе в поле формы "Цена" не конкретного числа, а области чисел через дефис, программа бы искала подходящие записи в таблице, значение которых лежало бы в области данных введенных пользователем.
   (Ответ) Вариантов может быть много.
1. Прочитайте справку по оператору. Например, Like "12??" вернет вам числа от 1200 до 1299.
2. Используйте запрос SQL "select * table from where n>=1200 and n<1300"
Вопрос 144(27.12.2000) Делаю программу для заполнения платежных документов. Ситуация такая. В форме из поля со списком выбирается ИНН получателя, а затем автоматически из справочника получателей заполняются все остальные поля для получателя (все работает). Но возникла такая ситуация, ИНН один, а отделений банка, счетов банка и расчетных счетов к нему много. Я думаю сделать так: выбираем ИНН из списка, а потом счет из списка, а остальные поля заполняются автоматически. Но как это сделать? Не подскажите где можно посмотреть аналогичный пример.
   (Ответ) Вы на правильном пути. Это лучшее решение для платежного поручения, когда информация берется по ИНН. Для решения же Вашей проблемы надо ввести еще код, например, ИНН2. Тогда ключ для таблицы будет состоять из двух полей ИНН и ИНН2. Список ИНН2 должен заполнятся автоматически при входе в поле в зависимости от ИНН. Примеры на эту тему есть в файлах для форм.
Вопрос 145(27.12.2000) Не подскажете, откуда вы в Курс2000 динамически берете курс валюты.  Через cgi скрипт наверное , только как?
   (Ответ) Пока в Интернете я не встречал "красивых" решений на эту тему, поэтому код программы не распространяется бесплатно.
Вопрос 146(27.12.2000) Сделал сайт на основе страниц доступа к данным и базы (softbase.mdb), расположенной в том же каталоге, что и страницы. При отладке на локальном компьютере страницы без проблем находили файл базы по ссылке: Data Source=softbase.mdb.После переноса на сервер в INET страницы перестали находить источник данных (softbase.mdb), хотя он по-прежнему находился в одном подкаталоге с ними. Все попытки указать путь к источнику другими способами не увенчались успехом. Общался с четырьмя серверами по этому поводу. Два ответили, что не поддерживают эту технологию, а страницы, кстати ,выглядят и функционируют нормально, только источника не видят.
Поэтому вопрос: "Могут ли страницы доступа к данным Access2000 работать с базой, помещенной на тот же сайт, что и они, и если да, то что для этого нужно"?
   (Ответ) Страницы доступа к данным будут отображаться на любом сервере провайдера, но вот чтобы они смогли читать базу данных Access требуется установка специального программного обеспечения. Я встречал провайдеров, которые обеспечивают доступ к mdb файлам. В основном это зарубежные сайты. Попробуйте поискать hosting и Access, где-нибудь на yahoo.com. Вообще, все это будет так медленно работать, что может лучше поискать другую базу данных, например, mysql.
Вопрос 147(27.12.2000) Есть форма (карточка оборудования), как создать в этой форме отдельное поле для поиска , после ввода или во время ввода данных в которое (инв.№ или наименования) осуществлялся поиск и подстановка данных в форму
Если можно код.
   (Ответ) Смотрите пример 3 "Контекстный поиск" (la_form.mdb) или 15 в файле la_form1.mdb
Вопрос 148(28.12.2000) Я только начинаю работать в Access и у меня возникла следующая проблема: есть служебная таблица где хранится Модель прибора, тип установки и т. д.. В рабочей таблице, с которой работают конечные пользователи, есть те же поля плюс другие. Вопрос, можно ли сделать так что бы пользователь ввел только Модель а все
другие поля автоматически заполнились из служебной таблицы. Если кто сделает
небольшой примерчик буду вдвойне, нет втройне благодарен.
   (Ответ) Пользователи скажут вам пятикратное спасибо, если Вы внимательно посмотрите на пример номер 15 в файле la_from1.mdb и сможете грамотно переименовать поля и таблицы в этом примере.
Вопрос 149(29.12.2000) У меня возникла такая проблема, вдруг перестали работать в форме все кнопки, даже те которые я делала с помощью конструктора.
   (Ответ) Если mdb-файл у Вас еще открывается, то это значит, что Ваши кнопки не получают сообщения от Windows. Сожмите базу, проверьте событие Нажатие кнопки=[Процедура обработки событий], в коде VBA должна быть программа Click_кнопка. Если есть циклы, то вставьте в них команду DoEvents.
Помощь.   В гостевой книге есть  2 интересных предложения, связанных с работой и изучением Access. Так, что если Вы готовы оказать реальную помощь, то пишите по указанным ниже электронным адресам.
   [1]. Имя: Anton ,  Город: С-Петербург .
Комментарии: Господа, нужна помощь в создании программки для расчета не совсем правильной заработной платы :-) Возможна доработка некоторой уже готовой, но там должно быть несколько специальных функций, а многого из программы предложенной на сайте не нужно. Очень желательно, чтобы человек, который за это возьмется жил в Питере. Все оплачивается, деньги правда небольшие, но и работа не сложная.
- Wednesday, December 20, 2000 at 16:00:27 (MSK)
   [4]. Имя: Давыдов Константин, Город: Москва.
Комментарии: Всем, всем добрый день! Учение по книгам - дело хорошее, но когда начинаешь с нуля, приходится затратить много времени, а время это деньги. Если есть желающие помочь, не бесплатно, пишите. Благодарность не будет иметь границ в пределах разумного. Я имел ввиду частное обучение.
- Thursday, November 02, 2000 at 12:19:08 (MSK)
Вакансии. На сайте открыт новый раздел Работа. Используйте этот раздел для изучения спроса на программистов по Access. Вам достаточно нажать только кнопку "Поиск", и отобразятся вакансии по этой тематике. Их может быть достаточно много, в день может появиться новых 5-10 штук. Среди них есть очень интересные как для работы в России, так и за рубежом. Даже если Вы сразу не найдете работу, то хотя бы будете знать какие требования предъявляют организации к специалистам по базам данных. Ниже приводится несколько вакансий этого сайта.
26.12.00 15:53 | Требуется Программист в крупную российскую торгово-производственную компанию
Образование - высшее.
Опыт работы - до 2-х лет.
Город: Москва
На постоянную работу. Полный рабочий день.
Зарплата от 600 $/месяц
Контактное лицо: Елена
Телефон: тел/факс 291-92-71, 202-26-55
E-Mail: elena_mdc@mtu-net.ru
Дополнительные сведения:
Крупная российская торгово-производственная компания приглашает на постоянную работу программиста с опытом работы не менее 1 года. Задачи: поддержка MSAccess систем, существующей системы Concorde, программирование отчетов, обучение пользователей. Требования: в/о, отличное знание MSAccess , опыт программирования бухгалтерских или логистических процессов, знакомство с SQL сервером, знакомство с бизнес ПО (Concorde, SunSystems, Platinum, Scala, BAAN, SAP и т.п.), высокая степень самоорганизации и самообучаемости, готовность к напряженной работе в команде професионалов. Резюме по факсу: 291-92-71, 202-26-55 или по e-mail: elena_mdc@mtu-net.ru

26.12.00 13:56 | Требуется Системный администратор в компанию.
мужчина, 22 - 30 лет. Образование - высшее.
Опыт работы - до 2-х лет.
Город: Москва
На постоянную работу. Полный рабочий день.
Зарплата от 500 $/месяц
Контактное лицо: Менеджер по персоналу
Телефон: Факс 923-0882
E-Mail: hr_diana@rambler.ru
Дополнительные сведения:
Опыт администрирования 1С: -Бухгалтерия 6.0 от 1 года. Экспорт данных между 1С и Access . Администрирования сети (1сервер, 20 компьютеров, Интернет). Знание железа. Высшее техническое образование.

26.12.00 13:50 | Требуется VISUAL BASIC 6.0 WITH MS ACCESS 97/CRYSTAL REPORTS SPECIALIST
23 - 35 лет. Образование - высшее.
Опыт работы - свыше 2-х лет.
Город: Санкт-Петербург
На постоянную работу. Полный рабочий день.
Зарплата от 4000 $/месяц
Контактное лицо: Оксана Дадерко
Телефон: (812) 279-64-68
E-Mail: it-staff@totem.ru
Дополнительные сведения:
МЕСТО РАБОТЫ: США СРОКИ РАБОТЫ: от 6 месяцев до 3 лет ОПЫТ РАБОТЫ: Не менее 2х лет в профессиональном направлении Visual Basic 6.0 with MS Access 97/Crystal Reports ТЕХНИЧЕСКИЕ НАВЫКИ: Java/ASP/COM/DCOM/HTML/MTS/Visual Interdev, Multiple Database Oracle 7.x/8.x, SQL Server 6.5/7.0 ВЛАДЕНИЕ ИНОСТРАННЫМ ЯЗЫКОМ Приличный уровень владения английским языком

 

Выпуск 22. Как составить договор на разработку базы данных ?

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

Access 2000. Урок 4. Создание связанных таблиц
    После того, как Вы научились создавать таблицы в Access, надо научиться назначать различные связи между ними. Профессионально созданная база данных характеризуется не количеством отчетов или форм, а грамотным определением структуры таблиц и ее ключевых полей. Одного взгляда профи достаточно, чтобы узнать, кто проектировал базу данных, и как она будет работать в дальнейшем.
    Рассмотрим пример. У вас есть на предприятии накладные на отгрузку продукции. Вам поручили их обработку на компьютере. Рассматривая каждый документ по одиночке, Вы приходите к выводу, что у них есть постоянный заголовок и таблица с разными товарами. Начинающий специалист попытается побыстрее создать 1 таблицу с максимальным числом полей, завести в нее все данные и отчитаться о том, что он быстрее всех разработал базу данных. И это будет неправильно, т.к. в таблице постоянно будут повторяться данные, возникнут сложности с изменением реквизитов документа, да и объем базы данных будет слишком большой. Правильный выход - это создание 3х таблиц, в одной будут храниться заголовки документов, в другой - товары, а в третьей - постоянные заказчики Вашей продукции. А для того, чтобы обеспечить взаимодействие таблиц как единое целое, надо определить и связать их через первичные ключи[1].
    Какой же должен быть ключ в таблице? Принцип назначения ключа - он должен быть самым коротким и быстрым. Идеальный ключ в таблице - это одно числовое поле типа Long[2] с коротким именем до 8 символов. Кто-то сразу может возразить, что Byte[3] или Integer[4] лучше Long, т.к. они короче, а следовательно быстрее. На самом деле все гораздо сложнее. Windows 95, NT, 2000 - это 32 разрядные операционные системы, а следовательно все процессы оптимизированы для выполнения 32 разрядных операций (минимальный элемент в потоке данных). Перевод же, например, 16 разрядных элементов Integer в Long займет некоторое время, что скажется на скорости работы базы данных. Вроде бы мелочь, изменили лишь только свойство поля базы данных, но самом деле 50% времени на обработке таблиц Вы выиграете. И так, при правильном проектировании, вместо одного часа Ваша база должна открываться всего за 30 минут (шутка).
    Теперь поговорим о связях, которые существуют в таблицах. Известны следующие связи: один к одному (1-1)[5] и один ко многим (1-M)[6]. Все остальные - это лишь следствие их. В нашем примере можно связать таблицу заголовков и товаров по принципу 1-М, т.е заголовок должен быть один, а товаров в накладной много. Это правильно. Но если Вы назначите связь 1-1, то в таблицу товаров Вы сможете ввести только 1 позицию, что не совсем правильно, хотя и возможно на некоторых документах.
    У связанных таблиц можно изменять еще и атрибуты соединения, например, назначить каскадное обновление таблиц (очень важное свойство). В этом случае изменения в подчиненных таблицах будут производиться автоматически, например, изменили номер в главной таблице, то он сразу изменится во всех подчиненных таблицах.
   При проектировании сложных баз данных, например, по складу, зарплате или финансам связанных таблиц может оказаться очень много. Возможно Вам придется создавать/удалять соединения не только визуально, но и программно. О том, как определить атрибуты связанных таблиц смотрите в примере 12 файла: la_table1.mdb.
   Задание. После 4 уроков Вы должны уметь создавать таблицы и связи между ними (желательно на VBA). Для этого попробуйте изменить пример 12 так, чтобы из модуля можно было создать/удалить некоторую связь в базе данных. (смотрите CreateRelation[7] в Справке).
Словарь
   • [1] Первичный ключ - это одно или несколько полей в таблице, которые однозначно определяют запись. В конструкторе таблиц поля обозначены ключиком слева, в запросах они всегда выделены жирным цветом.
   • [2] Long (Длинное целое) - числовое поле базы данных, размер 4 байта (32 разряда)
   • [3] Byte (Байт) - свойство поля базы данных, занимает 1 байт (8 разрядов)
   • [4] Integer (Целое) - свойство поля базы данных, занимает 2 байта (16 разрядов)
   • [5] 1-1 (Один к одному) - каждой строке первой таблице соответствует не более одной строки второй таблицы.
   • [6] 1-М (Один ко многим) - каждой строке в первой таблице соответствует одна, ни одной или несколько строк во второй таблице.
   • [7] CreateRelation (Создать соединение между таблицами) - функция в библиотеке DAO 3.6, отвечающая за связи между таблицами.

Ответы на вопросы


     Вопросы Вы можете задавать по email: или опубликовать на сайте в разделе "Доска объявлений". На некоторые вопросы уже есть ответы, но на них будут ответы в следующей рассылке, т.к. рассылка ограничена размерами.

Вопрос от заказчика: Сейчас поставил на закачку новую версию программы "Склад и Реализация". Сначала закачать по ссылке не получилось, а с помощью ReGet все сразу пошло. Кстати программа очень понравилась, то что я долго искал. Вот только есть одна небольшая загвоздка: по нашему ассортименту не у всего товара есть артикулы. Можно как-нибудь этот момент исправить?
   Вообще "Артикул" и другие 3 поля - это своего уникальный ключ в таблице товаров. Используется он вместо поля типа "Счетчик". С одной стороны, в эти поля Вы можете занести информацию о товаре, а с другой стороны Вы избавлены от "Счетчика" с бессмысленным набором цифр. Технически переименования возможны, но нужно ли это делать. Например, в некоторых известных dBase программах используются названия: Fam, Im, Nstr или даже Sp354, Sp398 и сложно понять, что находится в этих полях. Вот варианты решения проблемы:
   • Вы можете заказать бесплатно изменить отчет(ы) , где вместо "Артикул" будет, например, фигурировать "Номенклатура" или вообще этого поля не будет. Вышлите описание отчетов по email.
   • Откройте в папке: "99 Филиал\..." эталон ШаблонБД.mdb. Добавьте в его таблицу "СКЛАД справочник" ваше новое поле, например, "Номенклатура". Далее в таблице "INI version" измените в поле "Версия" значение 4.0, например, на 4.001. Закройте все таблицы. Теперь при открытии или создании новых базы данных, всегда будет происходить репликация, т.е. в таблицу товаров автоматически будет добавляться поле "Номенклатура".
   • Можете вставить любой внешний отчет или форму смотрите файл: "..\Сборник\Мои программы\Склад и Реализация.mdb". Примеры настроек смотрите в основном файле "Склад и Реализация.mde" таблицы "АДМ элементы управления".
   • Если Вам удобнее работать с редактором Microsoft Word,  то можете бесплатно заказать отчеты, например, Прайс-Лист, Счет-Фактуру с построением в нем. В этом случае, программа не будет экспортировать отчеты из базы данных, потому что Access неправильно передает таблицы, а сама построит их в редакторе. Заголовки таблиц Вы сможете назначить сами.
Общий вопрос. Не могли бы Вы рассказать, как составить договор на разработку базы данных?
    Ответ. Если подробно остановиться на этом вопросе, то на другие можно и не отвечать. Места в рассылке не хватит. Позволю себе остановиться на некоторых тонкостях, которые могут встретиться Вам.
   Во первых, обдумайте коммерческие предложения прежде, чем принимать решение о разработке базы данных. Вот несколько сомнительных предложений: • участие в тендере; • перевод базы из Fox Pro (защищена неизвестным паролем) в Access, • разработка несложной формы, оплата - наличными, но позже. Думайте головой, когда участвуете в таких работах. Если оплата за труд назначается после работы, то лучше заручиться гарантийным письмом или передайте сначала только mde файл.
   Во вторых, серьезно продумывайте текст договора. Например,
   1. Точно указывайте в названии договора имя базы данных. Например, у меня был случай, когда форма базы данных разрабатывалась для Access 2000, а заказчику она нужна была в формате Access 97. Пришлось вносить изменения в код программы, т.к. просто сохранить ее не удалось из-за некоторых различий баз данных.
   2. При работе с не русскими базами данных указывайте текст комментариев в VBA. Используя транслит вместо английского, можно сэкономить время на разработке.
   4. При работе с отраслевыми программами обязательно уточните, кто отвечает за методику расчета. Если заказчик, то меньше времени уйдет на подготовку к работе.
   5. При работе с dBase файлами уточните взаимодействие баз данных. Экспорт/импорт данных обеспечить можно, а одновременную работу в сети нет.
   6. При работе с x-бухгалтерией уточните язык программирования. Намного лучше в качестве основного языка использовать VBA, чем встроенный в бухгалтерскую программу.
   8. Вставляйте в договор пункты, которые защищают не только Ваши, но и интересы Заказчика. Например, укажите:
  • что Заказчик имеет право проверять ход и качество выполнения работ;
  • что доработки, связанные с отступлениями от технического задания, ошибками в расчетах и т. п. производятся Исполнителем за свой счет;
  • что Исполнитель вправе под свою ответственность вносить изменения в решение, как частных, так и узловых технических вопросов, в методику и содержание работы;
  • что можно приостановить ход выполнения работы из-за неучтенных проблем, связанных со сложностью, важностью, новизной или другим научно-техническим риском работы;
  • что Стороны признают юридическую силу текстов документов, полученных по электронной почте...
    Вообще все рассказать невозможно. Могу выслать примерные документы на разработку базы данных, а именно,  договор (4 страницы), техническое задание и календарный план. Для этого достаточно иметь какую-нибудь информацию, например, решите один или несколько вопросов из подписки в файле mdb.
Вопрос 110 (30.11.2000). Помогите, пожалуйста, необходимо получить информацию о системе в целом. В частности количество жестких дисков, их объем, если можно серийные номера, объем ОЗУ, тип видеокарты, процессор.
   Ответ. Пример по системной информации о дисках, а также их серийные номера приведен в файле la_api.mdb. Информацию можно использовать для защиты mde-программы. О том, как записать в реестр данные приведу позже.
Вопрос 150(05.01.2000) Обнаружил в Интернете Вашу программу "Книги бухгалтерии". После разархивирования инсталлировал программу успешно, но когда  решил посмотреть "в живую", после загрузки "Access" выскочила табличка с надписью: "Нераспознаваемый формат базы данных: 'С:\!Лидер\Книги бухгалтерии.mde'. Войдя в папку !Лидер обнаружил, что файлов .mde в ней нет. Повторная инсталляция ничего нового не дала. У меня стоит Windows 98 и Office 97. Может быть, Ваша программа работает только при наличии Office 2000? Будьте любезны и подскажите, в чём моя ошибка, почему не работает Ваша программа.
   Ответ. Программа "Книги бухгалтерии" вышла в новой редакции 4.0. Теперь Вы можете устанавливать ее для Access 97 или Access 2000. И так, если у Вас правильно установлена база данных Microsoft Access, то таких сообщений у Вас не должно быть.
Вопрос 152(05.01.2000) Подскажите пожалуйста, как скрыть окно Асс2000, использовании Api ("ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long) не работает, какой-нибудь другой способ. Спасибо!
   Ответ. Малютин Николай г.Якутск
Во-первых непонятно, почему не работает эта функция, но можно воспользоваться любой из функций, описанных ниже, вот только - зачем, окно Access позволяет использовать строку меню и панели инструментов, в том числе и только собственные для каждой формы. А так эта возможность утрачивается
Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
примеры вызова:
ShowWindow Application.hWndAccessApp, False
SetWindowPos Application.hWndAccessApp, 1, 0, 0, 0, 0, &H80
MoveWindow Application.hWndAccessApp, -50, -50, 0, 0, 1
Надо только не забывать устанавливать свойства формы "Всплывающее"-"Модальное" в True
У каждой свои недостатки MoveWindow и SetWindowPos - если не предпринять дополнительных действий, то разными манипуляциями можно восстановить окно Access, а при ShowWindow можно "потерять" форму.
Виктор Конюков. Большое спасибо за отличный ответ.
Вопрос 153(05.01.2000) Zdravstvuite. Vse Vi umejete pisatj interesnije veschi. Poetomu tem kto ne znajet soobschaju o sledujuschej vozmozhnosti. Jesli Vi moshete pisatj interesno takzhe na anglijskom, libo mozhete perevesti na anglijskij napisannoje Vami (sami, ili s chjej-nibudj pomoschju), to predlagaju Vam zarabotatj normaljnije denjgi, sozdav svoju rassilku na www.listpower.com. Eto server napodobije subscribe.ru, no pishut tam dlja sravniteljno bogatih amerikancev, sootvetstvenno, i zaravbotatj tam mozhno boljshe, chem na subscribe.ru. Spasibo za vinmanije.
   Ответ. Согласен с Вами, что надо перевести некоторую информацию на английский, т.к. дополнительные контакты с заграницей не помешают. Нет проблем и с оплатой. Но мне не понятен принцип работы сайта, не нашел ни архивов и каталога подписки. Поэтому обращаюсь к тем спецам, кто располагает большей информацией о сервисе сайта и работал с ним. Заранее благодарю за ответ.
Вопрос 154(05.01.2000) У меня возник такой вопрос. Стоит Access 2000, help по вопросам, связанным с самой Access на русском, а вот по Visual Basic на английском. В Access 97 вся помощь на русском, можно ли не устанавливая на машину Access 97, как то подцепить файл справки.
   Ответ. Напишите маленькую программу на Access для подключения разных справочных файлов. Подробно как открыть дополнительный файл справки написано в Лекциях по Access.
Вопрос 155(05.01.2000) При отсылке на печать отчетов (Windows-98, Access-2000, принтер НР DJ1100) постоянно происходит сбой форматирования страницы. То ориентация, то поля, то все сразу. Программой по сети пользуются несколько человек. Приходится каждый раз заходить в "Параметры страницы" и набирать заново. Отчеты сделаны впритык по листу бумаги, поэтому любой сбой вылезает в печать второго листа с кусочками. Программно страница не задается (как у вас в примерах отчетов). Программы для платежек в банк и для выписки счетов (самодельные).
   Ответ. Для того, чтобы понять причину Вашей проблемы, надо взять инструкцию по программированию ( не перепутайте с инструкцией для пользователя  ) лазерного принтера. Так вот, там Вы прочтете, что изображение формируется на валике принтера с отступом в несколько мм. Отсюда следует, что для того, чтобы Access правильно сформатировал отчет, надо заранее задать в конструкторе для него границы. Я, например, применяю отступ в 7 мм от края листа, и это помогает для большинства лазерных и струйных принтеров.
Вопрос 157(05.01.2000) Полностью ли совместимы базы данных Access 2.0 c Access 2000. Не могу открыть базу данных написанною в Access 2.0 в Access 2000.
   Ответ. Базы данных не совместимы. Надо конвертировать Access 2.0 в Access 97, потом в Access 2000. Если нужны лишь только данные, то возможно подключение к разным базам через ODBC драйвер.
Вопрос 158(05.01.2000) Какое максимальное количество пользователей может иметь доступ к БД одновременно через ODBS (если можно и для Access 97 и для Access 2000)?
   Ответ. Для Access 2000 - это 50 пользователей, поэтому если кто-то обещает Вам программу на Access для одновременной работы 100 пользователей, то это значит, что он не разбирается не только в базах данных, но и в операционной системе. Для Access 97 - это число примерно в два раза меньше, но точно сказать не могу.
   Игорь Макеев. Это несколько некорректный ответ. Справка Access декларирует до 255 одновременных подключений (97 и 2000), другой вопрос, сможет ли он их обеспечить.
Вопрос 159(05.01.2000) Можно ли в Access создавать хранимые процедуры и передавать в них параметры из внешних программ, например, написанных на C или VB?
   Ответ. Для простоты будем считать, что компилятор С++ создает только exe файл, а Access - mde файл, в котором и сохраняются наши функции.
   1 вариант.  Запущен exe файл, надо вызвать VBA программу. Файлы базы данных имеют другую структуру, чем ту, которую имеют "родные" файлы операционной системы и следовательно  "в лоб" вызвать функцию не получиться. А вот, если Вы попробуете найти в MsAccess.exe функцию, которая отвечает за загрузку VBA функции в операционную систему, то это вполне реально, но очень сложно и составляет служебную информацию с грифом "Совершенно секретно" компании Microsoft (шутка).
   2 вариант. Запущен mde файл, надо вызвать программу из exe или dll файла. Здесь проблем больших нет, смотрите вызов api функций. Сложности возникают, когда Вы планируете создать серьезную базу данных. Вам потребуются дополнительные знания языка С++, т.к. только он дает наиболее короткий и быстрый код. Некоторые сложности возникают при передаче форм или других управляющих элементов, но все это в принципе разрешимо. Работа очень сложная, но зато Ваша база данных будет работать с космической скоростью, чем та, которая полностью разработана в mdb файле.
Вопрос 160(05.01.2000) Где можно скачать дополнительные русифицированые файлы справки по программированию в Access 2.0, 97, 2000; VBA?
   Ответ. Не знаю о каких дополнительных файлах идет речь. Все новые версии VBA будут поставляться Microsoft в оригинале, т.е. на английском языке. Встроенные справки на русском языке по Access 2.0 и 97 можно получить при установке этих версий.
Вопрос 161(05.01.2000) Нашей организации приходится за��лючать много договоров. Конечно, при этом желательно, чтобы эти договора имели эстетичный вид. Но я не знаю, как этого добиться в Access. Например, в Word есть такое понятие “выравнивание по ширине”, а в Access – нет ничего подобного. Пыталась выйти из данной ситуации разными способами, например, вводила частично текст договора в Word, затем вставляла эти фрагменты в отчет Access (договор сформирован в виде отчета), но этот способ имеет много недостатков. Пробовала проводить слияние с текстовым документом Word, но из-за того, что отчет формируется по запросу с параметрами (видимо, из-за этого) ничего не получилось – программа просто зависает.
   Ответ. В Access есть функция выравнивания по ширине, но на панелях инструментов для нее не хватило места или ее забыли вставить. Ее можно установить, если Вы для элемента с текстом вызовете его свойства и элементу "Выравнивание текста ... "  установите значение "Подбор". К сожалению перенос слов в этом случае не работает. P.S. Лучше, конечно, договор построить в Word, а текст хранить в базе данных.
Вопрос 163(09.01.2000) Не могли бы Вы рассказать, как Вы делаете круглые или овальные формы. Если Вас это не затруднит, то напишите, как такое чудо сделать.
  Ответ. Внимательно изучите коды на сайте, и я думаю Вы догадаетесь. Необычные формы в программах - это своего рода торговая марка программ сборника "Лидер Access", чтобы пользователи отличали профессиональную программу от интерфейса других баз данных. Исходя из вышеизложенного, можно сказать, что профессионал по Access сможет разработать такую форму. Для всех других предлагается недорого приобрести таймер в открытых кодах. Тогда Вам станет понятно также, как сделать форму "Объемной".  Более сложный код, с недокументированными функциями Access, продается организациям - это "Книги бухгалтерии". Его можно использовать как кирпичик для создания разнообразных баз данных, например, для заказных работ при смене учета в организациях с Excel на Access.
Вопрос 165(09.01.2000) Проблема: Установил Win2000  пока без Office2000 , и программы Access 97 не работают. Все вроде нормально, но некоторые формы, отчеты не открываются даже в режиме конструктора. WIN2000 выдает сообщение: Память не может быть Read, и Ассess закрывается. Некоторые программы удалось вылечить, скопировав глючные формы из архива. Но некоторые не лечатся. Что можно предпринять?
   Ответ. Если программы начинают "чудить", то и решать их надо по другому. Что такое ошибка? Она всегда женского рода. А что для женщины самое главное - это не только трезвый муж, но и хороший новый дом. Вот с этого и надо начинать. Во первых, создайте новую базу данных. Во вторых, установите в ней нужные ссылки. В третьих, импортируйте все объекты из старого проекта. В четвертых, откомпилируйте все программы. Если есть ошибки, то они сразу "вылезут" наружу покрасоваться, а те, которым больше нравиться старый проект, останутся жить в нем. Вообще этот метод надо применять всегда при переходе на новые версии Windows или Access. Очень часто помогает, так как сжатие базы данных, даже с флажком компрессии не удаляет некоторые ненужные и невидимые куски редактирования mdb файла.
Вопрос 162(09.01.2000) Есть вопрос. Как программно добраться до буфера обмена Windows. В VB Clipboard.Gettext и т. д. В Accese (2000) не работает.
  Смотрите: la_api.mdb пример 3.
Вопрос 167(09.01.2000) При запуске Вашей программы "Лидер" в Access появляется сообщение "нераспознаваемый формат базы данных". Сообщите, пожалуйста, как поступить дальше.
   Ответ. a) Скачайте новую версию программы "Книги бухгалтерии", версия 4.0. Эта версия поддерживает и Access 97 и Access 2000. Минимальные требования к программному обеспечению - это Windows 98 (или 2000) + Office 97 (или 2000) + Access. b) Для всех программ в открытых кодах mdb необходимо наличие Office 2000+Access.
Вопрос 168(09.01.2000) У меня такая проблема - параметры страницы в отчетах не сохраняются. Как можно из VB выставить поля страницы? Встречались ли Вы с такой проблемой в 2000-м Access? Буду признателен за любой ответ.
    Ответ. Да, в Access 2000 есть такая ошибка. Подробно о ней писалось в рассылке 8, смотрите номер 7(отмечена красным цветом). Для того, чтобы исправить ее, надо приобрести пакет обновления SR1 или в группе: Параметры ... -> Общие -> Автозамена имен снять флажки со всех элементов.
Вопрос 170(09.01.2000) Начался 2001г. Я скопировал свой mdb файл в новую папку и решил удалить данные в таблицах, чтобы в Новом году все было новое. Но не тут то было: выдается сообщение: "Невозможно удалить данные в связи с тем, что они имеют
связи с другими таблицами" - или что-то в этом роде. Теплые воспоминания остались от dbase - там кажется была команда "Скопировать структуру". Как быть в случае Access-2 - неужто разрушать все связи, удалять записи, а потом восстанавливать связи? Наверное я что-то не знаю. Все должно быть гораздо проще. В толстых книжках и во встроенной справке я ответа не нашел.
  Ответ. Проблему можно решить следующим образом. Сначала найдите подчиненные таблицы и удалите записи там. Далее удалите записи в вышестоящих таблицах. P.S. Все это лучше сделать программным способом. Пример 12 для определения связей в таблицах дан в файле: la_table1.mdb
Вопрос 171(09.01.2000) Недавно стал изучать Access и основательно застрял. Подскажите, пожалуйста, как осуществить выборку для последующего апгрейда N-го кол-ва записей из таблицы. N задается пользователем в процессе работы.
   Обновление записей лучше делать из модуля VBA. Пример отбора N записей (введены пользователем в поле N формы myForm) из таблицы указан ниже для DAO (т.е. Access 97 и 2000): Set rst = dbs.OpenRecordset("SELECT TOP " & Forms("myForm")!n & " myTable.*, * FROM myTable ORDER BY myTable.Имя;")
Вопрос 172(09.01.2000) Интересуюсь сетевой складской программой, способной работать с отрицательными остатками, имеющей оборотную ведомость, и желательно распечатывающей счета-фактуры.
   Ответ. Да программа по складу работает с отрицательными остатками. Это происходит тогда, когда продукция отгружается сразу, минуя склад. Единственно, что надо учесть, чтобы правильно соблюдать итоговые отчеты по отгрузке, надо в начале месяца "подбивать" остатки предыдущего периода. В этом случае не будет отрицательного сальдо в оборотной ведомости, и возможно правильно рассчитать себестоимость.
   Естественно программа печатает счет-фактуру и накладные за одно нажатие кнопки. Число документов и их тип настраивается пользователем.
Вопрос 173(09.01.2000) Какие курсы по Access Вы можете посоветовать?
   Ответ. Получить профессиональное образование на курсах невозможно. Я прошел курсы по Windows NT в популярном учреждении. Не буду называть его, чтобы не обижать сотрудников. Но так механизм работы курсов везде одинаков, имеет смысл рассказать о некоторых странностях обучения. Во первых, Вы подписываете бумагу, где есть пункт, что Вы не будете отвлекать преподавателя вопросами не по теме. Далее на первом занятии выясняется, что тема курсов опирается на какой - нибудь учебник. Вам будет рекомендовано купить 2-3 книги. Группы формируются не по уровню знаний, а совершенно из разных людей. Например, наиболее вероятно, что у Вас будет несколько человек, присланных из Фонда занятости на переподготовку с "нулевыми" знаниями. Так что, решить серьезные вопросы по базам данных Вам не удастся. Кроме этого надо понимать, что преподаватель получает зарплату за часы, а не за уровень Ваших знаний.
    Вообще "Базы данных", это не тот предмет который изучают на курсах. Оптимальная форма учебы - это индивидуальные занятия, например, как при изучении английского языка с репетитором. И так, если у Вас нет никаких знаний, то общие понятия на курсах Вы получите, но базу данных Вам не спроектировать. Если же Вам нужны серьезные знания, "без воды", то лучше заключить договор с профессионалом на разработку любой программы на 1-2 месяца. Затраты те же, но смело к ним можете добавить не только знания по базам данных, но и знакомство с профи и плюс решение проблемы предприятия.
   Дополнительно могу сказать, что при создании баз данных разработчики часто используют знания и других языков программирования. Например, я бы посоветовал бы серьезно изучить С++. Меня эти знания часто выручают в сложных ситуациях программирования. Бывает, что хороших примеров на VBA или VB нет, то на С++ их можно найти. Дополнительно становиться понятным применение таких вещей, как препроцессор (#if, #else), использование указателей на строки (с \0) в api интерфейсе и т.д.