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

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

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

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

Выпуск 19. Начало уроков по 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 по запросам пользователей.

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


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

Вопрос 2. Возникла следующая проблема. Access 97 (SP2). В форме используется ToolBar. В подформе в обработчике Form_BeforeUpdate происходит некая проверка и может выдаваться Question. Если выход из подформы осуществляется при щелчке мыши по ToolBar, то после выдачи сообщения "теряется" клик (нажатия на кнопку не происходит, а если перемещать курсор над кнопкой, по которой был клик, она "утапливается").
  Ответ. После обработки события перерисуйте форму или сделайте "лишние" действия, чтобы фокус с кнопки пропал.
Вопрос 4. Помогите пожалуйста решить одну "проблемку". Суть дела: - Есть форма, есть 2 кнопки в форме, есть отчет. Надо: чтобы при нажатии 1-ой кнопки отчет уходил на печать на 1-ый принтер, установленный в системе, а при нажатии 2-ой, соответственно на 2-ой принтер. Думаю, что есть пути решения вопроса.
Игорь В. Макеев Кстати, по поводу настроек принтера, рекомендую ссылку: http://www.emoney.ru/access/adhch10.zip
Виктор Конюков
Вообще на эту тему много всего написано. Я дал свой вариант работы с принтерами. Код дан с подробным описанием каждой функции, структуры, даже каждой строчки на Бэйсике для принтера. Есть "птичка" для авто-печати отчета.
Вопрос 11.   ACCESS 2000 работает в 2-х режимах: - старом с провайдером Microsoft.Jet.OLEDB.4.0 - и новом, с каким либо из провайдером сервера  При этом в первом случае, ACCESS автоматически подключается к провайдеру Jet, а во втором, в диалоге можно выбрать провайдера сервера. Если возникает необходимость основную часть БД держать на сервере, а небольшую часть в формате *.mdb на клиенте (в основном tmp таблицы или, возможно, прибегнуть к обработке информации из MS Servera возможностями SQL Jet). Как организовать одновременную работу проекта ACCESS с готовыми формами от разных провайдеров?
   Игорь Макеев 
'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
Help от MS ODE Tools.
Виктор Конюков Я бы добавил, что литературы на русском языке, по данной тематике я не встречал. Так что в качестве пособия Вы можете использовать еще библиотеку MSDN: msdn.microsoft.com
Вопрос 23. Добрый день, я пытаюсь сделать простую базу в Access и у меня такой вопрос: В таблице есть дата оплаты и сумма оплаты в рублях, в другой таблице перечень курсов по датам, мне нужно получить сумму в валюте... к сожалению я не знакома с VBA, можно ли решить мою проблему с помощью запроса?
Igor V. Makeev 
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
Стоит уточнить, что это верно для Аccess 2000, в Access 97 нет такого метода у Application
Вопрос 24. У меня проблема! не могу связать акцесную базу с фаилом FoxPro .dbf, т.к. в списке выбора типа связываемой таблицы нет FoxPro, а есть Dbase, но он не подходит. Как быть в этом случае?
  Надо найти драйвер ODBC FoxPro, посмотрите на сайте Microsoft.
Вопрос 25. Если связываемая БД FoxPro лежит на сервере, как сделать к ней доступ, т.е. связать с ней, она ругается в Access 97, что там нет доступа т.к. таблица FoxPro используется другим?
  Закройте бухгалтерскую программу, которая использует файл FoxPro, а потом запустите Access. А также почитайте информацию в разделе сайта dbase.
Вопрос 28. У меня возникла одна маленькая проблема как увязать Word и Access, а именно Существует поле гиперссылки куда ссылка на файл, находящийся на жестком диске. Как можно максимально упростить задачу добавления гиперссылки в поле? Скажем в форме где находится поле гипессылки есть другое поле данные которого равны названию папки на жестком диске, скажем данные "Импульс" , Папка на жестком диске "D:\Temp\Импульс". Есть также другое поле, поле с датой. Можно ли сделать так чтобы при нажатии на поле гиперссылки Открывался Word и Создавался бы файл в данном случае в папке "Импульс" с названием из поле дата скажем 22-июн-99г. Но это идеальный вариант, если такое сложно описывать, то хотя бы просто упростить задачу добавления гиперссылки
Игорь Макеев 
Один из способов:
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. Добавляем по вкусу обработку исключительных ситуаций и ошибок.
Вопрос 30. У меня проблема - создала форму с кнопками, для них написала код. Потом удалила эту форму - а в проекте в списке форм она осталась, и теперь не знаю, как её можно удалить. Копалась в help-е, бесполезно :(
  Ваша проблема легко решается. Для этого надо создать новый проект и передать в него путем импорта все объекты. Удаленная форма останется в старом проекте.
Вопрос 33. Опять все то же поле "дата/время". Маска ввода в форме: "##.##.##" При переносе файла базы данных на другой компьютер разделители в маске почему-то меняются "##:##:##" Поскольку в системных настройках в качестве разделителя используются точки, при вводе данных в это поле выдается сообщение об ошибке. Т.е. mde-файл создать нельзя, потому что приходится править маски во всех формах. Не встречались ли Вы с такой проблемой, и можно ли ее каким-либо образом решить?
 Игорь Макеев Можно посоветовать формировать маску при открытии формы.
Вопрос 37. Не хочу Вас сильно утруждать, поэтому сразу к вопросу: как напечатать один отчёт два раза на одном листе? Это гарантийный талон, нужна печать с обоих сторон.
  Самое лучшее - это купить принтер с двухсторонней печатью. Если нет возможности можно использовать команду: DoCmd.PrintOut, которая позволяет отпечатать отчет по страницам.
Вопрос 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 Можно попробовать отлавливать ошибку по On Error и запускать отчет на печать снова (число раз можно контролировать) или просто игнорировать.
   Виктор Конюков Попробуйте перед печатью файла в Windows NT сначала открыть, а потом закрыть его. Если будет ошибка, то у Вас проблемы с допуском к файлу.
    P.S. Пора переходить от складских программ под Dos на Windows.
Вопрос 42. У меня возникла такая проблема - необходимо динамично выделять цветами различные строки в ленточной форме. Самостоятельный поиск решения (по крайней мере средствами Access 97) не принес положительных результатов. Одно решение этой проблемы я обнаружил на сайте Microsoft. Автор предлагает использовать прозрачный фон у полей с данными + поле OLE (с битмапом) связанное по "нужному" алгоритму через запрос. (файл прилагается) Однако в моем случае этот вариант неприемлем ввиду того что при удалении записи удаляется и запись в таблице где хранятся битмапы, т.е. полностью удаляется цвет раскраски. Отслеживать все удаления записей и соответствующее восстановление битмапов на мой взгляд слишком громоздко и некрасиво. Организовать присвоение полю значение OLE так же не получилось, так как VBA не поддерживает работу с бинарными потоками.
     Игорь Макеев Надо всего лишь правильно расставить связи между таблицами. Видел этот вариант, нормально работает.
Вопрос 43. Можно ли заставить отчет печататься на всех принтерах и без уведомления о том, что он был якобы отформатирован для другого принтера???
   Igor V. Makeev
   Можно посмотреть свойства, относящиеся к принтеру PrtDevMode, PrtDevNames и PrtMip. Конкретней не скажу, не разбирался, но наверняка есть информация в MSDN.
   Виктор Конюков. Можно попытаться "сбросить" отчет в файл, а потом послать его копию на принтер. Однако, если у Вас принтеры разные, то из-за драйвера, который выводит на печать информацию, это может не получиться.
Вопрос 46. Помогите пожалуйста решить небольшую проблему.
Я хочу открыть объект Recordset на основе инструкции SQL:
Private Sub GetSumSalling()
Dim MyRst As ADODB.Recordset
Set MyRst = New ADODB.Recordset
MyRst.Open "SELECT Sum([qryGoodsSaling].[SumOfQuantity]) AS SUMALL FROM qryGoodsSaling", CurrentProject.Connection
Debug.Print MyRst!SUMALL
MyRst.Close
Set MyRst = Nothin
'Похоже что Access ругается на то, что подчиненный запрос ссылается на данные ActiveX 'элемента подчиненной формы subFrm. Может существует какое-то альтернативное решение ? Я решил свою проблему следующим образом:
Dim dbs As Database
Dim rst As Recordset
Set dbs = CurrentDb()
Dim qdf As QueryDef
Set qdf = dbs.QueryDefs("qryQV")
qdf.Parameters("[Forms]![frmGoodsMain]![Item Number]") = _
[Forms]![frmGoodsMain]![Item Number]
qdf.Parameters("[Forms]![frmGoodsMain]![subFrm].[Form]![ocxDateStart]") = _
[Forms]![frmGoodsMain]![subFrm].[Form]![ocxDateStart]
qdf.Parameters("[Forms]![frmGoodsMain]![subFrm].[Form]![ocxDateEnd]") = _
[Forms]![frmGoodsMain]![subFrm].[Form]![ocxDateEnd]
Set rst = qdf.OpenRecordset(dbOpenSnapshot)
MsgBox rst!SUMALL
rst.Close
dbs.Close
Виктор Конюков. Старайтесь заменять такие длинные ссылки на более короткие, например, set frm = [Forms]![frmGoodsMain]![subFrm].[Form]. Это %% 70 увеличивает скорость.
Вопрос 48. Можно ли в контекстное меню поля формы ACCESS 97 ДОБАВИТЬ свой пункт меню, НЕ удаляя стандартные пункты ?
   Игорь Макеев Например, подробности в Help.
Dim newItem As CommandBarControl
Set newItem = CommandBars("Form View
Control").Controls.Add(Type:=msoControlButton)
With newItem
.BeginGroup = True
.Caption = "Make Report"
.FaceId = 0
'.OnAction = "qtrReport"
End With
Вопрос 50. Подскажите, пожалуйста, как в вычисляемом поле запроса "Access" избавиться от 15 - 18 знаков после запятой? В вычисляемом поле перемножаются данные из поля с "длинным целым" (пробовал изменить на "целое") на данные из поля с "плавающей точкой (4 байт)" (пробовал и на 8 байт).
   Игорь Макеев Format или написать функцию округления
Вопрос 51. Как создать архив в созданной базе данных, например, за предыдущие месяцы? А за текущий месяц информация оставалась бы. Архив нужен для того, чтобы можно было посмотреть информацию за предыдущие месяцы.
  Игорь Макеев  Либо добавить поле-признак того, что информация в архиве. Или разделить базы, объединяя данные для выборки с помощью UNION
Вопрос 61 (15.11.2000). Помогите, пожалуйста, разобраться в ситуации. Почему в следующей процедуре выдается сообщение: Run-time error '13': Type mismatch
Sub Кнопка0_Click()
Dim dbsStrMat As Database
Dim rstPr As Recordset
Dim strPrim As String
Set dbsStrMat = CurrentDb
Set rstPr = dbsStrMat.OpenRecordset("Касса", dbOpenDynaset)
strPrim = "Примечание"
NewName rstPr, strPrim
dbsStrMat.Close
rstPr.Close
End Sub
Function NewName(rstQQQ As Recordset, _
strPrim As String)
With rstQQQ
.AddNew
!Примечание = strPrim
.Update
.Bookmark = .LastModified
End With
End Function
Программа останавливается на строке: Set rstPr = dbsStrMat.OpenRecordset("Касса", dbOpenDynaset) При этом библиотеки DAO 3.6, Access 9.0 b Office 9.0 object Library установлены. Дело в том, что мне нужно заполняя данные в одной форме, добавить запись в другую, не связанную таблицу. Может я вообще не то делаю? Если есть более простые методы, подскажите.
Igor V. Makeev 
Все объявления для DAO (Recordset - обязательно, Database - не обязательно, но для единообразия можно тоже) нужно заменить на прямое указание источника, т.е. вместо Dim dbsStrMat As Database Dim rstPr As Recordset должно быть Dim dbsStrMat As DAO.Database
Dim rstPr As DAO.Recordset, а так же вместо Function NewName(rstQQQ As Recordset, strPrim As String) нужно написать Function NewName(rstQQQ As DAO.Recordset, strPrim As String). Просто у спрашивающего наверняка А2к и еще подключена библиотека ADO, поэтому и получается: Recordset от ADO, а значение присваивается DAO.Recordset (т.к. используется Database). По поводу упрощения: быстрее написать: CurrentDb.Execute "INSERT INTO [Касса] ([Примечание]) VALUES ('" & strPrim & "')"
Вопрос 63 (15.11.2000). До установки Access 2000 я успешно использовал в формах и модулях встроенную функцию Date(), теперь мне выдаётся сообщение об ошибке и приходится использовать Now(), формат которой крайне не удобен.
Виктор Конюков.
Вообще Date() хранится в библ��отеке VBA (VBE6.DLL). Поэтому в ссылках она должна быть указана. Для чего нужны ссылки я привел в лекциях.
Igor V. Makeev
Ответ стандартный: проверить ссылки, меню Tools - References... не должно быть "сломанных" 
Вопрос 64 (15.11.2000). При разделении базы на mde и mdb файлы связи с таблицами можно обновить через диспетчер связанных таблиц. А как это сделать программным путем?
  Подробный ответ на данный вопрос дал Дмитрий Чернов.
Вопрос 66 (16.11.2000). Написал небольшую БД для учёта ЗИП на телефонной станции. Недавно появилась возможность работать с Access-2000.Открыв окно Access-2000, я понял что уже всё забыл и ничего не понимаю. Прошу Вас, если это возможно, сообщите как можно найти или приобрести учебники (обязательно с большим количеством примеров) желательно в электронном виде.
   Учебников с большим количеством примеров, в том числе и электронных, я не встречал. В некоторых книгах по Access есть CD диск c программами на VBA, но информации в них явно недостаточно. Так, что следите за примерами на сайте или задавайте вопросы.
Вопрос 67 (16.11.2000). В Access2000 произвожу экспорт таблицы в формат Paradox, нормально экспортирует, но кодировка получаемой базы .db почему-то 866, не подскажите как сделать 1251.
 Зайдите на сайт в раздел "Таблицы - dBase" там указано как это сделать. 
Вопрос 68 (16.11.2000). Сделана форма использующая 2 таблицы (типа адрес и из CboCity выбрать город. Город лежит в другой таблице. Выбор работает прекрасно, но если хочу добавить новый, сообщает (на этапе AfterUpdate, то есть до NotInList) что таблица другая, связанная с этой и внести изменения не может.
Igor V. Makeev   Надо смотреть отношения между этими таблицами (обратить внимание на контроль ссылочной целостности). А общий рецепт такой, сначала данные добавлять в главную таблицу, потом в связанную.
Вопрос 69 (16.11.2000). В форме используется 2 SubForm. Значение из первой (сумму оплаты) хочу использовать во второй - начисляются проценты к сумме. Вставила код расчета через переменную:
Private Sub Form_Current()
        varSum = Form_frmSubForm1.txtSum
        Me.txtPercentSum = varSum*Percent
End Sub
Возвращает значение varSum = 0, если ставлю breakPoint возвращает нормальное значение, но только для первого значения таблицы, остальные строки в Continues Form равны первому значению.
 Игорь Макеев Точно сказать не могу, мало информации, но скорее всего, просто пересчитывать не успевает. У меня так было, когда я считал сумму в подчиненной форме и выводил в главную, тоже через переменную (нужно было обеспечить возможность редактирования данного поля, так что прямую ссылку применить было нельзя). При изменении суммы в подчиненной форме тоже проскакивал 0. Лечилось задержкой (можно использовать управляемую или нет). Что можно посоветовать автору вопроса: а) попробовать организовать задержку (пустой цикл/через Time/до появления значения в переменной) б) если поле txtPercentSum не нуждается в редактировании, в его свойстве «Данные» (ControlSource) написать прямую ссылку на вторую форму, типа: =[frmSubForm1].[Form]![txtSum]*[Percent]
Вопрос 70 (16.11.2000). В Ваших ответах часто встречаю ссылку на файл LaForm.mdb, не поняла где его взять, может что-то упустила.
 Возможно у Вас нет возможности работать через Интернет, тогда Вам лучше скачать некоторые страницы сайта в интернете, где указаны все файлы с примерами на Access. Смотрите ссылки в конце урока. 
Вопрос 71 (16.11.2000). Я начинающий программист (если так можно выразиться) у меня есть одна проблема в Access у меня в база организована так, что есть группы и есть подгруппы, но проблема в том, что не все группы имеют подгруппы. В результате в отчете, получается - название группы, потом название подгруппы, далее данные. А в тех группах где нет подгрупп - пустые строки. Подскажите, можно сделать так, чтобы в отчете этих пустых строк не было. Ну нет у подгруппы названия - не выводи вообще названия
подгруппы.
Виктор Конюков.  
В вашем случае надо уметь научится использовать команду Cancel в отчете. Для этого для каждой записи отчета проверяется наличие в ней данных, если их нет, то она отменяется. Смотрите пример N8 в файле: la_report.mdb
Igor V. Makeev
Варианты зависят от конкретного отчета и структуры данных, можно посоветовать в событии «Форматирование» (Format) области данных управлять видимостью полей с помощью Visible или, что имхо лучше, свойствами MoveLayout, NextRecord, PrintSection (описание работы смотреть в Help)
Вопрос 72 (16.11.2000). Буду признательна, если поможете справиться со следующей проблемой. Требуется выделять другим цветом поле или строку в ленточной форме в зависимости от конкретного значения поля текущей строки.
Igor V. Makeev
Такой вопрос уже был. Посмотреть можно http://www.mvps.org/access/forms/frm0024.htm (далее по ссылкам: Объекты, формы, выделение записи в ленточной форме)
Виктор Конюков
В Access 2000 - есть пункт меню, управляющий этим свойством.
Вопрос 74 (17.11.2000). У меня вопрос слегка ленивый: можно ли сделать так, чтобы при вводе в одно поле названия города, в соседнем автоматически вставлялся его телефонный код?
Виктор Конюков.  
Если не лень, загрузите файл: la_form1.mdb. Там есть пример 12 "Заполнение реквизитов". Добавьте туда поле телефон и проблема разрешится.
Igor V. Makeev
Ленивый ответ: можно. :) Вариантов много: DLookUp на AfterUpdate, лишний столбец в поле со списком (если город представлен так) или запрос для формы правильно построить.
Вопрос 75 (17.11.2000). И еще:) Год назад мне пришлось создать базу данных с нуля(я даже не слышала слова Access до этого). БД не маленькая, честно:) Работаю в пользовательском режиме (конструктор, кнопочки..). Вообще-то ничего, но с тех пор, как начала читать Вашу подписку, где много пишется про программный метод работы с БД, ... самой захотелось..:) Где можно об этом почитать? Учусь быстро, но даже понятия пока не имею, КУДА это все программки вписывать:) Прошу не смеяться. я серьезно!
  Ответ. Ничего смешного нет, все так начинали. А Ваш вопрос задавали уже несколько раз, потому что в Access не все так просто, как в Microsoft Word. Грамотно начать работать достаточно сложно. Теперь в рассылке я буду печатать некоторые уроки по Access для начинающих, а не только отвечать на вопросы. Ответ по существу. 1. Специальной литературы по программированию нет, некоторую информацию по программированию опубликована в книгах по Access. 2.Программы вписывают в объект: "модуль", который Вы создаете сами или в так называемый модуль класса, который связан с формой.
