Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Access 2000 - программирование и готовые решения


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Выпуск 18. Начало уроков по Access

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

Access 2000. Урок 1. Введение
   Microsoft Access 2000 [Майкрософт Эксис 2000] - компьютерная программа для работы с базами данными [1]. Она распространяется отдельно или в составе продуктов Microsoft Office 2000. Если Вы желаете получить максимум информации о ее возможностях, то желательно иметь у себя один из следующих комплектов Microsoft Office 2000: Professional, Premium или Developer.
  Access еще называют СУБД [2] реляционного типа, а программирование в ней - объектным. Это связано с тем, что в файле базы данных в отличие от других баз данных (dbf [4]) можно хранить разные объекты [3] и назначать между ними связи, отношения (relation).
  Почему же база данных стала самой популярной в мире? Ответ на этот вопрос дан ниже при сравнении с другими средствами проектирования.
  С++  и Delphi [5] - дают самый компактный исполняемый код [6] для Windows приложений. Недостаток их - неудобство в работе. На диске у Вас будет много файлов. Например, для C++ (*.cpp, *.h, *.def, *.h, *.mak, *.rc), для Delpi (*.pas, *.dfm, *.dcu, *.db, *.mb, *.px), причем, с короткими английскими именами до 8 символов. В больших проектах, становиться сложно управлять ими, а тем более быстро вносить изменения от заказчика. Поэтому работая с файлами этих программ, даже на примитивном уровне, от Вас потребуется сразу высокая квалификация как программиста.
  Microsoft Exсel - программа чем-то похожа на таблицы Access. Недостаток ее - проблемы при работе с большим количеством таблиц и данных, а также, малое количество помощников (конструкторов), которые помогают Вам создавать простой и понятный интерфейс для пользователя.
  VisualBasic - по сравнению с С++ и Delpi создает более длинный код, и при работе в сети будет медленно работать с mdb файлом из-за отсутствия единой управляющей программы. Что это за программа? Пока объяснять не буду, но она всегда запускается при открытии Access и контролирует действия приложения от возможных ошибок, а также отвечает за загрузку и сохранение данных в базах данных.
  Таким образом, приведенные выше примеры говорят о том, что Вы правильно выбрали Access - как лучшее средство для быстрой разработки программного обеспечения.
Словарь
   ∙ [1] База данных (database) - файл, имеющий расширение mdb. Он разрабатывается пользователем и служит для сохранения информации.
   ∙ [2] СУБД - система управления базой данных
   ∙ [3] Объект (object): элемент базы данных, например, таблица (table), запрос (query), форма (form), макрос (macro), отчет (report), модуль (module)
   ∙ [4] dbf - файл базы данных dBase
   ∙ [5] С++ и Delpi (Pascal) - самые популярные языки программирования. Наиболее известная компания, разработчик этих систем Borland (Inprise Corp.) - давний конкурент Microsoft.
   ∙ [6] Исполняемый код - программа с расширением exe (execute), которую выполняет операционная система Windows по запросам пользователей.
Примеры mdb программ:
   1. http://www.liac.nm.ru/subscribe/examples.htm (ссылка на mdb-коды для обучения)
   2. http://www.liac.nm.ru/shop/shopprice.htm (ссылка на mdb-коды в магазине 'Лидер Access')
   3. http://www.liac.nm.ru/subscribe/questions.htm (обсуждаемые вопросы пользователей)

Ответы на вопросы
     Вопросы Вы можете задавать по email: LiderAccess@bigfoot.com или опубликовать на сайте в разделе "Доска объявлений". Ответ попадает в подписку в том случае, если на него будет достаточно ответов. Кроме этого, если к вопросу придут замечания после рассылки, то они не рассылаются, а просто публикуются на сайте в соответствующем разделе подписки.
 
Вопрос 11.   ACCESS 2000 работает в 2-х режимах: - старом с провайдером Microsoft.Jet.OLEDB.4.0 - и новом, с каким либо из провайдером сервера  При этом в первом случае, ACCESS автоматически подключается к провайдеру Jet, а во втором, в диалоге можно выбрать провайдера сервера. Если возникает необходимость основную часть БД держать на сервере, а небольшую часть в формате *.mdb на клиенте (в основном tmp таблицы или, возможно, прибегнуть к обработке информации из MS Servera возможностями SQL Jet). Как организовать одновременную работу проекта ACCESS с готовыми формами от разных провайдеров?
Igor V. Makeev igor@mebelmassiv.tula.ru 
'1 пример

