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

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


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

Выпуск 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. И так, если из Вас кто-то из подписчиков находит решение, то высылает его по адресу: LiderAccess@bigfoot.com, для публикую на сайте www.liac.nm.ru ответ сразу без задержки, в течение 1-2 дней с реквизитами автора ответа.
3. Преимущества такой подписки.
    а) Задавший вопрос может получить ответы от разных разработчиков. Причем ответ будет получен быстрее и намного подробнее, чем раньше. Например, посмотрите ниже несколько ответов на вопрос по "Счетчику".
    б) Те кто отвечает на вопросы имеют возможность бесплатно рекламировать свои программы и себя как профессионала по Access.
    в) Для тех, кто только начинает программировать будет время подумать над вопросами, а не читать только ответы, что естественно скажется на уровне их подготовки.
4. После группировки и сортировки ответы будут рассылаться подписчикам

Новые вопросы по Access
     Всего их 56 штук. Ответы на некоторые вопросы будут даны на сайте: www.liac.nm.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). Как это реализовать в программном коде.
 
Copyright © 10.10.2000 Виктор Конюков,  (Web: www.liac.nm.ru, Email: LiderAccess.bigfoot.com)


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

В избранное