Вопрос 76 (17.11.2000). Есть необходимость общаться из Access с вешним устройством через com-порт. Помогите решить эту проблему.
Igor V. Makeev
В любом Help по API, раздел "Communications" или MS Communications Control идет вместе с VB или прочие контролы
Виктор Конюков
2 вариант. Надо использовать API функции из библиотеки dlporti.dll. 
Public Declare Function DlPortReadPortUchar Lib "dlportio.dll" (ByVal Port As Long) As Byte
Public Declare Sub DlPortWritePortUchar Lib "dlportio.dll" (ByVal Port As Long, ByVal Value As Byte)
3 вариант. Надо использовать API функции из библиотеки vbio32.dll. 
Private Declare Function Inport Lib "vbio32.dll" (ByVal portid as Long) As Integer
Private Declare Sub OutportW Lib "vbio32.dll" (ByVal portid as Long, ByVal nbyte as Long)

 

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

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

Вопрос 5. Как сделать, чтоб в отчете сумму прописью выдавало ?
   Ответ. Вставьте в поле отчет. В свойство данные вставьте: =funRusMoney([Сумма]). Саму функцию возьмите из модуля la_form1.mdb. Если желаете понять как связаны в коммерческих программах таблицы, запросы и сумма прописью, то смотрите модуль: B001.mdb или A012.mdb в Магазине "Лидер Access".
Вопрос 6. Кто-нибудь задавался целью, чтобы отчет в виде книжки можно было распечатать?
   Ответ. Если мне это нужно, я всегда отчеты экспортирую в Word 2000. По сравнению с Word 97 там появились специальные возможности для печати брошюр. Проверял неоднократно при печати инструкций, качество отличное. Для этого сделайте маленькую пустую книжку из бумаги размером, например, 2см x 4см. Пронумеруйте ее и при печати через Word используйте нумерацию для ввода страниц. Пример печати для брошюры из 16 страниц на листах формата A4: 1 блок: 16,1, 14,3, 12,5, 10,7. Переверните листы и напечатайте: 8,9, 6,11, 4,13, 2,15. Теперь можно сложить страницы. Не забудьте в разделе "Параметры страницы" установить флажок "2 страницы на листе".
Вопрос 7. Мне приходится часто работать с данными из DBF файлов. Иногда они содержат достаточно много данных и выборка без ключа занимает много времени. Все эти данные я беру из CLIPPERовской базы. Там есть индексные файлы, но их формат не поддерживается ODBC. Можно ли как-то решить такую проблему? Сейчас я или смиряюсь, или импортирую каждый раз в ACCESSовские таблицы. Как вообще обрабатывать внешние индексы - натолкнулся на INF файлы, но нигде не нашел описания правильной работы с ними.
   Denis Katkovsky: Dionisio@Mail.RU Пользоваться внешними не рекомендуется, так как Акцесс некорректно их использует. К тому же в Clipper'е, например, можно определить свои драйверы работы с БД и полностью контролировать построение индексов. Так что их, естественно, не поймет ни одна другая программа. Так что выход из ситуации действительно один - импортировать базу в МДБ. Не обязательно в основную - можно создать временную, а затем удалить. ...ну или смириться с тормозами.
   Виктор Конюков. Ваш вопрос - "больной" для многих. Можно предположить, что если нет достаточных примеров работы с внешними индексами, то с ними не пытаются "серьезно" работать через Access. Некоторые рассуждения на эту тему я привел в подписке 17 (16 вопрос).
Вопрос 8. Последние 5 лет я занимаюсь тем, что создал и постоянно дорабатываю по мере необходимости базу для фирмы занимающейся ЖД перевозками (обработка данных из т/т накладных, расчет оплаты, выставление счетов и т.д.). В последнее время моя сетевая база работает в Access97. При попытке пробного перевода ее в Access2000, я столкнулся с проблемой: функция Like отказывается производить поиск по маске если в ней содержатся символы кириллицы "Е", "К", "Г". В Access97 все работает.
  Виктор Конюков. Вообще очень странно, что у Вас Like не работает с этими символами. Посмотрите в файле la_form.mdb контекстный поиск. Все работает. Возможно у Вас очень сложный SQL запрос и требуется его упрощение.
  Igor V. Makeev Кстати, есть такой баг в A2k, сам не встречал, т.к. пока практически ничего не пишу на 2000, но вот выдержка из FAQ RU.MSACCESS
===
28) Q: (A2000only!) Можно ли боpоться с непpавильной pаботой пpи использовании pyсских бyкв в опеpатоpе LIKE в yсловиях запpоса/фильтpа? A: Фокyс в том, что если таблицы хpанить в базе данных 97-го фоpмата, то A2000 pаботает с ними ноpмально. Так что достаточно конвеpтнyть табличнyю базy в фоpмат A97. (Andrey Fedorov 5055/34)
===
  Виктор Конюков. Ну здесь я полностью не согласен с Вами. Like не хранится в mdb файлах, поэтому, если оператор Like возвращает неправильный результат, то это будет для любых присоединенных таблиц access, dbase, foxpro, paradox и т.п.
Вопрос 12. 1. Я интересовался у Вас размерами форм на мониторах с разным разрешением. Как определить разрешение экрана и текущие координаты и размеры форм я понял. Но что с этим делать дальше? Неужели необходимо пересчитать координаты и размеры всех элементов формы? К примеру, при разрешении 600*800 кнопка "Выход" находится в правом нижнем углу, а при 480*640 вылазит за пределы экрана. Если пересчитать только её координаты, то она залезет на другой объект.
  Ответ. Если Вы собираетесь масштабировать форму, то Вам нужно изменить не только ее, но и шрифт символов на кнопках, метках и т.п. Задача это не очень простая и требует высокой квалификации. С другой стороны, зачем Вам это нужно. Мне не встречался заказчик по Access, для которого это имело бы принципиальное значение. Оптимальный размер формы для бизнес-программ: 480*680. Большинство бухгалтеров работают на мониторах в 15" и не любят мелкие элементы в программах, так что очень усиленно стараться переводить программу на разрешение 600*800 не стоит.
Вопрос 13. 2. Как с помощью VBA создать таблицу с полем счетчика?
Denis Katkovsky:  Например, выполнить такой запрос: "CREATE TABLE SimpleTable (PersonID counter NOT NULL  , FirstName varchar(50) NOT NULL, LastName varchar(50) NOT NULL, CONSTRAINT PrimaryKey PRIMARY KEY (PersonID));" 
Виктор Конюков. Одно из решений Вы найдете в файле la_table.mdb
Igor V. Makeev
В А2k можно еще вот так:
Dim c As ADODB.Command
Set c = New ADODB.Command
c.CommandText = "CREATE TABLE tblCodeCounterDataTypes (Field1_IDENTITY IDENTITY(10,5), Field2 TEXT(10))"
c.ActiveConnection = CurrentProject.Connection
c.Execute
Set c = Nothing
Вопрос 14. Access как правило предлагает создать автоматически - в виде поля типа "Счетчик". Со временем в этом поле оказываются значения самые разные. Каким образом можно обновить это поле (вариант - внести запись с заданным значением в поле "Счетчик") ?
  Виктор Конюков. Решается это через SQL запрос или с использованием объекта Recordset и его функции AddNew. В поле счетчика должен содержаться уникальный номер записи, иначе будет сгенерирована ошибка. С другой стороны, Вы можете перевести счетчик из режима последовательных номеров в случайные. К сожалению обратно это сделать не удастся.
  Alexander Brezak:  Если уж и городить огород, то зачем мучать поле "счетчик". Создаешь свое поле и программно генерируешь нужные значения. А поле счетчика позволяет "забыть" про генерацию уникальных ID, т.е. тут за вас все делает Access.
Вопрос 16. Как можно программным способом прочитать все поля (в т.ч. и списки) одной формы и данные внести в другую?
   Ответ. В лекциях (6с) я рассказал как создать элементы формы. Эту программу можно переделать для ввода элементов не из запроса, а из формы. Думаю, что это не сложно.
Вопрос 17. При выводе на принтер отчета из Access ([Файл] -> Печать) появляется диалог "Печать", где в соответствующих окошках можно выбрать диапазон страниц для печати с ... по ... Проблема состоит в том, что на разных компьютерах максимальное количество цифр, которое можно ввести в эти окошки колеблется от трех до пяти. На компьютере с Win95 можно ввести пятизначное число (max 99999), с WinNT 4.0 на одной машине три цифры, на другой четыре, под Win 2000 на каждой из двух проверенных машин по четыре цифры. Получается, что страницу с номером > 100000 вообще нельзя вывести на печать, а на некоторых машинах страницу > 1000. От чего это зависит? Полная переустановка офиса не меняет ситуации. Модель и драйвер принтера, структура отчета не влияют на это ограничение (были проверены 5 разных принтеров с различными драйверами). Конфигурации компьютера (размер памяти и ЖД) тоже не влияет на это.
   Ответ. Вопрос к Вам. А зачем это нужно? Вы не задумывались сколько времени Access будет форматировать отчет с числом страниц, например, более 500. У большинства пользователей терпения на это не хватит. Лучше подумайте как улучшить запрос отчета или попробуйте использовать для печати фильтр отчета (см. la_report.mdb).
Вопрос 18. Подскажите пожалуйста, как в Access-2000 управлять шириной и высотой окна? Насколько я понимаю ширина формы (me.width) и ширина окна - разные вещи? Хотел бы менять размеры окон и элементов в зависимости от разного разрешения экрана, но что-то не выходит. При убавлении me.with она действительно убавляется (я это контролирую по ее значению, выводя на экран) , а ширина окна так прежней и остается.
  Виктор Конюков. Пример использования API функций для Вашего случая дан в программе la_form.mdb смотрите пример N4.
Igor V. Makeev
   Для изменения размеров API не нужно - DoCmd.MoveSize
Вопрос 19. У меня есть проблема... Руководству по зарез необходимо иметь график на котором в положительной (сверху) части отражаются средства фирмы, в отрицательной части (внизу с минусом) отражаются задолженности, и где то скачущую из плюса в минус и обратно сальдирующую линию. Проблема в сальдирующей линии. Она должна быть в положительной части синей, а в отрицательной - красной. Есть ли у Вас мысли как можно это реализовать (хотя бы в Excel).
   Ответ. В Excel нет. Для Access пример использования разноцветных линий в отчете дан в файле: la_report.mdb пример номер 6.
Вопрос 20. Добрый день! Работает следующая конфигурация: центральный склад (Access 97, Windows NT 4 (workstation)) - 2 компьютера. Розничная продажа: Access 97, Windows 98 - 2 компьютера. Данные находятся в двух файлах MDB на компьютере склада. Все 4 MDE файла (два складских и два розничных) завязаны на таблицы обоих MDB файлов. Потоки данных большие, работает система 3 месяца и в 2-х таблицах склада уже по 15000 записей. Один раз столкнулись с проблемой ошибки в одной конкретной таблице в MDB файле розницы. Но основная проблема следующая: 1-2 раза в неделю при обращении к файлу MDB склада возникает ошибка "Нераспознаваемый формат базы данных". Лечится командой "Восстановить" из меню Access. Формализовать ситуацию не удалось (конкретные обстоятельства появления ошибки не установлены). ЛВС по TCP/IP. Архитектура "Звезда". Центральный сервер сети: Win 2000. Все базы лежат на локальных дисках. Если вы сталкивались с такой проблемой, пожалуйста, помогите добрым советом.
Alexander Brezak:
Может мой ответ кому-то поможет. Встречался я с похожей ситуацией. Правда, у меня был один файл mdb,  в котором размещались таблицы + формы, отчеты, модули и т. д. Когда файл
немного подрос (до 10 М), а обращения к файлу тоже частые, при открытии файла стала часто появляться ошибка "Нераспознаваемый формат базы данных". Я просто разрезал файл на два: в одном остались только таблицы, в другом - все остальное. Покамест, если такая ошибка появляется, то она затрагивает только 2-й файл (с формами, отчетами и т.д.). В принципе, файл с таблицами можно еще больше подробить, а в других файлах сделать просто линки на эти таблицы. Такой подход мне пока помог.
Виктор Конюков. 1. Если у Вас установлен Windows 98, то его надо срочно заменить на Windows 98SE, т.к. в предыдущей версии есть ошибки в сетевом протоколе, смотрите информацию в разделе сайта "Аварийка". 2. Попробуйте сжать базу данных с помощью импорта объектов (смотрите раздел Аварийка). 3. В разделе "Панель управления" -> "Система" -> "Быстродействие" -> "Графика ..." отключите аппаратное ускорение. 4. Внимание! Неточная информация. При связи через HAB желательно иметь Windows одного класса NT или 98 из разницы в протоколе NetBios.
Вопрос 29. Здравствуйте, после всех полученных мною рассылок и у меня созрел такой вопрос, очень бы хотелось, чтобы в то время, когда идет расчет отчета, то показывался бы индикатор загрузки, ну я так считаю, что с отчетом его связать сложно, ведь когда открывается отчет, то все формы становятся невидимыми, и как Dialog тоже не откроешь. Как тогда быть? Или хотя бы как это сделать в форме и сопоставить с Recordset, желательно на примере.
Denis Katkovsky: 
Не в форме, но в строке статуса:
Sub Example()
Dim Counter As Long
'Инициализируем прогрессбар
SysCmd acSysCmdInitMeter, "Вычисляю", 10
For Counter = 1 To 10
'Обновляем прогрессбар
SysCmd acSysCmdUpdateMeter, Counter
'Здесь разместите свой код
Stop 'Это, разумеется, нужно убрать
Next Counter
'Уничтожаем прогрессбар
SysCmd acSysCmdRemoveMeter
End Sub
Виктор Конюков. Вообще поставленный вопрос для тех, кто работает с большими отчетами очень важна. Я это почувствовал на программе "Зарплата и Кадры" при формировании "листочков на зарплату" для нескольких сот сотрудников. Некоторую подсказку по проблеме Вы найдете в файле: la_report1.mdb при работе с фильтром отчета. Форма при масштабировании отчета находится сверху листа страницы. Необходимо только туда вставить свой timer. Пример, как это реализовать на практике, я приведу позже.
Вопрос 32. Как сделать так, чтобы в таблице выделялись не все даты, а только те, которые отвечают специально заданному условию. Например. синим: Date()<= значение <= Date()+2 красным: значение < Date()
Alexander Brezak: 
Сам давно пытался сделать что-то подобное в ACCESS 97, и именно в режиме таблицы. К сожалению, я ничего не придумал. В режиме ленточной формы или простой формы цвет легко меняется, а в режиме таблицы ничего не выходит. Но я знаю, я что ACCESS 2000 появилась возможность условного форматирования в _таблице_ (меню Формат->Условное форматирование). Вроде бы очень полезная штука получается.
Виктор Конюков. Маленькое уточнение. Условное форматирование действует только на формы в любом виде (в том числе и в виде таблицы), а в конструкторе таблиц как указано в примере файла la_table.mdb сделать это не удастся.
Вопрос 35. Скажите, можно ли импортировать данные из базы данных CLARION (*.dat). Если можно, то как это сделать?
Автор ответа:
Возможно...
Существует по крайне мере два варианта: 1. Использовать ODBC драйвер. Правда тут возникает другой вопрос: а где его взять? 2. Непосредственно формат баз данных CLARION (вроде бы) поддерживал Access 2.0. Сам я данной возможностью не пользовался, однако в HELP была статья - как подключить БД CLARION. Там не все было просто - но по описанию подключение было возможно. Так что если остался где нибудь в архивах Access 2.0 поэксперементируйте. Если удастся подключить - далее все просто. Конвертируем в Access 2, после чего конвертируем в более позднюю версию Access.
Виктор Конюков. Попробуйте поискать ODBC драйвер в Интернете. Иногда его можно найти не только у разработчика, но и партнеров, тех кто продает CLARION. Если найдете сообщите подписчикам по Access. Я думаю, что это будет интересно многим.
Алексей. 
Вообще, формат файлов данных Clarion (*.dat) известен и достаточно прост. Поэтому, в крайнем случае можно его легко "раскрутить" (правда, если он не запаролен). Единственная проблема, насколько я помню, преобразование дат (в Clarion дата представляется в виде Long (4 байта) со своей точкой отсчета).
Вопрос 36. Я работаю в Access 97. При реплицировании БД в таблицах автоматически создаются новые поля. После импортирования таблиц из реплицированной базы в обычную в новой БД в таблицах визуально этих полей не видно, но фактически они просматриваются в окне отладки при выполнении моего модуля. На программном уровне пытаюсь их удалить с помощью применения метода Delete объекта TableDef, но выводится ошибка: "3280 - Can't delete the field that is part of an index or is needed by the system". Как удалить данные поля?
  Denis Katkovsky: 