Dim cm As ADODB.Command
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString ="Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;DataSource = C:\Temp\Access\2000\db1.mdb"
cn.Open
Set r = New ADODB.Recordset
r.CursorLocation = adUseClient
r.Open "select * from test", cn, adOpenKeyset
Set Me.Recordset = r
'2 пример, DAO
Dim ws As DAO.Workspace
Dim db As DAO.Database
Dim r As DAO.Recordset
Set ws = CreateWorkspace("NewJetWorkspace", "admin", "", dbUseJet)
Set db = ws.OpenDatabase("C:\Documents and Settings\Igorek\Мои
документы\Access\2000\db1.mdb")
Set r = db.OpenRecordset("Test", dbOpenDynaset)
Set Me.Recordset = r
 
Виктор Конюков.
 Я бы добавил еще несколько примеров по составлению командной строки для обращения к другим провайдерам с использованием ADO.
Access: "Provider=MSRemote;RemoteServer=http://myFolder;RemoteProvider= Microsoft.Jet.OLEDB.4.0; DataSource=mydb.mdb" (удаленный доступ к филиалу)
Excel: "Provider=Microsoft.Jet.OLEDB.4.0;DataSource= test.xls;ExtendedProperties=""Excel8.0; HDR=Yes;"";" (работа с электронными таблицами)
Oracle:
"Provider=OraOLEDB.Oracle;DataSource=mydb;UserId=xxx;Password=;" (подключение через  Oracle)
SQL server: "Provider=sqloledb;NetworkLibrary=DBMSSOCN;DataSource=xxx;InitialCatalog=myFolder; UserId=xxx;Password=;" (Microsoft SQL server)
P.S. Если есть мысли по улучшению кода - присылайте, опубликуем со ссылкой на автора.
Вопрос 15. В своих примерах Вы часто используете библиотеки Виндов. Где можно получить информацию о них, об их объектах и свойствах? Меня заинтересовал TreeView (и не только).
Igor V. Makeev igor@mebelmassiv.tula.ru 
Help от MS ODE Tools.
Виктор Конюков Я бы добавил, что литературы на русском языке, по данной тематике я не встречал. Так что в качестве пособия Вы можете использовать еще библиотеку MSDN: msdn.microsoft.com
Вопрос 23. Добрый день, я пытаюсь сделать простую базу в Access и у меня такой вопрос: В таблице есть дата оплаты и сумма оплаты в рублях, в другой таблице перечень курсов по датам, мне нужно получить сумму в валюте... к сожалению я не знакома с VBA, можно ли решить мою проблему с помощью запроса?
Igor V. Makeev igor@mebelmassiv.tula.ru
SELECT idpay, rub_sum, date, rub_sum*(select top 1 val from curs where setdt
<= date order by setdt desc) AS valut_sum FROM sum; 
ВАlеx. Это можно сделать с помощью SQL запроса:
SELECT Таблица1.Дата, Таблица1.СуммаВРублях, Таблица2.Курс_РубЗаДол,
[СуммаВРублях]/[Курс_РубЗаДол] AS СуммаВДолларах
FROM Таблица1 LEFT JOIN Таблица2 ON Таблица1.Дата = Таблица2.Дата;
Таблица1 (Дата, СуммаВРублях)
Таблица1 (Дата, Курс_РубЗаДол)
Считаем, что одному числу (дате) соответствует только одно число (например, только курс рубля к доллару). Если в справочнике курсов несколько валют, тогда в каждой таблице нужно ввести код валюты. Тип соединения таблиц зависит от предметной области (т. е. INNER JOIN или LEFT JOIN). Как самому сделать что-то похожее. Зайти в режим конструктора запросов. Задать соединение между таблицами. Выбрать поля, которые будут нужны при вычислениях или (и) их нужно будет выводить на экран. Записать запрос. Для нового поля правой кнопкой мышки вызвать построитель выражений ("Построить"). Набрать нужное выражение с помощью построителя запросов. В Help по-моему есть примеры по построителю выражений.
Виктор Конюков

Вы можете также посмотреть пример N2 в файле: la_query.mdb.
Вопрос 22. Очень хочется, при создании программным путем запросов (да и вообще чего угодно), добиваться эффекта поставленного флажка "скрытый" в свойствах запроса, к сожалению в свойствах запроса как документа, я этого не нашел.
 Виктор Конюков . Ниже приводится 2 примера для скрытия запроса и таблицы. Для других элементов используйте функцию SetHiddenAttribute аналогично указанным примерам.
Application.SetHiddenAttribute acQuery, "Запрос1", True
Application.SetHiddenAttribute acTable, "Таблица1", True
Для скрытия других элементов базы данных используйте свойство Visible, т.е Visible = False.
Igor V. Makeev igor@mebelmassiv.tula.ru
Стоит уточнить, что это верно для Аccess 2000, в Access 97 нет такого метода у Application
Вопрос 25. Если связываемая БД FoxPro лежит на сервере, как сделать к ней доступ, т.е. связать с ней, она ругается в Access 97, что там нет доступа т.к. таблица FoxPro используется другим?
  Закройте бухгалтерскую программу, которая использует файл FoxPro, а потом запустите Access. А также почитайте информацию в разделе сайта dbase.
Вопрос 28. У меня возникла одна маленькая проблема как увязать Word и Access, а именно Существует поле гиперссылки куда ссылка на файл, находящийся на жестком диске. Как можно максимально упростить задачу добавления гиперссылки в поле? Скажем в форме где находится поле гипессылки есть другое поле данные которого равны названию папки на жестком диске, скажем данные "Импульс" , Папка на жестком диске "D:\Temp\Импульс". Есть также другое поле, поле с датой. Можно ли сделать так чтобы при нажатии на поле гиперссылки Открывался Word и Создавался бы файл в данном случае в папке "Импульс" с названием из поле дата скажем 22-июн-99г. Но это идеальный вариант, если такое сложно описывать, то хотя бы просто упростить задачу добавления гиперссылки
Igor V. Makeev igor@mebelmassiv.tula.ru 
Один из способов:
1. Создаем форму
2. Размещаем на ней два поля: plFolder и plDate
3. Размещаем надпись lblLink
4. Свойство надписи <Адрес гиперссылки> (HyperlinkAddress) устанавливаем в
file:\\, просто, чтобы ссылка светилась
5. Оформляем событие надписи MouseDown
Private Sub lblLink_MouseDown(Button As Integer, Shift As Integer, X As
Single, Y As Single)
Dim wdApp As Object
Set wdApp = CreateObject("word.application")
wdApp.Documents.Add
wdApp.ActiveDocument.SaveAs Me.plFolder + Format(Me.plDate, "Medium Date") +
".doc"
wdApp.Quit
Set wdApp = Nothing
Me.lblLink.HyperlinkAddress = "file:\\" + Me.plFolder + Format(Me.plDate,
"Medium Date") + ".doc"
End Sub
6. Получаем требуемую функциональность вводя в поле plFolder путь, а в
plDate - дату.
7. Добавляем по вкусу обработку исключительных ситуаций и ошибок.
Вопрос 41. Если у Вас есть возможность, прошу посоветовать: КТО виноват и ЧТО делать? Ситуация: Есть складская программа под DOS. Из нее периодически делается экспорт в текстовые файлы. Access97 с периодом в 20сек ищет эти файлы и печатает к ним отчет. База данных для программы под Access лежит на WinNT Server4.0 (используется совместно с выгружаемыми файлами для формирования отчета). Для печати отчета применяется Docmd.OpenReport. Работа происходит так: Пользователи запускают программу под Access (и больше к ней не возвращаются), запускают складскую программу (полноэкранный режим, DOS) и работают в ней, а Access тем временем печатает отчеты к файлам, которые они выгружают. Проблема:
    Если работа происходит на рабочей станции Win98 - все работает нормально, но если работа происходит на NT (Ws или Ser) то иногда (частоту и связь с действиями пользователей установить не удается) в момент вывода отчета на печать посредством DoCmd.OpenReport возникает ошибка: "Использован метод DoCmd для запуска макрокоманды в Visual Basic, но затем в диалоговом окне была нажата кнопка Отмена. Например,..." ну и соответственно этот отчет не печатается. Такое впечатление, что NT как-то отменяет печать отчета. Вы не встречались с подобной проблемой?
   Igor V. Makeev igor@mebelmassiv.tula.ruМожно попробовать отлавливать ошибку по On Error и запускать отчет на печать снова (число раз можно контролировать) или просто игнорировать.
   Виктор Конюков Попробуйте перед печатью файла в Windows NT сначала открыть, а потом закрыть его. Если будет ошибка, то у Вас проблемы с допуском к файлу.
    P.S. Пора переходить от складских программ под Dos на Windows.
Вопрос 43. Можно ли заставить отчет печататься на всех принтерах и без уведомления о том, что он был якобы отформатирован для другого принтера???
   Igor V. Makeev igor@mebelmassiv.tula.ru 
   Можно посмотреть свойства, относящиеся к принтеру PrtDevMode, PrtDevNames и PrtMip. Конкретней не скажу, не разбирался, но наверняка есть информация в MSDN.
   Виктор Конюков. Можно попытаться "сбросить" отчет в файл, а потом послать его копию на принтер. Однако, если у Вас принтеры разные, то из-за драйвера, который выводит на печать информацию, это может не получиться.
Вопрос 63 (15.11.2000). До установки Access 2000 я успешно использовал в формах и модулях встроенную функцию Date(), теперь мне выдаётся сообщение об ошибке и приходится использовать Now(), формат которой крайне не удобен.
Виктор Конюков.
Вообще Date() хранится в библиотеке VBA (VBE6.DLL). Поэтому в ссылках она должна быть указана. Для чего нужны ссылки я привел в лекциях.
Igor V. Makeev igor@mebelmassiv.tula.ru 
Ответ стандартный: проверить ссылки, меню Tools - References... не должно быть "сломанных" 
Вопрос 66 (16.11.2000). Написал небольшую БД для учёта ЗИП на телефонной станции. Недавно появилась возможность работать с Access-2000.Открыв окно Access-2000, я понял что уже всё забыл и ничего не понимаю. Прошу Вас, если это возможно, сообщите как можно найти или приобрести учебники (обязательно с большим количеством примеров) желательно в электронном виде.
   Учебников с большим количеством примеров, в том числе и электронных, я не встречал. В некоторых книгах по Access есть CD диск c программами на VBA, но информации в них явно недостаточно. Так, что следите за примерами на сайте или задавайте вопросы.
Вопрос 67 (16.11.2000). В Access2000 произвожу экспорт таблицы в формат Paradox, нормально экспортирует, но кодировка получаемой базы .db почему-то 866, не подскажите как сделать 1251.
 Зайдите на сайт в раздел "Таблицы - dBase" там указано как это сделать. Ссылка на страницу в Интернете: http://www.liac.nm.ru/subscribe/s_dbase.htm
Вопрос 70 (16.11.2000). В Ваших ответах часто встречаю ссылку на файл LaForm.mdb, не поняла где его взять, может что-то упустила.
 Возможно у Вас нет возможности работать через Интернет, тогда Вам лучше скачать некоторые страницы сайта в интернете, где указаны все файлы с примерами на Access. Смотрите ссылки в конце урока. Часть файлов mdb, например, la_form.mdb, la_report.mdb находятся по адресу: http://www.liac.nm.ru/subscribe/zip/la_form.zip (la_report.zip)
Вопрос 71 (16.11.2000). Я начинающий программист (если так можно выразиться) у меня есть одна проблема в Access у меня в база организована так, что есть группы и есть подгруппы, но проблема в том, что не все группы имеют подгруппы. В результате в отчете, получается - название группы, потом название подгруппы, далее данные. А в тех группах где нет подгрупп - пустые строки. Подскажите, можно сделать так, чтобы в отчете этих пустых строк не было. Ну нет у подгруппы названия - не выводи вообще названия
подгруппы.
Виктор Конюков.  
В вашем случае надо уметь научится использовать команду Cancel в отчете. Для этого для каждой записи отчета проверяется наличие в ней данных, если их нет, то она отменяется. Смотрите пример N8 в файле: la_report.mdb
Igor V. Makeev igor@mebelmassiv.tula.ru 
Варианты зависят от конкретного отчета и структуры данных, можно посоветовать в событии «Форматирование» (Format) области данных управлять видимостью полей с помощью Visible или, что имхо лучше, свойствами MoveLayout, NextRecord, PrintSection (описание работы смотреть в Help)
Вопрос 74 (17.11.2000). У меня вопрос слегка ленивый: можно ли сделать так, чтобы при вводе в одно поле названия города, в соседнем автоматически вставлялся его телефонный код?
Виктор Конюков.  
Если не лень, загрузите файл: la_form1.mdb. Там есть пример 12 "Заполнение реквизитов". Добавьте туда поле телефон и проблема разрешится.
Igor V. Makeev igor@mebelmassiv.tula.ru 
Ленивый ответ: можно. :) Вариантов много: DLookUp на AfterUpdate, лишний столбец в поле со списком (если город представлен так) или запрос для формы правильно построить.
Вопрос 75 (17.11.2000). И еще:) Год назад мне пришлось создать базу данных с нуля(я даже не слышала слова Access до этого). БД не маленькая, честно:) Работаю в пользовательском режиме (конструктор, кнопочки..). Вообще-то ничего, но с тех пор, как начала читать Вашу подписку, где много пишется про программный метод работы с БД, ... самой захотелось..:) Где можно об этом почитать? Учусь быстро, но даже понятия пока не имею, КУДА это все программки вписывать:) Прошу не смеяться. я серьезно!
  Ответ. Ничего смешного нет, все так начинали. А Ваш вопрос задавали уже несколько раз, потому что в Access не все так просто, как в Microsoft Word. Грамотно начать работать достаточно сложно. Теперь в рассылке я буду печатать некоторые уроки по Access для начинающих, а не только отвечать на вопросы. Ответ по существу. 1. Специальной литературы по программированию нет, некоторую информацию по программированию опубликована в книгах по Access. 2.Программы вписывают в объект: "модуль", который Вы создаете сами или в так называемый модуль класса, который связан с формой.

Copyright © 20.11.2000 Виктор Конюков,  (Web: www.liac.nm.ru, Email: LiderAccess.bigfoot.com)


http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное