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

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


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

Выпуск 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.
Ответ.
    Ваш вопрос не имеет практического применения, сложно придумать реальную задачу, где можно применить такое количество форм. Интерфейс явно будет перегружен. При большом количестве данных загрузка такой формы может занимать длительное, более минуты, время. Советую подумать над улучшением программы. Например, я в программе "Склад и Реализация" при загрузке формы, отключаю запросы в подчиненных формах и только в момент обращения к данным начинаю загружать их.
Copyright © 02.10.2000 Виктор Конюков,  (Web: www.liac.nm.ru, Email: LiderAccess.bigfoot.com)


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

В избранное