1. Проверить, не участвуют ли эти поля в индексных выражениях: Таблицы - Конструктор - Индексы 2. Не участвуют ли эти поля в отношениях между таблицами: Сервис-"Схема данных..."
   Виктор Конюков. Если при решении этой проблемы Вы "добрались" до удаления полей программным способом, подумайте над моим предложением: "Может быть лучше Вам написать программу, которая будет импортировать не всю таблицу, а только ее структуру без полей репликации". Далее останется написать запрос на добавление записей. В этом случае не придется сжимать новую базу данных, да и ее структура будет лучше.
Вопрос 38. Просьба помогите решить проблему. Есть в форме несколь��о списков. При выборе в первом должен формироваться второй, условие значение из первого. Однако во втором списке появляется одно значение(хотя должно быть несколько значений)
Private Sub Список8_AfterUpdate()
Dim rst As Recordset ' ***
Set rst = CurrentDb.OpenRecordset("SELECT * FROM [littel dog] WHERE [idbreed]=" & Me.Список8.Value)
If rst.RecordCount <> 0 Then
With rst
Me.Список10.RowSource = rst!POMET
End With
Else
MsgBox ("Пусто")
End If
rst.Close
End Sub
Автор ответа: 
Попробуйте следующее:
Private Sub Список8_AfterUpdate()
If IsNull(Me.Список8.Value) then
   Me.Список10.RowSource = "SELECT * FROM [littel dog]"
else
   Me.Список10.RowSource = "SELECT * FROM [littel dog] WHERE [idbreed]=" & Me.Список8.Value
end if
Me.Список10.Requery 'Важно
End Sub
Если я правильно помню (сейчас под рукой нет Access) свойство RowSource списка или поля со списком содержит запрос или SQL оператор. Кроме того, если в поле [idbreed] числовое, то все нормально. Если же оно строкового типа то SQL выражение должно выглядеть следующим образом:"SELECT * FROM [littel dog] WHERE [idbreed]='" & Me.Список8.Value &"'"
Вопрос 40. Я очень надеюсь, что Вы сможете ответить на интересующий меня вопрос. А состоит он в следующем: во время написания программы, которая генерирует запросы, мне очень не хочется привязывать параметр запроса к определенной форме, но к сожалению при дальнейшем использовании, т.е. при открытии формы, использующей этот запрос, мне не удается установить значение параметра программным путем, т.к. выводится диалог на задание параметра, и никакие установки параметров запроса в семействе Parameters не помогают. Интересна прежде всего идея, если это вообще возможно, так как во-первых во встроенной справке я ничего толкового не нашел, во-вторых, отсутствие Office 2000.
Автор ответа: 
Под термином параметр запроса как я полагаю понимается условие отбора. Если это не так, то ответ не на вопрос. Попробуйте убрать условия отбора в запросе. А при вызове формы программным путем указывай требуемые условия отбора:
DoCmd.OpenForm Имя_Формы, , , Условие
Где условие это выражение WHERE оператора SQL. Также возможно изменение условий отбора в уже открытой форме путем применения команды DoCmd.ApplyFilter или задания свойства Filter (если не ошибаюсь в названии) формы
Igor V. Makeev 
Как уже правильно посоветовали: не строить формы на таких запросах. Т.е.
либо использовать аргументы OpenForm, либо передавать нужные параметры через
вызовы функций, т.е.:
... where Field = GetFieldParam() ...
Вопрос 47. Я разрабатываю базу, чем-то похожую на microsoft'совский Борей. Но заказчику необходима функция проверки времени и, если она соответствует некоторому условию (интервалу с 10:00 до 12:00), то будет выполняться некоторая подпрограмма. Конечно, я понимаю, что это мало относится к созданию баз данных, но всё же надеюсь, что Вы мне подскажите, как это можно сделать и написать.
   Ответ. Для определения времени в Access существует функции Date() и Time(). Вот, например, как можно реализовать действие этих функций. При открытии формы после 10 часов утра появится сообщение об установленных в Windows Дате и Времени.
Private Sub Form_Open(Cancel As Integer)
   If (Time() >= TimeValue("10:00:00")) and (Time() < TimeValue("12:00:00") Then
       MsgBox "Дата: " & Date & ", Время: " & Time()
   End If
End Sub
Вопрос 57 (14.11.2000) При попытке импорта данных (или при связи таблиц ) из файлов DBF , DB (не могу точно сказать чьи это базы - Paradox , FoxPro или еще что-то) все выполняется, кроме одного - вместо русских букв - неизвестно что (даже не "нормальные" кракозябы) . Как решить эту проблему.  ?
   Ответ. Для борьбы с "кракозябами" надо подправить немного реестр Windows. Пример дан для Windows 98.
[HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Xbase]
"DataCodePage"="OEM"
При работе с другими dbf файлами надо изменить OEM страницу на ANSI
"DataCodePage"="ANSI"
P.S. При изменении реестра программным способом изменения вступают после перезагрузки Access.
Вопрос 58 (14.11.2000). Подскажите, пожалуйста, возможно ли решение следующей задачи? Имеются два запроса: в первом только поле даты, во втором - поле комментария. Между собой они никак не связаны. Как создать запрос, в котором эти два поля были бы объединены, т.е. дата1 примечание1, дата2 примечание2, поля даты и примечаний уже отсортированы в соответствующих запросах как надо. У меня получается: дата1 примечание1, дата1 примечание2, дата2 примечание1, дата2 примечание2
     Ответ. В этом примере используется простой запрос на объединение с сортировкой по полю Дата. SELECT * FROM Таблица1 UNION SELECT * FROM Таблица2 ORDER BY Дата;
P.S. Вместо таблиц можно использовать и запросы.
К вопросу о рисовании линий в форме.
Николай Малютин, г. Якутск: 
Дополнение к Вашим примерам В примере о рисовании в форме Вы используете способ получения hwnd. Это можно сделать более коротким кодом:
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWndParent As Long, ByVal hWndChildAfter As Long, _
ByVal lpClassname As String, ByVal lpWindowName As String) As Long
lnghWnd = FindWindowEx(Me.hWnd, FindWindowEx(Me.hWnd, 0, "OFormSub", ""), "OFormSub", "")
Форма Me имеет два дочерних окна класса OFormSub при этом одно из окон имеет дочернее окно класса OFEDT, которое мы и определяем

Выпуск 17. Изменение схемы подписки

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

Новости сайта.
   1. Добавилась визитки разработчиков Access программ: Антон Бевзюк (Иркутск), Сергей Бушмелев (Ижевск), Станислав Прозоров (Ижевск), Евгений Гладышев (Кишинев).
  
2. Добавились новые отчеты и программы. Все в открытых кодах. 

[Проблема]. Вопрос 1 (от клиента Mагазина "Лидер Access") Пользуясь случаем хочу у Вас получить консультацию по возникшей проблеме. Я не профессионал по Access , но уже более 6 лет сочиняю лично для себя необходимые программы. В настоящий момент у меня работает их около 20. При разработке новой программы я столкнулся с возникшей проблемой: При создании базы данных таблицы - мне необходимо около 35 полей , 16 из которых текстовых с размером - 100. Однако при заполнении в форме возникает ошибка - Слишком большая длина записи +. Следуя рекомендациям убрал лишние поля ( из одной таблицы сделал 5 тбл ), однако ошибка не исчезает. Появляется ошибка и при открытии непосредственно Таблицы (в которой 4 поля тхт размер по 100 в каждой) У меня есть программы где имеются таблицы с количеством полей до 60, но их размеры не превышают 50 и работают без ошибок. Если есть возможность подскажите.
Ответ. Всего в таблице может быть 255 поля. В вашем случае их явно меньше. Так как одна из таблиц не открывается можно предположить, что ее структура или одно из полей в результате редактирования базы разрушились. У меня это встречалось при проектировании сложной программы "Зарплата и Кадры" для Access 97. Мой совет. Создайте пустую базу данных. Путем импорта загрузите в нее объекты из старой базы кроме "плохой" таблицы. Не достающуюся таблицу лучше создать вручную. Обязательно сделайте это как можно быстрее, иначе возможна потеря всей базы. P.S. Можете выслать также базу мне, тогда я протестирую ее своими средствами.

Продолжение подписки 16

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

[Выпуск 16]. Вопрос 1.
Подскажите чайнику - в таблице поле - "Счетчик". Набрано 8 записей. после их удаления при наборе новых записей счет идет с 9 и дальше. Как обнулить счетчик?
Ответ.
   Вопрос слож��ый. Access не даст Вам изменить поле счетчика ручным или программным способом. Выход заключается в том, что необходимо уничтожить старое поле "Счетчик", а потом создать новое. Недостаток такого способа - рост размера базы данных. Пример создания и удаления счетчика приведен в программе la_table.mdb.
   P.S. Теоретически и практически возможно изменение счетчика, минуя ядро Access, но для этого необходимо знать структуру mdb файла. Я никогда в разработках не использую поле счетчик, а стараюсь генерировать уникальный номер с помощью собственной функции.
Ответ 1 читателя.
Проделайте опыт. Создайте две одинаковые таблицы. Пусть у нас в одной ключ типа счетчик меняется от 1 до 8, а во - второй - остальные записи, скажем от 9 до 20. Если написать запрос на вставку строки из первой во вторую таблицы с ключом равным 2, то запись добавиться! При это структура счетчика ломается, т.е. следующая строка, вставленная в первую таблицу приобретает ключ 3. Лечится только восстановлением или переливанием базы. Но само по себе переливание (создание новой базы и импорт в нее данных), кажется тоже обнуляет счетчик, в случае, если в таблице нет данных. Кстати, знаете ли Вы, что Access позволяет добавлять данные в таблицу с помощью операции UPDATE? Это кривой прием, но работает!
Ответ 2 читателя.
В последней Вашей рассылке, на вопрос об обнулении поля счетчика после удаления записей, Вы рекомендуете удалять поле счетчика и заново создавать. На сколько мне известно данная проблема решается элементарно! Необходимо после удаления всех записей просто сжать базу данных. Попробуйте!
Ответ 3 читателя.
Для сброса счетчика достаточно сжать базу, а начать с любого значения позволит запрос на добавление нужного номера в поле счетчика. По поводу создания/уничтожения - при наличии связей по этому полю, Вам такие действия произвести не удастся.
Ответ 4 читателя.
Показался очень странным Ваш невразумительный ответ. Насколько я понимаю, надо просто сделать сжатие базы данных. При этом, если удалялись последние введенные записи в БД, счетчик сбрасывается на значение которое соответствует max от поля счетчика. Т.е. для примера указанного в вопросе он обнуляется. По крайне мере это было справедливо в Access 97.
Ответ 5 читателя.
Ответ неверный. Вот пример доступа к счетчику программным способом: a)создаем таблицу "test", б) поле RecordID - счетчик, primary index, в) поле Value - текстовое, по-умолчанию г) добавляем N записей, д) удаляем их, е) запускаем
Private Sub test1()
Dim Recs As Recordset
Set Recs = CurrentDb.OpenRecordset("test", dbOpenDynaset)
With Recs
.AddNew
!RecordID = -2
!Value = "test"
.Update
.Close
End With
End Sub
ж) лезем в таблицу и наслаждаемся результатом
Ответ 6 читателя.
Я не совсем согласен с Вашим ответом на данный вопрос. В такой постановке вопроса есть два способа изменить значение счетчика:
1) После удаления записи(ей) произвести сжатие базы, тогда при добавлении новой записи счетчик примет значение [максимальное не удаленное значение]+1. Но тогда могут появиться "дырки" в нумерации;
2) Скопировать _структуру_ обрабатываемой таблицы (в этом случае счетчик устанавливается на 0), а затем скопировать туда существующие записи. Затем переименовать новую и удалить старую таблицы.
PS: Вообще-то подобные операции проводиться не должны, так как по полю "Счетчик" строятся связи (реляции) между таблицами, и пользователь _не должен_ видеть это поле. Оно СЛУЖЕБНОЕ, и предназначено только для построения отношений между таблицами!!! Если есть необходимость отображать/использовать какое-то числовое значение (скажем, для ускорения процесса выбора записи из справочника), то необходимо ввести _дополнительное_ поле! Существование дополнительного поля позволит достигнуть гибкости и удобства в _интерфейсе_, а "Счетчик" гарантирует ссылочную целостность базы данных. (Все это из моего *личного* опыта)
Мой 2-ой ответ.
   1. Все способы перечисленные авторами работают только с новыми записями. А в заголовке 16 выпуска предположительно указан вопрос пользователя: "Как изменить текущую запись счетчика?". История проблемы такова. До 16 рассылки по Access у меня было 4 вопроса по счетчику от разных авторов. Ответить нужно было всем.  Решение нашел следующее: 2 вопроса опубликовал в 16 выпуске (один в заголовке, другой в тексте), еще 2 опубликовал сейчас (смотрите N13 и 14). Положительный эффект от этого есть. Можно(!) сказать, что все проблемы по счетчику полностью решены. Надеюсь, что авторы замечаний не ограничатся только счетчиком, но и дадут ряд других полезных советов. При желании автор (имя, email) будут указаны в подписке.
  2. Некоторые сомневаются в том, что я зря не использую поле счетчик. Постараюсь объяснить свою позицию на практическом примере. В программе "Склад и Реализация" есть 2 таблицы "СКЛАД расход_01" и "СКЛАД расход_02" (смотрите модуль A012.mdb). В одной хранятся заголовки накладных в другой непосредственно сами проводки. Первая таблица имеет уникальный индекс: "Nдок, Дата" и связана с  другой с помощью него (индекс сокращен, полностью он указан в модуле A012). Этот индекс и заменяет мне "Счетчик". В чем тут преимущество: а) не надо вспоминать номер счетчика, чтобы найти накладную, б) при изменении номера накладной, достаточно изменить его только в первой таблице, далее Access автоматически по цепочке передаст изменения на вторую и другие связанные таблицы. Если бы я использовал для связи счетчик, то нужно было бы писать функцию обновления для всех таблиц, в) в третьих, так как число файлов mdb у меня велико, не используя счетчик в них, я уменьшаю размеры файлов и следовательно увеличиваю скорость доступа к данным.
[Формы]. Вопрос 5-7. 1. В "Лекциях..." , в примерах и ответах Вы применяете механизм DAO, но в руководствах по Access2000 указывается, что Microsoft активно внедряет механизм ADO, и со временем он может вытеснить DAO. В связи с этим нельзя ли указывать на нюансы, которые могут возникнуть (напр. невозможность реализации некоторых функций или алгоритма DAO с использованием ADO). Я только начал изучать Access, так почему бы сразу не начать с ADO. Еще лучше, конечно, дублирующие примеры . Какое Ваше мнение на использование DAO / ADO ?
Мой 1-ый ответ.
    1. Документацию по Бэйсику, которую Вы только начали изучать уже "устарела", есть новая 7.0 версия с другими библиотеками. Мой совет, если все же решите изучать Access, на начните с DAO, когда приобретете SQL сервер или Oracle изучите ADO или ADOX. Хорошие примеры на эту тему есть в справочной системе.
Ответ читателя
Опять же, на текущий момент, по моему мнению, можно не тратить время на устаревающую библиотеку (DAO), особенно с учетом наличия MSA2000.
Мой 2-ой ответ. С одной стороны, в Access 2000 используется улучшенная версия DAO 3.6. С другой стороны, для решения проблемы, какую лучше библиотеку использовать в программах, есть надежный способ - тестирование. Пример теста. Создайте 2 базы данных с таблицами: одна будет использовать DAO, другая ADO. Желательно иметь большое количество таблиц, полей и данных в них. Сравните скорость баз данных, а именно, открытие таблиц, поиск записей и сохранение информации. В конечном счете DAO выиграет спринт у ADO.
P.S. Для тех кто интересуется данной проблемой. Вообще я планирую написать коммерческий вариант лекций с использованием ADO и ADOX и разместить информацию о них в "Магазине 'Лидер Access'". Цены будут низкими, но Вы сможете купить и дешевле, если сделаете заказ сейчас. Деньги перечислять не надо, укажите только email и минимальные реквизиты. Для Вас будет скидка.
[Проблемы] Вопрос 12. Не нашел в рассылке ссылок на разработку БД в сетевом варианте. Есть ли особенности при проектировании БД для сетевого использования? Проблема: одно-ранговая сеть на РК кабеле, создал локальную БД, затем разделил, создал группу, таблицы на одном ПК и две оболочки. При запуске БД и попытке ввода информации в таблицы, все зависает. Я - начинающий, может что-то не так делаю, или сеть перегружается?
Мой 1-ый ответ.
   Да отличия есть. Зависание сети зависит от многих факторов: от проводки, от связи с HAB и даже от названия полей таблиц. Для тестирования сети нужно иметь проверенную сетевую программу, написанную на Access. Я, например, пользуюсь программой "Книги бухгалтерии", так в ней не очень большое количество таблиц. Что делаю? Во первых, создаю автоматически несколько филиалов на всех локальных дисках. Во вторых, делаю проверку на ввод данных несколькими пользователями. В третьих, загружаю новые таблицы в эталонную базу данных и проверяю поля. Если возникли ошибки или просто предупреждения, то их я просматриваю в "Журнале контроля". Решение об исправлении принимаю в зависимости от серьезности ошибок.
Ответ читателя.
   1. Абстрагируясь от неправильного функционирования сети (это проблема не Access), следует уточнить, что самый распространенный глюк связан с использованием кривых драйверов от MS для сетевой платы Realtek. А вот по поводу имен... Чем подтверждаются Ваши слова?
   2. Надежная сеть и правильное проектирование. И никаких проблем.
Мой 2-ой ответ.
   Некоторые вопросы зависания баз данных приведены у меня на сайте в разделе Аварийка, надеюсь Вы прочитали там информацию. А теперь еще два примера, которых Вы не найдете в Интернете. Взяты из личного опыта по внедрению Access программ на предприятиях. У них кстати не было сетевых плат Realtek.
