Докладване на проблеми в ACCESS - Софтуерни продукти
Важен елемент от програмите за бази данни е механизмът за "отчитане". Тъй като структурата на базата данни може да бъде доста сложна, не е достатъчно да знаете основните характеристики на "дизайнера на отчети", за да внедрите такива програми. Може да се изискват познания за редица слабо документирани характеристики и техники.
Изходните документи в СУБД се проектират с помощта на механизма за отчитане. В MS Access този механизъм има много функции, които ви позволяват да създавате изходни документи, без да прибягвате до програмиране на вградения език VBA. Не всички проблеми обаче могат да бъдат решени по този начин.
Освен това полето "NPP" има тип Counter (Long integer), чиято особеност е следната: при изтриване на запис в това поле се изтрива и стойността, която вече няма да се повтаря. В резултат на това списъкът с поредни номера може да не съвпада със списъка със стойности в това поле.
В този отчет имената на колоните (заглавката на таблицата) се поставят в заглавката, полето "NPP" се използва като сериен номер, номерът на страницата е посочен в долния колонтитул и се добавя бележка към отчета с броя на изходните записи и пример за подписи. Модулът на класа е празен (т.е. няма програмни кодове на езика VBA). Този отчет се отпечатва без никакви проблеми. Но може да има оплаквания относно поставянето на бележката. По подразбиране свойството му Не прекъсвай е зададено на Да.
Това означава: ако цялата бележка не се побира на последната страница от редове с данни, тя ще бъде напълно прехвърлена на следващата. Но такова решение не винаги е приемливо - особено ако се отпечата финансов документ. Следователно можете да промените стойността на това свойство на "Не" - тогава бележката ще започне веднага след показването на последния запис. Това решавапроблем, но не напълно. Може да възникне ситуация, когато един подпис (например на директора) се окаже на една страница (последната с данни), а другият се прехвърли на следващата - също лошо. По-приемливо решение в този случай - с малка височина на бележката - би било тя да бъде поставена изцяло на отделна страница, но така че последните няколко реда данни да се добавят автоматично към нея отгоре. И тук не можете да правите без прибягване до VBA. Решение на този проблем може да бъде следният текст на модула на класа с кодове за обработка на събития:
Първо, интересно свойство Report_NoData е включено тук по пътя - справяне със ситуацията, когато няма записи в таблицата на източника на данни. Текстът на процедурата е почти стандартен, редът Cancel = True спира отпечатването на отчета.
Второ, контролата End of Page е зададена в Data Region и нейното действие се управлява в модула на класа.
При форматиране на всяка нова страница нейната "видимост" се изключва (Me![EndStr1]. Visible = False). Включва се при форматиране на Data Area - при възникване на определено условие, което се състои от две части. Първият контролира областта на листа, където бележката вече не може да се побере напълно. В този доклад е емпирично установено, че такъв момент настъпва след отпечатването на 39-ия ред (If I1> 39 Then). Целочислената променлива, която отчита номера на отпечатания ред е I1. При форматиране на заглавката той се нулира, а при форматиране на всеки нов ред от данни стойността му се увеличава с 1. Но това не е достатъчно - все още трябва да определите, че последните редове се показват. Това става чрез две други променливи: KolZ, която съдържа номера на текущия запис в отпечатаната таблица (KolZ =аз CurrentRecord) и KolZap, който съхранява общия брой записи, изчислен при отваряне на отчета (KolZap = zap. RecordCount). В крайна сметка, ако има ситуация на отпечатване на последните два записа в областта на листа, където бележката вече не може да бъде напълно поместена, тогава те се отпечатват заедно с нея на следващата страница.
Но в този пример има грешка - общото поле за преброяване на броя на записите в Забележката на отчета преброи 528 записа. И последният номер в последователността е посочен като "529". Тази ситуация е възможна, ако поле от типа Брояч се показва като пореден номер и записите са изтрити по време на попълването на таблицата (в примера е изтрит един запис). Следователно е по-добре да използвате свободно поле, което не е свързано с изходната таблица, като поле за сериен номер в отчета. Като данни за такова поле трябва да зададете стойността "=1" и да посочите опцията За всички в параметъра Натрупана сума.
Може да се наложи номериране не само в границите на целия отчет, но и страница по страница. Това също става чрез свободно поле, но попълването му става в модула клас. Под него се декларира нова променлива, например: Dim NStrP As Integer. Трябва да се нулира при форматиране на заглавката и да се запълни при форматиране на областта с данни, например:
Последната опция за преброяване на редове е да се вземе предвид номерацията в групата. Access ви позволява да сортирате и групирате данни направо на изхода. Тези настройки се правят в дизайнера чрез диалоговия прозорец Сортиране и групиране (извикван от командата на менюто Изглед). За да създадете групиране по произволно поле на този прозорец, изберете го (полето) в списъка (в примера полето OBLAST) и посочете „Да“ в параметъра Заглавие на групата. Тук също можете да инсталиратесортиране за други полета без групиране по тях (в примера по поле GOROD). Поредният номер в групата се показва в полето "свободно", в параметъра Данни на което е посочено "=1", но Натрупаната сума е зададена на За групата.
Следващият проблем може да бъде поставянето на междинни суми в долния колонтитул за всяко поле. Тази ситуация често възниква във финансови документи - например при отпечатване на лист за заплати. На пръв поглед това може да се направи с помощта на технологията, обсъдена по-рано: променлива се декларира, настройва се на нула при форматиране на заглавката и се попълва при форматиране на областта с данни. Но тъй като резултатът трябва да бъде въведен в „свободно“ поле, поставено в друга секция (в долния колонтитул), сумата ще бъде неправилна - в края на краищата процесът на форматиране на някои секции на „отчетите“ в Access може да се повтори. Това е характеристика на технологията за изготвяне на "доклади" - трябва да запомните това, когато програмирате. По-специално, в разглеждания пример, попълването на променливата за междинната сума (SumStr) може да се извърши не при форматиране на областта с данни, а при разработване на свойството за печат на областта с данни (Data_Print Area), в което можете да контролирате ситуацията - дали листът с тези данни ще бъде отпечатан или не. И в зависимост от резултатите от контрола трябва да се попълни полето, разположено в долния колонтитул. Да кажем, че се казва SumS, а променливата, която натрупва стойността на страницата, е SumStr. Тогава текстът на кода за такава процедура ще изглежда така:
Подобна ситуация може да възникне при опит за използване на подотчет, който най-често се вмъква в бележка за отчет или групова бележка. Ако трябва да посочите някаква изчислена стойност в него(например същия номер на страницата), тогава може да не е правилен, тъй като такъв отчет ще бъде форматиран няколко пъти.
За да разрешите проблема, командата за попълване на полето Ред # на страницата на подотчета трябва да бъде преместена от обработката на събитието за форматиране в обработката на събитието за печат на секцията Област на данни, например: