LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































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

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         24.04.2001
Сайт:         http://www.leadersoft.ru
Слоган:     Если база Вам нужна, в LeaderSoft зайди сперва.
Комментарий: 
      Мы разрабатываем по заказам клиентов различные программы, используя Microsoft Access. Базы данных разрабатываются "с нуля" или, используя готовые решения (Склад, Касса, Банк и т.п.), что позволяет достаточно гибко решать финансовые вопросы по оплате услуг за разработку. Для регистрации заказа заполните форму: Регистрация заказа на разработку


Новости сайта
    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 программ написано на английском языке и следовательно разработчики компилятора лучше всего адаптировали его к этому языку, локальные версии всегда имеют проблемы.
  Вывод. Поля, таблицы используйте на русском, а функции пишите на английском. Названия элементов выбирайте короткие, но понятные.
  Ответ 2. Андрей Беляков. Насколько я разобрался с Access 2, там запросы хранятся в предкомпилированной форме, по крайней мере - после первого использования - точно. Т.е. в обоих случаях имена полей заменены некоторым ID. Эти ID целочисленные одинаковые по размеру. Почему один из них должен обрабатываться медленнее? Адаптация компилятора под язык? В смысле - под набор букв языка? Никогда не видел такой адаптации. Компилятор, точнее его лексический анализатор, принимает определенный набор последовательностей символов(букв). Количество размер принимаемого множества символов влияет только на размер лексического анализатора, но никак не сказывается на быстродействии. Вот пример (извините за Си - на Бейсике это обычно не пишут):
...
Decision decision[][];
unsigned char * pText, ch, CurrentState;
...
// получение очередной буквы
ch = *pText++;
// и перевод анализатора в следующее состояние
CurrentState = decision[CurrentState][ch];
...
  Ответ 3. Виктор Конюков. 1. Создайте одинаковые по принципу базы данных с длинными запросами и короткими. Размеры их будут отличаться (даже для mde), а следовательно
загружаться и выполняться будут по разному.
2. Попытайтесь вызывать из SQL функцию (конвертор цены в текст) на русском языке - будут ошибки, но не сразу (надо редактировать формы, еще что-то делать ...). Это проверено неоднократно. Требуется перегрузка всей базы данных или замена ключевых слов на английский текст, тогда ошибка исчезает. Категорически не советую в больших базах использовать функции на русском языке. В локальных версиях всегда ошибок больше из-за проблем, связанных с кодировками символов.
3. Давно известно, что корректно обрабатываются компилятором, а именно, ключевые слова (не данные) состоящие из символов от 32-127 символов, посмотрите на htm - страницы (там нет поддержки расширенного набора символов (128-255) ), т.к. другие могут восприниматься как управляющие символы.
   Ответ 4 (дискуссия с  Андреем Беляковым)
> 1. Создайте одинаковые по принципу базы данных с длинными запросами и короткими. Размеры их будут отличаться (даже для mde), а следовательно загружаться и выполняться будут по разному.
Разумеется, размер текста запроса, будет разный. И запрос с длинными названиями полей будет занимать больше места. Но(!) только  до предкомпиляции. Предкомпилированные версии будут совпадать с точностью до ID полей. Сама база, из-за размера, будет открываться по-другому, но работать должно с одинаковой скоростью. Исключение - первое выполнение.
С MDE не экспериментировал - не нужно было, поэтому судить не берусь. Могу только предположить, что MDE содержит и текстовый, и предкомпилированный варианты запроса.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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