1 пример. При внедрении программы "Склад и Реализация" на коммерческом предприятии, занимающемся торговлей, было замечено странное. Запросы на выборку и связанные таблицы не показывали данные, приходилось выходить из программы и снова ее загружать. Случалось это иногда 1-2 раза в день. Анализ сети, перезагрузка Windows и Office пользователем ничего не дали. Открыв "Журнал контроля", я заметил, что пользователь ввел "личные" поля. Чтобы они отличались от других, он отмечал их знаком #. Примеры названия полей: #Сотовый директора, #Email заказчика и т.п. Всего около 10-15 штук в разных таблицах. Переименование этих полей резко изменило ситуацию, все заработало. P.S. Хотя Access и допускает использование таких полей, возможно проблема была в том, что в SQL запросах знак # используется для ввода даты.  Отсюда следует, что иногда интерпретатор SQL "путался" и не мог правильно отобразить результат.
2 пример. В этом случае зависание базы данных было примерно 1-2 раза в неделю на производственном предприятии. Из трех компьютеров, имеющих одинаковую конструкцию и конфигурацию программного обеспечения, один зависал. Стандартные методы проверки не помогали. Пришлось его перевести на примитивный 16-цветный режим на всю неделю. Тогда Access база заработала прекрасно, пришлось заменить виокарту. Вывод. Проблема возникала из-за какой-то внутренней ошибки TNT2 при работе в многоцветном режиме, хотя драйверы и программы были в норме и одинаково настроены.
[Отчеты] Вопрос 13. Во время создание отчета возникла проблема с ограничением ширины поля (около 58см), можно ли обойти данное ограничение
Мой 1-ый ответ.
   Если Вы возьмете 2 листа бумаги 11 формата и сложите по длинной стороне, то получите 59,4 см. Отбросьте поля в 7 мм, и Вы получите размер бумаги для печати на широкоформатных принтерах. Далее по ширине печати идут графопостроители (плоттеры). Для печати на таких устройствах используются графические программы со специальными драйверами печати или рисования. У меня нет таких устройств. Могу дать только идею: попробуйте использовать пример N11 в файле la_report.mdb, где поле рисуется с помощью функций отчета, а не строится через конструктор.
Ответ читателя
Нет. Это ограничение MSA, описано в Help'е
Мой 2-ой ответ.
   Вообще можно самому создать свой браузер просмотра отчетов без данных ограничений. Мне, например, при просмотре отчетов не нравятся большие поля. В конечном итоге, это будет зависеть только от серьезности задачи, а так заниматься этой проблемой не зная для чего не имеет смысла. Но дело в том, что данная проблема получила продолжение. От читателя пришел другой вопрос в виде gif файла. Из которого видно, что эта проблема возникла при использовании лекций. При создании отчета калькулятора выскакивает ограничение в 57.8 см. Было на 2х компьютерах. Я так понимаю, что у него неправильно установлен драйвер или параметры принтера. С другой стороны, если кто-то встречался с этой проблемой прошу сообщить.
[Таблицы] Вопрос 16. Работаю с Access97 c начала его выхода. Решил перейти на Access2000 и сразу столкнулся с проблемой. У меня в приложениях Access2000 все присоединенные *.dbf файлы открываются заблокированными и только для чтения. Следовательно я не могу ни отредактировать данные, ни установить фильтр и т.д. Как решить эту проблему?
Мой 1-ый ответ.
   DBF файл открывается в однопользовательском режиме. Закройте все приложения, которые работают с вашим файлом. Попробуйте в примере N1 файла la_table.mdb, присоединить Ваш файл. Если файл открывается только для чтения, то проблема в ваших dbf-файлах. Возможно они закрыты от записи.
 Ответ читателя
ИМХО, проблема в индексах. Подробнее можно посмотреть архив конференции fido7.ru.msaccess
 Мой 2-ой ответ
  В вопросе читателя не указано, что он работает с индексами, возможно он скопировал dbf файлы с CD диска и забыл снять флажок "Только чтение". Я вообще предпочитаю работать с индексами dbase несколько по другому.
  1. Если dbf файл небольшой, то индекс не имеет принципиального значения для скорости. Поэтому я его программно удаляю, а когда открывается 'родная' программа, то она автоматически создаст новый индекс (ndx, ntx).
  2. Если dbf файл имеет большие размеры, то его один или несколько индексов лучше хранить в mdb файле. Для этого создаю временную таблицу в Access и индексирую ее. В этом случае скорость доступа будет значительно выше, чем при использовании 'родного' индекса. При этом надо иметь ввиду, что если Вы только редактируете таблицу dbf, то ndx файл удалять не надо. С другой стороны, если Вы добавляете записи, удаляете их, то все равно придется сжимать базу данных, поэтому индекс (ndx) можно спокойно удалить. При использовании этих методов скорость к записям dbf будет выше.
[Таблицы] Вопрос 22-24. Имеется ли возможность обращения из Access 2000 к присоединенным DBF таблицам, если они уже открыты другим приложением (в отличие от Access 2 почему-то не работает) ???
Мой 1-ый ответ.  Нельзя. DBF файл создан для работы в однопользовательском режиме.
Ответ читателя.  
    Е-мое! DBF не "не создан" для однопользовательского режима, просто Акцесс (вернее ODBC) не может его открывать в многопользовательском режиме. Сама же база ДБФ поддерживает даже блокирование _конкретной_ записи, при ее изменении/(ит.д.) пользователем. Просто писать подобные программы нужно с использованием специализированных языков, и сетевых библиотек к ним. (Зуб даю ;-) )
   Сам часто работаю с DBF-файлами, и мог бы посоветовать запаковать базу. Хотя бы с помошью DBU.EXE, входящего в стандартную поставку Clipper, или другой подобной утилиты.
Мой 2-ой ответ.
   Первая версия dbase файла появилась в начале 80х. Естественно в то время не было Windows  и никто не думал о работе в сети. За 20 лет все изменения dbf файла от версии к версии существенных изменений не принесли. Различные библиотеки для сетевой работы также не могут преодолеть его недостатки. Вспомните, сколько раз Вам приходилось его индексировать после зависания, или открывать dbf-таблицы достаточно долго. А все проблемы хранятся в его структуре. Файл dbf можно сравнить с паровозом, к которому прицепляют вагоны разных размеров: ndx, ntx, mem, dbt и frm. Таким хвостом управлять очень сложно, особенно это заметно в сети. Microsoft не стала мучиться над dbf файлом, когда создавала Windows и Office, а сразу создала 2 новых формата файлов mdb (вместо dbf) и bmp (вместо pcx). Мой совет не тратьте очень много времени на изучение работы dbase файлов. Время замены dbf на mdb уже пришло. Недостаток специалистов по Access уже чувствуется, а со временем потребность на них должна резко возрасти.

 

 Изменение схемы подписки... Я получил несколько писем о том, что некоторым разработчикам Access сложно разобраться в рассматриваемых вопросах. Предполагаю, что это связано с тем, что в подписке идет много информации по разным темам и ее надо как-то "переварить". Поэтому и предлагается другая схема подписки.
1. Вы задаете вопрос, он публикуется в подписке в виде анонса.
2. И так, если из Вас кто-то из подписчиков находит решение, то высылает его по адресу:
, для публикую на сайте www.leadersoft.ru ответ сразу без задержки, в течение 1-2 дней с реквизитами автора ответа.
3. Преимущества такой подписки.
    а) Задавший вопрос может получить ответы от разных разработчиков. Причем ответ будет получен быстрее и намного подробнее, чем раньше. Например, посмотрите ниже несколько ответов на вопрос по "Счетчику".
    б) Те кто отвечает на вопросы имеют возможность бесплатно рекламировать свои программы и себя как профессионала по Access.
    в) Для тех, кто только начинает программировать будет время подумать над вопросами, а не читать только ответы, что естественно скажется на уровне их подготовки.
4. После группировки и сортировки ответы будут рассылаться подписчикам

Новые вопросы по Access
     Всего их 56 штук. Ответы на некоторые вопросы будут даны на сайте: www.leadersoft.ru. Вы можете принять участие в их решении. После получения достаточных ответов они будут разосланы подписчикам.

Вопрос 1. est baza , v tablice v pole OLE hranjatsja fotografii ja tak ponimaju v BMP formate tam 15 000 zapisej ! Baza 900 megabait chasto nado delat REPEAR ACCESS 2oj moznoli kak nibud pereformatirovat kartinki ? v jpg naprimer ? chto mozno sdelat chto bi ne visla .Kakov maksimalnij objom baz vo 2m ACCESSe ?
P.S. Я бы ответил, что данный вопрос относится к разряду профессиональных. Его сложно будет решить новичку, но решение найти можно.
Вопрос 2. Возникла следующая проблема. Access 97 (SP2). В форме используется ToolBar. В подформе в обработчике Form_BeforeUpdate происходит некая проверка и может выдаваться Question. Если выход из подформы осуществляется при щелчке мыши по ToolBar, то после выдачи сообщения "теряется" клик (нажатия на кнопку не происходит, а если перемещать курсор над кнопкой, по которой был клик, она "утапливается").
 
Вопрос 3. Имеем: - доступ по HTTP протоколу к текстовому файлу: httр://путь.../имя_файла.txt Необходимо: - регулярно копировать этот файл для дальнейшей обработки копии в автоматическом режиме, т.е. с обработкой ошибок в случае недоступности исходного файла.
 
Вопрос 4. Помогите пожалуйста решить одну "проблемку". Суть дела: - Есть форма, есть 2 кнопки в форме, есть отчет. Надо: чтобы при нажатии 1-ой кнопки отчет уходил на печать на 1-ый принтер, установленный в системе, а при нажатии 2-ой, соответственно на 2-ой принтер. Думаю, что есть пути решения вопроса.
 
Вопрос 5. Как сделать, чтоб в отчете сумму прописью выдавало ?
 
Вопрос 6. Кто-нибудь задавался целью, чтобы отчет в виде книжки можно было распечатать?
 
Вопрос 7. Мне приходится часто работать с данными из DBF файлов. Иногда они содержат достаточно много данных и выборка без ключа занимает много времени. Все эти данные я беру из CLIPPERовской базы. Там есть индексные файлы, но их формат не поддерживается ODBC. Можно ли как-то решить такую проблему? Сейчас я или смиряюсь, или импортирую каждый раз в ACCESSовские таблицы. Как вообще обрабатывать внешние индексы - натолкнулся на INF файлы, но нигде не нашел описания правильной работы с ними.
 
Вопрос 8. Последние 5 лет я занимаюсь тем, что создал и постоянно дорабатываю по мере необходимости базу для фирмы занимающейся ЖД перевозками (обработка данных из т/т накладных, расчет оплаты, выставление счетов и т.д.). В последнее время моя сетевая база работает в Access97. При попытке пробного перевода ее в Access2000, я столкнулся с проблемой: функция Like отказывается производить поиск по маске если в ней содержатся символы кириллицы "Е", "К", "Г". В Access97 все работает.
 
Вопрос 9. Как подключиться к БД MSDE, которая находится в сети на отдельном сервере (под WIN. 98, WIN. NT)
 
Вопрос 10. Где в проекте БД можно применять файлы строки подключения (Microsoft Data Link.udi). Как это реализовать в программном коде.
 

Выпуск 16. Как изменить поле Счетчик?

Введение.
    
В данном выпуске рассматриваются 28 вопросов пользователей. Всего добавлено 11 программ в файлы: la_table.mdb (7), la_report.mdb(2), la_form1.mdb(1),  la_menu.mdb (1)

[Отчеты]. Вопрос 2. Подскажите или сделайте пример, пожалуйста, как посылать отчет по
факсу с компьютера. У меня программа факса Venta ZVoice (для модема ZyXEL Omni 56k). Или может быть рассмотреть и такой пример: отчет экспорт в файл, допустим Word, а затем экспорт в Venta ZVoice.
Ответ.
   Для того, чтобы послать отчет Access на факс существует функция: DoCmd.SendОbject. Пример ее использования приведен в файле: la_report1.mdb. P.S. Возможна также передача факса через DDE - интерфейс.
[Таблицы] Вопрос 3. Я пытаюсь самостоятельно изучать Access, в основном по Help-у и не все еще получается. У меня появилась необходимость сделать несложную программку по капитальному ремонту, которая состоит из двух частей, а именно виды выполненных работ и израсходованных при этом материалов. С работами особых проблем нет, а с материалами сложнее. Принцип заключается в том, что берутся данные из файла .dbf, выбираются необходимые материалы (как правило это несколько наименований), в необходимом количестве и записываются в таблицу отчета (для возможности последующего просмотра и распечатки отчета). Но сложность (для меня) заключается в том, что в базе данных (не обязательно в файле .dbf), можно в таблице, которая импортируется из этого файла .dbf, необходимо уменьшать количество оставшегося материала на величину списанного и при этом всем выбранным списком (по возможности).
Ответ.
   Данная задача, когда требуется обновление части записей на постоянную или переменную величину, решается с помощью запроса на обновление, который применяется в функции VBA. Пример использования такого запроса дан в файле la_table.mdb
[Таблицы]. Вопрос4.   Access 2000 мне взять негде но вопрос по Access 97 я думаю Вы сможете мне помочь. Суть проблемы. На сервере фирмы выложена база (Б1) данных из таблиц которой я запросом в свою базу (Б2) качаю информацию и пытаюсь обработать. Так вот поле с цифровыми данными в Б1 проставлен тип - текст. При обработке таблиц в Б2 не могу изменить текст на цифровой тип, или теряются данные или выдает ошибку. Есть какой-то прибамбас для этого? А пока качаю в Excel и меняю там но время уходит уйма, кол. записей в таблице достигает порядка 27- 50 тысяч.
Ответ.
   Да такие проблемы могут встречаться при передаче данных. Для этого Вам необходимо в запросе, который обрабатывает таблицы, принудительно провести перевод данных из текстового формата в числовой. Пример конвертера текстовых полей дан в файле: la_table.mdb
[Формы]. Вопрос 5-7. 1. В "Лекциях..." , в примерах и ответах Вы применяете механизм DAO, но в руководствах по Access2000 указывается, что Microsoft активно внедряет механизм ADO, и со временем он может вытеснить DAO. В связи с этим нельзя ли указывать на нюансы, которые могут возникнуть (напр. невозможность реализации некоторых функций или алгоритма DAO с использованием ADO). Я только начал изучать Access, так почему бы сразу не начать с ADO. Еще лучше, конечно, дублирующие примеры . Какое Ваше мнение на использование DAO / ADO ?
2. Таблицы хранятся в другой БД. На нее поставлен пароль, при попытке соединения  выдается сообщение, что база данных заблокирована с монопольным доступом. Каким образом заблокировать БД с таблицами от попытки открыть любым другим способом, кроме "родного".(помимо установки в самой БД с таблицами макроса Autoexec, стартовой формы и т.п.)
3. В примерах по созданию кнопок меню необходимо предварительно создать строку меню с помощью "Настройка" В "Лекциях" строка меню создается в другом приложении.
Метод DoCmd.AddMenu требует описания исполнительного макроса. Каким образом в текущей базе данных программно узнать включенные меню, погасить их и создать собственную строку меню p.s. Конечно воспользоваться "Настройка" гораздо проще.
Ответ.
    1. Документацию по Бэйсику, которую Вы только начали изучать уже "устарела", есть новая 7.0 версия с другими библиотеками. Мой совет, если все же решите изучать Access, на начните с DAO, когда приобретете SQL сервер или Oracle изучите ADO или ADOX. Хорошие примеры на эту тему есть в справочной системе.
    2. Некоторые вопросы защиты базы данных смотрите в разделе сайта "Защита"
    3. Вообще о том, как погасить или отобразить панель меню я дал в примере N1 смотрите файл: la_menu.mdb. Для начинающего программиста задача "Отображения меню" в Access - отличный способ себя проверить. Используя лекции, а также указанный пример, Вы сможете спокойно решить ее. Если что-то не получится, то смотрите решение N3 в файле la_menu.mdb
[Формы]. Вопрос 8. Не могли бы Вы мне подсказать, как мне поступить? Ситуация: в форму вводим данные, затем при закрытии этой формы нужно распечатать введенные данные на листе в двух экземплярах, причем в заранее выбранном формате плюс некоторые значения должны быть обработаны с помощью макросов (например, перевод из числовой формы в текстовую). Как распечатать саму форму - понятно, но как придать ей новый вид?
Ответ.
   Вообще формы не печатают. Для этого существуют отчеты. Попробуйте создать отчет, и там решить Ваши проблемы.
[Формы]. Вопрос 9. Rasskazhute,pozhalyjsta,kak cozdat' coctavnue i cvjazanue formu.
Ответ.
  
О том как создать формы рассказывается в лекциях и примерах la_form.mdb и la_form1.mdb. Если возможно, то уточните вопрос.
[Таблицы] Вопрос 10. У меня вопрос, конечно, детский, но... Уж очень раздражает. Каждый раз при открытии Access 97 главное окно свернуто и при вызове таблиц, запросов и т.д. тоже раскрываются свернутыми. Возможно ли иначе?
Ответ.
   Можно. Для этого при открытии таблицы, запроса или отчета надо вставить команду DoCmd.Miximize. Пример смотрите в файле: la_table.mdb
[Формы] Вопрос 11. Буду очень благодарен, если Вы проясните вопрос: есть ли в Access 2000 календарь, и если есть , то как им пользоваться, а так же как узнать установленный пользователем фильтр в подчиненной форме?
Ответ.
   Да, в Access 2000 есть календарь в виде ActiveX элемента. Используется он очень просто. Вставьте его в форму и добавьте свою функцию в событие календаря AfterUpdate. Пример смотрите в файле la_form1.mdb. Фильтр в форме можно узнать через команду s= me.filter.
