Какво е Lookup или ефективната работа с Microsoft Access може да бъде по-ефективна, ако не...
Какво е Lookup или ефективната работа с Microsoft Access може да бъде по-ефективна, ако не...
Първо, кратък откъс от системата за помощ на MSaccess относно свойството на формуляра .Filter
Свойство на филтъра
Свойството Филтър определя подмножеството от записи, които се показват след прилагане на филтър към формуляр, заявка или таблица.
Стойности
Стойността на свойството Filter се определя от низов израз, съдържащ клауза WHERE без ключовата дума WHERE. Например, следните оператори на Visual Basic ще дефинират филтър, който избира клиенти от България:
Me.Filter = "Държава = 'България'" Me.FilterOn = True
Нека разгледаме специален случай за формуляри, т.к на практика потребителите често работят с формуляри.
От написаното: "Стойността на свойството Филтър (Филтър) се определя от низов израз, съдържащ клауза WHERE без ключовата дума WHERE" става ясно, че низовият израз съдържа СТАНДАРТЕН низSQL, само без ключовата думаWHERE, следователно този низ трябва да се обработва от стандартните функции на AccessApplyFilter,Dlookupи други които използватSQL>, както и в обектиRecordsetи други подобни, това твърдение е почти вярно, но на практика се оказа различно, искам също да отбележа, че дължината на низаSQLв свойството на формата .Filterима ограничение за размер от 2048 байта.
Защо изобщо се нуждаем от свойството.Filterвъв формуляри? Къде може да се използва?
Не знам за какво точноMicrosoftискаше да го използва, не видях добри примери по тази тема, това свойство беше подходящо за мен за конкретна задача, зададена от клиента. Задачата беше да:
Имаше формуляр със записи, потребителят трябваше да намери някои данни и на тяхна база да създаде няколко таблични формуляра, съдържащи намерените записи и да изгради няколко временни отчета подред, за да провери някои от техните данни, формулярът съдържаше много полета и беше доста трудно да се създаде фиксиран брой формуляри и отчети за всички условия, беше по-лесно да се създаде един формуляр, върху който бяха наложени условия, в зависимост от данните, намерени в основния формуляр, за тези цели избрах свойството .Filter на форма, изглежда, всичко е наред, потребителят приложи филтър към формуляра, отвори табличен формуляр, където данните бяха предмет на условиетоWHERE .Filter, сви го, намери нови данни, отвори нов формуляр и т.н. и наистина всичко работи, когато филтърът е приложен от вашия собствен код, като напримерDoCmd.AppleyFilter ,"[ > "[ > ", възникнаха проблеми, когато потребителят започна да използва командите "Изключване на селекция" и "Филтриране по селекция", те показаха неправилна работа с прикачени стойности в списъците на формуляра и, както се оказа по-късно, неправилна работа в почти всичко.
За да разберете неудобството на вградените функции, разгледайте конкретен пример, който е приложен към тази статия.
Има малка база данни, състояща се от няколко таблици (в този случай се използват две) и се установява връзка между две от тях чрез конкретно поле, много често срещана техника (вижте фигурата)

1. Можете безкрайно да прилагате филтъра върху избраното поле, докато достигнете ограничението за дължината на SQL низа, докато броят на записите няма да се промени и SQL низът във филтъра ще нараства равномерно.
Помислете сега за пример за командата „Изключиselected", първо изчистете свойството.Filterна формуляра (бутон "Delete Me.Filter"), поставете курсора върху полето "Warehouse" и щракнете върху бутона "Exclude selected" в менюто, щракнете върху бутона "Show Me.Filter", редът .Filterще изглежда така ((Не t[(Data) Warehouse].C treasure="Petrov")) , тук всичко е наред и от гледна точка на парсване на получения SQL низ няма да има проблеми, но ако натиснете отново бутона "Изключване на избрани" ще се случи следното: или формулярът ще отиде на нов запис, или ако имате забрана за въвеждане на нови записи във формуляра, всички елементи в областта с данни ще изчезнат и ще трябва да щракнете върху "Rem ов филтър" за показване на всички записи, което не винаги е удобно и в някои случаи може да доведе до грешка. от това формулираме:
2. При изключване на запис за избрано поле има възможност стойността на това поле да е уникална, в резултат на което всички записи да бъдат изключени, а формата да стане без контроли.
Разгледайте пример за полето "Тип", то се различава от другите по наличието на прикачена колона, изчистете свойството.Filterна формуляра (бутон "Delete Me.Filter"), поставете курсора върху това поле и щракнете върху бутона "Филтриране по избрани", щракнете върху бутона "Покажи ми.Filter", линията.Filterще има формата ((Lookup_ctrlType.Type="RES"))., което вече не е приемливо, не само се появи неизвестният префикс Lookup, но данните се вземат не от полето, а от контролата ctrlType. Този ред вече не се обработва от стандартни функции (Dcountи др.). Въз основа на това формулираме:
3. Когато изберете командите „Филтриране по избор“ и „Изключване на избор“ за полета, съдържащи прикачена колона, SQL низът в свойствотона формуляра Филтър ще приеме необработена форма.
Получените три формулировки анулираха използването на свойствотоFilterна формата, така че трябваше да създам свой собствен алгоритъм за тази цел. Отворете формуляра "FixLookup" от този пример и следвайте стъпките по-горе.
За да заменим стандартните функции на Access, имаме нужда от една основна и няколко спомагателни функции, те се намират в модулаacFormUtlв приложената база данни, това
1. FrmFilterSelection - основна функция за заместване на "Филтриране по селекция" и "Изключване на селекция"
2. FrmSort - функция за замяна на сортиранеA до ZиZ до A
3. FrmShowAllRecords - заместваща функция "Премахване на филтъра/Покажи всички записи"
4. MeBuildCriteria - Функция за подмяна наBuildCriteriaпоради некоректна работа със символите на шаблона, както и функцията cmdBarButtonED в модула на формуляра за настройка на свойствата .Enabledв менюто за бутоните, отговарящи за филтриране и сортиране. Трябва също да включите следния код в събитието Open на формуляра:
Private Sub Form_Open(Отказ като цяло число)
Me.FilterOn = False 'Деактивиране на използването на запазени филтри Me.OrderByOn = False 'Деактивиране на използването на запазено сортиране Me.Filter = "" 'Нулиране на филтъра
Функции 1,2,3 във формата винаги трябва да се използват заедно, те се пресичат в свойството .Filterи невключването на нито една от тях ще доведе до неправилна работа на другите. Препоръчително е тези функции да се използват в менюто, като във втория случай те трябва да бъдат декларирани катоFunction, а неSub, което е свързано с техните извиквания на Access от менюта или ленти с инструменти.
Няма да анализирам подробно тези функции в тази статия, кодът е доста прост.
Като се използватези функции елиминират неудобството, не внедрих, може би, само филтриране по избрани секции на полето, например Microsoft може да избере година в поле за дата и ще филтрира записи с посочената година, според мен това вече е излишно, но това също е внедрено по принцип, добавих и възможност за търсене на записи, съдържащиNULL.

В конкретен контекст замяната на тези функции може да изглежда маловажна, но те са само част от по-голям код, предназначен за лесно навигиране през записите във формуляра. Следващата статия ще разгледа пример за създаване на удобни шаблонни филтри за формуляр (вижте фигурата).
MAUG: Заедно с примера можете да изтеглите и пълния текст на статията във формат Microsoft Word.