Структурированная система хранения документов предприятия

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

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 27.01.2016
Размер файла 803,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Амортизационные отчисления, процесс постепенного перенесения стоимости средств труда по мере их физического и морального износа на стоимость производимых с их помощью продукции в целях аккумуляции денежных средств для последующего полного восстановления. Амортизационные отчисления производятся по установленным нормам амортизации, выражаются, в процентах к балансовой стоимости оборудования и рассчитываются по формуле (3.8):

Где Cобор - стоимость компьютера,

Тнорм - нормативный срок службы (для персонального компьютера примем Тнорм = 6 [лет]. Таким образом, получаем:

Статья: "Накладные расходы"

Накладные расходы, связанные с управлением и обслуживанием, содержанием и эксплуатацией оборудования и прочими дополнительными затратами на обеспечение процессов производства и обращения, составляют 50% от фонда заработной платы, вычисляются по формуле (3.9):

Таблица 3.5

Статьи затрат

Затраты, руб.

1. Материальные расходы

490 руб.

2. Расходы на оплату труда с учётом отчислений по социальному страхованию

32801 руб.

3. Расходы на амортизацию

1305 руб.

4. Накладные расходы

86000 руб.

Социальное страхование

19432 руб.

Итого

140030 руб.

3.5 Расчёт срока окупаемости единовременных затрат и экономической выгоды от внедрения программного продукта на предприятии

Рассчитаем экономию от внедрения программного продукта на предприятии.

Расчет трудоемкости до и после внедрения ПП представлен в таблице 3.6.

Таблица 3.6

Трудоемкость до и после внедрения ПП

Наименование этапов и работ

Исполнитель

Трудоемкость, час

До

После

1. Заполненение карточки документа

Оператор

0,2

0,1

2. Помещение документа в архив

Оператор

0,2

0,2

3. Поиск документа

Оператор

0,3

0,05

4. Печать копии документа

Оператор

0,4

0,1

Итог

1,1

0,45

Результаты расчета затрат на оплату труда ПП приведены в таблице 3.7.

Таблица 3.7

Расходы на оплату труда до и после внедрения ПП

Исполнители

Разряд

Тариф. коэф.

Суммарная трудоемкость, час.

Час. тариф. ставка, руб

Сумма, руб.

до

после

До

После

Оператор до внедрения

12

2,423

1,1

0,45

100

266,53

109,04

Итог

266,53

109,04

Экономия от обслуживания одного документа составила 157,49 руб.

Внедрение ПП предположительно снизит затраты на обработку одного документа до внедрения на 53.86%. Предприятие обычно обрабатывает около 200 документов в месяц, что составляет 2400 в год. Таким образом, годовая экономия затрат от внедрения ПП составляет:

Эгод = 157,49* 2400 = 377,976 руб.

Рассчитаем срок окупаемости ПП:

3.6 Результат по организационно-экономической части

В ходе проведенного маркетингового исследования программного продукта были исполнены следующие пункты:

определены основные технические и потребительские отличительные свойства системы;

произведен расчет сметы затрат на разработку;

рассчитана годовая экономия от внедрения программного продукта на предприятии.

Срок окупаемости продукта составил чуть больше 2 месяцев, что указывает на целесообразность внедрения ПП на предприятии.

4. Охрана труда

4.1 Обеспечение безопасных условий труда инженера-разработчика

Одним из основных направлений научно технического прогресса является развитие электронной вычислительной техники и ее широкое применение в производстве, научно-исследовательских и проектно-конструкторских работах, плановых расчетах и сфере управления. Уменьшение стоимости, габаритов, потребляемой энергии вместе с ростом вычислительных возможностей позволяет использовать ЭВМ в гораздо более широких масштабах и существенно улучшить условия труда обслуживающего персонала. Охрана труда выявляет и изучает опасные и вредные производственные факторы, степень их воздействия на работающих с ЭВМ. Разрабатывает организационные и технические мероприятия, направленные на профилактику производственного травматизма и профессиональных заболеваний. Охрана труда создает технические средства защиты, устраняющие или уменьшающие воздействие на работающих этих факторов окружающей среды, предупреждает несчастные случаи, создает высокопроизводительные, здоровые и безопасные условия труда в ВЦ (вычислительный центр) /7,8,9,10/.

На организм человека и работу оборудования ВЦ большое влияние оказывает относительная влажность воздуха. При влажности воздуха до 40% выходит из строя изоляция проводов, а также возникает статическое электричество при движении носителей информации на ЭВМ. При относительной влажности воздуха более 75-80% снижается сопротивление изоляции, изменяются рабочие характеристики элементов ЭВМ, возрастает интенсивность отказов элементов ЭВМ.

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

Таблица 4.1

Нормы температуры и относительной влажности воздуха в рабочей зоне машинного зала ВЦ

Наименование

Параметры

Оптимальные

Допустимые

Т-ра,°С

Отн. Влажность, %

Т-ра,°С

Отн. влажность, %

Воздух в рабочей зоне машинного зала

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 "Естественное и искусственное освещение. Нормы проектирования".

В помещениях с компьютерной техникой применяется совмещенная система освещения. К этим системам предъявляют следующие требования:

1) соответствие уровня освещенности рабочих мест характеру выполняемых зрительных работ;

2) достаточно равномерное распределение яркости на рабочих поверхностях и в окружающем пространстве;

3) отсутствие резких теней, прямой и отраженной блеклости;

4) постоянство освещенности во времени;

5) оптимальная направленность излучаемого осветительными приборами светового потока;

6) долговечность, экономичность, электро- и пожаробезопасность, эстетичность, удобство и простота эксплуатации.

Для искусственного освещения помещений с вычислительной техникой следует использовать главным образом люминесцентные лампы. У этих ламп высокая световая отдача (до 75 лм/Вт и более), продолжительный срок службы (до 10 000 ч), малая яркость светящейся поверхности, близкий к естественному спектр излучения, что обеспечивает хорошую цветопередачу. Наиболее приемлемыми являются люминесцентные лампы белого света и тепло-белого света мощностью 20, 40, 80 Вт.

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

Для обеспечения оптимальных условий зрительных работ пользователей с дисплейными устройствами, необходима определенная световая отделка помещения. Рекомендуемая освещенность для работы с экраном дисплея составляет 150 лк, а при работе с экраном в сочетании с работой над документами - 300 лк.

Наличие множественных источников постоянного шума на рабочем месте приводит к значительному снижению производительности труда, росту количества ошибок в работе операторов.

По происхождению шум делят на механический, аэродинамический и шум электрических машин. Для рабочих мест операторов характерно наличие всех видов шумов. Технические средства, например принтер, плоттер создают механический шум, установки кондиционирования - аэродинамический шум, преобразователи напряжения - электромагнитный.

В соответствии с ГОСТ 12.1.003-83 "Шум, общие требования безопасности" уровень шума на рабочем месте операторов видеотерминалов не должен превышать 50дБ, а в помещениях, где работают инженерно-технические работники, осуществляющие лабораторный, аналитический и измерительный контроль - 60дБ.

Для снижения шума и вибрации в помещениях ВЦ оборудование, аппараты и приборы необходимо устанавливать на специальные фундаменты и амортизирующие прокладки, предусмотренные нормативными документами. Стены и потолки должны быть облицованы звукопоглощающим материалом, независимо от количества единиц установленного оборудования. В качестве звукопоглощающего материала должны использоваться специальные перфорированные плиты, панели и другой материал аналогичного назначения, а так же плотная хлопчатобумажная ткань, которой драпируются потолок и стены.

Нормальная продолжительность рабочего времени на предприятиях не может превышать 40 ч. в неделю. Основным режимом работы является пятидневная рабочая неделя с двумя выходными днями. Продолжительность ежедневной работы определяется правилами внутреннего трудового распорядка или графиками сменности.

Графики сменности регламентируют время начала и окончания рабочего дня (дня смены), перерывов для отдыха и питания, порядок чередования смен.

Время отдыха включает в перерывы для отдыха и питания, междусменные перерывы, выходные и праздничные дни и отпуска. Перерыв для отдыха и питания предоставляется в течение рабочего дня. Перерыв для отдыха и питания предоставляется, как правило, через 4ч. после начала работы.

Согласно СанПиН 2.2.2.542-96, в зависимости от вида работ выделяют три группы работ с видеотерминалами:

1. работа по считыванию информации с экрана ЭВМ с предварительным запросом;

2. работа по вводу информации;

3. творческая работа в режиме диалога с ЭВМ.

Для видов трудовой деятельности, связанной с работой на ЭВМ устанавливается три категории тяжести и напряженности работы с ЭВМ. Для первой группы определяются по суммарному числу считываемых знаков, но не более 60000, для второй группы - по суммарному числу введенных знаков, но не более 40000 и для третьей группы - по суммарному времени работы за смену, но не более 6 часов.

Для обеспечения оптимальной работоспособности и сохранения здоровья работника на протяжении рабочей смены должны устанавливаться регламентированные перерывы. Продолжительность и время регламентированных перерывов устанавливается в зависимости от продолжительности, вида и категории трудовой деятельности.

Всем работникам ежегодно предоставляется отпуск с сохранением места работы (должности) и среднего заработка. Право на ежегодный отпуск (за первый год работы) они приобретают по истечении 11 месяцев непрерывной работы на данном предприятии. Очередные отпуска (за второй и последующие годы работы) предоставляются в любое время рабочего года в соответствии с графиками отпусков.

Таким образом, рациональная организация рабочего времени позволит сохранить работоспособность человека и сбережет его здоровье.

Для наиболее эффективной защиты здоровья и жизни работающих в ВЦ людей необходимо выполнять общие требования безопасности:

1) к эксплуатации персональных компьютеров допускаются лица, прошедшие инструктаж по технике безопасности;

2) все пользователи персональных компьютеров (ПК), находясь в компьютерном классе, обязаны:

- использовать только исправные ПК, указанные преподавателем или дежурным оператором;

- соблюдать тишину, чистоту и порядок как на рабочем месте, так и в компьютерном классе;

- соблюдать правила пожарной безопасности, а при возгорании вызвать пожарную охрану;

- работать на ПК не более 4-х часов в день, с 15-минутными перерывами через каждый час работы.

3) пользователям ПК запрещается:

- вносить без разрешения системного администратора какие-либо изменения в настройке ПК;

- самостоятельно устранять сбои в работе ПК;

- самостоятельно производить изменения в конфигурации периферийных устройств ПК (принтера, монитора, клавиатуры);

- курить в помещении компьютерного класса.

4) обслуживание и ремонт ПК:

- техническое обслуживание и ремонт производится персоналом с соответствующей подготовкой;

- мониторы обеспечиваются защитными экранами при их несоответствии санитарным нормам;

- во время технических перерывов класс должен проветриваться.

5) первоначальное подключение всех периферийных устройств (монитора, принтера, клавиатуры) производится специалистом, который предварительно проверяет их исправность и надежность коммуникационных соединений;