[Проблемы] Вопрос 12. Не нашел в рассылке ссылок на разработку БД в сетевом варианте. Есть ли особенности при проектировании БД для сетевого использования? Проблема: одно-ранговая сеть на РК кабеле, создал локальную БД, затем разделил, создал группу, таблицы на одном ПК и две оболочки. При запуске БД и попытке ввода информации в таблицы, все зависает. Я - начинающий, может что-то не так делаю, или сеть перегружается?
Ответ.
   Да отличия есть. Зависание сети зависит от многих факторов: от проводки, от связи с HAB и даже от названия полей таблиц. Для тестирования сети нужно иметь проверенную сетевую программу, написанную на Access. Я, например, пользуюсь программой "Книги бухгалтерии", так в ней не очень большое количество таблиц. Что делаю? Во первых, создаю автоматически несколько филиалов на всех локальных дисках. Во вторых, делаю проверку на ввод данных несколькими пользователями. В третьих, загружаю новые таблицы в эталонную базу данных и проверяю поля. Если возникли ошибки или просто предупреждения, то их я просматриваю в "Журнале контроля". Решение об исправлении принимаю в зависимости от серьезности ошибок.
[Отчеты] Вопрос 13. Во время создание отчета возникла проблема с ограничением ширины поля (около 58см), можно ли обойти данное ограничение
Ответ.
   Если Вы возьмете 2 листа бумаги 11 формата и сложите по длинной стороне, то получите 59,4 см. Отбросьте поля в 7 мм, и Вы получите размер бумаги для печати на широкоформатных принтерах. Далее по ширине печати идут графопостроители (плоттеры). Для печати на таких устройствах используются графические программы со специальными драйверами печати или рисования. У меня нет таких устройств. Могу дать только идею: попробуйте использовать пример N11 в файле la_report.mdb, где поле рисуется с помощью функций отчета, а не строится через конструктор.
[Формы] Вопрос 14. Не могли бы Вы ответить на следующий вопрос: у меня есть ленточная форма. После добавления новой записи я поставил команду Me.RecordsetClone.Requery для обновления формы. При ее выполнении выдается ошибка: "Out of stack space. Error 28" и Access зависает. Что можно сделать в этом случае?
Ответ.
   Для подчиненной формы запрос обновляется через команду me.requery. Для главной формы необходимо еще уметь сохранять позицию записи, потому что при использовании указанной команды, позиция редактируемой записи теряется.
[Проблема] Вопрос 15. Не встречалась ли Вам такая проблема: Имеется файл *.adp(ade) к проекту которого подключен другой файл *.ade В подключаемом файле написаны собственные библиотечные функции. В исходном файле в просмотре объектов все функции подключаемого файла видны нормально, но при попытке вызвать любую функцию из модуля выдается ошибка: функция не определена. Но это еще не все - описанная проблема проявляется периодически и не на всех файлах работающих по такой схеме. Случайно обнаруженное временное решение проблемы: переименование названия проекта в VB. Создание нового файла и импортирование в него всех объектов проблему не решает.
Ответ.
   Сложная проблема. Начните проверку ссылок в VBA, а также наличие полного доступа ко всем файлам DLL, которые использует Ваша программа.
[Таблицы] Вопрос 16. Работаю с Access97 c начала его выхода. Решил перейти на Access2000 и сразу столкнулся с проблемой. У меня в приложениях Access2000 все присоединенные *.dbf файлы открываются заблокированными и только для чтения. Следовательно я не могу ни отредактировать данные, ни установить фильтр и т.д. Как решить эту проблему?
Ответ.
   DBF файл открывается в однопользовательском режиме. Закройте все приложения, которые работают с вашим файлом. Попробуйте в примере N1 файла la_table.mdb, присоединить Ваш файл. Если файл открывается только для чтения, то проблема в ваших dbf-файлах. Возможно они закрыты от записи.
[Программы] Вопрос 17. Подскажите, пожалуйста, где бы я мог раздобыть базу данных по учету книг домашней библиотеки (может быть, необязательно домашней), написанной на Access 2000. Хотелось бы иметь возможность развития этой базы. Я не программист и начать с нуля для меня затруднительно - не знаю, как подступиться. Пример подобной базы, написанный для Access 97 у меня не понимает мой пакет Office 2000.  Проект, как Вы понимаете не коммерческий.
Ответ.
   Пока информации о такой программе, распространяемой в открытых кодах у меня нет. Подождите немного, возможно кто-то и поставит ее на продажу в магазин "Лидер Access" по доступной цене.
[Формы] Вопрос 18. При использовании поля с списком с параметрами как в рисунке, часто на экране не отображается содержание второго столбца, значение в поле есть, в качестве параметра для отбора использовать можно. При новой загрузке формы восстанавливается. Наблюдается в не обновленной версии 2000 года. Если есть решение, подскажите.
Ответ. Перегружать форму не надо. Вставьте в событие Enter для поля команду Requery. Например, для поля Поле1 событие выглядит так:
Private Sub Поле1_Enter()
    Me.Поле1.Requery
End Sub
[Таблицы] Вопрос 19. Можно ли в Access написать рекурсивный SQL запрос?. Если да, то подскажите, пожалуйста, как это сделать на таком примере. Есть сборка в нее может входить еще несколько подсборок, в подсборку еще подсборки и т.д, кроме этого в каждую сборку (подсборку) входит некоторое количество деталей. Нужно составить список всех деталей, входящих в сборку, просуммировав при этом количество повторяющихся деталей.
Ответ.
   Рекурсивный запрос создать нельзя. Но в вашем случае надо создать рекурсивную функцию, в которой можно использовать SQL - запрос. Как использовать в функциях запросы на обновление смотрите пример N7 в файле la_table.mdb
[Формы] Вопрос 20. Как известно, в Access сохранение новой или редактируемой записи происходит автоматически при переходе на новую запись. А как программно сохранить запись?
Ответ.
   Если Вы собираетесь сохранить текущую запись в форме, то вставьте в код программы команду: me.refresh
[Программы] Вопрос 21. Программированием увлекся не так давно, но уже основательно, забывая про сон и ужин. Ну да Бог с ним. Вопрос вот в чем. Решил я сотворить программу для начисления зарплаты. В первое время, хотя бы для приобретения опыта. Так вот, данные по количеству отработанных часов, как и начисленная зарплата, исходя из почасовой ставки, у меня заносятся в разные поля таблицы. Часы, в соответствии месяцам в поля М1, М2, М3 и т.д., зарплата Z1, Z2, Z3 и т.д. Но тогда я вынужден был создавать 12 запросов, по одному для каждого месяца, и на их основе 12 форм, чтобы данные попали в поля нужного месяца. Суть, Вы конечно поняли. Так вот, чтобы их не создавать в таком количестве, я придумал сделать одну переменную, которую бы видел весь проект, и которая бы являлась номером рабочего месяца. Один раз установил рабочий месяц и форма предъявляла бы для редактирования поля нужного месяца. Так же и при расчете зарплаты, чтобы рассчитанная сумма для каждого работника, попадала в поле, в соответствии с номером месяца. Теоретически то я до этого дошел, а вот практически реализовать не смог. Может Вы что подскажете? Или я вообще не в том лесу ищу и есть более простое решение?
Ответ.
   Попробуйте изучить применение фильтра для формы (Me.Filter = "...", me.FilterOn=True). Вообще, задача расчета зарплаты даже для профессионалов очень сложная. Требуется хорошо знать не только программирование, но и методику расчета заработанной платы, а именно, виды начислений, удержаний, налогообложение и многое другое. Если серьезно будете разрабатывать программу Зарплата, то советую приобрести таблицы нашей программы "Заплата и Кадры" с уже отлаженными названиями, полями, связями и данными. Стоит информация 50 долларов, но зато 1-2 года сэкономите на разработке.
[Таблицы] Вопрос 22-24. Вопрос 1. Имеется ли возможность в списках(List) Access 2000 автоматического поиска записей по первой букве, как это было в Access 2 ??? Вопрос 2. Имеется ли возможность обращения из Access 2000 к присоединенным DBF таблицам, если они уже открыты другим приложением (в отличие от Access 2 почему-то не работает) ???
Вопрос 3. Имеется ли возможность изменения содержимого кода модуля Access 2000 (не
данных), если к этому модулю уже подключено один или несколько пользователей
(как это опять же без проблем было возможно в Access 2)???
Ответ.
   1. Да можно, смотрите пример 12 в файле la_form1.mdb 2. Нельзя. DBF файл создан для работы в однопользовательском режиме. 3. Вообще непонятно, зачем это нужно. Уточните вопрос. Если по логике Вашей программы необходимо использовать какую-нибудь функцию несколькими пользователями, то ее записывают в DLL библиотеку и вопрос тогда отпадает.
[Проблема] Вопрос 25. У меня вопрос по поводу Ваших "Лекций по Microsoft Access 2000". Я работаю в Access 97. Набрал в нем часть кода и запустил программу. У меня появляются ошибки: "Невозможно создание объекта компонентом ActiveX", "Индекс выходит за пределы допустимого диапазона" и опять "Невозможно создание объекта компонентом ActiveX". Возможно это связанно с более старой версией Access? Буду признателен за ответ.
Ответ.
   Проверьте настройку ссылок в программе. Вообще лекции рассчитаны на определенный уровень знаний, т.е. если Вы начинаете программировать, то лучше начать с чего-нибудь попроще. P.S. Непонятно, зачем Вы прислали часть моего кода. Если вы его изменяете, то доводите работу до конца. Иначе не следует заниматься программированием.
[Рассылка] Вопрос 26. Я подписался на Вашу рассылку. Успешно получил 14 выпуск, но вот 15 выпуск до меня не дошел. Я проверил состояние подписки на http://subscribe.ru там всё вроде правильно, Ваша рассылка числится, в том на что я подписан. Что Вы посоветуете проверить?
Ответ.
   Действительно - это бывает. Все подписчики разбиты на группы по 50 человек в каждой. Например, сейчас число групп более 80. Рассылка осуществляется в пакетном режиме, т.е. отправляется сразу всем в одной группе. Если адрес электронной почты долго не отвечает, то повторно письмо туда не посылается. Я не могу влиять на алгоритм рассылки, у меня даже нет адресов. Поэтому, если такое случится снова, лучше поменяйте адрес электронной почты.
[Таблицы] Вопрос 27. После подписки на рассылку и получения первого же письма, у меня появилась надежда получить ответы на несколько давно интересующих вопросов, но задавать их без предварительного прочтения лекций посчитал бестактным. Да вот только и я, и мои заказчики используют MS Access 97. Не могли ли Вы что-нибудь сделать или порекомендовать мне для того, чтобы лекции я все-таки увидел (кроме установки MS Access 2000).
Ответ.
   Вы можете прочитать лекции в виде Windows справки. Адрес загрузки: http://www.leadersoft.ru/zip/la2000help.zip
[Таблицы] Вопрос 28. Здравствуйте, Уважаемые господа! Очень интересный сайт!!!!!!!!!! Как получить модуль B002.mdb? Куда платить ?
Ответ.
   1. Откройте электронный счет в системе WebMoney Transfer. Для открытия его скачайте с сайта webmoney.ru бесплатную программу, которая будет управлять Вашими средствами. Какие виды переводов осуществляются через webmoney смотрите по ссылке: переводы. Примерный оборот данной системы в день равен 15 000 долларов.
   2. Далее создайте кошелек и пополните его с помощью безналичной или наличной форм оплаты. При зачислении средств Вам будет выдан договор, который заполняется автоматически. Вам останется только проверить свои данные и нажать кнопку "Согласен". После этого программа выдаст документ: "Платежное поручение" (для Юридических лиц), или "Квитанцию для сбербанка" (для Частных лиц), которую необходимо предъявить в банк. Деньги на Ваш счет поступят в течение 3х дней. Их Вы сможете использовать для оплаты любой программы.
   3. Для оплаты вашего заказа через систему WebMoney Transfer вам необходимо произвести 75 рублей на кошелек R950727048343. При переводе денег обязательно укажите код программы. Отправьте по email: сообщение о том, что Вы заплатили за программу c кодом = B002. Обязательно укажите Ваш адрес электронной почты, куда необходимо отправить mdb-файл. Перевод необходимо делать без протекции сделки. После того, как Вы произведете перевод, мы в течение ближайшего времени примем Ваш заказ к исполнению. Программа будет перечислена к Вам в виде zip - архива.
   4. Примечание. Модуль B002.mdb имеет 3 таблицы с заполненными данными, запрос, отчет и VBA- код. Защиты нет. Таким образом, Вы можете свободно использовать ее в своих проектах. P.S. Если Вам очень сложно понять как все это работает, то можно получить счет по факсу и оплатить его через банк.

Выпуск 15. Сколько зарабатывает программист Access?

Введение. В данном выпуске рассматриваются 9 вопросов пользователей. Всего добавлено 4 программы в файлы: la_form1.mdb, la_table.mdb.

[Бизнес]. Вопрос 1. Интересно, а есть ли спрос на продукты на Access? Сколько в среднем зарабатывает программист на Access? Обычно вся индустрия программирования - это пирамида похлеще МММ. Думаю, что так же и про Access. Мне немало лет, я 20 лет занимаюсь компьютерами и практически не видел рядом с собой успешных применений. Сейчас (скоро 21 век!) пишу первую в истории конторы базу данных для нашего отдела кадров (5000 человек), может пригодится? Как Вы думаете?
Ответ.
   1. Спрос есть. Мной продано уже несколько программ для Москвы, России и других стран. Причем покупатели не новички, а уже имеют опыт работы с различными складскими и бухгалтерскими программами.
   2. Точных сведений о зарплате программиста баз данных у меня нет. Приблизительно можно сказать, что для России, учитывая государственные и коммерческие предприятия, это где-то между 200-400 $ в месяц. При выполнении работы на заказ зарплата, конечно выше, основываюсь на собственном опыте 
   3. Все, что касается индустрии программирования - я бы не сказал, что это пирамида. Компания MMM развалилась очень быстро, не просуществовав и 5 лет, а программистов явно не хватает. Даже для США, Германии требуются профессионалы. Причем зарплата ИТ - специалиста выше, чем в других отраслях. Всего месяц назад, мой родственник был заграницей в небольшом штате США по обмену опытом. С его слов могу сказать, что зарплата 50 000 долларов в год для иностранных специалистов не предел.
   4. Ваша база данных может пригодиться. Но мне кажется, что уже сейчас надо "застолбить" место среди компьютерных программ. Чем раньше Вы начнете ее рекламировать, тем лучше. К сожалению, у нас в стране нет специальных фирм, которые смогли бы это профессионально сделать. Но решение можно найти всегда.
     Для Вас и других разработчиков Access, я открыл магазин "Лидер Access". Теперь не надо ждать, когда у Вас появится готовая версия вашей программы. Вы можете поставить на продажу часть вашего проекта. Например, потратьте один день, сделайте 1-2 «качественных» отчета в формате mdb, вставьте в них свои реквизиты и разместите информацию о них в магазине. Пройдет какое-то время (зависит от посещаемости магазина) заказчик, которому понравится ваш отчет, купит его и свяжется с вами.
    Для размещения информации в Магазине вышлите мне короткое описание, ссылку на Ваш gif-файл, оставьте визитку. 
    P.S. Все средства от продажи программ поступают разработчику за исключением комиссионных магазина - 10 %.
[Таблицы]. Вопрос 2. Здравствуйте, с удовольствием просмотрел Ваши лекции. Интересно. Но у меня есть вопрос, не относящийся к ним. Проблема следующая: есть необходимость динамически подключать и отключать Dbf файлы к базе данных Access. Если есть такая возможность, прошу сообщить.
Ответ.
   При присоединении таблиц в текущей базе данных используется команда: DoCmd.TransferDatabase. Смотрите пример N1 в файле la_table.mdb.  Я бы отметил здесь 3 нюанса, которые Вы должны знать. Во первых, желательно, чтобы база данных dbf хранилась в папках с английскими названиями. Во вторых, в качестве параметра команды TransferDatabase DatabaseName используйте каталог dbf файла. В третьих, при загрузке базы надо следить за кодировкой символов. Т.е. если Вы загрузите dbf  и текстовые поля будут выглядеть правильными, то Вам не надо ничего менять. Иначе, надо в реестре изменить кодировку символов. Каждый раз меняя ее, необходимо закрыть Access, а потом открыть его снова. В примере использован файл пенсионного фонда. Для других программ могут возникнуть проблемы с отображением текстовых полей.
[Проблема]. Вопрос3. Есть вопрос. при выполнении строк кода:
Set db = CurrentDb
Set tdf = db.TableDefs![Имя_Таб]
tdf.Fields("Поле1").Size = 10
возникает ошибка: Недопустимая операция.(Ошибка 3219) При выполнении этой операции в конструкторе таблицы он (конструктор) спрашивает и предупреждает о возможной потере данных, но тем не менее делает то что от него просят. Можно ли с помощью программы изменить это свойство поля.
Ответ.
    Самый простой способ изменить свойства поля - это использовать запрос SQL. Пример 2 найдете в файле: la_table.mdb. Посмотрите еще пример 3, который позволяет изменить у поля запроса свойство Format, но уже по другому.
[Формы]. Вопрос 4. Я слышал что есть такая функция как Сумма прописью ( не число, а именно сумма) т.е. есть число 123,67 автоматически прописывало так: сто двадцать три тугрика 67 коп. Не расскажите ли в рассылке.
Ответ.
    К сожалению в Access нет такой встроенной функции. Но ее можно написать самому. Алгоритм следующий. Надо число разделить на рубли и копейки, а далее разбить рубли на единицы, десятки, сотни, тысячи и т.п. Пример посмотрите у меня в файле: la_form1.mdb. Он взят из программы "Склад и Реализация". P.S. Не пытайтесь код перевести на русский язык. Могут возникнуть проблемы в запросах.
[Формы]. Вопрос 5. Очень мне помогли ответы на Вопрос 8 и вопрос 9 выпуска 14. Все работает, только вот в функции "Авто-вычисление полей в форме" при вычислении, данные из поля Итого у меня не записываются в таблицу Базовая (аналог Вашей таблицы "Мои книги") Указание в Свойствах - Данные, поля Итого таблицы Базовой не дают результата. :-(
Ответ.
   Надо добавить промежуточное (невидимое) поле. Я изменил код в программе для вашего варианта. Теперь при переходе от одной записи к другой результат будет сохраняться в таблице.
[Формы]. Вопрос 6. ОЧЕНЬ! нужен диалог открытия файла, который в la_form.mdb, но он к сожалению не работает - не возвращает имя файла! ПОМОГИТЕ! Заранее очень благодарен, особенно если вышлите ответ на email. Спасибо.
Ответ.
    Очень хорошо, что задали вопрос о загрузке файла. Этот код у меня работал, иначе зачем же я его размещал в Интернете. К сожалению точно ответить, почему в первом случае код программы не возвращает результат, а в другом работает хорошо лучше задать Microsoft. Но Вы должны запомнить этот пример, т.к. такие ситуации иногда встречаются.
1. If GetOpenFileName(OFNAME) = True Then _
               funGetOpenFileName = ... '!Может не работать
2. Flag = GetOpenFileName(OFNAME)
    If Flag Then _
               funGetOpenFileName = ... 'Возвращает результат
[Таблицы] Вопрос 7. У меня следующая проблема. Мне надо чтобы при вводе текстовых или цифровых данных в поле формы была проверка с ранее введенными данными на предмет повторения. Поле формы текстовое. Проверка при переходе на следующее поле или при обновлении. Не могли бы вы подсказать как это сделать?
Ответ.
    Для этого существуют индексы в таблицы. Откройте любую таблицу и поставьте "ключ" на поле вашей таблицы. Например, в файле la_form1.mdb есть таблица "Мои книги", где ключ установлен на поле "Дата" и "Книга". В данном варианте Вы не сможете ввести 2 книги с одним названием и датой.
[Проблема] Вопрос 8. Option Compare Database
Option Explicit ' ***
Private Sub allFirms1_AfterUpdate()
Dim rst As Recordset ' ***
Set rst = CurrentDb.OpenRecordset("SELECT * FROM [Покупатели] WHERE [Код]=" & Me.allFirms1)
По аналогии с la_form1 пример 12 Получилась ошибка: run-time error 13 Type mismatch Данная ошибка исчезает если закомментировать строчки отмеченные как: ' *** Если же всю проделанную мной работу экспортировать в вашу базу то опять же всё работает. Подскажите, пожалуйста, в чём может быть причина ?
Ответ.
    При создании базы данных (по умолчанию) не создается ссылка на библиотеку DAO 3.6. Вам нужно в редакторе назначить необходимую ссылку. Смотрите дополнительно: "Лекции по Access" (2d), FAQ к ним, раздел на сайте "Аварийка". Нельзя отключать опцию: Explicit, она проверяет описание переменных вашего кода.
[Таблицы] Вопрос 9. Помогите решить проблему: есть 2 таблицы, они объединяются запросом. Да вся беда в том, что не находя данных для записи запрос оставляет поле пустым, а мне нужен НОЛЬ, так как это поле участвует в расчетах, а если значение с одного поля сложить с пустотой другого, то пустота и выходит. Надеюсь, Вы хоть немного меня поняли. Заранее благодарен.
Ответ.
    Действительно, при объединении двух таблиц может получится такой вариант, когда в поле запроса не будет данных. Это связано с тем, что по умолчанию, при создании запроса, форматы некоторых полей не назначаются. Эта проблема решается через конструктор запроса (щелкните правой клавишей на названии поля). Кроме этого Вы проблему можно решить программным способом, смотрите пример N3 у меня в файле la_table.mdb. Команда формат для полей имеет вид: 0;0;0;0 для 4 чисел типа: a >0 b<0 c=0 d=Null.

Выпуск 14. Как отпечатать отчет на разных принтерах?

Введение. В данном выпуске рассматриваются 27 вопросов пользователей. Всего добавлено 10 программ в файлы: la_form.mdb, la_form1.mdb, la_report.mdb, la_report1.mdb, la_array.mdb.

[Отчеты]. Вопрос 1. Есть процедура, которая автоматизирует печать отчетов. Необходимо в зависимости от некоторых условий печатать один и тот же отчет на разные сетевые принтеры. Как программно указать под какой принтер форматировать и соответственно печатать отчет.
Ответ. Самый короткий способ, минуя API-интерфейс, Вы найдете в файле: la_report1.mdb. Кроме этого Microsoft дает несколько примеров изменения настроек принтера в зависимости от операционной системы: Windows 3.11, 95 и NT. Посмотрите их по ссылкам: 1. Setting Printer to Item in the Printers Collection Fails, 2. Set Which Printer Is the System Default Printer
[Проблема]. Вопрос 2. Добрый день, если Вам не сложно, найдите несколько минут и посмотрите мой mdb. В форме "Капиталовложения" при многократном переходе от узла к узлу в TreeView происходит ошибка "нехватка памяти". Причём только под Windows 98 (под 2000 такого нет). Ошибка выскакивает и в Access 2000 и в Access 97 (текст функций конечно немного отличается). Я определил, что эту ошибку вызывает Sub Дерево_NodeClick, а точнее строка: "Me.Bookmark = Me.RecordsetClone.Bookmark" (при её отключении этого глюка нет). Как можно ещё синхронизировать TreeView и форму?
Ответ. Замечания к коду.
• Во первых, уберите лишние ссылки в базе данных. Смотрите tools/references…
• Во вторых, в своих лекциях, в конце курса, я предупредил, что могут быть проблемы с названиями на русском языке. Вообще некоторые буквы русского алфавита нельзя использовать в названиях функций, например, Ч(ч). Исправьте названия функций. Например, Function поиск_младшей_дочери(имя_дерева As Object) As Node назовите
Public Function Search_young_daughter(name_tree as Object) as Node.
• В третьих, Set rds = CurrentDb.OpenRecordset(таблица, dbOpenDynaset) не желательно использовать, лучше написать программу длиннее
Dim dbs as Database
Set dbs = CurrentDb
Set rds = dbs.OpenRecordset(myTable, dbOpenDynaset)
• В четвертых, необходимо освобождать память объектов, т.е. почаще посылать через команду Nothing в корзину: Set dbs = Nothing, или Set rds = Nothing
• В пятых, поставьте обработчики ошибок: On Error GoTo …
PS. Возможно этих изменений будет недостаточно, т.к. ошибка у Вас связана с элементом TreeView. Советую Вам для этого элемента завести подчиненную форму, тогда программа заработает.
[Проблема]. Вопрос3. Извините, если я не совсем по теме задаю вопрос. Ситуация следующая: Два компьютера (1) на одном Window 98SE и Ассess97+SP2 на нем же находится 2 MDB-файла (в одном программа в другом таблицы) (2) на другом WindowsNT4+SP6 и Ассess97+SP2. Если на (1) база открыта, то при попытке открыть эту же базу на (2) происходит практически зависание (2) на 2 - 5 минут, после чего она открывается. Если судить по TaskManeger-у то зависание происходит до того как в списке процессов появляется MS Access. Компьютеры в одном сетевом сегменте, протокол TCP/IP. Другие файлы (допустим документы Word) по сети открываются быстро. В чем может быть проблема?
Ответ.
• Во первых, создайте полностью две пустые базы данных и попытайтесь провести эксперименты с ними. Если они открываются нормально, как Word, значит сетевой протокол и настройки Access установлены правильно.
• Во вторых, выберите одну пустую базу данных и импортируйте из старой базы все элементы: таблицы, формы и т.п. Проверьте размер старой базы по отношению к новой созданной базе. Если она больше новой ~ 30 %, значит при редактировании базы Access у Вас остались лишние связи, которые и влияют на загрузку Access. Такие же действия проделайте и с другой базой.
• В третьих, один файл надо конвертировать в mde формат, смотрите подписку о разделении баз данных на mdb и mde.
• Комментарий. К сожалению программы сжатия (запускаемые из меню и модуля VBA CompactDatabase) в Access 97 и 2000 работают неправильно. Приведу пример на своей базе данных "Склад и Реализация". Сжав программу стандартными действиями, я не успокаиваюсь на этом, далее сжимаю ее по своему алгоритму. Иногда мне удается сжать mdb-файл на 40-45%. Потом делаю из mdb mde файл, который бывает меньше полученного обычным путем mde файла на 8-9%. Все это приводит к тому, что программа быстро загружается и корректно работает в сети из компьютеров, имеющих разные операционные системы.
[Таблицы]. Вопрос 4. Если Вас не затруднит, ответьте, пожалуйста, на такой вопрос. При копировании данных таблицы Access через буфер обмена, при вставке этих данных в другое приложение по умолчанию копируются также названия столбцов. Можно ли исключить копирование названий столбцов?
Ответ.
    Обычным способом сделать нельзя, попробуйте программным способом. Непонятно, зачем Вам это нужно. Если Вы скопировали таблицу в Excel или Word, то там названия столбцов выделяются и удаляются все вместе очень просто.
[Таблицы]. Вопрос 5. Каким образом считать определенную ячейку из таблицы, возможно я где-то пропустил Help. Например: поле 4, запись 3. С помощью Recordset это на составляет труда, а более простой метод - как в Excel (D3) ?
Ответ.
Обратиться как в Excel к таблице невозможно. В ней может быть несколько миллионов записей. Но если Вам нравиться такая система поиска, возьмите функцию GetRow, она позволяет прочитать все(часть) записей в массив. Массив 2x мерный: myTable(x,y), где x-это поля, y –строчки, совсем как в Excel. Пример есть в файле: la_array.mdb, “Поиск как в Excel(GetRow)” PS. Советую испытать программу с массивом в несколько тысяч записей, прежде, чем использовать в работе.
[Проблема]. Вопрос 6. При обработке события Отсутствие в списке (я просто обращаюсь в подчиненную табличную форму и добавляю запись ) блокируется клавиатура, все приходит в норму после щелчка мыши в любом месте главной формы.
Ответ.
    Если у Вас блокируется клавиатура, то это означает, что программа выполняет какие-то «зацикленные» действия, т.е. операционная система не получает «сообщений» от Вашей программы. Попробуйте вставить в разные точки программы команду: DoEvents.
[Формы] Вопрос 7. Подскажите, пожалуйста, как сделать на всю строку курсор в табличной или ленто��ной форме. Я использую в табличной форме для события "текущая запись" команду" выделить строку", но это на мой взгляд коряво.
Ответ.
    Я примерно также выделяю строку, и мне это кажется «коряво». Пример для ленточной формы посмотрите в файле: la_form1.mdb. Не забудьте откорректировать код для разных нажатий клавиши мыши.
[Формы] Вопрос 8. У меня есть несколько вопросов по эксесу... Вот захотелось мне сделать прогу "Платёжки". Вроде и правильно создал таблицы... А вот у меня не получается сделать форму, чтоб в ней при выборе "Плательщика" из выпадающего меню - сразу сами вписывались остальные поля: код, мфо, кредит, счет и т.д. Я никак не пойму, как делается ссылка на файл, в котором лежит все это, в смысле в редакторе "Подстановка" (файл, список, файл со списком). Соответственно (даже при составлении "Схема данных") в "меню списка полей" нету списка полей всех нужных мне таблиц, из которых бы я вручную сам подставлял поля( ибо в авто/форма ничего не катит) :-((( Может я не так понятно выражаюсь - тогда буду как-то по другому излагать. Эксес начал только юзать, так шо ногами не пинать, plz :-)
Ответ.
    Пример «Заполнение реквизитов» найдете в программе la_form1.mdb. PS. Небольшой совет. Когда-то и я начал изучать Access 2.0 c «Платежки». Но чтобы Ваша программа стала профессиональной необходимо добавить к ней разные свойства. Например, у меня в программе «Банк предприятия» можно: • получать автоматически курсы валют • заполнять банковские реквизиты плательщика по БИК, • печать поручения на специальных бланках, • осуществлять быстрый поиск плательщика по списку • выделять НДС и много других.
[Формы] Вопрос 9. Как сделать в форме вычисление? "Поле1" делится на "Поле2" (при этом поле2 имеет постоянное значение, и при переходе на другую запись должно автоматически переноситься), а результат выводится в "Поле3"
Ответ.
    Пример «Автозаполнения полей в форме» найдете в программе la_form1.mdb.
[Формы] Вопрос 10. Подскажите начинающему, как сделать в запросе поиск по нескольким полям, чтобы в одном из полей для поиска вводить части слова и подстановочные знаки, например вводим К*зл а находим Кезлав, Козлов и т.д.
Ответ.
    В запросе надо использовать ключевое слово Like. Пример для данного поиска Вы найдете в программе «Поиск по нескольким полям»: la_form.mdb. Там я добавил код «Поиск по шаблону» для Вашего случая.
[Проблема] Вопрос 11. Сия конструкция проработала на IIS3 1,5 года
<% strTB1= Request("sqlri")
set objConn = server.createobject("ADODB.Connection")
objConn.Open "dnsalias"
set cm = Server.CreateObject("ADODB.Command")
cm.ActiveConnection = objConn
cm.CommandText ="INSERT INTO Table1 (item1) VALUES (?)"
set objparam=cm.createparameter(, 200, , 255, strTB1)
cm.parameters.append objparam
if strTB1 <> "" then
cm.execute
end if %>
После переноса на IIS5 (W2000) выдала: [Microsoft][Драйвер ODBC Microsoft Access] В операции должен использоваться обновляемый запрос. Жалуется на строку cm.execute. На уговоры не поддается. =( Кто такой обновляемый запрос? Как быть?
Ответ.
    Это происходит потому, что драйвер ODBC "не понимает" ваши SQL запросы, т.к. различия в командах SQL могут быть различными. Попробуйте упростить задачу, используйте только ANSI SQL. Впервые я получил сообщение «В операции должен использоваться обновляемый запрос» в программе «Зарплата и Кадры». Пришлось разделить SQL-запрос на две части. Первая часть создавала временную таблицу. Вторая часть запроса брала данные из таблицы и продолжала вычисления.
[Проблема] Вопрос 12. Есть БД на Oracle. Если работаю с ней через MS Access, то "сложные" запросы выполняются и получаю приемлемый результат. Поскольку запрос получается на MS SQL (или Access, не знаю как правильно), то есть подозрение, что где-то есть интерпретатор, который конвертирует в понятный для Oracle вид. Каким образом можно получить запрос в "удобоваримом" для Oracle виде, т.е. на PL/SQL?
Ответ.
    Я не специалист по Oracle, но могу сказать, что связь Access и Oracle осуществляется через драйверы ODBC, которые поставляются как Microsoft так и Oracle. Какой лучше из них, не знаю. Интерпретатор (драйвер ODBC) конвертирует данные одной базы данных в другую. Например, из Oracle в Access: Float -> Double, Long->Memo. Если Вы используете типы полей Oracle, которых нет в Access, то они конвертируются в поле Text с соответствующим размером точности. PS. Таким образом, возможное решение Вашей проблемы лежит в плоскости ODBC. (нужно найти подходящий драйвер ODBC).
[Отчеты]. Вопрос 13. Не могли ли вы написать про создание отчетов, и если возможно можно ли в Access сделать свое законченное приложение(setup/install) - что бы работал на тачке, где нет Access?
Ответ.
    Программы по отчетам Вы найдете в файле: la_report.mdb и la_report1.mdb. Небольшую информацию о том, как создать законченное приложение на Access я дал в подписке. Кроме этого, у меня на сайте в разделе «Другие» есть ссылка на статью, где подробно описывается об этом. PS. Вообще, если Вы разрабатываете коммерческую программу, лучше подумайте о том, как сделать доступным заказчику для изменения отчеты, формы и т.п. Потому что, если он будет покупать программу, то первый вопрос, который он задаст Вам, звучит примерно так: «Можно ли изменить отчеты в программе?».
[Формы]. Вопрос 14. Как сделать, что бы сортировка на форме производилась в порядке ввода данных.
Ответ.
    Вам надо создать на форме кнопку, которая бы сортировала записи и далее «находила» запись формы, с которой Вы работали ранее. Пример «Сортировка в форме» Вы найдете в файле: la_form1.mdb
[Отчеты]. Вопрос 15. Многих (и меня в том числе) интересует возможность при помощи Access2000 публиковать данные из аксессовской базы в формате html в виде ленточной формы (или хотя-бы табличной). Визард не позволяет получить такое отображение. Возможно ли в Аксессе, не привлекая дополнительных средств (Нотепадов и т.д. :-) ) смастерить страничку с динамически обновляющимися данными в ленточном или табличном виде?
Ответ.
    В Access есть страницы доступа к данным. Я разработал одну такую и даже пытался разместить ее в Интернете. Но, но этот способ публикации информации в Интернете не самый лучший. Он еще не развит, да и открывается html-файл медленно, поэтому лучше воспользуйтесь другими средствами публикации.
[Формы]. Вопрос 16. У меня такой вопрос. Я заранее не знаю на каком мониторе (с каким разрешением) будут работать мои программы, поэтому получается, что созданная мной форма либо не влазит в экран, либо часть экрана остается пустой. Что можно сделать?
Ответ.
    Посмотрите пример «Как определить разрешение экрана» в программе la_form.mdb
[Формы] Вопрос 17. Еще один вопрос. Может не Вам, но если можете, подскажите. В запросе к серверу SQL я могу явно указать параметр для отбора записей (например, дату). Как указать в запросе, чтобы этот параметр брался из поля формы? Ссылка типа Forms!NameForm!Pole не проходит.
Ответ.
    Попробуйте ссылку написать так Eval(Forms!NameForm!Pole), тогда функция Eval вернет в SQL значение, а не ссылку. PS. Если не получиться, то надо составлять запрос: sSql=«SELECT * FROM [MyTable] WHERE [myDate]=» & Forms!NameForm!Pole. Дата в поле должна иметь американский стандарт.
[Проблемы]. Вопрос 18 . У меня возникла следующая проблема: Имеется база данных на ~30000 записей, находящейся на файл-сервере Nowell 3.12. Начиная с некоторого момента сервер стал выдавать сообщение о том, что ему не хватает памяти для "залочивания" изменяемых записей, и базу пришлось перенести на локальную машину. Что очень не удобно. Попытки поиграть с режимом блокирования записей ничего не дали, памяти добавить на сервер нет возможности. Возможно, я что-то упустил? Подскажите, как быть. (Конечно изменить алгоритм работы можно, но хотелось бы иметь и другой вариант решения проблемы)
Ответ.
    Попробуйте сжать базу данных по алгоритму, который я привел выше для двух mdb файлов. Сначала создаете пустой mdb файл, а далее в него путем импорта вставляете таблицы и другие объекты.
[Списки]. Вопрос 19. Я работаю на Access 97. У меня на форме список с источником строк, направленным на запрос с параметрами. Когда форма (и, соответственно, запрос) открыты, я изменяю значения параметров запроса (через компонент QueryDef) и выполняю Requery у списка. При этом открываются диалоги ввода параметров, а установленные мною значения параметров игнорируются. Почему?
Ответ.
    Я вообще запросы с параметрами не использую, но в списках запросы изменяю очень часто. При «входе» (ПолеСоСписком1_Enter) в список и «после обновления» ПолеСоСписком1_AfterUpdate). Поэтому, попробуйте составить запрос без параметров. Например, напишите так: sSQL = “SELECT * FROM [MyTable] WHERE [Код]=” & Me.Kod. Далее присвойте эту строку списку: Me.ПолеСоСписком1.RowSource = sSQL
[Формы]. Вопрос 20. Остался такой вопрос. Кнопка в форме: в исходном состоянии запрещено изменение и добавление. При нажатии на кнопку - меняются свойства и теперь можно вводить изменения или, например, добавить. При этом происходят какие-то изменения в форме, например, цвет кнопки меняется на красный.
Ответ.
    Пример, «Включить редактирование в форме», смотрите файл: la_form.mdb
[Отчеты]. Вопрос 21. Вопрос. В отчете печатаются фамилии и какая-то сумма. Необходимо в конце получить ИТОГО. Например, Вася 200, Маня 305, Ваня 276,5 ИТОГО 781,5
Ответ.
    Для получения результатов в отчете необходимо провести группировку по нужным записям и использовать функцию sum() для поля Сумма. Это выглядит так: sum([Сумма]). Пример «Суммирование в отчетах» дан в файле: la_report1.mdb для книг.
[Проблема]. Вопрос 22. Недавно начал программировать на Access. На строчку Dim dbs As Database в Access-e выдается ошибка user-defined type not defined. Хотя в Ваших лекциях (программа калькулятор) все проходит нормально. В чем может быть проблема??
Ответ.
    При работе с запросами, таблицами необходимо установить ссылку на DAO (например, Microsoft DAO 3.6 Object Library). Дополнительно прочтите Лекцию 2d, далее при редактировании своей программы выберите меню Tools - References и установите нужную ссылку. Внимание!. Порядок ссылок может иметь существенное значение. Могли бы получить ответ и раньше, если бы прочли на сайте раздел FAQ для лекций.
[Таблицы]. Вопрос 23. У меня возникла небольшая проблема с объектом RecordSet и её методом Delete. Я знаю, как добавить записи в базу с помощью метода AddNew. Теперь возникла необходимость удаления Записей из таблицы. Скажем так, существует необновляемый запрос, в состав которого входит таблица, из которой будут удаляться записи. У этой таблицы в запросе есть свой Код, с помощью которого будут удаляться записи. Код выглядит так.
Dim tbl as Recordset, db as database, Kod As String
Kod = [Поле в запросе, соответствующее этому коду]
set db = currentdb
set tbl = db.OpenRecordset("MyTable",dbOpenDynaset)
tbl.delete
Метод tbl.delete удалят поочерёдно записи из таблицы начиная с первой. А вот как сделать то что бы он удалял только ту строку, которая на данный момент активна в запросе (на которой стоит курсор) и соответствует Ключевому полю Kod Описаному Ниже.
Ответ.
    Для позиционирования в запросе существует метод tbl.FindFirst. Смотрите примеры в файле: la_form.mdb. В вашем случае, я бы написал по другому: db.execute “DELETE * FROM [MyTable] WHERE [Kod]=” & me.Kod. Пример «Как удалить запись через SQL?» возьмите из файла: la_form1.mdb
[Другие]. Вопрос 24. Я только подписался и не все понимаю в рассылках. Но сама рассылка мне понравилась. И сходу несколько вопросов по теме …
Ответ.
    Сходу не получится, т.к. пострадают другие подписчики, которые прислали вопросы раньше. Технология ответа следующая. Все вопросы, присланные по адресу , хранятся у меня в папке «Подписка». И так, если к Вам не пришло никаких сообщений, то я его получил. Далее я разбираю почту и даю ответ в подписке в порядке очередности. Вы, также получите сообщение, что вопрос попал в подписку. Кроме этого, все вопросы сортируются и попадают на сайт www.leadersoft.ru в разные разделы. Если Вы имеете срочный вопрос, то Вы можете получить на него ответ быстрее. Для этого в письме дайте пометку «Срочный» и отошлите его, я дам ответ о его получении. Услуга платная, расценки следующие: 5 (пять) рублей «За консультацию по Access», 50 (пятьдесят) рублей «За программу по Access». Оплата через сайт: www.webmoney.ru
[Отчеты] Вопрос 25. Подскажите, пожалуйста, по вопросу №5 (рассылка 13). Возле "цена" - печатать "новая" - добавляю еще одну такую же процедуру с другим условием и для другого поля. Отчет не хочет получаться, пишет что-то про ошибку печати в программе.
Ответ.
    Я добавил VBA - код для другого поля, смотрите файл: la_report.mdb
[Проблема]. Вопрос 26. Razdelil bazu ! Tablici v odnoj direktorii , aplikacii v drugoj . pitajus iz MDB sdelat MDE, vidajot takoe soobshenie. Chital help , napisano chto vrode chto to sdelat s podlinkovannimi bazami. Chto mozno sdelat ?
Ответ.
    Правильно Access дает Вам сообщения. Прежде чем, создавать mde файл из mdb, свяжите последний с реальными таблицами, которые Вы разместили в другом файле. Для этого используйте пункт меню «Диспетчер связанных таблиц»
[Лекции]. Вопрос 27. Napishi pojailusta etu programu c English mazvaniyami a to u menya ne rabotaet na Win98(English) and Offise 2000 mne ocheni nujni lektsii po Access
Ответ.
    Я планирую это сделать. Но на эту работу нужны деньги. Вы можете ускорить выход лекций на английском языке. Задайте нужный Вам вопрос. На него будет дан ответ на английском языке и написана программа. Услуга - платная, стоимость определите сами. Оплатить можно через www.webmoney.ru
[Другие] Вопрос 28. Dear Leader: I subscribed for Access recently, and started receiving information from issue 11. Could you, please, help me to get issues 1 - 10? Thank you in advance.
Ответ.
    Hellow! You can receive all archive: www.leadersoft.ru. With the best regards, Victor Konjukov

Выпуск 13. Как добавить поле в отчет MDE файла?

Введение. В данном выпуске рассылки рассматривается 11 проблем пользователей баз данных Access на темы: отчеты, формы, аварийные ситуации, драйвера и т.п.

Вопрос 1 [Отчеты] Как добавить новое форматированное поле в отчет, не используя конструктор отчета! Желательно это сделать для MDE-файла, т.к. мне надо, чтобы заказчик сам изменял форму отчетов в MDE файлах.
Ответ.
    Коварный вопрос, потому что всем известно, что конструктор в MDE файлах применить нельзя. Но решается он очень просто, если подумать немного головой. Все поля отчета располагаются в секции Me.Section(acDetail)-область данных. При этом для каждой такой секции у отчета есть событие Print. Возникает оно для КАЖДОЙ записи после форматирования, но до момента вывода данных на печать. Отсюда следует, что Вам надо вставить в это событие свою программу, которая будет сама форматировать нужные Вам поля.
    Пример 11 посмотрите в файле la_report.mdb. Там я добавляю поле "Цена" в конец списка полей, используя для вывода данных запрос rstRpt и функцию форматирования Format(rstRpt!Цена,"# ##0.00"). Внимание! Для корректного выравнивания некоторых полей по правой границе может потребоваться пакет обновления SR1, т.к. функция TextWidth возвращает неправильный результат.
Вопрос 2 [Отчеты] У меня в прайс - листе надо иметь строки отчета разной высоты, причем в некоторых полях текст может быть иметь разную длину, другой шрифт, наклон, высоту и толщину, причем я планирую вставить рисунки разной высоты для каждой записи. Сейчас применяя  расширение по вертикали для поля, другие поля не расширяются и прямоугольники вокруг них рисуются не правильно.
Ответ.
    Красивый у Вас будет отчет. Я таких еще не видел. Вообще задача расширения строк по вертикали необходима для многих отчетов которые используются по складу или в бухгалтерии, например, для счет - фактуры, накладных, прайс - листов. Я так понял, что эта задача на сообразительность. Решение у нее очень простое:
    • Во первых, сделайте невидимой каждую границу (рамку) поля.
    • Во вторых, в событии Print для секции надо вставить программу, которая будет определять поле максимальной высоты, далее рисуете для каждого поля ограничивающий прямоугольник. Пример 9 Вы сможете найти в файле la_report.mdb. Прямоугольник в примере рисуется близко к тексту. Задача от меня. Как сделать так, чтобы текст в поле форматировался на некотором расстоянии от рамки поля ?
Вопрос 3 [Дискуссия] 1. Из Ваших лекций следует, что профессионализм приложения может быть определен из наличия динамически создаваемых объектов (формы , отчеты, таблицы . и. т. д. - минимизирующий размер программы), тогда как, на мой взгляд, предварительно сформированные объекты упрощают работу с приложением (особенно при изменении уже созданных объектов). 2. Вы советуете не создавать больших баз данных. А как быть если предметная область требует создания множества взаимосвязанных таблиц (от 50 до 100)
Ответ.
    Вы неточно сделали вывод из лекций. Динамически создавать отчеты и формы вовсе не обязательно. Естественно, если Вы создали форму, ввели в нее элементы управления, заранее создали запросы, то программа будет работать быстрее. Я даю примеры программирования для того, чтобы Вы не "зацикливались" на конструкторах базы данных, а искали и другие методы проектирования.
   Ведь что получается, просмотрев 100% программ по складу в Интернете, я обнаружил, что все они работают нормально только в начале года, когда нет данных.  Таким образом, если у Вас накапливается около 20,000 - 30,000 записей на таблицу (конец года), то уже все ресурсы компьютера идут на поиск в базе данных. Открытие форм, отчетов, справочников может занимать несколько минут. Требуется установка специальных программ-серверов, даже если у Вас всего 3 компьютера. Мне в программе "Склад и Реализация" удалось реализовать постоянную скорость доступа к данным в течение года. При этом число таблиц, с которыми работает бухгалтерия около 1000. Удалось ЗНАЧИТЕЛЬНО сократить ошибки по вводу данных, да и работать с базой стало приятнее.
    Все рассказать не возможно, лучше всего приобрести программу "Склад и Реализация" и посмотреть на нее в действии. Стоимость ее - 1380 рублей для сети, оплата любая, согласитесь, что очень низкая цена за информацию. Тем более, что все новые идеи для покупателей рассылаются бесплатно. Сейчас я готовлю новую версию программы, где Вы сможете заменить любую форму, отчет и вставить свой mdе(mdb) модуль.
Вопрос 4 [Аварийная ситуация] Я сделала базу, где таблицы и другие объекты находились в одном файле, а потом решила отделить таблицы. Однако, после присоединения таблиц, некоторые запросы "испортились", т.е. либо стали работать неправильно, либо не стали работать вообще. С чем это может быть связано?
Ответ.
    При разделении баз данных, Вам приходиться удалять таблицы. Но в отличие от Access 97, Access 2000 обеспечена взаимосвязь объектов таблиц, запросов, форм, отчетов. Например, если Вы изменяете название поля таблицы, все запросы и формы, использующие такое поле получают новое имя из источника данных.
    В вашем случае необходимо сначала было скопировать базу данных, а потом уже удалять таблицы. После удаления и присоединения новых таблиц проверить запросы, и если они испортились, то из скопированной базы данных импортировать их в Вашу базу данных.
Вопрос 5 [Отчеты] Мне необходимо в прайс-листе около цены вставлять некоторые комментарии, например, "Новая" цена. Все они зависят от разных требований.
Ответ.
    Посмотрите пример N10 в файле: la_report.mdb. Там я вставляю слово "новая" в поле "Цена". Логику программы можно изменить и добавить другие слова и условия.
Вопрос 6 [Клавиатура] Как определить процедуру на нажатие комбинации клавиш (Alt + ... , Ctrl + кнопка мыши , и т.п. ) ?
Ответ.
    Во первых, Вам необходимо добавить при загрузке формы в событие Form_Load() строку Me.KeyPreview = True. Тогда события клавиатуры для Вашей формы будут обрабатываться в первую очередь. Во вторых, назначить события KeyDown для формы и MouseDown для элемента управления. Помните, что если Вы обрабатываете ключ, которому уже назначено события, например, F1-справка,  то после обработки его, необходимо "обнулить"  коды клавиш (keyCode=0 и Shift=0). Иначе, сработает встроенная справка Access. Обратите внимание, что если есть подчиненная форма, то надо сделать обработку событий и в ней.  Пример N7 найдете в файле la_form.mdb.
Вопрос 7. [Формы] Хочу вызвать окно открытия файла если можно помогите пожалуйста. Я работаю в Access 97.
Ответ.
    Вообще, для Access 97 поставляется демонстрационная база данных, в которой есть пример для работы с стандартным окном Windows для открытия файла. Он немного запутан, но разобраться можно. Упрощенный пример для Access 2000 на основе API-интерфейса Вы найдете в файле: la_form.mdb
Вопрос 8. [Отчеты] Получается такая ситуация, что динамически не возможно изменить RecordSource или Filter, у подчиненных запросов. Скажем так, есть подчиненный итоговый отчет, данные в котором должны должны рассчитываться (Recordsource) или отбираться (Filter) с учетом даты указанной в форме, причем если форма не загружена фильтрации нет, а если загружена то нужно учесть и начальную дату и конечную, обе даты могут иметь нулевое значение. Cоставить запрос с учетом этих требований не представляется возможным, а событий для отчета явно маловато, чтобы изменить изложенные выше свойства.
Ответ.
    Событий для отчета хватает, только нужно научиться применять их. В Вашем случае, перед печатью каждой строки отчета, надо проверить в них данные на соответствие вашим требованиям. И если они не удовлетворяют логике Вашей программы, то отменить их, для этого в событии для секции "Область данных" Format вставьте Cancel = True. Пример N8 возьмите из файла la_report.mdb
Вопрос 9 [Формы] 1. Можно ли менять ширину столбцов в ленточной форме по такому же принципу как в EXCEL? 2. Подскажите, пожалуйста, можно ли в ACCESS 2000 в ленточной форме "Закрепить" n первых столбцов?
Ответ.
    Ширину столбцов и их закрепление Вы можете назначить только для табличной формы. Во всех других видах форм - это невозможно сделать, не используя программные средства. В вашем случае откройте форму в режиме таблицы, поместите указатель мышки на заголовок поля и нажмите правую клавишу мыши. В меню Вы найдете три пункта, которые работают с столбцами: "Ширина столбца ...", "Скрыть столбцы", "Закрепить столбцы". В верхней панели меню "Формат" Вы можете найти команду освобождения столбцов.
    В программе "Склад и Реализация" я использую программные средства, чтобы управлять закреплением и отображением столбцов. Делается это через функции: FrozenColumns, ColumnOrder, RowHeight, ColumnWidth, ColumnHidden.
Вопрос 10 [Драйверы] Возможно ли взаимодействие ACCESS с файлами формата *.dat
Ответ.
    Access взаимодействует с любыми  файлами. Во первых, если этот файл Вы разработали сами, то Вам надо научиться читать/сохранять файл в таблицах Access. Во вторых, если структура этого файла разработана известной компьютерной фирмой, то надо приобрести у них соответствующий драйвер ODBC.
Вопрос 11 [Формы] Podskazhite pozhaylusta kak v ruchnuyu svyazat, skazhem 5-6 posledovatelnyh podchinennyh form. S pomoshyu mastera mozhno sozdat formu s dvumya maximum sub-formami.
Ответ.
    Ваш вопрос не имеет практического применения, сложно придумать реальную задачу, где можно применить такое количество форм. Интерфейс явно будет перегружен. При большом количестве данных загрузка такой формы может занимать длительное, более минуты, время. Советую подумать над улучшением программы. Например, я в программе "Склад и Реализация" при загрузке формы, отключаю запросы в подчиненных формах и только в момент обращения к данным начинаю загружать их.

Выпуск 12. Как в форме нарисовать окружность?

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

Внимание. На сайте: www.leadsoft.ru появилась новая программа Курс 2000, версия 4.2. В ней улучшена диагностика при подключению к ЦБ. Программу можете получить бесплатно. Также Вам предлагается новая программа "Склад и Реализация", в которую встроено более 100 отчетов.

1. [Формы] У меня есть такая проблема. Разрешима ли она? Не сильно вдаваясь в подробности, вопрос такой - Могу ли я что либо создавать на форме в тот момент, когда она уже запущена? К примеру, нарисовать линию (которой нет в режиме Конструктора). Мне, это надо для рисования различных типов окон, по заданным параметрам пользователя в масштабе. И более того выводить эти рисунки на печать. Вариант, с заранее приготовленными рисунками в режиме Конструктора формы не подходит. Так как их огромное количество и невозможно их видоизменять. Например нанести заданные размеры на рисунок, сделать масштаб сторон окна и т.д.?

 

Ответ . Да Ваша проблема разрешима. Но она достаточно сложная и без соответствующей подготовки не обойтись. Для этого Вам надо хорошо изучить API-функции (user32.dll) и GDI-интерфейс (gdi32.dll) для рисования графических элементов Windows. Форма в Access как слоеный пирог состоит из цепочки связанных между собой пластинок-окон. Классы окон бывают разные, например, "OFormSub", "OTabControl" и другие. Среди них надо найти класс "OFEDT", получить предыдущий контекст окна и использовать его для рисования. В файле la_form.mdb Вы найдете пример 5, который показывает как нарисовать в форме Access ДУГУ и ЛИНИЮ. С помощью GDI - интерфейса Вы сможете нарисовать и другие объекты Windows, сплайны, ломаные и заштрихованные области. Думаю, что если внимательно изучите пример, то У Вас все получится.
    Вывод на печать в отчете достаточно простой. Для этого в нем есть функции рисования линий Report.line и элипсов Report.circle. Использовать их надо после форматировании страницы. Внимание! Когда Вы рисуете в отчете размерность элементов может быть в мм, см, дюймах, твипах, пикселах и других, а в форме размерность дается в пикселах. Смотрите файл: la_report.mdb
    PS. Второй способ заключается в том, чтобы найти ActiveX  элемент для формы, т.е. небольшой графический редактор. Я думаю, что такие фирмы как Adobe, Corel, Кодак давно разработали их. Для этого дано посмотреть сайты, содержащие графику. Элемент ActiveX может содержаться в web-страницах.

2. [Меню]. С большим интересом изучаю Ваши "Лекции". При попытке создать по описанному в них способу пользовательскую панель меню столкнулась с тем, что на кнопках на моей панели не отображается текст, указанный в свойстве Caption, а отображается этот текст во всплывающей подсказке к кнопке. С чем это связано и как это исправить?

 

Ответ . Попробуйте сначала научиться создавать панель элементов с помощью мастера Access. Для этого Вы должны поместить указатель мыши на любую панель управления и нажать правую клавишу мыши и выбрать пункт "Настройка ...". Далее создайте свою панель и группу клавиш и изучите их свойства. Теперь попробуйте написать программу, которая будет использовать свойства клавиш вашей панели. Всплывающая подсказка - это свойство TooltipText, текст на клавише - Caption. Дополнительно можете посмотреть пример номер 2 в файле la_menu.mdb

3. [Формы] Подскажите, имеется ли способ отображения в форме и отчете (анкеты) фотографии, находящейся в определенном каталоге, не включая ее в базу, а лишь по ссылке, например фотографии складываются в каталог Photo, и каждой присваивается название по номеру записи, а при открытии конкретной записи в форме отображается необходимая фотография. Смысл, думаю, понятен: не было бы необходимости каждый раз вставлять фотографию в виде объекта, а достаточно отсканировать, обозвать по номеру записи и бросить в каталог, а база сама покажет ее, если на данную запись оная существует. В настоящее время у меня фотографии выделены в отдельный файл .mdb, но во-первых этот файл непомерно растет, во-вторых - не каждый пользователь может после сканирования вставить объект в базу.

 

Ответ. Вы правильно думаете, хранить фотографии в базе данных - это слишком расточительно. Например, я в программе в программе "Склад и Реализация" сделал папку "Рисунки", где храню отсканированные подписи сотрудников, печати организаций, образы типов баз данных. Это позволяет выставлять счета на предоплату и отправлять их по почте не затрачивая средства на бумагу и факс. Примеры вставки рисунка для форм и отчетов найдете в файлах: la_form.mdb и la_report.mdb. Название файла считывается из таблицы, а далее графический файл ищется в текущей папке на диске и вставляется в форму или отчет.

4. [Формы] Интересно, каким образом можно получить Left, Top для формы или отчета. Да, и хотя бы улавливать, когда она (он) максимизируется (не говоря уже о знании этого свойства). А то ведь, какая ситуация получается, хотелось бы, что бы пользователь сам определял место для своей формы, и устанавливал ее размеры, а при запуске мы ее в том же месте и подсовываем (т.е. там где она была перед выгрузкой).

 

Ответ . Данная задача не очень сложная, если Вы хорошо изучите API-интерфейс Windows (user32.dll). Используйте для определения размеров окна функцию GetWindowRect, а для смещения и изменения ширины и высоты окна - MoveWindow. Чаще всего функцию MoveWindows размещают при обработке события Form_Open Вашей формы. Помните! Все размеры и координаты окна даются в пикселах, а не в твипах. Пример N4, в файле "la_form.mdb" можете посмотреть у меня на сайте.

5. [Формы] Мне надо создать в форме контекстный поиск (как справка по Access), т. е. в поле А(редактирование) ввожу одну букву в поле Б(список) тут же отбираются слова содержащие эту букву так вторую и т.д. Как это можно реализовать с помощью VisualBasic в Access. Ломаю голову не могу понять, помогите!

Ответ. В принципе задача очень интересная и реализаций контекстного поиска может быть много. Смотрите пример N3 в файле la_report.mdb. В них есть два примера, один с отбором записей, другой - с поиском. Там я использовал обработку события Change для полей и получения введенного значения. Далее составляется строка поиска или запрос SQL для использования в подчиненной форме.

6. [Формы] В справке Access 2000 указано, что сочетание клавиш Ctrl+; должно вставлять текущую дату. Не работает. И в таблице и в форме (и в текстовом поле типа Note и в поле типа Date) при нажатии Ctrl+; выдается ошибка "The expression you entered has a function name that Microsoft Access can't find". Не знаете в чем проблема?

 

Ответ. У меня данная группа клавиш работает, то я этим никогда не пользуюсь. Потому что, когда я открываю в таблице поле имеющее формат даты, то сразу изменяю у него свойства, т.е.  [Маска ввода] = "00.00.0000;0;_", [Значение по умолчанию] = "Date()". Все эти свойства автоматически передаются и полю в форме, если она будет связана с данной таблицей. После таких настроек Вам не придется вводить дату. Дополнительно к этим комментариям посмотрите таблицу в файле: la_form.mdb (раздел формы), где показана установка этих свойств и раздел сайта "инсталляция Windows и Access".

7. [Отчеты] Может ли номер страницы генерироваться (в "Report footer"), а не поступать из таблицы. Скажем такая ситуация: При печати отчета не всегда печатают все группы товаров, а только необходимые и поэтому группы товаров могут находится каждый раз на другой странице. (К теме: Печать оглавления прайс-листа)

Ответ. Я специально дал Вам пример , где номер страницы хранится в таблице. Это наиболее общий случай печати с оглавлением. В вашем случае, если из отчета "выпадает" несколько страниц, Вы должны будете перед формированием оглавления, открыть основной запрос отчета, рассчитать число строк на страницу и результат записать в таблицу оглавления.


 

Выпуск 11. Как пронумеровать строки в отчете?

Введение. В данном выпуске рассылки рассказывается о проблемах, связанных с печатью отчетов в Access 2000. Кроме комментариев к вопросам написаны короткие программы в la_report.mdb файле. Смотрите их на сайте в разделе "Архив подписки".

Внимание. На сайте: www.leadersoft.ru с предыдущего выпуска рассылки появились новые ответы и решения: Разное(1), Формы(5), Запросы(1), Защита(1), Массивы(1), Модули(1). К некоторым из них есть решения в файлах mdb

1. Как пронумеровать строки в отчете, например, 1.1, 1.2, 1.3 (a.1, a.2, a.3 ...), где первая цифра или буква означает группу товаров.

1. Ответ. Во первых, надо научится пронумеровывать строки в отчете по порядку: 1,2,3,4. Делается это следующим образом. Вы вводите свободное поле в отчет. В конструкторе выбираете вкладку "Данные". Далее в свойствах поля "Данные" записываете выражение "=1" и  "Сумма с накоплением" делаете равным "Для группы".
     Во вторых, это поле делаете с именем и невидимым, т.е. свойство "Имя"="Num", а "Вывод на экран" = "Нет". PS. Я все поля, которые имеют невидимые свойства, изменяю на красный цвет, чтобы можно было отличать в конструкторе от тех, которые печатаются в отчете.
     В третьих, вводите еще одно поле, где в свойстве данные введите строку: =[Группа] & "." & [Num]
     Если непонятно описание, то готовое решение Вы можете посмотреть в файле: la_report.mdb

2. Как напечатать в отчете в Access 97 штрих коды типа EAN13 или подобные им. Может есть библиотека ?

2. Ответ. Существует несколько способов записи штрих - кодов, например, ЕАN-8, EAN-13, 12-UCP-E, 8-UCP-E. Примеры Вы можете посмотреть в файле: la_report.mdb. Практически они одинаковы и отличаются, только числом линий (шрихов). Для вывода на печать из Access 2000 штрих-кода мне известно три способа.
    1. Печать в виде рисунка, т.е. на диске хранится графический файл с изображением штрих-кода. Иногда штрих-код разбивают на несколько изображений, например, цифре 1 соответствует рисунок pic01.gif, цифре 2 - pic02.gif и т.д. При открытии отчета Вы можете управлять этими рисунками, т.е. указывать их новое положение на диске. Например, Me.Controls(2).Picture = "c:\newcode\ean13\pic01.gif"
    2. Второй способ, это когда штрих-код "набирается" в виде управляющих элементов линий. При открытии отчета эти линии гасятся, передвигаются или изменяется их толщина. Вы можете использовать для них следующие свойства: ctrl.left, ctrl.visible, ctrl.width. Эти свойства работают также в mde файле.
    3. Третий способ, это когда применяется специальный шрифт (font) и код набирается символами.
    Решения для первых 2 способов печати штрих - кодов Вы можете посмотреть в файле: la_report.mdb. PS. Желательно штрих код разработать и разместить в подчиненном отчете. О том существует ли бесплатная DLL-библиотека для печати кодов, и кем и как она распространяется мне неизвестно.

3. Как напечатать в отчете "Оглавление", например, как в учебниках. Сейчас у меня прайс - лист занимает более 20 страниц и требуется напечатать содержание.

3. Ответ. Стандартными средствами, т.е. используя только один отчет, Вы это не сделаете. Для этого нужно разработать подчиненный отчет, в котором и вывести оглавление. Необходимо запомнить, что оглавление всегда выводится на новой странице в начале или конце отчета, поэтому надо поставить, например, для примечания отчета (в котором находится подчиненный отчет) "Конец страницы = До раздела". Решение в формате mdb Вы можете найти в файле: la_report.mdb.

4.Объясните, пожалуйста, как использовать быструю печать шрифтами принтера (EPSON FX1170 в частности) русских букв из MS Access 2000, например, при выборе шрифта DRAFT 10 cpi (использовал печать отчёта из MS Access 2000). Английский алфавит печатается, а вместо русского - знаки "?". Используется Windows 98. По моему драйвер принтера здесь не причём, так как изменение принтера в параметрах страницы на лазерный, при том же шрифте ничего не меняет. Принтер EPSON поддерживает кодовую страницу 866.

4. Ответ. Принтер EPSON FX1170 относится к матричным принтерам. Причем у матричных принтеров существует два режима печати: один текстовый, когда Вы можете печатать только текст (с подчеркиванием или выделением) и другой - графический, когда Вы можете напечатать отчет с любым оформлением. Все команды принтера имеют общий вид, т. е. с начала идет символ ESC (десятичный код = 27) далее - код команды с данными. (Внимание! У лазерных принтеров совершенно другая система команд загрузки шрифтов и данных. Они полностью не совместимы с матричными устройствами.)
    При печати из Access 2000, драйвер Windows будет всегда принтер переводить в графический режим, чтобы обеспечить приемлемое качество отчета и поддержку русского алфавита. Графический режим самый медленный, но если Вам нужно отпечатать текст в DRAFT-режиме (быстрый режим), минуя драйвер Windows, то сначала сделайте проверку принтера, загрузите шрифт, а потом уже отпечатайте отчет:
    a) попробуйте послать ESC-команду подчеркивание: ESC-1 Test-underline ESC-0 (chr(27) & "-" & chr(1) ...). Если текст будет с подчеркиванием, то можно будет загрузить драйвер принтера.
    б) Возьмите любой драйвер загружающий русские символы. Он должен иметь ДОСовский формат, т.е. разработан для DOS, а не для Windows. Все DOS-драйверы в принципе одинаковы, их даже можно взять от другого матричного принтера поддерживающего стандарт EPSON.
    в) Драйвер русского алфавита загружается путем простого копирования файла на принтер: FileCopy "Epson_Drive","PRN". При удачной загрузке драйвера принтер не будет ничего печатать, иначе выдаст "тарабарщину"  
    г) Текст из Access 2000 форматируется в ДОСовскую кодировку командой: DoCmd.OutputTo acOutputReport, "Прайс-лист N2", acFormatTXT, "PRN". В результате этого, он будет посылаться на печать, минуя установленный в Windows драйвер печати, и использовать Ваш набор символов и настройки принтера, которые Вы выбрали на его панели управления. Решение в формате mdb Вы можете найти в файле: la_report.mdb.


 

