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

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


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

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

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

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

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

Ссылки на ресурсы Access
   VBStreets.ru - программирование на Visual Basic, VBScript и Active Server Pages

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Copyright © 24.04.2001 Виктор Конюков


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

В избранное