6) пользователь должен убедиться в том, что ПК находится в состоянии готовности к работе, а именно:

- соединительные кабеля не имеют повреждений;

- корпус ПК закрыт.

7) включение ПК осуществляется в следующей последовательности:

- включить стабилизатор напряжения (если ПК подключен через него);

- включить принтер (если он нужен);

- включить монитор (если включается отдельно);

- включить ПК переключателем на его корпусе.

8) категорически запрещается:

- производить изменение в конфигурации периферийных устройств ПК (принтера, монитора, клавиатуры) во время его работы;

- вскрывать корпус ПК, если он находится во включенном состоянии.

9) перед тем, как выключить компьютер надо завершить выполнение всех загруженных программ;

10) при коротком замыкание, перегреве или при возникновении других отклонений от нормального режима работы ПК, необходимо обесточить компьютер и обратиться к дежурному оператору;

11) при возникновении возгорания, необходимо обесточить компьютер и вызвать пожарную охрану;

12) при поражении кого-либо из пользователей электрическим током необходимо немедленно провести мероприятия по оказанию пострадавшему первой медицинской помощи.

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

В современных ЭВМ очень высокая плотность размещения элементов электронных схем. В непосредственной близости друг от друга располагаются соединительные провода, коммуникационные кабели. При протекании по ним электрического тока выделяется значительное количество тепла, что может привести к повышению температуры отдельных узлов до 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м,

S = 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)

3. Программа "Архив документов" - URL: http://www.simple-soft.ru/DocumentsCount. htm (дата обращения: 11.11.2012)

4. Докпартнер 2012 - URL: http://docpartner.ru/ (дата обращения: 11.11.2012)

5. Мак-Дональд М. WPF 4: Windows Presentation Foundation в.net 4.0 с примерами на С# 2010 для профессионалов.: Пер. с англ. - М.: ООО "И.Д. Вильяме", 2011. - 1024 c.

6. Jay Kreibich. Using SQLite - O'Reilly Media, 2010 - 528 с.

7. А.И. Мальцев. Алгебраические системы, - М., Наука, 1970 г., 392 стр. с илл.

8. М.А. Сенилов, С.В. Почерняев, И.В. Килин Методические указания по дипломному проектированию. - Ижевск: Изд-во ИжГТУ, 2000.

9. Соболева В.П. Методические указания по оформлению курсовых и дипломных работ. - Ижевск: Изд-во ИжГТУ, 2008. - 25с.

10. ГОСТ 19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.

11. ГОСТ 19.505-79 ЕСПД. Руководство оператора. Требования к содержанию и оформлению.

Приложение 1. Тексты программ

Файл AppManager. cpp

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. Reflection;

using DKCore. DataBase;

using DKCore. DataBase. Objects;

using DKCore. ConcreteDocuments. Interfaces;

using DKCore. FormsI;

using System. Windows;

namespace DKCore

{

public class AppManager

{

public static bool IsInited { get; private set; }

// Классы комплексных функций системы

public static Dictionary<Type, APIBase> apiObjects;

// Объект приложения

private static ApplicationI appObject;

// Свойства приложения

private static object applicationPropertiesObject;

// Доступ к базе данных

private static DBDocuments db;

public static DBDocuments DB

{

get { return db; }

}

// Дополнительные типы документов

private static Dictionary<string, CDocAddinBase> concreteDocAddins;

public static Dictionary<string, CDocAddinBase> ConcreteDocAddins

{

get { return concreteDocAddins; }

}

static AppManager ()

{

concreteDocAddins = new Dictionary<string, CDocAddinBase> ();

apiObjects = new Dictionary<Type, APIBase> ();

}

// Инициализирует менеджер приложения

static public void Init (ApplicationI app, object application_properties)

{

applicationPropertiesObject = application_properties;

appObject = app;

//

db = new DBDocuments ( (string) getApplicationProperty ("DBConnectionString"));

db. Init ();

appObject. CheckVersion ();

// Инициализация загруженных объектов

foreach (var api_object in apiObjects)

{

api_object. Value. Init ();

}

// Плагины

if (! PluginManager. LoadInstalledPlugins ())

{

var res = MessageBox. Show ("Некоторые дополнительные типы документов не могут быть загружены. Хотите изменить настройки? (Нет - продолжить работу)", "Ошибка загрузки дополнений", MessageBoxButton. YesNo);

if (res == MessageBoxResult. Yes)

{

appObject. ShowPluginSettingsForm ();

return;

}

}

//

foreach (var addin in ConcreteDocAddins)

{

addin. Value. Init ();

}

IsInited = true;

}

// Возвращает значение свойства приложения по имени

// Если свойство не задано, кидает исключение

static public object getApplicationProperty (string property)

{

var prop = applicationPropertiesObject. GetType (). GetProperty (property);

if (prop! = null) return prop. GetValue (applicationPropertiesObject, null);

else throw new Exception ("Trying read not defined proprty '" + property + "'");

}

// Открывают форму ошибки

public static void ShowExceptionForm (Exception e)

{

appObject. ShowExceptionForm (e);

}

// Создать форму изменения списка объектов (связанных с доп. типами)

public static EditListFormI CreateEditListForm (EditListSettingsBase settings, string title)

{

return appObject. createEditListForm (settings, title);

}

// Регистрирует новый дополнительный тип документов

public static void RegisterConcreteDocAddin (CDocAddinBase addin)

{

concreteDocAddins. Add (addin. Name, addin);

if (IsInited) addin. Init ();

}

// Возвращает указанный дополнительный тип документов

public static CDocAddinBase Addin (string name, bool quiet = false)

{

if (concreteDocAddins. ContainsKey (name)) return concreteDocAddins [name];

else if (quiet) return null;

else throw new Exception ("Доступ к несуществующему дополнительному типу документов");

}

public static CDocAddinBase Addin (DBO_DocType doctype, bool quiet = false)

{

return Addin (doctype. Name, quiet);

}

public static CDocAddinBase AddinByDocTypeID (long? doctype_id, bool quiet = false)

{

foreach (var addin in concreteDocAddins)

{

if (addin. Value. DocTypeDBO. ID == doctype_id) return addin. Value;

}

if (quiet) return null;

else throw new Exception ("Доступ к несуществующему дополнительному типу документов");

}

public static bool IsAddinExist (DBO_DocType doctype)

{

return concreteDocAddins. ContainsKey (doctype. Name);

}

// Регистрирует новый дополнительный тип документов

public static void RegisterAPI (APIBase api_object)

{

apiObjects. Add (api_object. GetType (), api_object);

if (IsInited) api_object. Init ();

}

// Возвращает api

public static APIObject API<APIObject> () where APIObject: APIBase

{

if (apiObjects. ContainsKey (typeof (APIObject))) return (APIObject) apiObjects [typeof (APIObject)];

else return null;

}

// Перезапустить приложение

public static void RestartApplication ()

{

System. Diagnostics. Process. Start (Application. ResourceAssembly. Location);

Application. Current. Shutdown ();

}

}

}