Выпуск 10. Зачем делить базу данных на mdb и mde?

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

Письмо. Совет по делению базы на mdb и mde встречается почти везде, но ни у кого я не встречал внятного объяснения того, зачем это надо. Такое ощущение, что все просто повторяют прочитанную где-то в учебнике по Access фразу. Сжимается база прекрасно и без деления - просто в Tools->Options->General ставится галочка в поле "Compact on close". Так какой же реальный смысл в создании mde для новичков? У меня например, с mde файлами были одни проблемы - пытаясь чему-то научиться, я скачал множество образцов баз данных у microsoft (их программа ms office extentions) - и ни одна база на основе mde, написанная для access 97 нормально не открывается в access 2000 - все выдают ошибки при конвертации. В тоже время любые mdb базы из ранних версий access прекрасно конвертируются в access 2000. Учитывая, что новые версии офиса всегда не за горами - хотелось бы знать зачем огород городить!

Считаю, что вопрос по делению базы данных на mdb и mde является очень важным для "серьезных" программ, поэтому и даю подробный ответ для чего это нужно:

[1. Для скорости]. Файл mde является "родным" для Access, т.е. структура его близка к машинно-двоичному виду, практически это тоже самое как файл exe для Windows. Следовательно, если Вы выделите из базы данных таблицы (кстати по объему информации они всегда стоят на первом месте) и скомпилируете все остальное в mde файл, Вы получите программу с минимальным размером. Отсюда следует, что пользователи будут быстрее загружать программу и работать с ней будет надежнее и удобнее. (Замечание. Не тратьте много усилий на конвертирование mde файлов к другим версиям Access и не пытайтесь их открывать из других версий Access - это не получится. Файлы mde не имеют исходных текстов программ на Бэйсике, следовательно для компилятора Access - это китайская грамота, так же как для большинства из нас язык племени Юмба-Намба из Северной Африки).

