Наименование
|
Параметры
|
|
Оптимальные
|
Допустимые
|
|
Т-ра,°С
|
Отн. Влажность, %
|
Т-ра,°С
|
Отн. влажность, %
|
Воздух в рабочей зоне машинного зала
|
20-22°С зимой, 20-24°С летом
|
50-60%
|
18-25°С (кратковременно не более чем на 3°С
выше средней температуры наружного воздуха в 13 ч. дня самого жаркого месяца,
но не выше 28°С)
|
45-70%
|
Охлаждающий воздух на входе в стойки ЭВМ: - при
заборе воздуха из машинного зала
|
18-20°С
|
60-65%
|
18-20°С (кратковременно до 28°С)
|
45-70%
|
- при подаче воздуха от кондиционера в стойки
|
14-16°С
|
60-70%
|
То же
|
0-70%
|
В машинном зале и хранилище носителей информации
рекомендуется поддерживать температуру и влажность воздуха постоянными, с
относительно малыми колебаниями. Значительные колебания приводят к изменению рабочих
характеристик узлов и устройств ЭВМ.
К современному освещению помещений, где работают с
вычислительной техникой, предъявляют высокие требования как гигиенического, так
и технического характера. Правильно спроектированное и выполненное освещение
обеспечивает высокий уровень работоспособности, оказывает положительное
психологическое воздействие, способствует повышению производительности труда.
Условия деятельности пользователя в системе "человек-машина" связаны
с явным преобладанием зрительной информации - до 90% общего объема. Режим
освещения, его нормы регламентируются согласно СНиП РФ 23-5-95
"Естественное и искусственное освещение. Нормы проектирования".
В помещениях с компьютерной техникой применяется совмещенная
система освещения. К этим системам предъявляют следующие требования:
) соответствие уровня освещенности рабочих мест
характеру выполняемых зрительных работ;
2) достаточно равномерное распределение яркости на
рабочих поверхностях и в окружающем пространстве;
) отсутствие резких теней, прямой и отраженной
блеклости;
) постоянство освещенности во времени;
) оптимальная направленность излучаемого
осветительными приборами светового потока;
) долговечность, экономичность, электро- и
пожаробезопасность, эстетичность, удобство и простота эксплуатации.
Для искусственного освещения помещений с вычислительной
техникой следует использовать главным образом люминесцентные лампы. У этих ламп
высокая световая отдача (до 75 лм/Вт и более), продолжительный срок службы (до
10 000 ч), малая яркость светящейся поверхности, близкий к естественному спектр
излучения, что обеспечивает хорошую цветопередачу. Наиболее приемлемыми
являются люминесцентные лампы белого света и тепло-белого света мощностью 20,
40, 80 Вт.
Для исключения засветки экранов дисплеев прямым световым
потоком, светильники общего освещения располагают сбоку от рабочего места,
параллельно линии зрения оператора и стене с окнами. Такое расположение
светильников позволяет производить их последовательное включение по мере
необходимости и исключает раздражение глаз чередующимися полосами света и тени,
возникающими при поперечном расположении светильников.
Для обеспечения оптимальных условий зрительных работ
пользователей с дисплейными устройствами, необходима определенная световая
отделка помещения. Рекомендуемая освещенность для работы с экраном дисплея
составляет 150 лк, а при работе с экраном в сочетании с работой над документами
- 300 лк.
Наличие множественных источников постоянного шума на рабочем
месте приводит к значительному снижению производительности труда, росту
количества ошибок в работе операторов.
По происхождению шум делят на механический, аэродинамический
и шум электрических машин. Для рабочих мест операторов характерно наличие всех
видов шумов. Технические средства, например принтер, плоттер создают
механический шум, установки кондиционирования - аэродинамический шум,
преобразователи напряжения - электромагнитный.
В соответствии с ГОСТ 12.1.003-83 "Шум, общие требования
безопасности" уровень шума на рабочем месте операторов видеотерминалов не
должен превышать 50дБ, а в помещениях, где работают инженерно-технические
работники, осуществляющие лабораторный, аналитический и измерительный контроль
- 60дБ.
Для снижения шума и вибрации в помещениях ВЦ оборудование,
аппараты и приборы необходимо устанавливать на специальные фундаменты и
амортизирующие прокладки, предусмотренные нормативными документами. Стены и
потолки должны быть облицованы звукопоглощающим материалом, независимо от
количества единиц установленного оборудования. В качестве звукопоглощающего
материала должны использоваться специальные перфорированные плиты, панели и
другой материал аналогичного назначения, а так же плотная хлопчатобумажная
ткань, которой драпируются потолок и стены.
Нормальная продолжительность рабочего времени на предприятиях
не может превышать 40 ч. в неделю. Основным режимом работы является пятидневная
рабочая неделя с двумя выходными днями. Продолжительность ежедневной работы
определяется правилами внутреннего трудового распорядка или графиками
сменности.
Графики сменности регламентируют время начала и окончания
рабочего дня (дня смены), перерывов для отдыха и питания, порядок чередования
смен.
Время отдыха включает в перерывы для отдыха и питания,
междусменные перерывы, выходные и праздничные дни и отпуска. Перерыв для отдыха
и питания предоставляется в течение рабочего дня. Перерыв для отдыха и питания
предоставляется, как правило, через 4ч. после начала работы.
Согласно СанПиН 2.2.2.542-96, в зависимости от вида работ
выделяют три группы работ с видеотерминалами:
. работа по считыванию информации с экрана ЭВМ с
предварительным запросом;
2. работа по вводу информации;
. творческая работа в режиме диалога с ЭВМ.
Для видов трудовой деятельности, связанной с работой на ЭВМ
устанавливается три категории тяжести и напряженности работы с ЭВМ. Для первой
группы определяются по суммарному числу считываемых знаков, но не более 60000,
для второй группы - по суммарному числу введенных знаков, но не более 40000 и
для третьей группы - по суммарному времени работы за смену, но не более 6
часов.
Для обеспечения оптимальной работоспособности и сохранения
здоровья работника на протяжении рабочей смены должны устанавливаться
регламентированные перерывы. Продолжительность и время регламентированных
перерывов устанавливается в зависимости от продолжительности, вида и категории
трудовой деятельности.
Всем работникам ежегодно предоставляется отпуск с сохранением
места работы (должности) и среднего заработка. Право на ежегодный отпуск (за
первый год работы) они приобретают по истечении 11 месяцев непрерывной работы
на данном предприятии. Очередные отпуска (за второй и последующие годы работы)
предоставляются в любое время рабочего года в соответствии с графиками
отпусков.
Таким образом, рациональная организация рабочего времени
позволит сохранить работоспособность человека и сбережет его здоровье.
Для наиболее эффективной защиты здоровья и жизни работающих в
ВЦ людей необходимо выполнять общие требования безопасности:
) к эксплуатации персональных компьютеров допускаются
лица, прошедшие инструктаж по технике безопасности;
2) все пользователи персональных компьютеров (ПК),
находясь в компьютерном классе, обязаны:
- использовать только исправные ПК,
указанные преподавателем или дежурным оператором;
- соблюдать тишину, чистоту и порядок как на
рабочем месте, так и в компьютерном классе;
- соблюдать правила пожарной безопасности, а
при возгорании вызвать пожарную охрану;
- работать на ПК не более 4-х часов в день,
с 15-минутными перерывами через каждый час работы.
3) пользователям ПК запрещается:
- вносить без разрешения системного
администратора какие-либо изменения в настройке ПК;
- самостоятельно устранять сбои в работе ПК;
- самостоятельно производить изменения в
конфигурации периферийных устройств ПК (принтера, монитора, клавиатуры);
- курить в помещении компьютерного класса.
4) обслуживание и ремонт ПК:
- техническое обслуживание и ремонт
производится персоналом с соответствующей подготовкой;
- мониторы обеспечиваются защитными экранами
при их несоответствии санитарным нормам;
- во время технических перерывов класс
должен проветриваться.
5) первоначальное подключение всех периферийных
устройств (монитора, принтера, клавиатуры) производится специалистом, который
предварительно проверяет их исправность и надежность коммуникационных
соединений;
6) пользователь должен убедиться в том, что ПК находится
в состоянии готовности к работе, а именно:
- соединительные кабеля не имеют
повреждений;
- корпус ПК закрыт.
7) включение ПК осуществляется в следующей
последовательности:
- включить стабилизатор напряжения (если ПК
подключен через него);
- включить принтер (если он нужен);
- включить монитор (если включается
отдельно);
- включить ПК переключателем на его корпусе.
8) категорически запрещается:
- производить изменение в конфигурации
периферийных устройств ПК (принтера, монитора, клавиатуры) во время его работы;
- вскрывать корпус ПК, если он находится во
включенном состоянии.
9) перед тем, как выключить компьютер надо завершить
выполнение всех загруженных программ;
10) при коротком замыкание, перегреве или при
возникновении других отклонений от нормального режима работы ПК, необходимо
обесточить компьютер и обратиться к дежурному оператору;
) при возникновении возгорания, необходимо обесточить
компьютер и вызвать пожарную охрану;
) при поражении кого-либо из пользователей
электрическим током необходимо немедленно провести мероприятия по оказанию
пострадавшему первой медицинской помощи.
Выполнение условий электро- и пожаробезопасности, соблюдение
необходимых мер предосторожности при работе с техникой позволяет увеличить
трудоспособность, снизить риск возникновения различных заболеваний.
В современных ЭВМ очень высокая плотность размещения
элементов электронных схем. В непосредственной близости друг от друга
располагаются соединительные провода, коммуникационные кабели. При протекании
по ним электрического тока выделяется значительное количество тепла, что может
привести к повышению температуры отдельных узлов до 80-100°С. При этом возможно
оплавление изоляции проводов, их оголение, и как следствие, короткое замыкание,
которое сопровождается искрением, ведет к перегрузкам элементов электронных
схем.
Для отвода избыточной теплоты от ЭВМ служат системы
вентиляции и кондиционирования воздуха. Однако постоянно действующие системы
вентиляции и кондиционирования представляют дополнительную пожарную опасность
для ВЦ.
Учитывая высокую стоимость оборудования ВЦ, категорию их
пожарной опасности, здания для ВЦ должны быть первой или второй степени
огнестойкости. В ВЦ противопожарные преграды в виде перегородок из несгораемых
материалов устраивают между машинными залами, помещениями для размещения
сервисной аппаратуры, для персонала. Противопожарные окна должны быть не
открывающимися. Все виды кабелей от трансформаторных подстанций прокладывают в
металлических трубах.
Для ликвидации пожаров в машинных залах недопустимо применять
такие первичные средства пожаротушения, как вода и пенные огнетушители. В этом
случае существует опасность повреждения или полного выхода из строя ЭВМ и
другого дорогостоящего оборудования. Для тушения пожаров на ВЦ наиболее
эффективно применение порошковых огнетушителей типа ОП-5-01. Преимуществом
использования данного средства пожаротушения является также и то, что в момент
тушения пожара устройство может находиться под напряжением.
Таким образом, производственная среда, являющаяся предметным
окружением человека, должна сочетать в себе рациональное
архитектурно-планировочное решение, оптимальные санитарно-гигиенические условия
(микроклимат, освещение, отопление, вентиляция и другие). Должна обеспечиваться
надежность и безопасность оборудования и приборов в эксплуатации, а также
должны проводиться мероприятия по предотвращению пожаров. Рассмотренное рабочее
место пользователя ВЦ практически полностью соответствует вышеперечисленным
нормам. Создание и поддержание оптимального микроклимата на рабочем месте,
выполнение условий электро- и пожаробезопасности, соблюдение необходимых мер
предосторожности при работе с техникой позволяет увеличить трудоспособность,
снизить риск возникновения различных заболеваний и травматизм.
4.2 Расчет
искусственного освещения рабочего места
Как уже было сказано выше, освещение является одним из
важнейших факторов, от которого зависит здоровье работника. Поэтому необходимо
правильно и точно произвести расчет искусственного освещения на рабочем месте.
При расчете освещенности обязательно необходимо учесть наименьший размер
объекта различения, характеристику фона, контраст объекта различия с фоном;
нужно определить разряд и подразряд зрительной работы, нормируемый уровень
минимальности освещённости на рабочем месте.
Наименьший размер объекта размещения = 2 мм., контраст
объекта с общим фоном - большой, характеристика фона - светлый, характеристика
зрительной работы высокой точности. Основываясь на этих характеристиках, делаем
вывод, разряд зрительной работы - 3, подразряд - Г. Следовательно, нормам
проектирования искусственного освещения комбинированное освещение - 400 лм.,
общее освещение - 200 лм.
Рассчитаем число светильников N. Равномерное освещение
горизонтальной поверхности достигается при определённом отношении расстояния
между центрами светильников L, м (L = 1,75Н) к высоте их
подвеса над рабочей поверхностью Нр, м (в расчётах Нр
= Н). Число светильников с люминесцентными лампами, которые приняты в
качестве источника света:
где S - площадь помещения, м2, L -
расстояния между центрами светильников, м, М - расстояние между
параллельными рядами, м.
В соответствии с рекомендациями
М ≥ 0,6Нр.
Оптимальное значение М = 2.3 м. Для достижения
равномерной освещённости светильники с люминесцентными лампами рекомендуется
располагать сплошными рядами, параллельными стенам с окнами или длинным
сторонам помещения.
Площадь помещения:
S = a*b,
где а - длина помещения, м, b - ширина
помещения, м, а = 8м, b = 5м,
= 8*5 = 40 м2.
Расстояние между опорами светильников: L = 1,75Н
при Нp = 4, L = 1,75 * 4 = 7 м.
Вычисляем расстояние между параллельными рядами:
М ≥ 0,6 * 4 = 2,4 м.
Число светильников:
Для расчёта общего равномерного освещения горизонтальной
рабочей поверхности используют метод светового потока, учитывающий световой
поток, отражённый от потолка и стен.
Расчетный световой поток для группы светильников с
люминесцентными лампами, лм:
где Ен - нормированная минимальная освещённость,
лк, S - площадь помещения, м2, Z - коэффициент минимальной
освещённости, , для люминесцентных ламп Z = 1,1.
К -
коэффициент запаса (значение зависит от характеристики помещения), для
помещения с малым выделением тепла К = 1,5, - коэффициент использования
светового потока ламп, = 0,3.
По полученному значению светового потока, подбираем лампы,
учитывая, что в светильнике с люминесцентными лампами может быть больше одной
лампы, т.е. n может быть равно 2 или 4. В этом случае, световой поток
группы люминесцентных ламп необходимо уменьшить в 2 или 4 раза. Световой поток
выбранной лампы должен соответствовать соотношению Фл. расч. =
(0,9.1,2) Фл. табл., где Фл. расч. - расчётный
световой поток, лм, Фл. табл. - световой поток, определённый
по табличным значениям, лм.
В соответствии с проведенными расчетами выбираем лампу (4070 лм.)
ЛДЦ 80.
Рассчитаем потребляемую мощность осветительной установки.
Р = p*N*n,
где р - мощность лампы, Вт, N - число светильников,
шт., n - число ламп в светильнике, для люминесцентных ламп n = 2,
4.
Потребляемая мощность:
Р = 80*3*2 =
480 Вт.
Для данного помещения требуются 3 светильника с люминесцентными
лампами, в каждом по 2 лампы. Тип и мощность лампы - ЛДЦ80. Общая потребляемая
мощность осветительной установки - 480 Вт.
Заключение
В ходе выполнения дипломной работы была разработана
структурированная система хранения документов предприятия, которая уменьшает
издержки при работе с бумажными документами.
Введение созданной системы ускорит обработку документов, а
значит и процесс принятия решения, что может положительно сказаться на
экономическом состоянии предприятия. Кроме того, система снижает риск потери
важных документов, т.к. для большинства операций над бумагами не требуется их
физическое наличие.
Структурированная система хранения документов рассчитана на
небольшие и средние предприятия, которым требуется работа с большим потоком
бумажной документацией. Для таких предприятий вопрос о переходе на электронный
документооборот становится все более актуальным в связи с инициативами
государства о создании электронного правительства.
Дальнейшее развитие системы будет включать в себя:
разработку многопользовательской версии приложения;
разграничение прав доступа пользователей;
добавление истории операций над документами;
развитие пользовательского интерфейса;
работу с электронными документами (создание по шаблону,
электронно-цифровая подпись)
добавление интеграции с существующими CRM-системами.
Система очень перспективна и будет развиваться дальше.
Список
использованных источников
1. Якобсон
А., Буч Г., Рамбо Дж. Унифицированный процесс разработки программного
обеспечения. - СПб.: Питер, 2002. - 496 с: ил.
2. Документ
Плюс - URL: http://www.documentplus.ru/ (дата обращения: 11.11.2012)
. Программа
"Архив документов" - URL: http://www.simple-soft.ru/DocumentsCount.
htm (дата обращения: 11.11.2012)
. Докпартнер
2012 - URL: http://docpartner.ru/ (дата обращения: 11.11.2012)
. Мак-Дональд
М. WPF 4: Windows Presentation Foundation в.net 4.0 с примерами на С# 2010 для
профессионалов.: Пер. с англ. - М.: ООО "И.Д. Вильяме", 2011. - 1024
c.
. Jay
Kreibich. Using SQLite - O’Reilly Media, 2010 - 528 с.
. А.И.
Мальцев. Алгебраические системы, - М., Наука, 1970 г., 392 стр. с илл.
. М.А.
Сенилов, С.В. Почерняев, И.В. Килин Методические указания по дипломному
проектированию. - Ижевск: Изд-во ИжГТУ, 2000.
. Соболева
В.П. Методические указания по оформлению курсовых и дипломных работ. - Ижевск:
Изд-во ИжГТУ, 2008. - 25с.
. ГОСТ
19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные
обозначения и правила выполнения.
. ГОСТ
19.505-79 ЕСПД. Руководство оператора. Требования к содержанию и оформлению.
Приложение 1.
Тексты программ
Файл AppManager. cppSystem;System. Collections.
Generic;System. Linq;System. Text;System. Reflection;DKCore. DataBase;DKCore.
DataBase. Objects;DKCore. ConcreteDocuments. Interfaces;DKCore. FormsI;System.
Windows;DKCore
{class AppManager
{static bool IsInited { get; private set; }
// Классы комплексных функций системыstatic
Dictionary<Type, APIBase> apiObjects;
// Объект приложенияstatic ApplicationI appObject;
// Свойства приложенияstatic object
applicationPropertiesObject;
{{ return db; }
}
// Дополнительные типы документовstatic Dictionary<string,
CDocAddinBase> concreteDocAddins;static Dictionary<string,
CDocAddinBase> ConcreteDocAddins
{{ return concreteDocAddins; }
}AppManager ()
{= new Dictionary<string, CDocAddinBase> ();= new
Dictionary<Type, APIBase> ();
}
// Инициализирует менеджер приложенияpublic void Init
(ApplicationI app, object application_properties)
{= application_properties;= app;
// = new DBDocuments ( (string) getApplicationProperty
("DBConnectionString"));. Init ();. CheckVersion ();
// Инициализация загруженных объектов(var api_object in
apiObjects)
{_object. Value. Init ();
}
// Плагины(! PluginManager. LoadInstalledPlugins ())
{res = MessageBox. Show ("Некоторые дополнительные типы
документов не могут быть загружены. Хотите изменить настройки? (Нет -
продолжить работу)", "Ошибка загрузки дополнений",
MessageBoxButton. YesNo);(res == MessageBoxResult. Yes)
{. ShowPluginSettingsForm ();;
}
}
// (var addin in ConcreteDocAddins)
{. Value. Init ();
}= true;
}
// Возвращает значение свойства приложения по имени
// Если свойство не задано, кидает исключениеpublic object
getApplicationProperty (string property)
{prop = applicationPropertiesObject. GetType (). GetProperty
(property);(prop! = null) return prop. GetValue (applicationPropertiesObject,
null);throw new Exception ("Trying read not defined proprty '" +
property + "'");
}
// Открывают форму ошибкиstatic void ShowExceptionForm
(Exception e)
{. ShowExceptionForm (e);
}
// Создать форму изменения списка объектов (связанных с доп.
типами)static EditListFormI CreateEditListForm (EditListSettingsBase settings,
string title)
{appObject. createEditListForm (settings, title);
}
// Регистрирует новый дополнительный тип документовstatic
void RegisterConcreteDocAddin (CDocAddinBase addin)
{. Add (addin. Name, addin);(IsInited) addin. Init ();
}
// Возвращает указанный дополнительный тип документовstatic
CDocAddinBase Addin (string name, bool quiet = false)
{(concreteDocAddins. ContainsKey (name)) return
concreteDocAddins [name];if (quiet) return null;throw new Exception
("Доступ к несуществующему дополнительному типу документов");
}static CDocAddinBase Addin (DBO_DocType doctype, bool quiet
= false)
{Addin (doctype. Name, quiet);
}static CDocAddinBase AddinByDocTypeID (long? doctype_id,
bool quiet = false)
{(var addin in concreteDocAddins)
{(addin. Value. DocTypeDBO. ID == doctype_id) return addin.
Value;
}(quiet) return null;throw new Exception ("Доступ к
несуществующему дополнительному типу документов");
}static bool IsAddinExist (DBO_DocType doctype)
{concreteDocAddins. ContainsKey (doctype. Name);
}
// Регистрирует новый дополнительный тип документовstatic
void RegisterAPI (APIBase api_object)
{. Add (api_object. GetType (), api_object);(IsInited)
api_object. Init ();
}
// Возвращает apistatic APIObject API<APIObject> ()
where APIObject: APIBase
{(apiObjects. ContainsKey (typeof (APIObject))) return
(APIObject) apiObjects [typeof (APIObject)];return null;
}
// Перезапустить приложениеstatic void RestartApplication ()
{. Diagnostics. Process. Start (Application.
ResourceAssembly. Location);. Current. Shutdown ();
}
}
}
Файл ApplicationI. csSystem;System. Collections.
Generic;System. Linq;System. Text;DKCore. FormsI;System. Windows;DKCore
{
// Интерфейс для WPF-шного приложения, с которым
взаимодействует AppManagerinterface ApplicationI
{
// Отобразить форму ошибкиShowExceptionForm (Exception e);
// Отобразить форму настройки плагиновShowPluginSettingsForm
();
// Создать форму изменения списка объектов (связанных с доп.
типами)createEditListForm (EditListSettingsBase settings, string title);
// Проверка версии базыCheckVersion ();
// Завершить работуShutdown ();
}
}
Файл DBHelper. csSystem;System. Collections. Generic;System.
Linq;System. Text;System. Collections. ObjectModel;System. Reflection;System.
Data. SQLite;System. Windows;DKCore. DataBase. Attributes;DKCore. DataBase
{class DBHelper: IDisposable
{conn;transact;throwExceptions;
//
// throw_exeptions - если false - подавлять исключения
// DBHelper (bool throw_exceptions = false)
{= null;= null;= throw_exceptions;
}
// Открыть соединение с базой
// connection_string - строка подключения
// is_transaction - запустить транзакциюvoid Open (string
connection_string, bool is_transaction = false)
{
{= new SQLiteConnection (connection_string);. Open ();=
(is_transaction)? conn. BeginTransaction (): null;
}(Exception e)
{(e);
}
}
// Обрабатывает возникшее исключениеvoid handleException
(Exception e)
{
#if DEBUG. Diagnostics. Debugger. Break ();
#endif(throwExceptions) throw e;AppManager. ShowExceptionForm
(e);
}
// Подтвердить, если была запущена транзакцияvoid Commit ()
{(transact! = null) transact.commit ();
}
// Отменить, если была запущена транзакцияvoid Rollback ()
{(transact! = null) transact. Rollback ();
}void Dispose ()
{(conn! = null) conn. Close ();(transact! = null) transact.
Dispose ();
}
// Возвращает названия полей, ассоцированных со свойствами
объекта db_object, значения которых не равно null (если skip_null = true)
// Если задан field, составляет список из свойств этого
объекта ({ PropertyField = <col_desc>,. })
// <col_desc> = "column_name": берется
указанное поле
// <col_desc> = null - берется из атрибутов
// Если задано must_be_primary, включает в себя поля только
из свойств, помеченных атрибутом как ключевые
// Dictionary<string, PropertyInfo> getInsertingFields
(object db_object, object fields = null, bool skip_null = true, bool?
must_be_primary = null)
{result = new Dictionary<string, PropertyInfo> ();type
= db_object. GetType ();(fields! = null)
{
// Заданы конкретные поля[] fields_props = fields. GetType
(). GetProperties (BindingFlags. Public | BindingFlags. Instance);(var fprop in
fields_props)
{tprop = type. GetProperty (fprop. Name);(tprop! = null)
{fprop_val = fprop. GetValue (fields, null) as
string;(fprop_val == null)
{
// Имя столбца таблицы взять из атрибутовres =
getInsertingFields_OneProperty (db_object, tprop, false, null);(res! = null)
result. Add (res, tprop);
}
{. Add (fprop_val, tprop);
}
}
}
}
{
// Получить поля из атрибутов[] target_props = type.
GetProperties (BindingFlags. Public | BindingFlags. Instance);(var tprop in
target_props)
{res = getInsertingFields_OneProperty (db_object, tprop,
skip_null, must_be_primary);(res! = null) result. Add (res, tprop);
}
}result;
}string getTablePostfix (Type type)
{attributes = type. GetCustomAttributes (typeof
(DBTableNameAttribute), false);(attributes. Length > 0) return (
(DBTableNameAttribute) attributes [0]). TablePostfix;return null;
}string getInsertingFields_OneProperty (object db_object,
PropertyInfo tprop, bool skip_null = true, bool? must_be_primary = null)
{attributes = tprop. GetCustomAttributes (typeof
(DBFieldNameAttribute), false);(attributes. Length > 0)
{attr = (DBFieldNameAttribute) attributes
[0];(must_be_primary == null || must_be_primary == attr. IsPrimaryKey)
{(skip_null == false || tprop. GetValue (db_object, null)! =
null)
{field_name = attr. FieldName;(attr. UsePostfix) field_name
+= "_" + getTablePostfix (db_object. GetType ());field_name;
}
}
}null;
}
// Выбирает все записи по запросу и заполняет объектами T
результирующий список
// com - sql-запрос у базе
// fields - поля, которые будут заполнены у элемента типа T.
// Должен быть представлен обхектом вида: { PropertyField =
"column_name",. }
// Если only_first = true, возвращает список, состоящи только
из первого элемента
// ObservableCollection<T> fetchAll<T> (DBCommand
com, object fields = null, bool only_first = false) where T: class, new ()
{result = new ObservableCollection<T> ();
{. Connection = conn;. Transaction = transact;(var reader =
new DBHelperReader (com. ExecuteReader ()))
{
// MessageBox. Show ("a1");
// Получаем список запрашиваемых полей и связанных с ними
свойст Tretrieve_fields = reader. getRetrievedFields (typeof (T), fields);
// MessageBox. Show ("a2");
// Записываем данные в список результа(reader. Read ())
{elem = new T ();(var field in retrieve_fields)
{. Value. SetValue (elem, reader. readFieldWithType (field.
Key, field. Value. PropertyType), null);
}. Add (elem);(only_first) break;
}
}
// MessageBox. Show ("a3");
}(Exception e)
{(e);
}result;
}T fetchOne<T> (DBCommand com, object fields = null)
where T: class, new ()
{list = fetchAll<T> (com, fields, true);(list. Count
> 0)? list [0]: null;
}T getByID<T> (long? id, string table = null, string
id_field_name = null) where T: class, new ()
{[] class_attrs = typeof (T). GetCustomAttributes (typeof
(DBTableNameAttribute), false);
// Имя таблицы(table == null)
{(class_attrs. Length > 0) table = (
(DBTableNameAttribute) class_attrs [0]). TableName;throw new Exception
("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано
имя таблицы");
}
// Имя поля id(id_field_name == null)
{id_prop = typeof (T). GetProperty ("ID",
BindingFlags. Public | BindingFlags. Instance);(id_prop! = null)
{[] id_attrs = id_prop. GetCustomAttributes (typeof
(DBFieldNameAttribute), false);(id_attrs. Length > 0)
{_field_name = ( (DBFieldNameAttribute) id_attrs [0]).
FieldName;( ( (DBFieldNameAttribute) id_attrs [0]). UsePostfix)
{(class_attrs. Length > 0) id_field_name += "_"
+ ( (DBTableNameAttribute) class_attrs [0]). TablePostfix;throw new Exception
("Ошибка вставки: невозможно определить поле ID: постфикс таблицы не
указан");
}
}throw new Exception ("Ошибка вставки: невозможно
определить поле ID: в атрибутах не указано поле в таблице");
}throw new Exception ("Ошибка вставки: невозможно
определить таблицу: не найдено свойство ID");
}(var com = new DBCommand ("SELECT * FROM " + table
+ " WHERE " + id_field_name + " = @" + id_field_name))
{. Parameters. AddWithValue ("@" + id_field_name, id);fetchOne<T>
(com);
}
}
// Вставляет объект db_object в базу данных:
// Если указан table, в таблицу table (иначе берется из
атрибутов)
// Если указан fields - вставляются только указанные свойства
(иначе свойства, которые не равны null)
// void insert<T> (T db_object, string table = null,
object fields = null) where T: class, new ()
{
{
// Имя таблицы(table == null)
{[] attributes = typeof (T). GetCustomAttributes (typeof
(DBTableNameAttribute), false);(attributes. Length > 0) table = ( (DBTableNameAttribute)
attributes [0]). TableName;throw new Exception ("Ошибка вставки:
невозможно определить таблицу: в атрибутах не указано имя таблицы");
}
// inserting_fields = getInsertingFields (db_object,
fields);(DBCommand com = new DBCommand ())
{. Connection = conn;. Transaction =
transact;(inserting_fields. Count > 0)
{query = "INSERT INTO " + table + "
(";values = " VALUES (";first = true;(var field in
inserting_fields)
{(first) first = false;
{+=", ";+=", ";
}+= field. Key;+= "@" + field. Key;. Parameters.
AddWithValue ("@" + field. Key, field. Value. GetValue (db_object,
null));
}.commandText = query + ")" + values +
")";
}com.commandText = "INSERT INTO " + table + "
DEFAULT VALUES";. ExecuteNonQuery ();
}
}(Exception e)
{(e);
}
}
// Формирует и выполняет запрос на вставку в таблицу table из
полей и значений словаря field_values
// Если values = null вставляет запись со значениями по
умолчанию
// void insertValues (string table, Dictionary<string,
object> field_values = null)
{
{(DBCommand com = new DBCommand ())
{. Connection = conn;. Transaction = transact;(field_values!
= null && field_values. Count > 0)
{query = "INSERT INTO " + table + "
(";values = " VALUES (";first = true;(var field in field_values)
{(first) first = false;
{+=", ";+=", ";
}+= field. Key;+= "@" + field. Key;. Parameters.
AddWithValue ("@" + field. Key, field. Value);
}.commandText = query + ")" + values +
")";
}com.commandText = "INSERT INTO " + table + "
DEFAULT VALUES";. ExecuteNonQuery ();
}
}(Exception e)
{(e);
}
}
// Удаляет объект db_object в базу данных:
// Если указан table, из таблицы table (иначе берется из
атрибутов)
// Если указан keys - ключевые поля берутся из него
// void delete<T> (T db_object, string table = null,
object keys = null) where T: class, new ()
{
{
// Имя таблицы(table == null)
{[] attributes = typeof (T). GetCustomAttributes (typeof
(DBTableNameAttribute), false);(attributes. Length > 0) table = (
(DBTableNameAttribute) attributes [0]). TableName;throw new Exception
("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано
имя таблицы");
}
// key_fields = getInsertingFields (db_object, keys, false,
true);(key_fields. Count > 0)
{(DBCommand com = new DBCommand ())
{. Connection = conn;. Transaction = transact;query =
"DELETE FROM " + table + " WHERE ";first = true;(var field
in key_fields)
{(first) first = false;query +=", ";+= field. Key +
" = " + "@" + field. Key;. Parameters. AddWithValue
("@" + field. Key, field. Value. GetValue (db_object, null));
}.commandText = query;. ExecuteNonQuery ();
}
}
}(Exception e)
{(throwExceptions) throw e;MessageBox. Show (e. ToString ());
}
}
// Обновляет объект db_object в базу данных:
// Если указан table, в таблицу table (иначе берется из
атрибутов)
// Если указан keys - ключевые поля берутся из него
// Если указан fields - обновляются только указанные свойства
(иначе все свойства)
// void update<T> (T db_object, object fields = null,
string table = null, object keys = null) where T: class, new ()
{
{
// Имя таблицы(table == null)
{[] attributes = typeof (T). GetCustomAttributes (typeof
(DBTableNameAttribute), false);(attributes. Length > 0) table = (
(DBTableNameAttribute) attributes [0]). TableName;throw new Exception
("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя
таблицы");
}
// key_fields = getInsertingFields (db_object, keys, false,
true);data_fields = getInsertingFields (db_object, fields, false,
false);(data_fields. Count > 0)
{(DBCommand com = new DBCommand ())
{. Connection = conn;. Transaction = transact;query = "UPDATE
" + table + " SET ";first = true;(var field in data_fields)
{(first) first = false;query +=", ";+= field. Key +
" = " + "@" + field. Key;. Parameters. AddWithValue
("@" + field. Key, field. Value. GetValue (db_object, null));
}+= " WHERE ";= true;(var field in key_fields)
{(first) first = false;query +=", ";+= field. Key +
" = " + "@" + field. Key;. Parameters. AddWithValue
("@" + field. Key, field. Value. GetValue (db_object, null));
}.commandText = query;. ExecuteNonQuery ();
}
}
}(Exception e)
{(throwExceptions) throw e;MessageBox. Show (e. ToString ());
}
}
// Возвращает id, сгенерированное последим запросом на
вставку
// table - имя таблицы, куда вставлялась запись
// id_field_name - имя ключевого поля (должно быть
autoincrement)
// long? getLastInsertedID (string table, string
id_field_name)
{
{(var com = new DBCommand ("SELECT last_insert_rowid
()", conn, transact))
{com. ExecuteScalar () as long?;
}
}(Exception e)
{(e);null;
}
}
// Выполнить команду в текущей транзакции
// void executeNonQuery (DBCommand com)
{
{. Connection = conn;. Transaction = transact;.
ExecuteNonQuery ();
}(Exception e)
{(throwExceptions) throw e;MessageBox. Show (e. ToString ());
}
}
// Выполнить команду в текущей транзакции и получить reader
для прочтения возвращенных запросом данных
// DBHelperReader executeReader (DBCommand com)
{
{. Connection = conn;. Transaction = transact;new
DBHelperReader (com. ExecuteReader ());
}(Exception e)
{(e);null;
}
}
}
// / <summary>
// / Предоставляет упрощенный доступ к полям
// / </summary>class DBHelperReader: IDisposable
{reader;DBHelperReader (SQLiteDataReader rd)
{= rd;
}void Dispose ()
{. Close ();
}
// Читает поле с именем col_name из reader как значение типа
T
// T readField<T> (string col_name)
{col_index = reader. GetOrdinal (col_name);readField<T>
(col_index);
}
// T readField<T> (int col_index)
{(T) readFieldWithType (col_index, typeof (T));
}
// Читает поле с именем col_name из reader как значение типа
type
// object readFieldWithType (string col_name, Type type)
{col_index = reader. GetOrdinal (col_name);readFieldWithType
(col_index, type);
}
// Читает поле с индексом col_index из reader как значение
типа type
// object readFieldWithType (int col_index, Type type)
{is_nullable = false; // Может ли принимать nullrtype = type;
// Если type - Nullable, значение равно будет типу, переданному в шаблон
Nullable(type. IsGenericType && type. GetGenericTypeDefinition () ==
typeof (Nullable<>))
{_nullable = true;= Nullable. GetUnderlyingType (type);
}is_nullable = type. IsClass;
// Если значение в базе равно NULL и тип переменной Nullable
// Возвращаем null(reader. IsDBNull (col_index) &&
is_nullable) return null;
// В любом другом случае:
// type_code = Type. GetTypeCode (rtype);(type_code)
{TypeCode. Boolean: return Convert. ToBoolean (reader.
GetValue (col_index));TypeCode. Decimal: return reader. GetDecimal
(col_index);TypeCode. DateTime: return reader. GetDateTime
(col_index);TypeCode. Int16: return Convert. ToInt16 (reader. GetValue
(col_index));TypeCode. Int32: return Convert. ToInt32 (reader. GetValue
(col_index));TypeCode. Int64: return Convert. ToInt64 (reader. GetValue
(col_index));:
// Другие типыreader. GetValue (col_index);
}
}T readObject<T> (object fields = null) where T: class,
new ()
{retrieve_fields = getRetrievedFields (typeof (T),
fields);elem = new T ();(var field in retrieve_fields)
{. Value. SetValue (elem, readFieldWithType (field. Key,
field. Value. PropertyType), null);
}elem;
}
// Возвращает список индексов полей reader, которые нужно
извлечь для объекта типа type
// Если задан field, составляет список из свойств этого
объекта ({ PropertyField = "column_name",. })
// иначе берет из атрибутов типа type (DBFieldNameAttribute,
DBTableNameAttribute)
// Пример fields:
// new
// {
// ID = "id_doc_type",
// Title = "title_doc_type",
// Name = "name_doc_type",
// CharPrefix = "char_doc_type",
// IsDeleted = "is_deleted"
// }
// Dictionary<int, PropertyInfo> getRetrievedFields
(Type type, object fields = null)
{result = new Dictionary<int, PropertyInfo> ();(fields!
= null)
{
// Заданы конкретные поля[] fields_props = fields. GetType
(). GetProperties (BindingFlags. Public | BindingFlags. Instance);(var fprop in
fields_props)
{tprop = type. GetProperty (fprop. Name);(tprop! = null)
{
// try
// {field_index = reader. GetOrdinal ( (string) fprop.
GetValue (fields, null));. Add (field_index, tprop);
// }
// NOTE:
// Возможно в этом случае переъватывать исключение не стоит
// catch (IndexOutOfRangeException) { }
}
}
}
{
// Получить поля из атрибутов[] attributes;= type.
GetCustomAttributes (typeof (DBTableNameAttribute), false);(attributes. Length
> 0)
{= tprop. GetCustomAttributes (typeof (DBFieldNameAttribute),
false);(attributes. Length > 0)
{attr = (DBFieldNameAttribute) attributes [0];field_name =
attr. FieldName;(attr. UsePostfix) field_name += "_" + postfix;
{field_index = reader. GetOrdinal (field_name);(field_index!
= - 1) result. Add (field_index, tprop);
}(IndexOutOfRangeException) { }
}
}
}
}result;
}
// / <summary>
// / Читает следующую строку результата
// / </summary>
// / <returns>
// / Возвращает true, если данные считаны, false - если
данных нет
// / </returns>bool Read ()
{reader. Read ();
}
}
}
Файла DBEntityObjectBaseSystem;System. Collections.
Generic;System. Linq;System. Text;System.componentModel;DKCore. DataBase.
Attributes;DKCore. DataBase
{public class DBEnityObjectBase: INotifyPropertyChanged
{DBEnityObjectBase (long id)
{= id;
}DBEnityObjectBase ()
{= null;
}bool existInDB
{{ return ID! = null; }
}
//
// Поля:
// long? id;
[DBFieldName ("id", true, true)]long? ID
{{ return id; }
{= value;(new PropertyChangedEventArgs ("ID"));
}
}
//
// Уведомление об изменениях (INotifyPropertyChanged)
// event PropertyChangedEventHandler PropertyChanged;void
OnPropertyChanged (PropertyChangedEventArgs e)
{(PropertyChanged! = null) PropertyChanged (this, e);
}
}
}
Файл DBDocumentsSystem;System. Collections. Generic;System.
Text;System. Data. SQLite;System. Windows;System. Collections.
ObjectModel;System. Reflection;System. Data;DKCore. DataBase. Objects;DKCore.
DataBase
{class DBDocuments
{string connectionStr;
// Инициализирован?bool isInited;bool IsInited
{{ return isInited; }
}
// Подключенные к базе модулиDictionary<Type,
DBModuleBase> modules;
// Схема базыDBSchema schema;DBSchema Schema
{{ return schema; }
}DBDocuments (string connection_string)
{= false;= new Dictionary<Type, DBModuleBase> ();=
connection_string;. RegisterFunction (typeof
(SQLiteCaseInsensitiveCollation));. RegisterFunction (typeof (SQLiteRusUpper));
// Схема базы (заполняется модулями)= new DBSchema ();
// Модули:(new Modules. DBModule_CardCase ());(new Modules.
DBModule_Documents ());(new Modules. DBModule_Files ());(new Modules.
DBModule_FastSearch ());
}
// Подготавливает базу для работы
// Загружает наиболее часто используемые данныеvoid Init ()
{(var module in modules)
{. Value. Init ();
}= true;
}
// Регистрирует новый модуль DBModule для работы с базой
// void RegisterModule (DBModuleBase module)
{(! modules. ContainsKey (module. GetType ()))
{. Add (module. GetType (), module);
// module. GrantBeginTransaction (BeginTransaction);. DB =
this;(IsInited) module. Init ();
}
}
// Возвращает объект модуля базы или false
// DBModule Module<DBModule> () where DBModule:
DBModuleBase
{(modules. ContainsKey (typeof (DBModule))) return (DBModule)
modules [typeof (DBModule)];return null;
}
// Запускает транзакцию для обращения к базе
// Возвращает объект DBHelper:
// Чтобы подтвердить транзакцию необъодимо вызвать
DBHelper.commit ();
// Чтобы откатить транзакуию, необходимо вызвать DBHelper.
Rollback ();
// DBHelper BeginTransaction (bool transaction_mode = false,
bool throw_exception = false)
{dbhelper = new DBHelper (throw_exception);. Open
(connectionStr, transaction_mode);dbhelper;
}
// Возвращает версию подсистемыstring getSysVersion (string
subsystem, DBHelper dbhelper)
{(var com = new DBCommand ("SELECT version FROM
sys_versions WHERE subsystem = @subsystem"))
{. Parameters. AddWithValue ("@subsystem",
subsystem);(var reader = dbhelper. executeReader (com))
{(reader. Read ()) return reader. readField<string>
("version");return null;
}
}
}string getSysVersion (string subsystem)
{(var dbhelper = BeginTransaction ())
{getSysVersion (subsystem, dbhelper);
}
}
// Загружает объект с заданным idT loadByID<T> (long?
id) where T: DBEnityObjectBase, new ()
{(var dbhelper = BeginTransaction ())
{dbhelper. getByID<T> (id);
}
}
}
}
Файла DBDocumentSelector. csSystem;System. Collections.
Generic;System. Linq;System. Text;System.componentModel;System. Data.
SQLite;DKCore. ConcreteDocuments. Interfaces;DKCore. ConcreteDocuments.
Interfaces. DB;DKCore. DataBase. Objects;DKCore. DataBase
{class DBDocumentSelector
{DBDocumentSelector ()
{= new Dictionary<DBO_DocType, DBConcreteInfoFilter>
();
}
// Фильтр 1 (по документам в целом)DBDocumentFilter
DocumentFilter { get; set; }
// Фильтр 1 (по документам в целом)DBCommonInfoFilter
CommonInfoFilter { get; set; }
// Фильтры по каждому из типов
документовDictionary<DBO_DocType, DBConcreteInfoFilter>
ConcreteDocFilters { get; set; }
}
}
Файл DBCompleFieldAttributeSystem;System. Collections.
Generic;System. Linq;System. Text;DKCore. DataBase. Attributes
{
// / <summary>
// / Атрибут указывает, что при извлечении объекта из
источника (базы) значение этого свойства
// / должно так же интерпретироваться как объект базы, поля
которого рекурсивно заполняются
// / из источника с добавлением префикса
// / </summary>
[AttributeUsage (AttributeTargets. Property, Inherited =
true, AllowMultiple = false)]class DBComplexField: System. Attribute
{DBComplexField (string _prefix = "")
{= _prefix;
}
// Префикс к полямstring prefix;string Prefix
{{ return prefix; }
}
}
}
Файл DBFieldNameAttributeSystem;System. Collections.
Generic;System. Linq;System. Text;DKCore. DataBase. Attributes
{
[AttributeUsage (AttributeTargets. Property, Inherited =
true, AllowMultiple = false)]class DBFieldNameAttribute: System. Attribute
{DBFieldNameAttribute (string field_name, bool use_postfix =
false, bool is_primary_key = false)
{= field_name;= use_postfix;= is_primary_key;
}
// Имя поля в базеstring fieldName;string FieldName
{{ return fieldName; }
}
// Использовать постфикс к полям таблицыbool usePostfix;bool
UsePostfix
{{ return usePostfix; }
}
// Это поле ключевоеbool isPrimaryKey;bool IsPrimaryKey
{{ return isPrimaryKey; }
}
}
}
Фала DBTableName. csSystem;System. Collections.
Generic;System. Linq;System. Text;DKCore. DataBase. Attributes
{
[AttributeUsage (AttributeTargets. Class, Inherited = false,
AllowMultiple = false)]class DBTableNameAttribute: System. Attribute
{DBTableNameAttribute (string table_name, string
table_postfix)
{= table_name;= table_postfix;
}
// Имя таблицы в базеstring tableName;string TableName
{{ return tableName; }
}
// Префикс к полям таблицыstring tablePostfix;string
TablePostfix
{{ return tablePostfix; }
}
}
}
Файл DBModule_DocumentsSystem;System. Collections.
Generic;System. Linq;System. Text;System. Data. SQLite;System. Windows;System.
Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase.
Objects;DKCore. DataBase;DKCore. DataBase. Attributes;DKCore. DataBase. Modules
{class DBModule_Documents: DBModuleBase
{
// Типы документов
// Загружаются при старте программы
(init)Dictionary<string, DBO_DocType> docTypes; // Имя типа =>
типDictionary<long?, DBO_DocType> docTypesByID; // ID типа =>
типObservableCollection<DBO_DocType> docTypeList; // Список типовpublic
void Init ()
{
// Тип документа. Schema. addTable (new DBTable
("doc_type", "id_doc_type"));
// Картотека. Schema. addTable (new DBTable ("card_case",
"id_card_case"));table = DB. Schema. addTable (new DBTable
("card_folder", "id_card_folder"));. addForeignKey (new
DBForeighLink ("id_card_case", DB. Schema. getTable
("card_case"), "id_card_case"));
// Документ= DB. Schema. addTable (new DBTable
("document", "id_document"));. addForeignKey (new
DBForeighLink ("id_d_type", DB. Schema. getTable
("doc_type"), "id_doc_type"));. addForeignKey (new
DBForeighLink ("id_card_folder", DB. Schema. getTable
("card_folder"), "id_card_folder"));
// Получение списка типов документов(var dbhelper =
BeginTransaction ())(var com = new DBCommand ("SELECT * FROM
v_notdel_doc_type"))
{= dbhelper. fetchAll<DBO_DocType> (com);= new
Dictionary<string, DBO_DocType> ();= new Dictionary<long?,
DBO_DocType> ();(var dt in docTypeList)
{. Add (dt. Name, dt);. Add (dt. ID, dt);
}
}
}
// FoundedCount getFoundedCount (DBDocumentFilter doc_filter,
DBO_DocType doc_type)
{(var dbhelper = BeginTransaction ())
{
// query = new DBQueryBuilder (DB. Schema);. SELECT
("COUNT (*) count"). FROM ("document"). LIMIT (1);_filter.
apply (query);
// (var com = new DBCommand (query. BuildQuery ()))
{_filter. passParams (com);
// (var reader = dbhelper. executeReader (com))
{(reader. Read ())
{res = new FoundedCount ();. DocType = doc_type;. Count =
reader. readField<long> ("count");res;
}return null;
}
}
}
}
// Возвращает список годов, которые присуствует в архиве
(+days дней от текущего момента)ObservableCollection<int> getArchiveYears
(int days)
{(var dbhelper = BeginTransaction ())
{<int> result = new ObservableCollection<int>
();(var com = new DBCommand ())
{(DBDocumentFilter. IsAutoArchiveEnabled)
{.commandText =
"SELECT ifnull (elapsing_year, force_year) AS
elapsing_year, ifnull (force_year, elapsing_year) AS force_year " +
"FROM v_documents_year " +
"WHERE elapsing_min IS NOT NULL AND elapsing_min <
date (CURRENT_TIMESTAMP, '-" + days. ToString () + " days') OR "
+
"force_min IS NOT NULL " +
"ORDER BY elapsing_year DESC, force_year DESC";
}
{.commandText =
"SELECT DISTINCT force_year AS elapsing_year, force_year
AS force_year " +
"FROM v_documents_year " +
"WHERE force_min IS NOT NULL " +
"ORDER BY elapsing_year DESC, force_year DESC";
}(var reader = dbhelper. executeReader (com))
{last_year = int. MaxValue;(reader. Read ())
{elapsing_year = reader. readField<int>
("elapsing_year");force_year = reader. readField<int>
("force_year");year = (elapsing_year > force_year)? force_year:
elapsing_year;(year < last_year)
{. Add (year);_year = year;
}
}
}
}result;
}
}
// Удалить все документы, удовлетворяющие фильтру
// Связанные файлы НЕ удаляютсяvoid deleteAllDocWithFilter
(DBDocumentFilter filter, DBHelper dbhelper)
{query = new DBQueryBuilder (DB. Schema);. FROM
("document");. apply (query);(var com = new DBCommand
("DELETE" + query. BuildQuery ()))
{. passParams (com);. executeNonQuery (com);
}
}void deleteAllDocWithFilter (DBDocumentFilter filter)
{(var dbhelper = BeginTransaction ())
{(filter, dbhelper);
}
}
// Поместить в корзину документ docvoid throwDocumentToBin
(DBO_Document doc)
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("UPDATE document SET is_in_recycle_bin = 1 WHERE id_document =
@id_document"))
{. Parameters. AddWithValue ("@id_document", doc.
ID);. IsInRecycleBin = true;. executeNonQuery (com);
}
}
// Принудительно поместить документ в архивvoid
forcePutInArchive (DBO_Document doc)
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("UPDATE document SET force_close_time = @force_close_time WHERE
id_document = @id_document"))
{close_time = DateTime. Now;. Parameters. AddWithValue
("@force_close_time", close_time);. Parameters. AddWithValue
("@id_document", doc. ID);. ForceCloseDate = close_time;.
executeNonQuery (com);
}
}
// Отменить принудительное помещение в архивvoid
forceGetFromArchive (DBO_Document doc)
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("UPDATE document SET force_close_time = @force_close_time WHERE
id_document = @id_document"))
{. Parameters. AddWithValue ("@force_close_time",
null);. Parameters. AddWithValue ("@id_document", doc. ID);.
ForceCloseDate = null;. executeNonQuery (com);
}
}
// Восстановить из корзины документ docvoid
restoreDocumentFromBin (DBO_Document doc)
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("UPDATE document SET is_in_recycle_bin = 0 WHERE id_document =
@id_document"))
{. Parameters. AddWithValue ("@id_document", doc.
ID);. IsInRecycleBin = false;. executeNonQuery (com);
}
}
// Возвращает список документов указнного типа в выбранный
периодObservableCollection<DBO_Document> getDocumentsWithFilter
(DBDocumentFilter filter, DBHelper dbhelper)
{query = new DBQueryBuilder (DB. Schema);. SELECT
("*"). FROM ("document", "d"). JOIN
("doc_type", "t"). WHERE (" [is_deleted] = 0",
"doc_type"). ORDER_BY ("name_document");. apply
(query);(var com = new DBCommand (query. BuildQuery ()))
{. passParams (com);dbhelper. fetchAll<DBO_Document>
(com);
}
}ObservableCollection<DBO_Document>
getDocumentsWithFilter (DBDocumentFilter filter)
{(var dbhelper = BeginTransaction ())
{getDocumentsWithFilter (filter, dbhelper);
}
}
// Возвращает список типов документа в выбранный период
// (либо за указанный год в архиве, когда year! = null, либо
+days дней от текущего момента)ObservableCollection<DBO_DocType>
getDocTypesWithFilter (DBDocumentFilter filter)
{(var dbhelper = BeginTransaction ())
{query = new DBQueryBuilder (DB. Schema);. SELECT ("t.
*"). FROM ("document", "d"). JOIN
("doc_type", "t"). WHERE (" [is_deleted] = 0",
"doc_type"). GROUP_BY (" [id_doc_type]", "doc_type");.
apply (query);(var com = new DBCommand (query. BuildQuery ()))
{. passParams (com);dbhelper. fetchAll<DBO_DocType>
(com);
}
}
}
// Возаращет тип документа с заданным именемDBO_DocType
getDocTypeWithName (string name)
{(docTypes. ContainsKey (name)) return docTypes [name];return
null;
}
// Возаращет тип документа с заданным IDDBO_DocType
getDocTypeWithID (long? id)
{(docTypesByID. ContainsKey (id)) return docTypesByID
[id];return null;
}
// Возвращает все типы документовObservableCollection<DBO_DocType>
getDocTypes ()
{docTypeList;
}
}
}
Файл DBModule_CardCase. csSystem;System. Collections.
Generic;System. Linq;System. Text;System. Data. SQLite;System. Windows;System.
Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase.
Objects;DKCore. DataBase;DKCore. DataBase. Attributes;DKCore. DataBase. Modules
{class DBModule_CardCase: DBModuleBase
{public void Init ()
{
// Картотека. Schema. addTable (new DBTable
("card_case", "id_card_case"));table = DB. Schema. addTable
(new DBTable ("card_folder", "id_card_folder"));.
addForeignKey (new DBForeighLink ("id_card_case", DB. Schema.
getTable ("card_case"), "id_card_case"));
}
// Возвращает все ящики в
картотекеObservableCollection<DBO_CardCase> getCardCases ()
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("SELECT * FROM v_notdel_card_case"))
{dbhelper. fetchAll<DBO_CardCase> (com);
}
}
// Удаляет.
// Физически запись не удаляетсяbool deleteCardCase
(DBO_CardCase obj)
{(var dbhelper = BeginTransaction ())
{. IsDeleted = true;. update<DBO_CardCase> (obj, new {
IsDeleted = 0 });
}true;
}
// Переименовывает ящик
// Возвращает false, если ящик с таким именем уже
существуетbool renameCardCase (DBO_CardCase obj, string new_name)
{(var dbhelper = BeginTransaction (true, true))
{
{already_exist = false;
// Проверка на повтор(var com_sel = new DBCommand
("SELECT 1 FROM v_notdel_card_case WHERE title_card_case =
@title_card_case"))
{_sel. Parameters. AddWithValue
("@title_card_case", new_name);(var reader = dbhelper. executeReader
(com_sel)) already_exist = reader. Read ();
}(! already_exist)
{
// Изменение в базе(var com_upd = new DBCommand ("UPDATE
card_case SET title_card_case = @title_card_case WHERE id_card_case =
@id_card_case"))
{_upd. Parameters. AddWithValue
("@title_card_case", new_name);_upd. Parameters. AddWithValue
("@id_card_case", obj. ID);. executeNonQuery (com_upd);.commit ();.
Title = new_name;true;
}
}return false;
}(Exception e)
{. Rollback ();. Show (e. ToString ());false;
}
}
}
// Возвращает все отсортированные по
имениObservableCollection<DBO_CardCase> getCardCasesSortedByTitle ()
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("SELECT * FROM v_notdel_card_case ORDER BY title_card_case"))
{dbhelper. fetchAll<DBO_CardCase> (com);
}
}
// Добавление нового
// dbhelper - объект текущей транзакцииbool addCardCase
(DBO_CardCase obj, DBHelper dbhelper)
{. insert<DBO_CardCase> (obj);. ID = dbhelper.
getLastInsertedID ("card_case", "id_card_case");true;
}bool addCardCase (DBO_CardCase obj)
{(var dbhelper = BeginTransaction ())
{addCardCase (obj, dbhelper);
}
}
// Возвращает все ящики в
картотекеObservableCollection<DBO_CardFolder> getCardFolders
(DBO_CardCase card_case)
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("SELECT * FROM v_notdel_card_folder WHERE id_card_case =
@id_card_case"))
{. Parameters. AddWithValue ("@id_card_case",
card_case. ID);dbhelper. fetchAll<DBO_CardFolder> (com);
}
}
// Возвращает все отсортированные по имениObservableCollection<DBO_CardFolder>
getCardFoldersSortedByTitle (DBO_CardCase card_case)
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("SELECT * FROM v_notdel_card_folder WHERE id_card_case = @id_card_case
ORDER BY title_card_folder"))
{. Parameters. AddWithValue ("@id_card_case",
card_case. ID);dbhelper. fetchAll<DBO_CardFolder> (com);
}
}
// Добавление нового
// dbhelper - объект текущей транзакцииbool addCardFolder
(DBO_CardFolder obj, DBHelper dbhelper)
{. insert<DBO_CardFolder> (obj);. ID = dbhelper.
getLastInsertedID ("card_folder", "id_card_folder");true;
}bool addCardFolder (DBO_CardFolder obj)
{(var dbhelper = BeginTransaction ())
{addCardFolder (obj, dbhelper);
}
}
// Удаляет.
// Физически запись не удаляетсяbool deleteCardFolder (DBO_CardFolder
obj)
{(var dbhelper = BeginTransaction ())
{. IsDeleted = true;. update<DBO_CardFolder> (obj, new
{ IsDeleted = 0 });
}true;
}
// Переименовывает папку в ящике
// Возвращает false, если ящик с таким именем уже существуетbool
renameCardFolder (DBO_CardFolder obj, string new_name)
{(var dbhelper = BeginTransaction (true, true))
{
{already_exist = false;
// Проверка на повтор(var com_sel = new DBCommand
("SELECT 1 FROM v_notdel_card_folder WHERE id_card_case = @id_card_case AND
title_card_folder = @title_card_folder"))
{_sel. Parameters. AddWithValue
("@title_card_folder", new_name);_sel. Parameters. AddWithValue
("@id_card_case", obj. CardCaseID);(var reader = dbhelper.
executeReader (com_sel)) already_exist = reader. Read ();
}(! already_exist)
{
{_upd. Parameters. AddWithValue
("@title_card_folder", new_name);_upd. Parameters. AddWithValue
("@id_card_folder", obj. ID);. executeNonQuery (com_upd);.commit ();.
Title = new_name;true;
}
}return false;
}(Exception e)
{. Rollback ();. Show (e. ToString ());false;
}
}
}
// Возвращает "Пустую запись"DBO_CardFolder
whitespaceCardFolder;DBO_CardFolder getWhiteSpaceCardFolder (DBHelper dbhelper)
{(whitespaceCardFolder == null)
{(var com = new DBCommand ("SELECT * FROM card_folder
WHERE title_card_folder = '' LIMIT 1"))
{= dbhelper. fetchOne<DBO_CardFolder>
(com);(whitespaceCardFolder == null)
{= new DBO_CardFolder () { Title = "", IsDeleted =
true };(whitespaceCardFolder, dbhelper);
}
}
}whitespaceCardFolder;
}
}
}
Файл DBModule_FastSearch. csSystem;System. Collections.
Generic;System. Linq;System. Text;System. Data. SQLite;System. Windows;System.
Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase.
Objects;DKCore. DataBase;DKCore. DataBase. Attributes;DKCore. DataBase. Modules
{class DBModule_FastSearch: DBModuleBase
{public void Init ()
{
// Поисковый тег. Schema. addTable (new DBTable
("search_tag", "id_search_tag"));
// Связь документов и тегов:table = DB. Schema. addTable (new
DBTable ("lnk_document_and_search_tag", "id_document"));.
addForeignKey (new DBForeighLink ("id_document", DB. Schema. getTable
("document")));. addForeignKey (new DBForeighLink
("id_search_tag", DB. Schema. getTable ("search_tag")));
}
// Быстрый поиск текст search_text, возвращающий count
результатовObservableCollection<DBO_Document> fastSearch (string
search_text, int count)
{(var dbhelper = BeginTransaction ())
{query = new DBQueryBuilder (DB. Schema);. SELECT_DISTINCT
(" [*]", "document")
. FROM ("document", "d"). JOIN_LEFT
("lnk_document_and_search_tag", "lnk"). JOIN_LEFT
("search_tag", "s")
. WHERE ("UnicodeUpper ([1. title_search_tag]) LIKE
@tag_like OR UnicodeUpper ([2. name_document]) LIKE @name_like",
"search_tag", "document")
. ORDER_BY (" [updated_time]", true,
"document")
. LIMIT (count);(var com = new DBCommand (query. BuildQuery
()))
{. Parameters. AddWithValue ("@tag_like",
"%" + search_text. ToUpper () + "%");. Parameters.
AddWithValue ("@name_like", search_text. ToUpper () +
"%");dbhelper. fetchAll<DBO_Document> (com);
}
}
}
// Добавляет тег поиска search_tag к документу documentvoid
addSearchTag (DBO_Document document, string search_tag, DBHelper dbhelper)
{(search_tag! = null)
{(var com = new DBCommand ("SELECT * FROM search_tag
WHERE title_search_tag = @title_search_tag"))
{. Parameters. AddWithValue ("@title_search_tag",
search_tag);st = dbhelper. fetchOne<SearchTag> (com);(st == null)
{= new SearchTag () { Title = search_tag };.
insert<SearchTag> (st);. ID = dbhelper. getLastInsertedID
("search_tag", "id_search_tag");
}. insertValues
(
"lnk_document_and_search_tag",Dictionary<string,
object> () { { "id_document", document. ID }, {
"id_search_tag", st. ID } }
);
}
}
}
// Добавляет информацию для поиска, специфичную documentvoid
addDocumentSearchInfo (DBO_Document document, DBHelper dbhelper)
{
// addSearchTag (document, document. Name, dbhelper);
}
// Удаление старых поисковых тегов для докумета с ID = idvoid
clearSearchInfo (long? id, DBHelper dbhelper)
{(var com = new DBCommand ("DELETE FROM
lnk_document_and_search_tag WHERE id_document = @id_document"))
{. Parameters. AddWithValue ("@id_document", id);.
executeNonQuery (com);
}
}
}
}
Файл DBModule_FIles. csSystem;System. Collections.
Generic;System. Linq;System. Text;System. Data. SQLite;System. Windows;System.
Collections. ObjectModel;System. Reflection;System. Data;DKCore. DataBase.
Objects;DKCore. DataBase;DKCore. DataBase. Attributes;DKCore. DataBase. Modules
{class DBModule_Files: DBModuleBase
{public void Init ()
{
// Файлы:table = DB. Schema. addTable (new DBTable
("doc_file", "id_doc_file"));. addForeignKey (new
DBForeighLink ("id_document", DB. Schema. getTable
("document")));
// Кол-во файлов в документе= DB. Schema. addTable (new
DBTable ("v_documents_file_count", "id_document"));.
addForeignKey (new DBForeighLink ("id_document", DB. Schema. getTable
("document")));
}
// Добавление нового файла в базу, назначение ему IDbool
addDocFile (DBO_DocFile file, DBHelper dbhelper)
{. insert<DBO_DocFile> (file);. ID = dbhelper.
getLastInsertedID ("doc_file", "id_doc_file");true;
}
// Добавление новой папки в базу, назначение ей IDbool
addDocFileFolder (DBO_DocFileFolder folder, DBHelper dbhelper)
{. insert<DBO_DocFileFolder> (folder);. ID = dbhelper.
getLastInsertedID ("doc_file_folder",
"id_doc_file_folder");true;
}
// Обновление пути файла в хранилищеvoid updateStoragePath
(DBO_DocFile file, DBHelper dbhelper)
{. update<DBO_DocFile> (file, new { StoragePath = 0 });
}
// Обновление данных файлаvoid updateFileInfo (DBO_DocFile
file)
{(var dbhelper = BeginTransaction ())
{. update<DBO_DocFile> (file);
}
}
// Обновление данных папкиvoid updateFolderInfo
(DBO_DocFileFolder file)
{(var dbhelper = BeginTransaction ())
{. update<DBO_DocFileFolder> (file);
}
}
// Возвращает все файлы, связанные с
документомObservableCollection<DBO_DocFile> getDocFiles (DBO_Document
doc)
{(var dbhelper = BeginTransaction ())(var com = new DBCommand
("SELECT * FROM v_notdel_doc_file WHERE id_document = @id_document"))
{. Parameters. AddWithValue ("@id_document", doc.
ID);dbhelper. fetchAll<DBO_DocFile> (com);
}
}
// Возвращает все файлы, связанные с документом, находящиеся
в заданной папкеObservableCollection<DBO_DocFile> getDocFiles
(DBO_Document doc, long? folder_id)
{getDocFiles (doc. ID, folder_id);
}ObservableCollection<DBO_DocFile> getDocFiles (long?
doc_id, long? folder_id)
{folder_id_query = "parent_id_doc_file_folder =
@folder_id";(folder_id == null) folder_id_query =
"parent_id_doc_file_folder IS NULL";(var dbhelper = BeginTransaction
())(var com = new DBCommand ("SELECT * FROM v_notdel_doc_file WHERE
id_document = @id_document AND " + folder_id_query))
{. Parameters. AddWithValue ("@id_document",
doc_id);. Parameters. AddWithValue ("@folder_id",
folder_id);dbhelper. fetchAll<DBO_DocFile> (com);
}
}
// Возвращает все папки, находящиеся в указаннойObservableCollection<DBO_DocFileFolder>
getDocFolders (DBO_Document doc, long? folder_id)
{getDocFolders (doc. ID, folder_id);
}ObservableCollection<DBO_DocFileFolder> getDocFolders
(long? doc_id, long? folder_id)
{folder_id_query = "parent_id_doc_file_folder =
@folder_id";(folder_id == null) folder_id_query =
"parent_id_doc_file_folder IS NULL";(var dbhelper = BeginTransaction
())(var com = new DBCommand ("SELECT * FROM v_notdel_doc_file_folder WHERE
id_document = @id_document AND " + folder_id_query))
{. Parameters. AddWithValue ("@id_document",
doc_id);. Parameters. AddWithValue ("@folder_id",
folder_id);dbhelper. fetchAll<DBO_DocFileFolder> (com);
}
}
// Удалитьвсе записи о прикрепленных файлах для документаvoid
deleteAllFiles (DBO_Document doc, DBHelper dbhelper)
{(var com = new DBCommand ("DELETE FROM doc_file WHERE
id_document = @id_document"))
{. Parameters. AddWithValue ("@id_document", doc.
ID);. executeNonQuery (com);
}
}
// Удалитьвсе записи о прикрепленных папках для документаvoid
deleteAllFolders (DBO_Document doc, DBHelper dbhelper)
{(var com = new DBCommand ("DELETE FROM doc_file_folder
WHERE id_document = @id_document"))
{. Parameters. AddWithValue ("@id_document", doc.
ID);. executeNonQuery (com);
}
}
}
}
Файла AddDocument. xaml. csSystem;System. Collections.
Generic;System. Linq;System. Text;System. Windows;System. Windows.
Controls;System. Windows. Data;System. Windows. Documents;System. Windows.
Input;System. Windows. Media;System. Windows. Media. Imaging;System. Windows.
Shapes;System. Collections. ObjectModel;System.runtime.
Serialization;System.runtime. Serialization. Formatters;System.runtime.
Serialization. Formatters. Binary;DKCore. DataBase. Objects;DKeeper. Logic.
API;DKeeper. Forms. EditListForm;DKCore. ConcreteDocuments. Interfaces.
Forms;DKeeper. Forms.common;DKCore. DataBase. Modules;DKCore. FormsI;DKeeper.
Forms. AddDocument
{
// / <summary>
// / Interaction logic for AddDocument. xaml
// / </summary>partial class AddDocument: Window
{Dictionary<DBO_DocType, ICDocAddPage>
recentDocTypes;ICDocAddPage
currentDocPage;ObservableCollection<DBO_DocFile>
editedFiles;ObservableCollection<DBO_DocFileFolder>
editedFolders;DBO_Document CurrentDocument
{{ return DataContext as DBO_Document; }
}bool OpenAfterClose { get; set; }AddDocument ()
{= new Dictionary<DBO_DocType, ICDocAddPage> ();= new
DBO_Document ();= new ObservableCollection<DBO_DocFile> ();= new
ObservableCollection<DBO_DocFileFolder> ();();
// lstAttachedFiles. ItemsSource = attachedFiles;= false;
}void Window_Loaded (object sender, RoutedEventArgs e)
{
// Загрузка типов документовdoctype_list = new
ObservableCollection<DBO_DocType> ();(var addin in App.
ConcreteDocAddins)
{_list. Add (addin. Value. DocTypeDBO);
}. ItemsSource = doctype_list;. ItemsSource = App. DB.
Module<DBModule_CardCase> (). getCardCasesSortedByTitle ();
}
// Смена типа документовvoid cmbDocTypes_SelectionChanged
(object sender, SelectionChangedEventArgs e)
{_DocType selected = ( (ComboBox) sender). SelectedItem as DBO_DocType;page
= null;(selected! = null)
{(recentDocTypes. ContainsKey (selected)) page =
recentDocTypes [selected];
{(App. ConcreteDocAddins. ContainsKey (selected. Name))
{= App. ConcreteDocAddins [selected. Name]. getNewAddPage
();[selected] = page;
}
}
}(page! = null)
{. Navigate (page);= page;
}
}void insertToDB ()
{
{card_case = cmbxCardCase. SelectedItem as
DBO_CardCase;(card_case == null)
{(cmbxCardCase. Text! = "") card_case = new
DBO_CardCase () { Title = cmbxCardCase. Text };
}card_folder = cmbxCardFolder. SelectedItem as
DBO_CardFolder;(card_folder == null)
{(cmbxCardFolder. Text! = "") card_folder = new
DBO_CardFolder () { Title = cmbxCardFolder. Text };
}
// MessageBox. Show ("-3");
// Сам документfull_doc_info = new DBO_FullDocInfo ();_doc_info.commonInfo
= CurrentDocument;_doc_info. CardCase = card_case;_doc_info. CardFolder =
card_folder;result = currentDocPage. insertConcreteDocToDB
(full_doc_info);(result)
{
// MessageBox. Show ("-2");
// Прикрепленные файлы= result && App. API<DocumentsAPI>
(). addAttachedFolders (CurrentDocument, editedFolders);= result &&
App. API<DocumentsAPI> (). addAttachedFiles (CurrentDocument,
editedFiles);(! result)
{. Show ("Документ #" + CurrentDocument. ID +
" был добавлен, " +
"однако в процессе создания возникли ошибки и не все
данные были сохранены." +
"Рекомендуется повторно отредактировать документ");
}= result;();
}
}(Exception e)
{. Show (e. ToString ());
}
}void OK_Click (object sender, RoutedEventArgs e)
{();
}void Cancel_Click (object sender, RoutedEventArgs e)
{= false;();
}void cmbxCardCase_SelectionChanged (object sender,
SelectionChangedEventArgs e)
{card_case = cmbxCardCase. SelectedItem as DBO_CardCase;.
Text = "";(card_case! = null)
{. ItemsSource = App. DB. Module<DBModule_CardCase> ().
getCardFoldersSortedByTitle (card_case);
}
{. ItemsSource = null;
}
}void btnCardCase_Click (object sender, RoutedEventArgs e)
{editlist = new EditListForm. EditListForm ();settings = new
EditListSettings<DBO_CardCase> ();. GetElemsFunc = App. DB. Module<DBModule_CardCase>
(). getCardCasesSortedByTitle;. AddElemFunc = App. DB.
Module<DBModule_CardCase> (). addCardCase;. DeleteElemFunc = App. DB.
Module<DBModule_CardCase> (). deleteCardCase;. EditListSettings =
settings;. SelectingObjTitle = "Картотека - ящик";res = editlist.
ShowDialog ();(editlist. ListWasChanged)
{
// Обновление списка. ItemsSource = App. DB.
Module<DBModule_CardCase> (). getCardCases ();
}(res == true)
{sel = (DBO_CardCase) editlist. SelectedItem;_CardCase
lst_sel = null;(var item in cmbxCardCase. Items)
{as_dbo = item as DBO_CardCase;(as_dbo! = null &&
sel. ID == as_dbo. ID)
{_sel = as_dbo;;
}
}. SelectedItem = lst_sel;
}
}void btnCardFolder_Click (object sender, RoutedEventArgs e)
{card_case = cmbxCardCase. SelectedItem as
DBO_CardCase;(card_case! = null)
{editlist = new EditListForm. EditListForm ();settings = new
EditListSettings<DBO_CardFolder> ();. GetElemsFunc = ( () => App. DB.
Module<DBModule_CardCase> (). getCardFoldersSortedByTitle (card_case));.
AddElemFunc = ( (card_folder) => { card_folder. CardCaseID = card_case. ID;
return App. DB. Module<DBModule_CardCase> (). addCardFolder
(card_folder); });. DeleteElemFunc = App. DB. Module<DBModule_CardCase>
(). deleteCardFolder;. EditListSettings = settings;. SelectingObjTitle =
"Картотека - папка";res = editlist. ShowDialog ();(editlist.
ListWasChanged)
{
// Обновление списка. ItemsSource = App. DB.
Module<DBModule_CardCase> (). getCardFolders (card_case);
}(res == true)
{sel = (DBO_CardFolder) editlist. SelectedItem;_CardFolder
lst_sel = null;(var item in cmbxCardFolder. Items)
{as_dbo = item as DBO_CardFolder;(as_dbo! = null &&
sel. ID == as_dbo. ID)
{_sel = as_dbo;;
}
}. SelectedItem = lst_sel;
}
}
}void Window_Closed (object sender, EventArgs e)
{
// Удаление временных файлов(var file in editedFiles)
{(file. IsTemporary)
{{ System. IO. File. Delete (file. LocalPath); }(Exception) {
}
}
}
}void AddFile_Click (object sender, RoutedEventArgs e)
{
// var open_dialog2 = new Ookii. Dialogs. Wpf.
VistaOpenFileDialog ();files = App. API<InterfaceAPI> (). openFileDialog
(true);(files! = null)
{(var filepath in files)
{file = new DBO_DocFile ();. LocalPath = filepath. ToString
();. OrigName = System. IO. Path. GetFileName (filepath);. Title = System. IO.
Path. GetFileName (filepath);(file);(file, SelectedDocFolderTreeItem);
}
}
}void ScanFile_Click (object sender, RoutedEventArgs e)
{title = String. Format ("Изображение{0}. jpg",
editedFiles. Count + 1);file = App. API<ScannerAPI> (). OpenScanDocDialog
(title);(file! = null)
{. OrigName = System. IO. Path. GetFileName
(title);(file);(file, SelectedDocFolderTreeItem);
}
}void AddFolder_Click (object sender, RoutedEventArgs e)
{folder = new DBO_DocFileFolder ();. Title = String. Format
("Новая папка{0}", editedFolders. Count + 1);(folder);(folder,
SelectedDocFolderTreeItem);
}TreeViewItem bubbleToTreeViewItem (object source)
{obj = (DependencyObject) source;(obj! = null && obj!
= treeDocFiles && obj is Visual)
{(obj is TreeViewItem)
{(TreeViewItem) obj;
}= VisualTreeHelper. GetParent (obj);
}null;
}void DeleteAttachedFile_Executed (object sender,
ExecutedRoutedEventArgs e)
{node = bubbleToTreeViewItem (e. Parameter);(node is
DocFileTreeItem)
{( (DocFileTreeItem) node);
}if (node is DocFileFolderTreeItem)
{( (DocFileFolderTreeItem) node);
}
}
/*void lstAttachedFiles_MouseDoubleClick (object sender,
MouseButtonEventArgs e)
{file = lstAttachedFiles. SelectedItem as DBO_DocFile;(file!
= null && file. LocalPath! = null)
{. API<DocumentsAPI> (). openAttachedFile (file);
}
}
*/void Window_Closing (object sender, System.componentModel.
CancelEventArgs e)
{
}DocFileFolderTreeItem SelectedDocFolderTreeItem
{
{selected = treeDocFiles. SelectedItem;(selected is
DocFileTreeItem)
{ftree = (DocFileTreeItem) selected;ftree. Parent as DocFileFolderTreeItem;
}
{selected as DocFileFolderTreeItem;
}
}
}
// Удаляет узел из дереваvoid deleteNodeFromDocFileTree
(TreeViewItem item)
{(item. Parent == treeDocFiles)
{. Items. Remove (item);
// Осталась только надпись "Файлы: "(treeDocFiles.
Items. Count == 1) treeDocFiles. Items. RemoveAt (0);
}
{parent = item. Parent as TreeViewItem;(parent! = null)
parent. Items. Remove (item);
}
}void deleteFromDocFiles (object item, bool quite = false)
{(item is DocFileFolderTreeItem) deleteFromDocFiles ( (DocFileFolderTreeItem)
item, quite);if (item is DocFileTreeItem) deleteFromDocFiles (
(DocFileTreeItem) item, quite);
}void deleteFromDocFiles (DocFileFolderTreeItem folder_item,
bool quite = false)
{folder = folder_item. Folder;(folder! = null)
{(! quite && folder. IsDeleted! = true &&
folder_item. Items. Count > 0)
{res = MessageBox. Show ("Удалить папку '" +
folder. Title + "' и все ее содержимое?", "Подтверждение
удаления", MessageBoxButton. OKCancel);(res == MessageBoxResult. Cancel)
return; // Отмена
}(folder. IsDeleted! = true)
{
// Удаление потомков
// var children = new List<object> ();
// foreach (var ch in folder_item. Items) children. Add (ch);
// foreach (var ch in children) deleteFromDocFiles (ch,
true);(int i = folder_item. Items. Count - 1; i >= 0; i--)
{(folder_item. Items [i], true);
}
// Удаление узла(folder. existInDB || folder_item. Items.
Count > 0)
{(folder);. IsDeleted = true;
}
{(folder. IsChanged) editedFolders. Remove
(folder);(folder_item);
}
}folder. IsDeleted = false;
}
}void deleteFromDocFiles (DocFileTreeItem file_item, bool
quite = false)
{file = file_item. File;(file! = null)
{(file. IsDeleted! = true)
{(file. existInDB)
{(file);. IsDeleted = true;
}
{(file. IsTemporary)
{{ System. IO. File. Delete (file. LocalPath); }(Exception) {
}
}(file. IsChanged) editedFiles. Remove (file);(file_item);
}
}
{
// Восстановлениеparent = file_item. Parent as
DocFileFolderTreeItem;(parent! = null)
{. Folder. IsDeleted = false;
}
}
}
}void addToDocFiles (DBO_DocFileFolder folder,
DocFileFolderTreeItem parent_folder)
{tree_item = new DocFileFolderTreeItem ();_item. Folder =
folder;(parent_folder == null)
{. ParentDocFolder = null;(treeDocFiles. Items. Count == 0)
{dummy = new TreeViewItem ();. Header = "Файлы: ";.
Items. Add (dummy);
}. Items. Add (tree_item);
}
{. ParentDocFolder = parent_folder. Folder;_folder.
IsExpanded = true;_folder. Items. Add (tree_item);
}
}void setDocFileAsEdited (object file_or_folder)
{(file_or_folder is DBO_DocFile) setDocFileAsEdited (
(DBO_DocFile) file_or_folder);if (file_or_folder is DBO_DocFileFolder)
setDocFileAsEdited ( (DBO_DocFileFolder) file_or_folder);
}void setDocFileAsEdited (DBO_DocFile file)
{(file. IsChanged! = true)
{. Add (file);. IsChanged = true;
}
}void setDocFileAsEdited (DBO_DocFileFolder folder)
{(folder. IsChanged! = true)
{. Add (folder);. IsChanged = true;
}
}void addToDocFiles (DBO_DocFile file, DocFileFolderTreeItem
parent_folder)
{tree_item = new DocFileTreeItem ();_item. File = file;(parent_folder
== null)
{. ParentDocFolder = null;(treeDocFiles. Items. Count == 0)
{dummy = new TreeViewItem ();. Header = "Файлы: ";.
Items. Add (dummy);
}. Items. Add (tree_item);
}
{. ParentDocFolder = parent_folder. Folder;_folder.
IsExpanded = true;_folder. Items. Add (tree_item);
}
}void treeDocFiles_Expanded (object sender, RoutedEventArgs
e)
{folder_item = e. Source as
DocFileFolderTreeItem;(folder_item! = null)
{(folder_item. Items. Count == 1 && folder_item.
Items [0] == null)
{_item. Items. Clear ();(folder_item. Folder. existInDB)
{folders = App. DB. Module<DBModule_Files> ().
getDocFolders (CurrentDocument, folder_item. Folder. ID);(var f in folders)
addToDocFiles (f, folder_item);files = App. DB. Module<DBModule_Files>
(). getDocFiles (CurrentDocument, folder_item. Folder. ID);(var f in files)
addToDocFiles (f, folder_item);
}
}
}
}void treeDocFiles_MouseDoubleClick (object sender,
MouseButtonEventArgs e)
{item = bubbleToTreeViewItem (e. OriginalSource) as
DocFileTreeItem;(item! = null)
{file = item. File;(file! = null && file. LocalPath!
= null)
{. API<DocumentsAPI> (). openAttachedFile (file);
}
}
}void treeDocFiles_KeyUp (object sender, KeyEventArgs e)
{
}void treeDocFiles_Renamed (object o, DKCustomControls. RenamingRoutedEventArgs
e)
{. NewName = e. NewName. Trim ();. Cancel = true;
// Определение объектаitem = bubbleToTreeViewItem (e.
OriginalSource);obj_title = "файла";(item is DocFileFolderTreeItem)
obj_title = "папки";(String. IsNullOrEmpty (e. NewName)) MessageBox.
Show ("Имя " + obj_title + " не задано");if (e. NewName
=="." || e. NewName ==". ") MessageBox. Show
("Недопустимое имя " + obj_title);if (e. NewName. IndexOfAny (System.
IO. Path. GetInvalidFileNameChars ())! = - 1) MessageBox. Show
("Недопустимые символы в имени " + obj_title);if (item is
DocFileTreeItem)
{(System. IO. Path. GetExtension (e. NewName)! = System. IO.
Path. GetExtension (e. OldName))
{res = MessageBox. Show ("Вы действительно хотите
изменить расширение файла?", "Переименование файла",
MessageBoxButton. YesNo);. Cancel = res == MessageBoxResult. No;
}e. Cancel = false;
}e. Cancel = false;(e. Cancel == false)
{(item is DocFileFolderTreeItem)
{folder = (DocFileFolderTreeItem) item;. Folder. Title = e.
NewName;(folder. Folder);
}
{file = (DocFileTreeItem) item;. File. Title = e.
NewName;(file. File);
}
}
}
[Serializable]class DragDataItem: ISerializable
{TreeViewItem Item { get; set; }DragDataItem ()
{
{
}void GetObjectData (SerializationInfo info, StreamingContext
context)
{
}
}startPoint;void treeDocFiles_MouseLeftButtonDown (object
sender, MouseButtonEventArgs e)
{= e. GetPosition (null);
}void treeDocFiles_MouseMove (object sender, MouseEventArgs
e)
{(e. LeftButton == MouseButtonState. Pressed)
{mousePos = e. GetPosition (null);diff = startPoint -
mousePos;(Math. Abs (diff. X) > SystemParameters.
MinimumHorizontalDragDistance || Math. Abs (diff. Y) > SystemParameters.
MinimumVerticalDragDistance)
{tree_item = bubbleToTreeViewItem (e. OriginalSource);(Mouse.
Captured == null && tree_item! = null && (tree_item is
DocFileFolderTreeItem || tree_item is DocFileTreeItem))
{dr = new DragDataItem ();. Item = tree_item;
{. DoDragDrop (treeDocFiles, dr, DragDropEffects. Move);
}(Exception) { }
}
}
}
}bool checkCanDrop (TreeViewItem tree_item, TreeViewItem
dragged)
{(tree_item == null || tree_item is DocFileTreeItem) return
false;(tree_item is DocFileFolderTreeItem)
{folder_item = (DocFileFolderTreeItem) tree_item;own_id =
folder_item. Folder. ID;(folder_item! = null)
{(folder_item. Folder. IsDeleted == true) return
false;(folder_item == dragged) return false;if (own_id! = null &&
folder_item. Folder. ParentDocFolderID == own_id) return false;_item =
folder_item. Parent as DocFileFolderTreeItem;
}
}true;
}void treeDocFiles_DragOver (object sender, DragEventArgs e)
{tree_item = bubbleToTreeViewItem (e.
OriginalSource);dragged_tm = null;
{_tm = e. Data. GetData (typeof (DragDataItem)) as
DragDataItem;
}(Exception) { }(dragged_tm! = null)
{dragged = dragged_tm. Item;(! checkCanDrop (tree_item,
dragged))
{. Effects = DragDropEffects. None;
}
}. Handled = true;
}void treeDocFiles_Drop (object sender, DragEventArgs e)
{. Effects = DragDropEffects. None;. Handled = true;tree_item
= bubbleToTreeViewItem (e. OriginalSource);dragged_tm = null;
{_tm = e. Data. GetData (typeof (DragDataItem)) as
DragDataItem;
}(Exception) { }(dragged_tm! = null)
{dragged = dragged_tm. Item;(dragged! = tree_item &&
checkCanDrop (tree_item, dragged))
{par = dragged. Parent as ItemsControl;. Items. Remove
(dragged);_item. IsExpanded = true;_DocFileFolder folder = null;
// (tree_item is DocFileFolderTreeItem)
{_item. Items. Add (dragged);= ( (DocFileFolderTreeItem)
tree_item). Folder;
}treeDocFiles. Items. Add (dragged);
// drag_file = dragged as DocFileTreeItem;drag_folder =
dragged as DocFileFolderTreeItem;(drag_file! = null)
{_file. File. ParentDocFolder = folder;(drag_file. File);
}if (drag_folder! = null)
{_folder. Folder. ParentDocFolder = folder;(drag_folder.
Folder);
}
}
}
}
}
}
Файл AddDocument. xaml
<Window x: Class="DKeeper. Forms. AddDocument.
AddDocument"="http://schemas.
microsoft.com/winfx/2006/xaml/presentation": x="http://schemas.
microsoft.com/winfx/2006/xaml": local_db_obj="clr-namespace: DKCore.
DataBase. Objects; assembly=DKCore": dkctrls="clr-namespace:
DKCustomControls; assembly=DKCustomControls"="Добавить документ"
Height="550" Width="400" Background="{StaticResource
FormBackgroundBrush}"="Window_Loaded"
Closing="Window_Closing" Closed="Window_Closed" xmlns:
my="clr-namespace: DKeeper. Forms. AddDocument">
<Window. Resources>
<ResourceDictionary>
<ResourceDictionary. MergedDictionaries>
<ResourceDictionary Source=".
/Resources/DocFilesDictonary. xaml"></ResourceDictionary>
</ResourceDictionary. MergedDictionaries>
</ResourceDictionary>
</Window. Resources>
<Grid>
<Grid. RowDefinitions>
<RowDefinition MinHeight="60"
Height="Auto"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition MinHeight="70"
Height="Auto"></RowDefinition>
</Grid. RowDefinitions>
<TextBlock FontSize="20" Margin="15,
10" VerticalAlignment="Center">Добавить
документ</TextBlock>
<! - Тип документа - ->
<Grid Grid. Row="1" Margin="15 0 15
15" Width="{Binding ElementName=DocPropertiesGrid,
Path=ActualWidth}" HorizontalAlignment="Left">
<Grid. ColumnDefinitions>
<ColumnDefinition Width="Auto"
MinWidth="110"
SharedSizeGroup="DialogLabelsGroup"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid. ColumnDefinitions>
<Label Target="{Binding
ElementName=cmbxDocTypes}">_Тип документа*: </Label>
<ComboBox Grid. Column="1"
Name="cmbxDocTypes" TextSearch. TextPath="Title"
DisplayMemberPath="Title" SelectedIndex="0"
SelectionChanged="cmbDocTypes_SelectionChanged"></ComboBox>
</Grid>
<Grid Grid. Row="2" >
<ScrollViewer VerticalScrollBarVisibility="Auto"
Name="ScrollSpace">
<Grid IsSharedSizeScope="True" Margin="15 0
15 15" Name="DocPropertiesGrid">
<Grid. RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid. RowDefinitions>
<! - Область для полей конкретных типов документов - ->
<StackPanel Grid. Row="1" Grid.
ColumnSpan="2">
<TextBlock FontSize="18" Margin="0 0 0
10" Text="{Binding ElementName=cmbxDocTypes, Path=SelectedItem.
Title}"></TextBlock>
<! - -<GroupBox Padding="5">-->
<Grid>
<Grid. RowDefinitions>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition
Height="100"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
</Grid. RowDefinitions>
<Grid. ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid. ColumnDefinitions>
<Frame Grid. ColumnSpan="2"
Name="frameConcreteDoc" JournalOwnership="OwnsJournal"
NavigationUIVisibility="Hidden"
Focusable="False"></Frame>
<DockPanel Grid. ColumnSpan="2" Grid.
Row="1" Margin="0 0 0 5" LastChildFill="True">
<Label DockPanel. Dock="Top"
Target="{Binding ElementName=txtComment}">Краткое _описание:
</Label>
<TextBox Name="txtComment"
AcceptsReturn="True" Text="{Binding Comment, Mode=TwoWay,
Converter={StaticResource
ResourceKey=NullableTextConverter}}"></TextBox>
</DockPanel>
<Label Grid. Row="2" Target="{Binding
ElementName=cmbxCardCase}">Позиция в _картотеке: </Label>
<Grid Grid. Row="2" Grid. Column="1"
VerticalAlignment="Top">
<Grid. ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition
Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid. ColumnDefinitions>
<DockPanel>
<Button Focusable="False" DockPanel.
Dock="Right" MinWidth="22"
Click="btnCardCase_Click" VerticalAlignment="Top" >.
</Button>
<ComboBox Name="cmbxCardCase"
IsEditable="True" VerticalAlignment="Top" TextSearch.
TextPath="Title" DisplayMemberPath="Title"
SelectionChanged="cmbxCardCase_SelectionChanged"></ComboBox>
</DockPanel>
<TextBlock Grid. Column="1" Margin="5
0">-</TextBlock>
<DockPanel Grid. Column="2">
<Button Focusable="False" DockPanel.
Dock="Right" MinWidth="22"
Click="btnCardFolder_Click" VerticalAlignment="Top"
Content=". ">
<Button. Style>
<Style TargetType="{x: Type Button}">
<Style. Triggers>
<DataTrigger Binding="{Binding
ElementName=cmbxCardCase,Path=SelectedItem}" Value="{x:
Null}">
<Setter Property="IsEnabled"
Value="False"></Setter>
</DataTrigger>
</Style. Triggers>
</Style>
</Button. Style>
</Button>
<ComboBox Name="cmbxCardFolder" Grid.
Column="2" IsEditable="True"
VerticalAlignment="Top" TextSearch. TextPath="Title"
DisplayMemberPath="Title" SelectedValue="{Binding CardFolderID,
Mode=TwoWay}" SelectedValuePath="ID"></ComboBox>
<DockPanel. Style>
<Style TargetType="{x: Type DockPanel}">
<Style. Triggers>
<DataTrigger Binding="{Binding
ElementName=cmbxCardCase,Path=Text}" Value="">
<Setter Property="IsEnabled"
Value="False"></Setter>
</DataTrigger>
</Style. Triggers>
</Style>
</DockPanel. Style>
</DockPanel>
</Grid>
</Grid>
<! - -</GroupBox>-->
</StackPanel>
<! - Общая информация документов - ->
<Expander Grid. Row="3" Grid.
ColumnSpan="2" Header="Прикрепленные файлы"
IsExpanded="True" Margin="0 15 0 0">
<StackPanel >
<StackPanel Orientation="Horizontal"
Margin="5, 5, 0, 5" HorizontalAlignment="Right">
<Image VerticalAlignment="Center" Margin="0
0 5 0" Source="{StaticResource ResourceKey=Icon_PaperClipDark}"
Width="8"></Image>
<TextBlock
VerticalAlignment="Center">Прикрепить: </TextBlock>
<Button Margin="5 0 0 0"
Click="AddFile_Click" Padding="5 0"
ToolTip="Прикрепить файл">Файл</Button>
<Button Margin="5 0 0 0"
Click="ScanFile_Click" Padding="5 0"
ToolTip="Сканировать документ">Скан</Button>
<Button Margin="5 0 0 0"
Click="AddFolder_Click" Padding="5 0" ToolTip="Создать
папку">Папку</Button>
</StackPanel>
<TreeView Name="treeDocFiles" TreeViewItem.
Expanded="treeDocFiles_Expanded" TreeViewItem.
MouseDoubleClick="treeDocFiles_MouseDoubleClick"
KeyUp="treeDocFiles_KeyUp" dkctrls: RenamingTextBox.
Renamed="treeDocFiles_Renamed" Style="{StaticResource
DocFileTreeStyle}" MouseMove="treeDocFiles_MouseMove"
Drop="treeDocFiles_Drop" DragOver="treeDocFiles_DragOver"
MouseLeftButtonDown="treeDocFiles_MouseLeftButtonDown">
<TreeView.commandBindings>
<CommandBinding Command="Delete"
Executed="DeleteAttachedFile_Executed"></CommandBinding>
</TreeView.commandBindings>
</TreeView>
<! - -<Grid Margin="5, 5, 0, 5"
HorizontalAlignment="Right">
<Grid. ColumnDefinitions>
<ColumnDefinition Width="Auto" MinWidth="120"
></ColumnDefinition>
</Grid. ColumnDefinitions>
<Grid. RowDefinitions>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
</Grid. RowDefinitions>
<Button Grid. Row="0" Margin="0 0 0 4"
Padding="6 1" Click="AddFile_Click">
<StackPanel Orientation="Horizontal">
<Image Margin="0 0 5 0"
Source="{StaticResource ResourceKey=Icon_PaperClipDark}"
Width="8"></Image>
<TextBlock>Прикрепить файл</TextBlock>
</StackPanel>
</Button>
<Button Grid. Row="1" Padding="6 1"
Click="ScanFile_Click">Сканировать документ</Button>
</Grid>-->
<! - -<Grid>
<ListBox Name="lstAttachedFiles"
BorderThickness="0" Background="{StaticResource
FormBackgroundBrush}" HorizontalAlignment="Left"
HorizontalContentAlignment="Stretch"
MouseDoubleClick="lstAttachedFiles_MouseDoubleClick" dkctrls:
RenamingTextBox. Renamed="FileTitle_Renamed" >
<ListBox.commandBindings>
<CommandBinding Command="Delete"
Executed="DeleteAttachedFile_Executed"></CommandBinding>
</ListBox.commandBindings>
<ListBox. Style>
<Style TargetType="{x: Type ListBox}">
<Style. Resources>
<Style x: Key="{x: Type ListBoxItem}"
TargetType="{x: Type ListBoxItem}">
<Setter Property="Template">
<Setter. Value>
<ControlTemplate TargetType="{x: Type
ListBoxItem}">
<Border Name="Bd" CornerRadius="8"
BorderThickness="1" Margin="2 2 6 2 " Padding="6
1" >
<ContentPresenter />
</Border>
<ControlTemplate. Triggers>
<MultiTrigger>
<MultiTrigger. Conditions>
<Condition Property="IsFocused"
Value="True"></Condition>
<Condition Property="IsSelected"
Value="True"></Condition>
</MultiTrigger. Conditions>
<Setter TargetName="Bd"
Property="BorderBrush" Value="#DDDDDD"></Setter>
</MultiTrigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd"
Property="Background" Value="#F0F0F0"></Setter>
</Trigger>
</ControlTemplate. Triggers>
</ControlTemplate>
</Setter. Value>
</Setter>
</Style>
</Style. Resources>
<Style. Triggers>
<DataTrigger Binding="{Binding RelativeSource={x:
Static RelativeSource. Self}, Path=Items. Count}" Value="0">
<Setter Property="HorizontalAlignment"
Value="Center"></Setter>
<Setter Property="Template">
<Setter. Value>
<ControlTemplate>
<TextBlock Name="msgEmpty"
DataContext="{Binding ElementName=lstAttachedFiles, Path=Items.
Count}" HorizontalAlignment="Center" Margin="0, 10"
Text="Нет прикрепленнных файлов" />
</ControlTemplate>
</Setter. Value>
</Setter>
</DataTrigger>
</Style. Triggers>
</Style>
</ListBox. Style>
<ListBox. ItemTemplate>
<DataTemplate>
<Grid Name="Gr">
<Grid. ColumnDefinitions>
<ColumnDefinition
Width="Auto"></ColumnDefinition>
<ColumnDefinition
MinWidth="60"></ColumnDefinition>
<ColumnDefinition
Width="Auto"></ColumnDefinition>
</Grid. ColumnDefinitions>
<Image Margin="0 0 5 0"
Source="{StaticResource ResourceKey=Icon_PaperClipDark}"
Width="8"></Image>
<dkctrls: RenamingTextBox Grid. Column="1"
Name="Title" Text="{Binding Title,
Mode=TwoWay}"></dkctrls: RenamingTextBox>
<Grid Grid. Column="2" Margin="5 0 0
0" Name="Buttons">
<Button Command="Delete"
CommandParameter="{Binding}">
<Button. Template>
<ControlTemplate TargetType="{x: Type
Button}">
<Border Name="Bd"
CornerRadius="10">
<Image Margin="5 0" Source="{StaticResource
ResourceKey=Icon_RedSmallDelete}" Width="5"></Image>
</Border>
<ControlTemplate. Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter TargetName="Bd"
Property="Background" Value="#FADADA"></Setter>
</Trigger>
<Trigger Property="IsPressed"
Value="True">
<Setter TargetName="Bd"
Property="Background" Value="#FFA0A0"></Setter>
</Trigger>
</ControlTemplate. Triggers>
</ControlTemplate>
</Button. Template>
</Button>
</Grid>
</Grid>
<DataTemplate. Triggers>
<DataTrigger Binding="{Binding ID}"
Value="{x: Null}">
<Setter TargetName="Title"
Property="FontStyle" Value="Italic"></Setter>
</DataTrigger>
</DataTemplate. Triggers>
</DataTemplate>
</ListBox. ItemTemplate>
</ListBox>
</Grid>-->
</StackPanel>
</Expander>
<! - -
<Expander Grid. Row="4" Grid.
ColumnSpan="2" Header="Связанные документы">
<StackPanel>
<GroupBox Header="Выберите существующую группу:
">
<DockPanel>
<Button DockPanel. Dock="Right">Выбрать.
</Button>
<TextBox></TextBox>
</DockPanel>
</GroupBox>
<GroupBox Header="Или создайте новую: ">
<Grid>
<Grid. ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid. ColumnDefinitions>
<Grid. RowDefinitions>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
<RowDefinition
Height="100"></RowDefinition>
<RowDefinition
Height="Auto"></RowDefinition>
</Grid. RowDefinitions>
<TextBlock>Имя: </TextBlock>
<TextBox Grid. Column="1"></TextBox>
<TextBlock Grid. Row="1" Grid.
ColumnSpan="2">Документы: </TextBlock>
<ListBox Grid. Row="2" Grid.
ColumnSpan="2"></ListBox>
<TextBlock Grid. Row="3">Добавить:
</TextBlock>
<StackPanel Grid. Row="3" Grid.
Column="1" Orientation="Horizontal">
<Button>Новый. </Button>
<Button>Существующий. </Button>
</StackPanel>
</Grid>
</GroupBox>
</StackPanel>
</Expander>
>
</Grid>
</ScrollViewer>
<Rectangle Style="{StaticResource
FormScrollTopFog}"/>
</Grid>
<! - Диалоговые кнопки - ->
<Border Grid. Row="3"
Background="{StaticResource FormBottomBrush}">
<Grid>
<Grid. ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition
Width="Auto"></ColumnDefinition>
</Grid. ColumnDefinitions>
<CheckBox Name="chkOpenAfterClose"
VerticalAlignment="Center" Margin="10 0 0 0"
IsChecked="{Binding Path=OpenAfterClose, Mode=TwoWay, RelativeSource={RelativeSource
FindAncestor, AncestorType=my: AddDocument, AncestorLevel=1}}">Открыть
по завершении</CheckBox>
<WrapPanel Grid. Column="1"
HorizontalAlignment="Right" VerticalAlignment="Center"
Margin="0 0 10 0">
<Button Click="Cancel_Click" MinWidth="80"
Margin="5" Padding="6 1">Отмена</Button>
<Button Click="OK_Click" MinWidth="80"
Margin="5" Padding="6 1">Ок</Button>
</WrapPanel>
</Grid>
</Border>
</Grid>
</Window>
Приложение 3.
Руководство оператора структурированной системы хранения документов предприятия
П.3.1 Назначение программы
Система предназначена для ведения архива документов,
предосталяет возможности поиска и печати.
П.3.2 Условия выполнения программы
Для работы структурированной системы хранения документов
предприятия требуется персональный компьютер со следующими характеристиками и
устройствами:
процессор: 1 ГГц (или выше);
ОЗУ: 1024 Мб (или выше);
жесткий диск: 10 Гб (или выше);
видеоадаптер;
монитор;
клавиатура;
мышь.
Для доступа к функциям печати и сканирования требуются
соответствующие устройства.
Кроме того, должно быть установлено следующее программное
обеспечение:
Операционная система: Windows XP SP 3, Windows Vista, Windows
7 (или выше)
.net Framework 4.5 Client Profile;Installer 3.1 (или выше).
Для доступа к функциям печати и сканирования требуется
установка драйверов соответствующих устройств.
П.3.3 Пуск программы
Для пуска программы необходимо открыть файл docstruct. exe
П.3.4 Команды оператора
Опреатор может выполнять следующие команды:
) Документы. - > Добавить - добавление нового документа;
) Документы. - > Изменить - изменение текущего документа;
) Документы. - > Удалить - удаление текущего документа;
) Документы. - > Поместить в архив - помещение текущего
документа в архив;
) Документы. - > Извлечь из архива - извлечение текущего
документа их архива;
) Картотека - показ позиции документов в картотеке;
) Отчеты - > Истекающие документы - показ списка
документов с истекающим сроком;
) Найти… - открыть форму поиска;
) Настройки - настройки программы (пути до базы данных,
автоматическое помещение документов в архив);
) Файл - > Создать резервную копию - создание резервной
копии базы данных;
) Файл - > Восстановить базу данных - восстановление базы
данных из ранее созданных резервных копий;
) Файл - > Закрыть - выход и из программы.