Файл ApplicationI. cs

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using DKCore. FormsI;

using System. Windows;

namespace DKCore

{

// Интерфейс для WPF-шного приложения, с которым взаимодействует AppManager

public interface ApplicationI

{

// Отобразить форму ошибки

void ShowExceptionForm (Exception e);

// Отобразить форму настройки плагинов

void ShowPluginSettingsForm ();

// Создать форму изменения списка объектов (связанных с доп. типами)

EditListFormI createEditListForm (EditListSettingsBase settings, string title);

// Проверка версии базы

void CheckVersion ();

// Завершить работу

void Shutdown ();

}

}

Файл DBHelper. cs

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. Collections. ObjectModel;

using System. Reflection;

using System. Data. SQLite;

using System. Windows;

using DKCore. DataBase. Attributes;

namespace DKCore. DataBase

{

public class DBHelper: IDisposable

{

SQLiteConnection conn;

SQLiteTransaction transact;

bool throwExceptions;

//

// throw_exeptions - если false - подавлять исключения

//

public DBHelper (bool throw_exceptions = false)

{

conn = null;

transact = null;

throwExceptions = throw_exceptions;

}

// Открыть соединение с базой

// connection_string - строка подключения

// is_transaction - запустить транзакцию

public void Open (string connection_string, bool is_transaction = false)

{

try

{

conn = new SQLiteConnection (connection_string);

conn. Open ();

transact = (is_transaction)? conn. BeginTransaction (): null;

}

catch (Exception e)

{

handleException (e);

}

}

// Обрабатывает возникшее исключение

private void handleException (Exception e)

{

#if DEBUG

System. Diagnostics. Debugger. Break ();

#endif

if (throwExceptions) throw e;

else AppManager. ShowExceptionForm (e);

}

// Подтвердить, если была запущена транзакция

public void Commit ()

{

if (transact! = null) transact.commit ();

}

// Отменить, если была запущена транзакция

public void Rollback ()

{

if (transact! = null) transact. Rollback ();

}

public void Dispose ()

{

if (conn! = null) conn. Close ();

if (transact! = null) transact. Dispose ();

}

// Возвращает названия полей, ассоцированных со свойствами объекта db_object, значения которых не равно null (если skip_null = true)

// Если задан field, составляет список из свойств этого объекта ({ PropertyField = <col_desc>,. })

// <col_desc> = "column_name": берется указанное поле

// <col_desc> = null - берется из атрибутов

// Если задано must_be_primary, включает в себя поля только из свойств, помеченных атрибутом как ключевые

//

private Dictionary<string, PropertyInfo> getInsertingFields (object db_object, object fields = null, bool skip_null = true, bool? must_be_primary = null)

{

var result = new Dictionary<string, PropertyInfo> ();

Type type = db_object. GetType ();

if (fields! = null)

{

// Заданы конкретные поля

PropertyInfo [] fields_props = fields. GetType (). GetProperties (BindingFlags. Public | BindingFlags. Instance);

foreach (var fprop in fields_props)

{

PropertyInfo tprop = type. GetProperty (fprop. Name);

if (tprop! = null)

{

string fprop_val = fprop. GetValue (fields, null) as string;

if (fprop_val == null)

{

// Имя столбца таблицы взять из атрибутов

var res = getInsertingFields_OneProperty (db_object, tprop, false, null);

if (res! = null) result. Add (res, tprop);

}

else

{

result. Add (fprop_val, tprop);

}

}

}

}

else

{

// Получить поля из атрибутов

PropertyInfo [] target_props = type. GetProperties (BindingFlags. Public | BindingFlags. Instance);

foreach (var tprop in target_props)

{

var res = getInsertingFields_OneProperty (db_object, tprop, skip_null, must_be_primary);

if (res! = null) result. Add (res, tprop);

}

}

return result;

}

private string getTablePostfix (Type type)

{

var attributes = type. GetCustomAttributes (typeof (DBTableNameAttribute), false);

if (attributes. Length > 0) return ( (DBTableNameAttribute) attributes [0]). TablePostfix;

else return null;

}

private string getInsertingFields_OneProperty (object db_object, PropertyInfo tprop, bool skip_null = true, bool? must_be_primary = null)

{

var attributes = tprop. GetCustomAttributes (typeof (DBFieldNameAttribute), false);

if (attributes. Length > 0)

{

DBFieldNameAttribute attr = (DBFieldNameAttribute) attributes [0];

if (must_be_primary == null || must_be_primary == attr. IsPrimaryKey)

{

if (skip_null == false || tprop. GetValue (db_object, null)! = null)

{

string field_name = attr. FieldName;

if (attr. UsePostfix) field_name += "_" + getTablePostfix (db_object. GetType ());

return field_name;

}

}

}

return null;

}

// Выбирает все записи по запросу и заполняет объектами T результирующий список

// com - sql-запрос у базе

// fields - поля, которые будут заполнены у элемента типа T.

// Должен быть представлен обхектом вида: { PropertyField = "column_name",. }

// Если only_first = true, возвращает список, состоящи только из первого элемента

//

public ObservableCollection<T> fetchAll<T> (DBCommand com, object fields = null, bool only_first = false) where T: class, new ()

{

var result = new ObservableCollection<T> ();

try

{

com. Connection = conn;

com. Transaction = transact;

using (var reader = new DBHelperReader (com. ExecuteReader ()))

{

// MessageBox. Show ("a1");

// Получаем список запрашиваемых полей и связанных с ними свойст T

var retrieve_fields = reader. getRetrievedFields (typeof (T), fields);

// MessageBox. Show ("a2");

// Записываем данные в список результа

while (reader. Read ())

{

T elem = new T ();

foreach (var field in retrieve_fields)

{

field. Value. SetValue (elem, reader. readFieldWithType (field. Key, field. Value. PropertyType), null);

}

result. Add (elem);

if (only_first) break;

}

}

// MessageBox. Show ("a3");

}

catch (Exception e)

{

handleException (e);

}

return result;

}

public T fetchOne<T> (DBCommand com, object fields = null) where T: class, new ()

{

var list = fetchAll<T> (com, fields, true);

return (list. Count > 0)? list [0]: null;

}

public T getByID<T> (long? id, string table = null, string id_field_name = null) where T: class, new ()

{

object [] class_attrs = typeof (T). GetCustomAttributes (typeof (DBTableNameAttribute), false);

// Имя таблицы

if (table == null)

{

if (class_attrs. Length > 0) table = ( (DBTableNameAttribute) class_attrs [0]). TableName;

else throw new Exception ("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя таблицы");

}

// Имя поля id

if (id_field_name == null)

{

PropertyInfo id_prop = typeof (T). GetProperty ("ID", BindingFlags. Public | BindingFlags. Instance);

if (id_prop! = null)

{

object [] id_attrs = id_prop. GetCustomAttributes (typeof (DBFieldNameAttribute), false);

if (id_attrs. Length > 0)

{

id_field_name = ( (DBFieldNameAttribute) id_attrs [0]). FieldName;

if ( ( (DBFieldNameAttribute) id_attrs [0]). UsePostfix)

{

if (class_attrs. Length > 0) id_field_name += "_" + ( (DBTableNameAttribute) class_attrs [0]). TablePostfix;

else throw new Exception ("Ошибка вставки: невозможно определить поле ID: постфикс таблицы не указан");

}

}

else throw new Exception ("Ошибка вставки: невозможно определить поле ID: в атрибутах не указано поле в таблице");

}

else throw new Exception ("Ошибка вставки: невозможно определить таблицу: не найдено свойство ID");

}

using (var com = new DBCommand ("SELECT * FROM " + table + " WHERE " + id_field_name + " = @" + id_field_name))

{

com. Parameters. AddWithValue ("@" + id_field_name, id);

return fetchOne<T> (com);

}

}

// Вставляет объект db_object в базу данных:

// Если указан table, в таблицу table (иначе берется из атрибутов)

// Если указан fields - вставляются только указанные свойства (иначе свойства, которые не равны null)

//

public void insert<T> (T db_object, string table = null, object fields = null) where T: class, new ()

{

try

{

// Имя таблицы

if (table == null)

{

object [] attributes = typeof (T). GetCustomAttributes (typeof (DBTableNameAttribute), false);

if (attributes. Length > 0) table = ( (DBTableNameAttribute) attributes [0]). TableName;

else throw new Exception ("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя таблицы");

}

//

var inserting_fields = getInsertingFields (db_object, fields);

using (DBCommand com = new DBCommand ())

{

com. Connection = conn;

com. Transaction = transact;

if (inserting_fields. Count > 0)

{

string query = "INSERT INTO " + table + " (";

string values = " VALUES (";

bool first = true;

foreach (var field in inserting_fields)

{

if (first) first = false;

else

{

query +=", ";

values +=", ";

}

query += field. Key;

values += "@" + field. Key;

com. Parameters. AddWithValue ("@" + field. Key, field. Value. GetValue (db_object, null));

}

com.commandText = query + ")" + values + ")";

}

else com.commandText = "INSERT INTO " + table + " DEFAULT VALUES";

com. ExecuteNonQuery ();

}

}

catch (Exception e)

{

handleException (e);

}

}

// Формирует и выполняет запрос на вставку в таблицу table из полей и значений словаря field_values

// Если values = null вставляет запись со значениями по умолчанию

//

public void insertValues (string table, Dictionary<string, object> field_values = null)

{

try

{

using (DBCommand com = new DBCommand ())

{

com. Connection = conn;

com. Transaction = transact;

if (field_values! = null && field_values. Count > 0)

{

string query = "INSERT INTO " + table + " (";

string values = " VALUES (";

bool first = true;

foreach (var field in field_values)

{

if (first) first = false;

else

{

query +=", ";

values +=", ";

}

query += field. Key;

values += "@" + field. Key;

com. Parameters. AddWithValue ("@" + field. Key, field. Value);

}

com.commandText = query + ")" + values + ")";

}

else com.commandText = "INSERT INTO " + table + " DEFAULT VALUES";

com. ExecuteNonQuery ();

}

}

catch (Exception e)

{

handleException (e);

}

}

// Удаляет объект db_object в базу данных:

// Если указан table, из таблицы table (иначе берется из атрибутов)

// Если указан keys - ключевые поля берутся из него

//

public void delete<T> (T db_object, string table = null, object keys = null) where T: class, new ()

{

try

{

// Имя таблицы

if (table == null)

{

object [] attributes = typeof (T). GetCustomAttributes (typeof (DBTableNameAttribute), false);

if (attributes. Length > 0) table = ( (DBTableNameAttribute) attributes [0]). TableName;

else throw new Exception ("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя таблицы");

}

//

var key_fields = getInsertingFields (db_object, keys, false, true);

if (key_fields. Count > 0)

{

using (DBCommand com = new DBCommand ())

{

com. Connection = conn;

com. Transaction = transact;

string query = "DELETE FROM " + table + " WHERE ";

bool first = true;

foreach (var field in key_fields)

{

if (first) first = false;

else query +=", ";

query += field. Key + " = " + "@" + field. Key;

com. Parameters. AddWithValue ("@" + field. Key, field. Value. GetValue (db_object, null));

}

com.commandText = query;

com. ExecuteNonQuery ();

}

}

}

catch (Exception e)

{

if (throwExceptions) throw e;

else MessageBox. Show (e. ToString ());

}

}

// Обновляет объект db_object в базу данных:

// Если указан table, в таблицу table (иначе берется из атрибутов)

// Если указан keys - ключевые поля берутся из него

// Если указан fields - обновляются только указанные свойства (иначе все свойства)

//

public void update<T> (T db_object, object fields = null, string table = null, object keys = null) where T: class, new ()

{

try

{

// Имя таблицы

if (table == null)

{

object [] attributes = typeof (T). GetCustomAttributes (typeof (DBTableNameAttribute), false);

if (attributes. Length > 0) table = ( (DBTableNameAttribute) attributes [0]). TableName;

else throw new Exception ("Ошибка вставки: невозможно определить таблицу: в атрибутах не указано имя таблицы");

}

//

var key_fields = getInsertingFields (db_object, keys, false, true);

var data_fields = getInsertingFields (db_object, fields, false, false);

if (data_fields. Count > 0)

{

using (DBCommand com = new DBCommand ())

{

com. Connection = conn;

com. Transaction = transact;

string query = "UPDATE " + table + " SET ";

bool first = true;

foreach (var field in data_fields)

{

if (first) first = false;

else query +=", ";

query += field. Key + " = " + "@" + field. Key;

com. Parameters. AddWithValue ("@" + field. Key, field. Value. GetValue (db_object, null));

}

query += " WHERE ";

first = true;

foreach (var field in key_fields)

{

if (first) first = false;

else query +=", ";

query += field. Key + " = " + "@" + field. Key;

com. Parameters. AddWithValue ("@" + field. Key, field. Value. GetValue (db_object, null));

}

com.commandText = query;

com. ExecuteNonQuery ();

}

}

}

catch (Exception e)

{

if (throwExceptions) throw e;

else MessageBox. Show (e. ToString ());

}

}

// Возвращает id, сгенерированное последим запросом на вставку

// table - имя таблицы, куда вставлялась запись

// id_field_name - имя ключевого поля (должно быть autoincrement)

//

public long? getLastInsertedID (string table, string id_field_name)

{

try

{

using (var com = new DBCommand ("SELECT last_insert_rowid ()", conn, transact))

{

return com. ExecuteScalar () as long?;

}

}

catch (Exception e)

{

handleException (e);

return null;

}

}

// Выполнить команду в текущей транзакции

//

public void executeNonQuery (DBCommand com)

{

try

{

com. Connection = conn;

com. Transaction = transact;

com. ExecuteNonQuery ();

}

catch (Exception e)

{

if (throwExceptions) throw e;

else MessageBox. Show (e. ToString ());

}

}

// Выполнить команду в текущей транзакции и получить reader для прочтения возвращенных запросом данных

//

public DBHelperReader executeReader (DBCommand com)

{

try

{

com. Connection = conn;

com. Transaction = transact;

return new DBHelperReader (com. ExecuteReader ());

}

catch (Exception e)

{

handleException (e);

return null;

}

}

}

// / <summary>

// / Предоставляет упрощенный доступ к полям

// / </summary>

public class DBHelperReader: IDisposable

{

SQLiteDataReader reader;

public DBHelperReader (SQLiteDataReader rd)

{

reader = rd;

}

public void Dispose ()

{

reader. Close ();

}

// Читает поле с именем col_name из reader как значение типа T

//

public T readField<T> (string col_name)

{

int col_index = reader. GetOrdinal (col_name);

return readField<T> (col_index);

}

//

public T readField<T> (int col_index)

{

return (T) readFieldWithType (col_index, typeof (T));

}

// Читает поле с именем col_name из reader как значение типа type

//

public object readFieldWithType (string col_name, Type type)

{

int col_index = reader. GetOrdinal (col_name);

return readFieldWithType (col_index, type);

}

// Читает поле с индексом col_index из reader как значение типа type

//

public object readFieldWithType (int col_index, Type type)

{

bool is_nullable = false; // Может ли принимать null

Type rtype = type; // Если type - Nullable, значение равно будет типу, переданному в шаблон Nullable

if (type. IsGenericType && type. GetGenericTypeDefinition () == typeof (Nullable<>))

{

is_nullable = true;

rtype = Nullable. GetUnderlyingType (type);

}

else is_nullable = type. IsClass;

// Если значение в базе равно NULL и тип переменной Nullable

// Возвращаем null

if (reader. IsDBNull (col_index) && is_nullable) return null;

// В любом другом случае:

//

TypeCode type_code = Type. GetTypeCode (rtype);

switch (type_code)

{

case TypeCode. Boolean: return Convert. ToBoolean (reader. GetValue (col_index));

case TypeCode. Decimal: return reader. GetDecimal (col_index);

case TypeCode. DateTime: return reader. GetDateTime (col_index);

case TypeCode. Int16: return Convert. ToInt16 (reader. GetValue (col_index));

case TypeCode. Int32: return Convert. ToInt32 (reader. GetValue (col_index));

case TypeCode. Int64: return Convert. ToInt64 (reader. GetValue (col_index));

default:

// Другие типы

return reader. GetValue (col_index);

}

}

public T readObject<T> (object fields = null) where T: class, new ()

{

var retrieve_fields = getRetrievedFields (typeof (T), fields);

T elem = new T ();

foreach (var field in retrieve_fields)

{

field. Value. SetValue (elem, readFieldWithType (field. Key, field. Value. PropertyType), null);

}

return 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"

// }

//

public Dictionary<int, PropertyInfo> getRetrievedFields (Type type, object fields = null)

{

var result = new Dictionary<int, PropertyInfo> ();

if (fields! = null)

{

// Заданы конкретные поля

PropertyInfo [] fields_props = fields. GetType (). GetProperties (BindingFlags. Public | BindingFlags. Instance);

foreach (var fprop in fields_props)

{

PropertyInfo tprop = type. GetProperty (fprop. Name);

if (tprop! = null)

{

// try

// {

int field_index = reader. GetOrdinal ( (string) fprop. GetValue (fields, null));

result. Add (field_index, tprop);

// }

// NOTE:

// Возможно в этом случае переъватывать исключение не стоит

// catch (IndexOutOfRangeException) { }

}

}

}

else

{

// Получить поля из атрибутов

object [] attributes;

attributes = type. GetCustomAttributes (typeof (DBTableNameAttribute), false);

if (attributes. Length > 0)

{

string postfix = ( (DBTableNameAttribute) attributes [0]). TablePostfix;

PropertyInfo [] target_props = type. GetProperties (BindingFlags. Public | BindingFlags. Instance);

foreach (var tprop in target_props)

{

attributes = tprop. GetCustomAttributes (typeof (DBFieldNameAttribute), false);

if (attributes. Length > 0)

{

DBFieldNameAttribute attr = (DBFieldNameAttribute) attributes [0];

string field_name = attr. FieldName;

if (attr. UsePostfix) field_name += "_" + postfix;

try

{

int field_index = reader. GetOrdinal (field_name);

if (field_index! = - 1) result. Add (field_index, tprop);

}

catch (IndexOutOfRangeException) { }

}

}

}

}

return result;

}

// / <summary>

// / Читает следующую строку результата

// / </summary>

// / <returns>

// / Возвращает true, если данные считаны, false - если данных нет

// / </returns>

public bool Read ()

{

return reader. Read ();

}

}

}

Файла DBEntityObjectBase

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System.componentModel;

using DKCore. DataBase. Attributes;

namespace DKCore. DataBase

{

abstract public class DBEnityObjectBase: INotifyPropertyChanged

{

public DBEnityObjectBase (long id)

{

ID = id;

}

public DBEnityObjectBase ()

{

ID = null;

}

public bool existInDB

{

get { return ID! = null; }

}

//

// Поля:

//

private long? id;

[DBFieldName ("id", true, true)]

public long? ID

{

get { return id; }

set

{

id = value;

OnPropertyChanged (new PropertyChangedEventArgs ("ID"));

}

}

//

// Уведомление об изменениях (INotifyPropertyChanged)

//

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged (PropertyChangedEventArgs e)

{

if (PropertyChanged! = null) PropertyChanged (this, e);

}

}

}

Файл DBDocuments

using System;

using System. Collections. Generic;

using System. Text;

using System. Data. SQLite;

using System. Windows;

using System. Collections. ObjectModel;

using System. Reflection;

using System. Data;

using DKCore. DataBase. Objects;

namespace DKCore. DataBase

{

public class DBDocuments

{

private string connectionStr;

// Инициализирован?

private bool isInited;

public bool IsInited

{

get { return isInited; }

}

// Подключенные к базе модули

private Dictionary<Type, DBModuleBase> modules;

// Схема базы

private DBSchema schema;

public DBSchema Schema

{

get { return schema; }

}

public DBDocuments (string connection_string)

{

isInited = false;

modules = new Dictionary<Type, DBModuleBase> ();

connectionStr = connection_string;

SQLiteFunction. RegisterFunction (typeof (SQLiteCaseInsensitiveCollation));

SQLiteFunction. RegisterFunction (typeof (SQLiteRusUpper));

// Схема базы (заполняется модулями)

schema = new DBSchema ();

// Модули:

RegisterModule (new Modules. DBModule_CardCase ());

RegisterModule (new Modules. DBModule_Documents ());

RegisterModule (new Modules. DBModule_Files ());

RegisterModule (new Modules. DBModule_FastSearch ());

}

// Подготавливает базу для работы

// Загружает наиболее часто используемые данные

public void Init ()

{

foreach (var module in modules)

{

module. Value. Init ();

}

isInited = true;

}

// Регистрирует новый модуль DBModule для работы с базой

//

public void RegisterModule (DBModuleBase module)

{

if (! modules. ContainsKey (module. GetType ()))

{

modules. Add (module. GetType (), module);

// module. GrantBeginTransaction (BeginTransaction);

module. DB = this;

if (IsInited) module. Init ();

}

}

// Возвращает объект модуля базы или false

//

public DBModule Module<DBModule> () where DBModule: DBModuleBase

{

if (modules. ContainsKey (typeof (DBModule))) return (DBModule) modules [typeof (DBModule)];

else return null;

}

// Запускает транзакцию для обращения к базе

// Возвращает объект DBHelper:

// Чтобы подтвердить транзакцию необъодимо вызвать DBHelper.commit ();

// Чтобы откатить транзакуию, необходимо вызвать DBHelper. Rollback ();

//

public DBHelper BeginTransaction (bool transaction_mode = false, bool throw_exception = false)

{

var dbhelper = new DBHelper (throw_exception);

dbhelper. Open (connectionStr, transaction_mode);

return dbhelper;

}

// Возвращает версию подсистемы

public string getSysVersion (string subsystem, DBHelper dbhelper)

{

using (var com = new DBCommand ("SELECT version FROM sys_versions WHERE subsystem = @subsystem"))

{

com. Parameters. AddWithValue ("@subsystem", subsystem);

using (var reader = dbhelper. executeReader (com))

{

if (reader. Read ()) return reader. readField<string> ("version");

else return null;

}

}

}

public string getSysVersion (string subsystem)

{

using (var dbhelper = BeginTransaction ())

{

return getSysVersion (subsystem, dbhelper);

}

}

// Загружает объект с заданным id

public T loadByID<T> (long? id) where T: DBEnityObjectBase, new ()

{

using (var dbhelper = BeginTransaction ())

{

return dbhelper. getByID<T> (id);

}

}

}

}

Файла DBDocumentSelector. cs

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System.componentModel;

using System. Data. SQLite;

using DKCore. ConcreteDocuments. Interfaces;


Подобные документы

