Название
|
Описание задачи
|
Выходные
параметры
|
|
Вывод врачей,
которые находятся на больничном
|
Name,
count_at_storehouse date_of_last_reteil (
|
4.
Результат разработки
.1
Реализация функций ПО
Большинство функций приложения построено на объектной модели.
В данной модели можно выделить несколько уровней:
· уровень данных
· уровень бизнес-логики
· уровень приложения
Для проектируемого ПО выбрана архитектура «клиент-сервер».
Важными преимуществами такого выбора для нас являются:
) Распределение функций ПО между несколькими
независимыми компьютерами в сети. Это позволяет упростить обслуживание ПО. В
частности, замена, ремонт, модернизация или перемещение сервера, не затрагивают
клиентов.
) Все данные хранятся на сервере, который защищён
гораздо лучше большинства клиентов. На сервере проще обеспечить контроль
полномочий, чтобы разрешать доступ к данным только клиентам с соответствующими
правами доступа.
Вся дальнейшая работа с данными, находящимися на сервере,
ведется с помощью клиентского приложения. Пользователь может просмотреть,
изменить, добавить или удалить нужные запросы (с учетом прав доступа).
Функции приложения можно разделить на несколько основных
модулей:
§ Модуль создания запроса
§ Модуль проверки запроса
§ Модуль включения ЛК
На рисунке 4.1 изображена модульная структура ПО.
.2
Служебные функции
Параметры приложения. Для функционирования клиентского
приложения требуется хранить в постоянной памяти определенный набор параметров
и извлекать его при каждом следующем запуске приложения. Параметры приложения
позволяют динамически сохранять и извлекать значения свойств и другие сведения
о приложении. Они также позволяют поддерживать индивидуальные настройки
приложения и пользователей на клиентском компьютере.
Подключение к БД. Подключение к SQL Server осуществляется с помощью
поставщика данных.NET Framework для SQL Server. Для установления связи
с БД используется объект SqlConnection. При попытке открыть соединение
анализируется строка соединения (свойство ConnectionString). Она содержит
сведения об инициализации, передаваемые в виде параметра от поставщика данных в
источник данных. Синтаксические ошибки формируют исключение во время
выполнения, а другие ошибки происходят после получения источником данных
сведений о соединении. После проверки источник данных применяет параметры,
указанные в строке соединения, и открывает соединение.
Формат строки соединения является списком разделенных точкой
с запятой пар параметров «ключ-значение»: keyword1=value; keyword2=value;
Для формирования строки соединения используется класс
SqlConnectionStringBuilder. Построитель строк подключения позволяет программным
способом создавать синтаксически правильные строки подключения, а также
анализировать и перестраивать существующую строку подключения с помощью свойств
и методов класса. SqlConnectionStringBuilder выполняет проверки на наличие
допустимых пар ключ / значение. Таким образом, этот класс нельзя использовать
для создания недопустимой строки подключения; попытка добавить недопустимые
пары или вредоносный код приведет к выбросу исключения.
4.3
Основные функции
Управление данными. Здесь описываются действия, которые
необходимо будет выполнить с содержащейся в БД информацией.
Связь между приложением и БД обеспечивают адаптеры таблиц
(TableAdapters). Точнее говоря, адаптер таблиц подключается к БД, выполняет
запросы или хранимые процедуры и либо возвращает новую заполненную таблицу
данных, либо заполняет существующую DataTable возвращаемыми данными. Адаптеры
таблиц также используются для отправки обновленных данных из приложения обратно
в БД. Для доступа к конкретному адаптеру таблиц из программы необходимо
объявить новый экземпляр TableAdapter.
Адаптеры таблиц содержат встроенный объект подключения и
имеют возможность хранить несколько запросов. Каждый запрос, добавляемый в
TableAdapter, представляется как общий метод, вызываемый как любой другой метод
или функция объекта. В TableAdapter можно иметь сколько угодно запросов до тех
пор, пока они возвращают данные, которые соответствуют одной и той же схеме
связанной типизированной DataTable.
Адаптеры таблиц являются генерируемыми конструктором
компонентами и обычно содержат методы Fill и Update. Начальный (основной)
запрос адаптера Fill используется в качестве основы для создания схемы
связанной таблицы данных, а также команд InsertCommand, UpdateCommand и
DeleteCommand, связанных с методом TableAdapter. Update. Это означает, что
вызов метода Update адаптера таблицы выполняет инструкции, созданные при
первоначальной настройке адаптера, и ни один из дополнительных запросов не добавлен
при помощи мастера настройки запросов адаптера таблиц.
Метод Fill принимает в качестве аргумента подлежащий
заполнению набор данных DataSet, а также объект или имя объекта DataTable,
который должен быть заполнен строками, возвращенными методом SelectCommand.является
находящимся в оперативной памяти представлением данных, обеспечивающим
согласованную реляционную программную модель, независимо от источника данных.
Набор данных DataSet представляет собой полную совокупность данных, которая
включает таблицы, ограничения и связи между таблицами. Набор данных является
независимым от источника данных, поэтому DataSet может включать данные,
локальные по отношению к приложению, а также данные из нескольких источников
данных.
При проектировании в среде Visual Studio с помощью мастера
конфигурации источника данных был создан типизированный набор данных «DoctorDataSet», заполненный таблицами
БД «Doctor». Для каждой таблицы был создан и сконфигурирован адаптер. В
процессе разработки набор «DoctorDataSet» редактировался с помощью конструктора наборов
данных. В него добавлялись новые и изменялись существующие объекты, такие как: DataTable, TableAdapter (вместе с запросами), DataRelation и Constraint.
Диаграмма структуры программного приложения SSD (System Structure Diagram) задаёт взаимосвязь
функций и программных модулей, которые их реализуют.
Структура программного приложения SSD представляет собой
иерархическую взаимосвязь программных модулей, которые реализует информационная
система. Диаграмма структуры программного приложения SSD служит мостом для
перехода от системных требований, которые отображены на предыдущих диаграммах (BFD, STD, DFD), к реализации
информационной системы.
Ниже на рисунках представлены диаграммы структуры
программного приложения для процесса проверки запроса.
Рисунок 4.2
4.3
Нагрузочное тестирование ПО
Для анализа работы ИС на различных уровнях нагрузки
применяется нагрузочное тестирование.
Для проведения тестирования информационной системы, её
исходные компоненты были размещены на одном из ЭВМ, размещённом на локальном
сервере. При проведении испытания использовался localhost-сервер, то есть все
тесты проводились на одной ЭВМ, которая выполняла роль сервера.
Аппаратное обеспечение тестовой ЭВМ:
· центральный процессор Intel Celeron 1,8
ГГц;
· объем оперативной памяти: 256Мб;
· видеокарта не ниже NVIDIA GeForce 4 MX 440
64 Мб;
· 17» монитор;
Программное обеспечение тестовой ЭВМ:
· операционная система Windows XP
Professional;
Для тестирования системы проведём следующие действия, которые
помогут оценить работоспособность и правильность выполнения операций:
· Регистрация пользователя
· Добавление нового запроса
· Проверка запроса;
· Внедрение запроса;
· Проверка логов.
Существует два основных принципа тестирования: функциональное
тестирование (по принципу «черного ящика»), структурное тестирование (по
принципу «белого ящика»).
Тестирование методом «черного ящика» предполагает обработку
системы как «непрозрачного объекта», таким образом, знание внутренней структуры
в ином виде не используется. Тестирование этим методом обычно подразумевает
проверку функциональных возможностей. Синонимами понятия метода «черного ящика»
являются: поведенческое тестирование, функциональное тестирование, метод
непрозрачного ящика, метод закрытого ящика. При тестировании программного
обеспечения методом «черного ящика» тестер знает только набор вводимых
параметров и ожидаемые на выходе результаты, каким образом программа достигает
этих результатов ему не известно.
Тестирование методом «белого ящика» предполагает обработку
системы как «прозрачного объекта» и позволяет заглянуть внутрь, фокусируя
внимание на использовании знаний о конкретном программном обеспечении для
правильного подбора тестовых данных. Синонимами понятия метода «белого ящика»
являются: структурное тестирование, метод прозрачного ящика, метод стеклянного
ящика.
В отличие от метода «черного ящика» данный метод основан на
использовании определенных знаний программного кода, необходимых для контроля
корректности данных на выходе. Тест является правильным только в том случае,
когда тестер знает, что конкретно должна делать программа. Таким образом,
тестер может контролировать ожидаемый результат. Тестирование методом «белого
ящика» не обрабатывает случайные ошибки, но наряду с этим весь видимый код
должен быть удобочитаемым.
В качестве методики тестирования изберем комбинированный
метод «черного» и «белого» ящика.
Применительно к данному проекту анализ внутренней структуры
скриптов слишком трудоемкое занятие, поэтому имеет смысл тестировать передачу
управления и данных между разделами. Это и будет элементом тестирования методом
«белого ящика». В то же время критерием соответствия системы поставленным для
неё требованиям будет корректное отображение на страницах информации, объявленной
по ссылке, по которой данная информация отображается. Таким образом, мы
получаем ожидаемые выходные данные и сверяем их с действительными. В этом
принципе заключается составляющая метода «черного ящика» в методике
тестирования.
Для тестирования информационной системы мы провели все
описанные выше процессы и вывели их на клиентскую часть. Так же были проведены
операции регистрации и аутентификации пользователя.
В качестве вывода по проведённым испытаниям можно сказать,
что разработанная компонента информационной системы является работоспособной, в
процессе тестирования ошибок в работе не было обнаружено. Всё это говорит о
том, что информационная система отвечает заявленным требованиям и может быть
внедрена для работы исследуемого предприятия.
Следует заметить, что разработанная система может быть
доработана и усовершенствована, то есть подразумевается расширение её
функциональности.
Отказы и сбои по степени их влияния на функционирование
комплекса программ и на всю систему управления в целом делятся на три крупные
группы:
· искажения, кратковременно прерывающие
функционирование системы и мало искажающие накопленные данные и выдаваемые
результаты, - частичный отказ или длительный сбой, в некоторой степени
обесценивающий предыдущие результаты;
· искажения, кратковременно и мало
отражающиеся на вычислительном процессе и обрабатываемых данных, - сбои,
практически не обесценивающие результаты функционирования комплекса программ.
Основные факторы, влияющие на надежность функционирования
комплексов программ:
· факторы, непосредственно вызывающие сбой или
отказ при исполнении программы, причинами могут быть:
§ искажения исходной информации, поступающей от
внешних источников;
§ самоустраняющиеся отказы или сбои в аппаратуре
вычислительной системы;
§ не выявленные ошибки в комплексе программ.
· архитектура комплекса программ и структурное
построение его компонент;
· факторы, определяющие качество контроля
вычислительного процесса и обрабатываемых данных, запаздывание в обнаружении
искажений.
В подготовке и вводе исходных данных в заявках участвует
человек - пациент поликлиники. Это приводит к тому, что соответствующая часть
данных характеризуется невысокой достоверностью с вероятностью ошибки около 10-4
на 1 байт. В автоматических устройствах подготовки и передачи информации вероятность
ошибки может быть значительно ниже и достигать значения 10-6-10-7.
Однако и при такой достоверности данные не всегда пригодны для обработки без
проведения контроля и предварительной селекции и могут оставаться существенной
причиной отказов или сбоев при их обработке. Повышение достоверности исходной
информации может производиться за счет использования избыточности при
подготовке первичных данных и при вводе их в ВС. Эта избыточность используется
для обнаружения искажений и исключения ложных данных, а в отдельных случаях и
для исправления ошибок.
На надежность функционирования программного обеспечения
влияет структура и технология разработки комплексов программ. В зависимости от
структурного построения комплекса программ последствия ошибки могут быть
локализованы в некотором небольшом участке программы и данных либо
распространиться на значительно большее расстояние от места расположения
ошибки. Строгое иерархическое построение крупных комплексов программ на базе
единообразно оформленных законченных программных модулей обеспечивает снижение
вероятности ошибки в каждой команде программы и снижает возможность
распространения последствий ошибок за пределы программного модуля и
используемых в нем массивов данных.
Таким образом, при формализации правил структурного
построения подпрограмм и всего комплекса, выборе языка программирования и
основных допустимых конструкций в программах следует учитывать кроме
эффективности программирования потенциальную склонность рекомендуемых
конструкций к локализации и снижению вредных последствий любой ошибки или
аппаратурного сбоя. Строгое модульно-иерархическое построение комплексов
программ и максимально возможная автономизация зон оперативной памяти
значительно повышают надежность функционирования таких комплексов.
Для оценки надежности программ, как и при исследовании
характеристик аппаратуры, как правило, приходиться ограничиваться интегральными
показателями наработки на отказ и средним временем восстановления. Определение
остальных показателей сопряжено с большими трудностями, которые обусловлены
тем, что для определения показателей надежности комплексов программ необходимы
длительные эксперименты или сложные расчеты при определенных исходных данных.
Существуют математические модели позволяющие оценить
характеристики ошибок в программах и прогнозировать их надежность при
проектировании и эксплуатации. Модели имеют вероятностный характер, и
достоверность прогнозов зависит от точности исходных данных и глубины
прогнозирования по времени. Эти математические модели предназначены для оценки:
· показателей надежности комплексов программ
в процессе отладки;
· количества ошибок, оставшихся
невыявленными;
· времени, необходимого для обнаружения
следующей ошибки в функционирующей программе;
· времени, необходимого для выявления всех
ошибок с заданной вероятностью.
Рассмотрим экспоненциальную модель нашей системы.
Предположим, что в начале отладки комплекса программ, при τ=0 в нем содержалось N0 ошибок. После отладки в течении времени τ осталось n0 ошибок и устранено n ошибок (n+n0=N0). При этом время τ соответствует длительности исполнения программ на ВС для
обнаружения ошибок и неучитывается простой машины, необходимые для анализа
результатов и проведения корректировок.
Наработка на отказ, рассматривается как обнаруживаемое
искажение программ, данных или вычислительного процесса, нарушение
работоспособности. Рассчитывается по формуле:
, (4.1)
где T - наработка на отказ, мин;
К - коэффициент времени;
N0 - начальное количество ошибок;
Кτ - коэффициент времени во
время отладки.
В процессе отладки и испытания программ для повышения
наработки на отказ, от Т1 до Т2 необходимо обнаружить и
устранить Δn ошибок. Величину Δn можно рассчитать следующим образом:
, (4.2)
где Δn - оставшееся количество ошибок после
исправления программы;
Т0 - начальная наработка на отказ, мин;
Т1 - время наработки на отказ после первого исправления
ПО;
Т2 - время наработки на отказ после второго исправления
ПО;
При тестирований, алгоритм не совершил ошибок, повлекших
потерю информации. Использование модульной структуры в разработке алгоритма
позволило на самых ранних стадиях отладки алгоритма выявить все ошибки и
устранить их. Благодаря использованию модульной структуры, в алгоритме легко
находить ошибки, а если возникнет отказ в работе того или иного блока, то
ошибку будет легко найти и нет необходимости исправлять весь код программного
обеспечения.
Таким образом, разработанная система обладает высокой
надежности и рекомендуется для внедрения в работу предприятия.
Заключение
В рамках дипломного проекта была разработана
автоматизированная информационная система «Поликлиника». В результате
выполненной разработки можно сделать следующие выводы:
Мы исследовали особенности управления поликлиникой, изучили
порядок оформления документов и сделали вывод о необходимости создания АИС,
задали типовую схему и разработали программу на ее основе, отметили основную
структуру типичной обучающей конструкции, собрали данные и провели обучение
программы. После этого применили ее на практике.
При разработке АИС был пройден полный цикл проектирования
программы от постановки задачи заказчиком до сдачи АИС в эксплуатацию.
- уменьшение времени необходимого для записи к врачу;
автоматизация контроля обращений к врачу;
возможность длительного хранения информации о пациентах на
предприятие большого срока давности, для возможности более полного расчета
эффективности деятельности предприятия;
своевременное получение информации о сроках и назначениях.
Разработанная АИС позволяет достигнуть следующих эффектов:
Целесообразность разработки обуславливается наличием
свободного сегмента рынка для реализации разработанной АИС. Экономический
эффект от внедрения программного продукта составит 708750 рублей в год, срок
окупаемости проекта - семь месяцев.
На основании вышесказанного можно сделать вывод о том, что
разработка АИС «Поликлиника» является целесообразной и будет приносить реальную
пользу при использовании ее на предприятии.
Список литературы
1. Прикладные
нечеткие системы / Тэрано Т., Асаи К., Сугено М., 2010.
2. Яхъяева
Г.Э. Нечеткие множества и нейронные сети. - БИНОМ. Лаборатория знаний,
Интернет-университет информационных технологий - ИНТУИТ.ру, 2008.
. Титоренко
Г.А. Автоматизированные информационные технологии в экономике. - М.: Компьютер,
ЮНИТИ, 1998.
. Карминский
А.М., Нестеров П.В. Информатизация бизнеса. - М.: Финансы и статистика, 2011.
5. Pineda F.J. 1988. Generalization of backpropagation to
recurrent and higher order networks. In Newral information processing systems,
ed. Dana Z. Anderson, pp. 602-11. New York: American Institute of Phisycs.
. Sejnowski T.J., Rosenberg C.R. 1987. Parallel networks
that learn to pronounce English text. Complex Systems 1:145-68.
. Burr D.J. 1987. Experiments with a connecnionlist text
reader. In Proceedings of the IEEE First International Conferense on Neural
Networks, eds. M. Caudill and C. Butler, vol. 4, pp. 717-24. San Diego, CA: SOS
Printing.
. Cottrell G.W., Munro P., Zipser D. 1987. Image
compression by backpropagation: An example of extensional programming. ICS
Report 8702, University of California, San Diego.
9. Кэнту
М. Delphi 7 для профессионалов -
СПб: Издательство «Питер», 2007. - 1120 с.:ил.
10. Minsky M., and Papert S., 1969. Perseptrons. Cambridge, MA:
MIT Press. (Русский
перевод: Минский М.Л., Пейперт С. Персептроны. - М. Мир. - 1971.)
11. Kohonen T. 1984. Self-organization and associative memory.
Series in Information Sciences, vol. 8. Berlin: Springer Verlag
Приложение 1
Сгенерированный в ERwin SQL код таблиц
using System;System. Collections. Generic;System.
Text;ITProject
{class DBOnlyQuery: Query
{DBOnlyQuery (Type TypeOfBusinessObjectToQuery)
{. TypeOfBusinessObjectToQuery =
TypeOfBusinessObjectToQuery;. Data. DataTable table = Factory. GetTable
(TypeOfBusinessObjectToQuery. Name);. TableName = table. TableName;.PKName =
Factory. GetPkNameFromTable(table);(TableName);= true;
}readonly Type
TypeOfBusinessObjectToQuery;readonly string TableName;readonly string
PKName;void AddAsUnionQuery (DBOnlySubQuery query)
{. Append (new DBOnlyUnionQuery(query));
}void AddSubQuery (DBOnlySubQuery SubQuery, JoinCondition
Condition)
{
// eg, if («JS_PK».StartsWith («JS_JC».SubString
(0, 3)))
// ie, PK and PK are both in the subquery
table(SubQuery.PKName. StartsWith (SubQuery. ForeignKey. Substring (0, 3)))
{(PKName, SubQuery. ForeignKey, SubQuery,
Condition);
}if (SubQuery. ForeignKey. StartsWith (PKName.
Substring (0, 3))) // FK is in parent query's table
{(SubQuery. ForeignKey, SubQuery.PKName,
SubQuery, Condition);
}
{new ApplicationException («Fields or Tables are
not following Enterprise naming standards.»);
}
}
/// <summary>
/// Add SubQuery in the following format:
[FieldNameOverride] IN (SELECT [SubQuery])
/// </summary>void AddSubQuery (string
FieldNameOverride, DBOnlySubQuery SubQuery, JoinCondition Condition)
{(FieldNameOverride, SubQuery. ForeignKey,
SubQuery, Condition);
}
/// <summary>
/// Ultimate AddSubQuery - all AddSubQuery
methods end up here
/// </summary>
/// <param name= «FieldName»></param>
/// <param name=
«SubQueryFieldName»></param>
/// <param name= «SubQuery»></param>
/// <param name=
«Condition»></param>void AddSubQuery (string FieldName, string
SubQueryFieldName, DBOnlySubQuery SubQuery, JoinCondition Condition)
{ClonedSubQuery = SubQuery. ShallowCopy
(FieldName, SubQueryFieldName);
//if (! IgnoreActiveFilter)
// {
// ClonedSubQuery. AddToFilter (BusinessObject.
GetActiveFilter (SubQuery. TypeOfBusinessObjectToQuery), JoinCondition. And);
// }(IsNoLock)
{. IsNoLock = IsNoLock;
}(ClonedSubQuery, Condition);
}
}
}System;System. Collections;System. Collections.
Generic;System. Text;ITProject
{interface IFilterPart
{
/// <summary>
/// Simplify is designed to remove layers of
complexity from IFilterPart statements
/// Remove any part of a statement that is deemed
unnecessary
/// If the entire statement can be removed return
null
/// </summary>[] GetSimplifiedVersion
(JoinCondition
lastJoinCondition);DisableModifications();DeepClone();ParameterisedSql
(ParameterNameFactory factory);LiteralTextADO {get;}
/// <summary>
/// Indicates that when merged with OTHER
statements, that this object will need bracketing
/// </summary>NeedsBrackets
{get;}FilterIsEmpty {get;}ContainsOrOperator {get;}HasParameters {get;}
}class Query: IFilterPart, IFilterPartsProvider
{int? CommandTimeoutInSeconds;static Query NoResultQuery
{
{query = new Query();. IsNoResultQuery = true;.
ModificationsEnabled = false;query;
}
}IFilterPart. DisableModifications()
{
//ModificationsEnabled = false;
}bool HasParameters
{{return FilterParts. HasParameters;}
}bool ModificationsEnabled
{{return
modificationsEnabled;}{modificationsEnabled = value;}
}modificationsEnabled;
#region ConstructorsQuery()
{= true;= new FilterStringBuilder();=
JoinCondition. And;= new StringCollectionX();= false;
}Query (Query Filter)
: this()
{(Filter);
}Query (Query Filter1, Query Filter2)
: this()
{(Filter1);(Filter2);
}Query (Query Filter1, JoinCondition
JoinCondition, Query Filter2)
: this()
{(Filter1);(Filter2, JoinCondition);
}Query (JoinCondition joinCondition, IFilterPart
filterPart)
: this()
{. Append(joinCondition);. Append(filterPart);
}Query (IFilterPart filterPart)
: this()
{. Append(filterPart);
}
#region Preferred ConstructorsQuery (string
schemaColumn, object Value)
: this()
{(schemaColumn, Value);
}Query (string schemaColumn, SQLComparisonOperator
Operator, object Value)
: this()
{(schemaColumn, Operator, Value);
}
#endregion
#endregion
#region AddToFilter
#region Merging two Query objects togethervoid
AddToFilter (SQLInFilter inFilter, JoinCondition Condition)
{(Condition);. Append (Condition, inFilter);
}void AddToFilter (Query SQLFilter)
{(SQLFilter, DefaultJoinCondition);
}bool IsDBOnlyQuery; // temp till readonly
factorybool IsNoResultQuery;void AddToFilter (Query SQLFilter, JoinCondition
Condition)
{(SQLFilter!= null)
{
// the filter always becomes empty when Or'd with
ZNoResultQuery(SQLFilter. IsNoResultQuery)
{(Condition == JoinCondition. And)
{= true;. Reset();
}if (Condition!= JoinCondition. Or)
{new NotSupportedException («Unknown join
condition detected - this condition must be coded for»);
}
}
{(SQLFilter);(Condition);. Append (Condition,
SQLFilter);
}(SQLFilter. ReLoadExistingRows)
ReLoadExistingRows = true;(SQLFilter. FetchOnlyFromLocalCache)
FetchOnlyFromLocalCache = true;(SQLFilter. IsNoLock) IsNoLock =
true;(SQLFilter. IsDBOnlyQuery) IsDBOnlyQuery = true;(SQLFilter.
IgnoreActiveFilter) IgnoreActiveFilter = true;(! string. IsNullOrEmpty
(SQLFilter. OrderBy))
{(string. IsNullOrEmpty(OrderBy))
{= SQLFilter. OrderBy;
}
{+=»,» + SQLFilter. OrderBy;
}
}
}
}BracketIfRequired (JoinCondition JoinOperator)
{(! FilterParts. FilterIsEmpty)
{(JoinOperator == JoinCondition. And &&
FilterParts. ContainsNonBracketedOr)
{. Bracket();
}
}
}
#endregionvoid AddFilterAndSQLParameterCollection
(String Filter, ZSqlParameterCollection ParameterCollection)
{(Filter, ParameterCollection, JoinCondition.
And);
}void AddFilterAndSQLParameterCollection (String
Filter, ZSqlParameterCollection ParameterCollection, JoinCondition
joinCondition)
{(ParameterCollection == null)
{= new ZSqlParameterCollection();
}(Filter. Contains (ParameterNameFactory.
ParameterPrefix))
{new Exception («The filter contains an
autogenerated parameter - this is incorrect and will make the filter fail when
applied.\r\n\r\n» + Filter + «\r\n\r\n»);
}(JoinCondition. And);. Append (joinCondition,
new NonPersistentDataQuery (Filter, ParameterCollection));
}
#region Column Name / Value pairvoid AddToFilter
(string schemaColumn, object Value)
{(DefaultJoinCondition, schemaColumn,
SQLComparisonOperator. Equal, Value);
}void AddToFilter (string schemaColumn,
SQLComparisonOperator ComparisonOperator, object Value)
{(DefaultJoinCondition, schemaColumn,
ComparisonOperator, Value);
}void AddToFilter (JoinCondition JoinOperator,
string schemaColumn, object Value)
{(JoinOperator, schemaColumn,
SQLComparisonOperator. Equal, Value);
}
/// <summary>
/// Ultimate calling path for ALL AddToFilter
methods.
/// </summary>void AddToFilter
(JoinCondition JoinOperator, string schemaColumn, SQLComparisonOperator
ComparisonOperator, object Value)
{(JoinOperator);(Value, schemaColumn,
ComparisonOperator, JoinOperator);
}
#endregion
#region Column Name / Column Name pair
//public void AddToFilter (string schemaColumn, SQLComparisonOperator
comparisonOperator, string withSchemaColumn)
// {
// if (withSchemaColumn == null)
// {
// AddToFilter (DefaultJoinCondition,
schemaColumn, comparisonOperator, null);
// }
// else
// {
// SQLColumnComparer filter = new SQLColumnComparer
(schemaColumn, comparisonOperator, withSchemaColumn);
// BracketIfRequired(DefaultJoinCondition);
// FilterParts. Append (DefaultJoinCondition,
filter);
// }
// }
#endregion
#endregion
#region FilterByForeignKeyvoid FilterByForeignKey
(string schemaColumn, BusinessObject[] businessObjects)
{(businessObjects!= null &&
businessObjects. Length > 0)
{[] guids = new Guid [businessObjects.
Length];(int i = 0; i < businessObjects. Length; i++)
{[i] = businessObjects[i].PK;
}(schemaColumn, guids);
}
{ // Invalidates query, you're filtering by
nothing= true;
}
}
#endregionint?
MaximumSecondsBeforeFlaggingSlowSQLQuery;
/// <summary>
/// The default join condition; used when adding
to the filter without stating a join condition.
/// </summary>JoinCondition
DefaultJoinCondition
{{return defaultJoinCondition;}
{();= value;
}
}defaultJoinCondition;
/// <summary>
/// Indicates to refresh existing data from
permanent storage where applicable
/// </summary>bool ReLoadExistingRows
{{return reLoadExistingRows;}
{();= value;
}
}reLoadExistingRows;
/// <summary>
/// Indicates to never hit the DB to get results
- only fetch from local cache
/// </summary>bool FetchOnlyFromLocalCache
{{return fetchOnlyFromLocalCache;}
{();= value;
}
}fetchOnlyFromLocalCache;
/// <summary>
/// Set the maximum number of rows to return -
Leave as default value for all available rows
/// </summary>int? MaximumRows
{{return maximumRows;}
{();= value;
}
}? maximumRows;
/// <summary>
/// Indicates if NOLOCK hints (Isolation Level
Read Uncommitted) will be used for the query - Default is set in Registry
/// </summary>bool IsNoLock
{{return isNoLock;}
{();= value;
}
}isNoLock;
/// <summary>
/// Ignores the ActiveFilter for the business
object when retrieving.
/// </summary>bool IgnoreActiveFilter;
/// <summary>
/// Indicates the sort order used to retrieve
rows. May be suffixed with ascending/descending as per SQL syntax
/// </summary>String OrderBy;bool
IsPrimaryKeyQuery
{
{sqlParam = GetFirstSingleEqualParameter();sqlParam!=
null
&& sqlParam. SchemaColumn. EndsWith
(«_PK»)
&& sqlParam. ComparisonOperator ==
SQLComparisonOperator. Equal;
}
}
/// <summary>
/// Returns the 'Equals' parameter from a filter
when it is the only parameter
/// Returns null in all other cases
/// </summary>
/// <returns></returns>virtual
ZSqlParameter GetFirstSingleEqualParameter()
{FilterParts. GetFirstSingleEqualParameter();
}void CheckModificationStatus()
{(! ModificationsEnabled)
{new Exception («Modifications have been disabled
on this filter. No further changes should be made. Check the origin of this
object (AdditionalFilter / RelationshipFilter etc)»);
}
}bool IsTableUsedInQuery (string TableName)
{TableList. Contains(TableName);
}void AddUsedTables (Query Query)
{DBQuery = Query as DBOnlyQuery;(DBQuery!= null)
{(DBQuery. TableName);
}(string TableName in Query. TableList)
{(TableName);
}
}void AddUsedTable (string TableName)
{(! TableList. Contains(TableName))
{. Add(TableName);
}
}
Приложение 2
Контрольный пример реализации программы
Экранная форма запуска