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

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


Выпуск 26. Access Rapid Start - конструктор приложений в Access

Подписка: "Access 2003/2010 - программирование и готовые решения"
Дата: 12.11.2012
Автор: Парусников Алексей
Сайт: http://www.accessoft.ru под редакцией с http://www.leadersoft.ru
Загрузка: ARS 2007 ARS 2010
Получить ключ: Key_ARS

В данном цикле статей рассказывается о работе с конструктором приложений Access - Access Rapid Start. Дополнительные вопросы по этой теме Вы можете задать на форуме. Вы так же можете заказать персональную консультацию или перенос вашего проекта в ARS, связаться с автором для решения вопросов о создании программы на базе ARS - в последнем случае вы кроме готового продукта получите возможность самостоятельно его развивать.


    Данная статья ориентирована на начинающих разработчиков Access, желающих более углубленно изучить возможности программирования в Access и сделать свои приложения более профессиональными.
Упрощенное заполнение перечня ТМЦ

В данной статье будут рассмотрены варианты интерфейса заполнения заявок ТМЦ на примере двух программ, сделанных в ASR: Учет ТМЦ АЭС и Смета ремонта.

Стандартный интерфейс заполнения документа с перечнем позиций ТМЦ (например, заявки ТМЦ) представляет собой пару форм: главную, где вводятся реквизиты документа, и подчиненную, в виде таблицы, куда заносится требуемая номенклатура ТМЦ. Пример такого интерфейса можно посмотреть в программе Учет ТМЦ АЭС: Форма заявки.
Понятно, что скролить список, выбирая в нем нужную позицию, не удобно, особенно, если таких позиций не одна тысяча. Но в данной программе их порядка 80 000 – такая номенклатура для ремонта блоков АЭС. Поэтому очевидно, что нужно предложить пользователю дополнительные функции, для ускорения процесса выбора ТМЦ из списка. Это может быть стандартная функция ARS – динамическая фильтрация списка. Запускается она так:

Call funSourceCombo(ctl, strSQL, sFldName)

Где:
Ctl – ссылка на контрол (поле со списком), в котором нужно запустить динамическую фильтрацию
strSQL – строка-источник данных списка
sFldName – имя поля, по которому нужно фильтровать список. Если параметр опущен, то в качестве имени берется имя контрола (списка)

В данном случае, этим параметрам задаются значения:
Ctl = Me!Kart_ID
strSQL = "SELECT Kart_ID, MatName FROM tab_MKart WHERE Sost=0"
sFldName = "MatName"

Фильтрация происходит во время ввода данных в список по фильтру Like *введенный фрагмент текста*, то есть по мере набора символов в списке его содержимое будет динамически фильтроваться.

Еще одна возможность ускоренного заполнения – мультивставка записей из каталога ТМЦ, который запускается ДБ кликом по списку в таблице. Мультивставка включена по умолчанию во всех стандартных поисковых ARS. Работает просто: вместо значения ключа выбранной записи вставляется список ключей через (,), например: 12,45,23 и т. д. А дальше остается только запустить запрос на добавление записей в таблицу заявок ТМЦ по фильтру Kart_ID IN (список кодов).

Но иногда можно сделать еще более быструю вставку записей, если как в данной программе, ведется каталог норм запаса на ремонт блоков АЭС. То есть существует некий стандартный перечень ТМЦ, который используется при ремонте (плановом, оперативном и т. п.), который можно просто вставить, например нажатием на кнопку «Вставить нормы», и в результате запустится запрос на добавление, который перенесет нормы  в заявку.

Однако и это не предел – можно задействовать еще один вариант, позволяющий сделать ввод ТМЦ по нормативам простым и наглядным. Такой способ используется в программе Смета ремонта. Для его реализации потребуется создать хитрый редактируемый запрос, который выводит все записи норматива и в дополнении к ним поля для ввода количества заявки в таблицу заявок. Хитрость в том, что значения ключа связи между таблицами будет подставляться автоматически. Чтобы по достоинству оценить этот способ, нужно отметить, что его более сложной альтернативой будет создание буферной (временной) таблицы, куда будет загружаться перечень ТМЦ из норматива, затем в этой же таблице будет указываться количество ТМЦ заявки, а потом содержимое таблицы нужно будет синхронизировать с реальной таблицей заявок. При этом под синхронизацией подразумевается отслеживание событий добавления, удаления, обновления. Все это дело хлопотное и не простое. Но как уже сказал выше, задачу можно решить более простым способом.

Итак, рассмотрим «хитрый запрос». Он составной, то есть с вложенным селектом (выборкой из другой таблицы). Вот запрос, который служит источником формы работ по смете (запускается из раздела: Работа – Сметы затрат)

SELECT SMR.SRKol, tab_Rabot.RabName, SMR.SR_ID, tab_Rabot.RB_ID, tab_MEdIzm.EdIzmName, SMR.SRCena, SMR.SM_ID, nz(SRKol,0)*nz(SRCena,0) AS Summa
FROM tab_MEdIzm RIGHT JOIN (tab_Rabot LEFT JOIN
(SELECT SR_ID, SM_ID, RB_ID, SRKol, SRCena FROM tab_Smeta_Rab WHERE SM_ID=[Forms]![frm_Smeta]![SM_ID])  AS SMR ON tab_Rabot.RB_ID=SMR.RB_ID) ON tab_MEdIzm.EdIzm_ID=tab_Rabot.EdIzm_ID WHERE (((tab_Rabot.RGR_txt) Like "*" & [forms]![frm_Smeta]![Find_1] & "*")) ORDER BY SMR.SRKol DESC , tab_Rabot.RabName;

Обратим внимание на вложенный запрос:

SELECT SR_ID, SM_ID, RB_ID, SRKol, SRCena FROM tab_Smeta_Rab WHERE SM_ID=[Forms]![frm_Smeta]![SM_ID]

Он показывает все нормы, по фильтру код сметы (SM_ID). При этом связан он с таблицей нормативов (tab_Rabot) через LEFT JOIN – это важно. В итоге результирующий запрос выводит все записи нормы с полями SMR.SRKol (количество нормы работ), SMR.SRCena (цена нормы работ) и пару ключей связи: SMR.SR_ID – ключ таблицы работ по смете (tab_Smeta_Rab), который будет использоваться для подстановки в таблицу ТМЦ по работам сметы, и SMR.SM_ID – ключ связи с таблицей сметы (tab_Smeta). Интересно в итоговом запросе то, что это поле в заполняемой таблице tab_Rabot будет заполняться автоматически, благодаря тому, что в запросе созданы соответствующие типы связей  и сам запрос редактируемый. При попытке вставить значение в поле SRKol  или SRCena для Access возникнет задача, отобразить результирующие данные согласно заданным соотношениям, и ему для этого придется вставить ключ в связанную таблицу.

В результате пользователь заполняет табличную форму так, как будто это справочник норм, но заполняются при этом данные таблицы заявки. Так как итоговый запрос позволяет заполнять сразу обе таблицы, поля нормативов, отображенные в форме как справочные, нужно заблокировать.

Конечно такой способ можно применять только если норматив по группе работ небольшой, порядка 20-30 записей. Иначе в форме будет отображен большой список, и опять вернемся с тому же, с чего начали: неудобство скролинга, теперь уже подчиненной формы.

Полезные ссылки

Интернет магазин от Leadersoft.ru
В этом магазине Вы можете купить не только готовое программное обеспечение для бизнеса, а также найти компактные решения для самостоятельного проектирования на Microsoft Access, SQL Server или ASP.NET

В избранное