  • Основные особенности нормативного и методического обеспечения архивного хранения электронных документов. Общие требования к организации и проведению учета электронных архивных документов. Рассмотрение инновационных методов учета в делопроизводстве.

    курсовая работа [255,8 K], добавлен 31.08.2015

  • Программные средства выполнения, обращения и хранения электронных документов на предприятии. Правовое и методическое обеспечение сохранности информационных ресурсов в организациях Республики Беларусь. Создание электронной регистрационной карточки.

    реферат [25,4 K], добавлен 17.04.2015

  • Порядок разработки, учета, хранения, размножения и уничтожения секретных (конфиденциальных) документов. Режим секретности при обработке секретных документов с применением средств вычислительной техники и технических средств иностранного производства.

    реферат [442,4 K], добавлен 01.02.2013

  • Анализ существующих поисковых систем и используемых ими алгоритмов поиска документов. Разработка информационно-поисковой системы словарного типа, способной осуществлять релевантный поиск документов, особенности ее структуры и информационно-поисковой базы.

    дипломная работа [942,1 K], добавлен 19.05.2011

  • Составление пакета программной документации. Анализ функционирования и совершенствование программы. Стандарты, регламентирующие ее эксплуатацию. Изучение требований к составу, содержанию и оформлению документов. Порядок хранения и обновления файлов.