[2. Для защиты]. Если Вы разрабатываете программу уже несколько лет и потратили много сил и энергии, то нет смысла ее распространять в открытом виде. Через 2-3 недели, изменив ваши авторские права на свои, уже кто-то начнет ее продавать как собственную разработку.

[3. Для надежности]. Ядро Access легче обрабатывает базу данных в которой хранятся одни таблицы. Следовательно, если в вашей mde-программе есть скрытые ошибки в расчетах, то может произойти разрушение mde-файла, но в случае раздельного хранения данных Ваши данные в таблицах останутся.

[4. Для обслуживания]. При работе в сети базу данных mdb размещают на сервере, а mde-программы на компьютерах пользователя. Если Вам надо поменять старую версию программы на новую, то не зачем останавливать всю работу предприятия в случае с одним mdb файлом. Вы просто отлаживаете mde-программу на своем компьютере, добавляете поля, таблицы в базу данных mdb на сервере, а потом заменяете по сети mde-файлы пользователей. Все это занимает несколько минут, и практически различные отделы, например, Бухгалтерия, Сбыт, ОТиЗ работают без остановки.

[5. Для удобства]. У меня программа, например, "Склад и Реализация.mde" работает сразу с многими филиалами и организациями. Для каждой организации или филиала отводится файл данных mdb, чтобы не мешать складскому и бухгалтерскому учету. Сейчас их на диске хранится более 50 штук. Если бы в этих файлах хранились еще формы и VBA-программы, бухгалтеру каждый раз нужно было бы закрывать и открывать Access программы. Для него это очень утомительно и неудобно, т.к. надо постоянно помнить все файлы. Сейчас бухгалтер не закрывает программу "Склад и Реализация.mde", если нужно найти данные другого филиала, он только выбирает филиал, а все остальные действия по поиску mdb-файла и установке связи с новой базой данных делает программа.

[6. Для совместимости]. Если у Вас один файл mdb обеспечить совместимость разных версий Access практически не возможно, т.е. трудно будет работать с файлом mdb из Access версий 2, 97 и 2000. Если же mdb-таблицы хранятся на сервере, Вы можете подключиться к ним через внутренние или внешние драйверы ODBC из любой версии Access

[7. Для мобильности]. Если Вы работаете с программой складского учета, то Вам требуется описать примерно 40-50 разных таблиц для склада, администрирования или настройки. Но этого явно недостаточно, т.к. по складу должны проходить и таблицы, связанные с кассой, с банком и себестоимостью (~60 штук). Если все это записать в один файл, то не только бухгалтера, но и Вы начнете путаться в них. Поэтому и надо разделять базу данных на несколько частей.

[8. Для администрирования]. Работая с "серьезной" базой данных надо заботиться о ее сохранении и развитии. Для этого существуют различные команды: архивирование и восстановление, копирование и удаление, репликация, т.е. добавление новых полей и таблиц. Все эти действия легче всего осуществить, если в Вашей базе данных будут одни таблицы. Зайдите на мой сайт и посмотрите введение к базе данных "Склад и Реализация", там есть что почитать.

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