    курсовая работа [31,2 K], добавлен 02.08.2015

  • Межбиблиотечный абонемент и доставка документов входит в число важнейших средств функционирования информационного пространства. Проблема стандартизации технологии и терминологии в библиотечном деле. Перспективы развития электронной доставки документов.

    контрольная работа [24,2 K], добавлен 17.11.2010

  • Понятие системы электронной доставки документов, становление и развитие. Схема функционирования и основные технологические этапы, получение и обработка заказов. Программы для изготовления копий, их хранение. Проблемы, возникающие при работе службы ЭДД.

    реферат [26,1 K], добавлен 10.10.2009

  • Анализ механизма функционирования программы Lotus Notes, позволяющей организовать процесс создания и распространения документов более удобным путем, объединяя документы в базы документов. Основные элементы интерфейса. Работа с папками, обработка почты.

    контрольная работа [4,0 M], добавлен 06.10.2010

  • Понятие шаблона документа, анализ последовательности действий для его создания. Несколько замечаний по поводу тактики создания шаблонов. Специфика создания документов с использованием слияния. Особенность использования программы Microsoft Graph.

    реферат [17,1 K], добавлен 05.10.2011

  • Проблемы авторского права в работе службы электронной доставки документов в библиотечно-библиографическом обслуживании. Характеристика ЭДД как современной службы по работе с удаленными пользователями, анализ ее работы в Российской национальной библиотеке.

    дипломная работа [2,3 M], добавлен 18.09.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.