Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Международные и отечественные стандарты языков программирования. Сходство и отличия стандартов

Содержание:

Введение

Когда программист-разработчик получает в той или иной форме задание на программирование, перед ним, перед руководителем проекта и перед всей проектной группой встают вопросы: что должно быть сделано, кроме собственно программы? что и как должно быть оформлено в виде документации? что передавать пользователям, а что – службе сопровождения? как управлять всем этим процессом?

Кроме упомянутых вопросов есть и другие, например, что должно входить в само задание на программирование?

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

Прошло много лет, программирование происходит в среде совершенно новых технологий, многие программисты, работая в стиле drag-and-drop, могут годами не видеть текст своих программ. Это не значит, что исчезла необходимость в их документировании. Более того, вопросы о наличии хоть какой-то системы, регламентирующей эту сторону создания программных средств (ПС), продолжают задавать постоянно. Спрашивают и о том, есть ли обязательные для применения стандарты (особенно остро стоит этот вопрос, когда разработка выполняется по заказу государственной организации или предприятия). Интересуются и тем, где можно купить имеющиеся стандарты.

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

Цель работы – обзор и анализ стандартов языков программирования.

Для достижения поставленной цели нужно выполнить следующие задачи:

  • рассмотреть понятие стандартов и обосновать необходимость их разработки;
  • рассмотреть существующие отечественные и международные стандарты;
  • выявить сходство и различие стандартов.

Стандарты языков программирования: понятие, необходимость разработки

Концепция языка программирования неотрывно связана с его реализацией. Для того чтобы компиляция одной и той же программы различными компиляторами всегда давала одинаковый результат, разрабатываются стандарты языков программирования. Существует ряд организаций, целенаправленно занимающихся вопросами стандартизации. Это Американский национальный институт стандартов ANSI (American National Standards Institute), Институт инженеров по электротехнике и электронике IEEE (Institute of Electrical and Electronic Engineers), Организация международных стандартов ISO (International Organization for Standardization).

Как правило, при создании языка выпускается частный стандарт, определяемый разработчиками языка. Если язык получает широкое распространение, то со временем появляются различные версии компиляторов, которые не точно следуют частному стандарту. В большинстве случаев идет расширение зафиксированных первоначально возможностей языка. Для приведения наиболее популярных реализаций языка в соответствие друг с другом разрабатывается согласительный стандарт. Очень важным фактором стандартизации языка программирования является своевременность появления стандарта – до широкого распространения языка и создания множества несовместимых реализаций. В процессе развития языка могут появляться новые стандарты, отражающие современные нововведения. Так, язык FORTRAN первоначально был стандартизирован в 1966 году. В результате был издан стандарт FORTRAN 66. Далее этот стандарт несколько раз пересматривался (в 1977 году был выпущен FORTRAN 77, затем появился и FORTRAN 90).

Язык Java, ставший в последнее время весьма распространенным, постепенно был значительно расширен и модифицирован: новая спецификация получила название Java 2.

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

Обзор стандартов, сходства и различия

Международные стандарты

Как было сказано в первой главе, разработкой международных стандартов занимаются многие организации. Это Американский национальный институт стандартов ANSI (American National Standards Institute), Институт инженеров по электротехнике и электронике IEEE (Institute of Electrical and Electronic Engineers), Организация международных стандартов ISO (International Organization for Standardization).

Ниже приведены примеры международных стандартов:

  • ISO/IEC 1539-1:2010. Информационные технологии. Языки программирования. Фортран. Часть 1. Основные языки
  • ISO/IEC 1539-1:2010/Cor 1:2012. Информационные технологии. Языки программирования. Фортран. Часть 1. Основные языки. Техническая поправка 1
  • ISO 7185:1990. Информационные технологии. Языки программирования. Паскаль
  • ISO 8485:1989. Языки программирования. APL
  • ISO/IEC 9899:2011. Информационные технологии. Языки программирования. Си
  • ISO/IEC 10279:1991. Информационные технологии. Языки программирования. Полный Бейсик
  • ISO/IEC 13211-1:1995. Информационные технологии. Языки программирования. Пролог. Часть 1. Общее ядро
  • ISO/IEC 13816:2007. Информационные технологии. Языки программирования, их среды и интерфейсы системного программного обеспечения. Язык программирования ISLISP

  • ANSI/IEEE 1012 - 1986. Планирование проверки (оценки) (verification) и подтверждения достоверности (validation) программных средств.
  • ANSI/IEEE 829 - 1983. Документация при тестировании программ.
  • ANSI/IEEE 1008 - 1986. Тестирование программных модулей и компонентов ПС.
  • ANSI/IEEE 983 - 1986. Руководство по планированию обеспечения качества программных средств.
  • ANSI/IEEE 1042 - 1987. Руководство по планированию управления конфигурацией программного обеспечения.
  • IEEE 1063-1987 (подтвержден 1993) - Пользовательская документация на программное обеспечение.
  • IEEE 1074-1995 - Процессы жизненного цикла для развития программного обеспечения.
  • ISO 12207:1995. Процессы жизненного цикла программных средств.
  • ISO 9000-3:1991. Общее руководство качеством и стандарты по обеспечению качества. Ч.3: Руководящие указания по применению ISO 9001 при разработке, поставке и обслуживании программного обеспечения.
  • ISO 9126:1991. ИТ. Оценка программного продукта. Характеристики качества и руководство по их применению.
  • ISO 9646 - 1-6: 1991. ИТ. ВОС. Методология и основы аттестационного тестирования ВОС.
  • ISO 12119:1994. ИТ. Требования к качеству и тестирование.
  • ISO 687:1983. ИТ. Управление конфигурацией программного обеспечения.
  • IEEE 1219-1993- Сопровождение программных средств.
  • ISO 6592:1986. ОИ. Руководство по документации для вычислительных систем.
  • ISO 9294-1990-TO. ИТ. Руководство по управлению документированием программного обеспечения (ГОСТ Р - 1993).
  • ISO 9127:1987. ИТ. Пользовательская и рекламная документация на пакеты программ.

Рассмотрим подробнее стандарты языка Паскаль.

После начала использования Паскаля в 1970 году и появления реализаций, расходящихся не только в дополнениях, но и в синтаксисе, был поднят вопрос о стандартизации языка. Стандарт языка был разработан Никлаусом Виртом в 1974 году совместно с Кетлин Йенсен (Kathleen Jensen). В дальнейшем, были приняты международный стандарт от ISO и американский от ANSI. На данный момент, выделяют три принципиально разных стандарта: Unextended Pascal (исходный), Extended Pascal (расширенный), Object-Oriented Extensions to Pascal (объектно-ориентированное расширение Паскаля).

Стандарты языка Pascal: исходный, международные ISO и американские ANSI Название Вариант Кем/где разработан Год создания Pascal Standard исходный Н. Вирт, Кетлин Йенсен 1974 Pascal Standard исходный ISO 7185:1983, ANSI/IEEE 770X3.97:1983 1982 Unextended Pascal исходный ISO 7185:1990 1989 Extended Pascal расширенный ANSI/IEEE 770X3.160:1989 1989 ISO/IEC 10206 1991 Object-Oriented
Extensions to Pascal объектно-ориентированное расширение ANSI/X3-TR-13:1994 1993

Одним из главных дополнительных свойств объектно-ориентированного расширения Extended Pascal стала модульность и средства, облегчающие раздельную компиляцию.

Стандартизация языка была запаздывающей по отношению к реальному появлению в языке тех или иных возможностей. Коммерческие реализации расширяли стандартный Паскаль; так было сделано в UCSD Pascal, модификации Object Pascal фирмой Apple, Turbo Pascal от Borland (незначительно модифицированная версия Apple) и его ответвлений. Ни одна из распространённых коммерческих реализаций Паскаля не соответствует в точности ни одному из официальных стандартов языка.

Стандарт МЭК 61131-3 устанавливает пять языков программирования ПЛК, три графических и два текстовых. Первоначально стандарт назывался IEC 1131-3 и был опубликован в 1993 г. но в 1997 г. МЭК (IEC) перешел на новую систему обозначений и в названии стандарта добавилась цифра "6". Продвижением стандарта занимается организация PLCopen (http://www.plcopen.org).

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

Системы программирования, основанные на МЭК 61131-3, характеризуются следующими показателями:

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

Языки МЭК 61131-3 появились не как теоретическая разработка, а как результат анализа множества языков, уже используемых на практике и предлагаемых рынку производителями ПЛК. Стандарт устанавливает пять языков программирования со следующими названиями:

  • структурированный текст (ST - Structured Text);
  • последовательные функциональные схемы (SFC - "Sequential Function Chart");
  • диаграммы функциональных блоков (FBD - Function Block Diagram);
  • релейно-контактные схемы, или релейные диаграммы (LD - Ladder Diagram);
  • список инструкций (IL - Instruction List).

Графическими языками являются SFC, FBD, LD. Языки IL и ST являются текстовыми.

В стандарт были введены несколько языков (а не один) для того, чтобы каждый пользователь мог применить наиболее понятный ему язык. Программисты чаще выбирают язык IL (похожий на ассемблер) или ST, похожий на язык высокого уровня Паскаль; специалисты, имеющие опыт работы с релейной логикой, выбирают язык LD, специалисты по системам автоматического управления (САУ) и схемотехники выбирают привычный для них язык FBD.

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

Языки МЭК 61131-3 базируются на следующих принципах [Lewis]:

  • вся программа разбивается на множество функциональных элементов - Program Organization Units (POU), каждый из которых может состоять из функций, функциональных блоков и программ. Любой элемент МЭК-программы может быть сконструирован иерархически из более простых элементов;
  • стандарт требует строгой типизации данных. Указание типов данных позволяет легко обнаруживать большинство ошибок в программе до ее исполнения;
  • имеются средства для исполнения разных фрагментов программы в разное время, с разной скоростью, а также параллельно. Например, один фрагмент программы может сканировать концевой датчик с частотой 100 раз в секунду, в то время как второй фрагмент будет сканировать датчик температуры с частотой один раз в 10 сек;
  • для выполнение операций в определенной последовательности, которая задается моментами времени или событиями, используется специальный язык последовательных функциональных схем ( SFC);
  • стандарт поддерживает структуры для описания разнородных данных. Например, температуру подшипников насоса, давление и состояние "включено-выключено" можно описать с помощью единой структуры "Pomp" и передавать ее внутри программы как единый элемент данных;
  • стандарт обеспечивает совместное использование всех пяти языков, поэтому для каждого фрагмента задачи может быть выбран любой, наиболее удобный, язык;
  • программа, написанная для одного контроллера, может быть перенесена на любой контроллер, совместимый со стандартом МЭК 61131-3.

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

Отечественные стандарты

Основу отечественной нормативной базы в области документирования ПС составляет комплекс стандартов Единой системы программной документации (ЕСПД). Основная и большая часть комплекса ЕСПД была разработана в 70-е и 80-е годы. Сейчас этот комплекс представляет собой систему межгосударственных стандартов стран СНГ (ГОСТ), действующих на территории Российской Федерации на основе межгосударственного соглашения по стандартизации.

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

Следует отметить, что стандарты ЕСПД носят рекомендательный характер. Впрочем, это относится и ко всем другим стандартам в области ПС. Дело в том, что в соответствии с Законом РФ «О стандартизации» эти стандарты становятся обязательными на контрактной основе — то есть при ссылке на них в договоре на разработку (поставку) ПС.

Говоря о состоянии ЕСПД в целом, можно констатировать, что большая часть стандартов ЕСПД морально устарела.

К числу основных недостатков ЕСПД можно отнести:

  • ориентацию на единственную, «каскадную» модель жизненного цикла (ЖЦ) ПС;
  • отсутствие четких рекомендаций по документированию характеристик качества ПС;
  • отсутствие системной увязки с другими действующими отечественными системами стандартов по ЖЦ и документированию продукции в целом, например, СРПП и ЕСКД;
  • нечетко выраженный подход к документированию ПС как товарной продукции;
  • отсутствие рекомендаций по самодокументированию ПС, например, в виде экранных меню и средств оперативной помощи пользователю («хелпов»);
  • отсутствие рекомендаций по составу, содержанию и оформлению перспективных документов на ПС, согласованных с рекомендациями международных и региональных стандартов.

Итак, ЕСПД нуждается в полном пересмотре на основе стандарта ИСО/МЭК 12207-95 на процессы жизненного цикла ПС.

Тем не менее, до пересмотра всего комплекса, многие стандарты могут с пользой применяться в практике документирования ПС. Эта позиция основана на следующем:

  • стандарты ЕСПД вносят элемент упорядочения в процесс документирования ПС;
  • предусмотренный стандартами ЕСПД состав программных документов вовсе не такой «жесткий», как некоторым кажется: стандарты позволяют вносить в комплект документации на ПС дополнительные виды программных документов (ПД), необходимых в конкретных проектах, и исключать многие ПД;
  • стандарты ЕСПД позволяют вдобавок мобильно изменять структуры и содержание установленных видов ПД исходя из требований заказчика и пользователя.

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

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

Из всех 28 стандартов ЕСПД остановимся только на тех, которые могут чаще использоваться на практике. Выделим также еще один, существенно более «свежий», чем остальные, отличающийся совместимостью с современными международными стандартами.

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

ГОСТ 19.201-78 ЕСПД. Техническое задание. Требование к содержанию и оформлению. Напомним, что техническое задание (ТЗ) содержит совокупность требований к ПС и может использоваться как критерий проверки и приемки разработанной программы. Поэтому достаточно полно составленное (с учетом возможности внесения дополнительных разделов) и принятое заказчиком и разработчиком, ТЗ является одним из основополагающих документов проекта ПС.

Следующий стандарт ориентирован на документирование результирующего продукта разработки: ГОСТ 19.402-78 ЕСПД. Описание программы.

Сделаем два замечания.

  1. Несмотря на возможность применения не всех, а только отдельных стандартов комплекса, использованная в них терминология, способы обозначения и другие детали могут потребовать опоры на такие общие стандарты, как ГОСТ 19.101-77 ЕСПД. Виды программ и программных документов, и другие.
  2. Состав документа «Описание программы» в своей содержательной части может дополняться разделами и пунктами, почерпнутыми из стандартов для других описательных документов и руководств: ГОСТ 19.404-79 ЕСПД. Пояснительная записка, ГОСТ 19.502-78 ЕСПД. Описание применения, ГОСТ 19.503-79 ЕСПД. Руководство системного программиста, ГОСТ 19.504-79 ЕСПД. Руководство программиста, ГОСТ 19.505-79 ЕСПД. Руководство оператора.

Есть также группа стандартов, определяющая требования к фиксации всего набора программ и ПД, которые оформляются для передачи ПС. Они (см. врезку) порождают лаконичные документы учетного характера и могут быть полезны для упорядочения всего хозяйства программ и ПД (ведь очень часто требуется просто навести элементарный порядок!). Есть и стандарты, определяющие правила ведения документов в «хозяйстве» ПС.

Надо также выделить ГОСТ 19.301-79 ЕСПД. Программа и методика испытаний, который (в адаптированном виде) может использоваться для разработки документов планирования и проведения испытательных работ по оценке готовности и качества ПС.

Наконец, выделим последний по году принятия стандарт. Это ГОСТ 19.701-90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Обозначения условные графические и правила выполнения. Он устанавливает правила выполнения схем, используемых для отображения различных видов задач обработки данных и средств их решения и полностью соответствует стандарту ИСО 5807:1985.

Наряду с ЕСПД на межгосударственном уровне действуют еще два стандарта, также относящихся к документированию ПС и принятых не так давно, как большая часть ГОСТ ЕСПД.

ГОСТ 19781-90 Обеспечение систем обработки информации программное. Термины и определения. Разработан взамен ГОСТ 19781-83 и ГОСТ 19.004-80 и устанавливает термины и определения понятий в области программного обеспечения (ПО) систем обработки данных (СОД), применяемые во всех видах документации и литературы, входящих в сферу работ по стандартизации или использующих результаты этих работ.

ГОСТ 28388-89 Системы обработки информации. Документы на магнитных носителях данных. Порядок выполнения и обращения. Распространяется не только на программные, но и на конструкторские, технологические и другие проектные документы, выполняемые на магнитных носителях.

В РФ действует ряд стандартов в части документирования ПС, разработанных на основе прямого применения международных стандартов ИСО. Это — самые «свежие» по времени принятия стандарты. Некоторые из них впрямую адресованы руководителям проекта или директорам информационных служб. Вместе с тем они неоправданно мало известны в среде профессионалов. Вот их представление.

ГОСТ Р ИСО/МЭК 9294-93 Информационная технология. Руководство по управлению документированием программного обеспечения. Стандарт полностью соответствует международному стандарту ИСО/МЭК ТО 9294:1990 и устанавливает рекомендации по эффективному управлению документированием ПС для руководителей, отвечающих за их создание. Целью стандарта является оказание помощи в определении стратегии документирования ПС; выборе стандартов по документированию; выборе процедур документирования; определении необходимых ресурсов; составлении планов документирования.

ГОСТ Р ИСО/МЭК 9126-93 Информационная технология. Оценка программной продукции. Характеристики качества и руководства по их применению. Стандарт полностью соответствует международному стандарту ИСО/МЭК 9126:1991. В его контексте под характеристикой качества понимается «набор свойств (атрибутов) программной продукции, по которым ее качество описывается и оценивается». Стандарт определяет шесть комплексных характеристик, которые с минимальным дублированием описывают качество ПС (ПО, программной продукции): функциональные возможности; надежность; практичность; эффективность; сопровождаемость; мобильность. Эти характеристики образуют основу для дальнейшего уточнения и описания качества ПС.

ГОСТ Р ИСО 9127-94 Системы обработки информации. Документация пользователя и информация на упаковке для потребительских программных пакетов. Стандарт полностью соответствует международному стандарту ИСО 9127:1989. В контексте настоящего стандарта под потребительским программным пакетом (ПП) понимается «программная продукция, спроектированная и продаваемая для выполнения определенных функций; программа и соответствующая ей документация, упакованные для продажи как единое целое». Под документацией пользователя понимается документация, которая обеспечивает конечного пользователя информацией по установке и эксплуатации ПП. Под информацией на упаковке понимают информацию, воспроизводимую на внешней упаковке ПП. Ее целью является предоставление потенциальным покупателям первичных сведений о ПП.

ГОСТ Р ИСО/МЭК 8631-94 Информационная технология. Программные конструктивы и условные обозначения для их представления. Описывает представление процедурных алгоритмов.

Сходства и различия отечественных и международных стандартов

Современные технологии преимущественно имеют англоязычное происхождение, что делает современный сектор программирования, зависим от зарубежных стандартов и моделей. Вместе с тем, следует уделить внимание немаловажному факту: языки программирования, основанные на русском языке, практически не распространены ни в России, ни за рубежом. Исключение составляет встроенный язык 1С: Предприятие, обслуживающий огромный сектор потребителей – множество компаний, которые ведут бухгалтерский учет в соответствии с нормами Российскими стандартами бухгалтерского учета. Подавляющее же большинство программного обеспечения, создаваемого сегодня в Российской Федерации, пишется на таких популярных языках программирования, как С++, Java, PHP и другие [4].

Современная Платформа «1С: Предприятие» предоставляет разнообразные средства для обмена данными и интеграции прикладных решений. Она позволяет создавать, обрабатывать и обмениваться данными различных форматов. Важно, что данная система способна поддерживать различные протоколы обмена, поддерживать стандарты взаимодействия с другими подсистемами и разрабатывать собственные Интернет-решения. Что делает данную платформу не зависимой от конфигурации и модификации технической составляющей. Решения построены на основе российских и международных стандартов и протоколов электронного обмена данными.

Ещё одной сложившейся проблемой остаётся проблема «русского программирования». Все аргументы в пользу «русского программирования» многочисленны и обоснованы, но все они хороши «в теории». На практике же – сплошное разочарование. Поддержку идентификаторов на кириллице имеют очень малое число языков или сред разработки. Существуют отечественные разработки типа языка «Глагол», «Валентина» и т.п. Но сфера их применения достаточно ограниченна, в основном в образовательной деятельности.

Любой, широко используемый, язык программирования должен быть международным. В идеале, программисты должны работать на том языке, который им удобен: на русском, английском, китайском, французском. И должны существовать мультиязычные словари, обеспечивающие автоматический перевод идентификаторов, которые по своей сути – слова и фразы, с одного языка на другой. Но проблема разработки такой системы перевода – отдельная тема.

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

Разработка программного обеспечения в соответствии со стандартом

Разработанное приложение состоит из 5 модулей MainClients.cpp, childTemplate.cpp, DbdDirectoryTemplate.cpp, AddSource.cpp, ParamPoisk.cpp. Внешний вид главного модуля приложения представлен на рис.1.

Рис.1. Внешний вид главной формы разработанного приложения.

Назначение главного модуля приложения MainClients.pas . Выборка, обработка, поиск данных, редактирование, добавление, удаление данных. Данная разработка предназначена для автоматизации действий менеджера склада ООО «Ай Ти Сервис», проводящего учет и выдачу материалов.

Модуль является главным и управляющим для остальных объектов проекта.

Для обеспечения связи с файлами базы данных размещенной на SQL сервере в разрабатываемом программном проекте в среде Builder C++ 6.0 используется хорошо зарекомендовавшая себя технология ADO (ActiveX Data Objects - объекты данных, построенные как объекты ActiveX), которая развивается и поддерживается корпорацией Microsoft.

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

База данных может быть указана двумя способами через файл линка к данным (файл в формате Microsoft Data Link, расширение UDL), либо прямым заданием параметров соединения.

Значение свойства всех ConnectionString этих компонент могут быть введены напрямую в текстовой форме, но куда проще вызвать редактор свойства нажав на кнопку “…” в конце поля ввода. Окно этого свойства представлено на рис.2-4:

Рис. 2. Настройка строки связи с базой данных

При выборе “Use data link file” и нажатии на кнопку “Browse…” появляется стандартный диалог выбора файла.

При выборе в редакторе свойства “Use connection string” и нажатии на кнопку “Build…” появляется такой же property sheet, как и при выборе “Open” для Microsoft Data Link файла.

В этом окне выбирается тип базы данных, местоположение базы и параметры соединения. На первой странице выбирается тип базы данных или Provider, в терминах ADO.

Рис. 3. Свойства связи с данными

Рис. 4. Свойства связи с данными

В компоненте TADOConnection существуют свойства Provider, DefaultDatabase и Mode которые являются альтернативным методом задания частей строки параметров соединения – провайдера, базы данных (например, пути до базы MS SQL) и режима совместного использования файлов базы данных. Эти значение этих свойств автоматически включаются в строку соединения, если были заданы до активизации компонента и автоматически выставляются после соединения.

Структурно клиентская часть ПП представляет собой выполнимый .EXE файл. Кроме него для работы с БД не нужны никакие другие файлы.

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

Для реализации базы данных в качестве основного инструмента был выбран сервер MS SQL 2008 DEVELOPER Edition. Данный выбор позволяет эффективно решать задачи организации таблиц базы данных, а также задачи разграниченного быстрого доступа, хранения, редактирования таблиц. Данное средство является стандартным средством, на котором реализовано большое количество промышленных баз данных, внедрена OLAP технология доступа к данным.

Фирма MicroSoft поддерживает данный продукт в смысле выпуска обновлений и гарантий эффективной работы в среде Windows 32. Одним из основных достоинств продукта проектирования новых баз данных могут использоваться другие совместимые продукты MicroSoft, MicroSoft Visio 2003, Microsoft Acess т.е. продукты спроектированные в этих системах могут адаптированы в MS SQL 2008.

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

Порядок работы с Microsoft SQL Server предусматривает предварительную инсталляцию продукта, причем она может быть выполнена в двух видах Local и Server. После инсталляции продукта на данный SQL могут быть перемещены базы данных, созданные на других MS SQL серверах. Для этого необходимо запустить Enterprise Manager и в левом окне SQL сервера, при помощи правой кнопки мыши выбрать альтернативу «Все задачи» затем «Attach Database», как показано на рис. 5.

Рис. 5. Добавление существующей базы данных

После выполнения этих действий на экране появится окно «Attach Database», изображение которого представлено на рисунке 6.

После выполнения этих действий при помощи кнопки с изображением « …», необходимо выбрать файл с расширением *.mdf, который содержит сам файл базы данных. (Рекомендуется предварительно его записать в директорию

C:\Program Files\Microsoft SQL Server\MSSQL\Data\). Завершить установку баз данных, после выбора mdf-файла, нажав на кнопку с изображением Attach.

Рис. 6. Добавление существующей базы данных

Необходимо отметить, что в случае использования Интернет соединений целесообразно использовать такую схему обеспечения соединения:

  1. На компьютере, который является сервером, устанавливается MS SQL Server 2008 в конфигурации Server.
  2. На компьютере, который является сервером, инсталлируется база данных так, как показано в данном пункте.
  3. На компьютере, который является клиентом, устанавливается MS SQL Server 2008 в конфигурации Client.
  4. При инсталяции и настройке MS SQL Server 2008 Client указывается IP адрес компьютера, который является сервером.
  5. На компьютере, который является клиентом, запускается разработанный программный проект.

Например, выбираем пункт «Просмотр таблицы комплектующих» (рисунок 7). Результат просмотра базы данных представлен на рисунке 8.

Рис.7. Пункт главного меню «Просмотр»

Рис. 8. Выбор просмотра данных о неисправностях

Рис. 9. Результат просмотра данных

3. На следующем шаге просмотрим всю базу данных, для этого выберем альтернативу «Просмотр базы данных» в меню «Просмотр» (рисунок 10).

Рис. 10. Просмотр всей базы данных

4. После этого приведем в исполнение элемент управления – кнопку «создать» – получаем Подтверждающую надпись (рис. 11).

Рис. 11. Дочерняя форма AddSource, динамически создаваемая для добавления информации

Динамически создаваемая дочерняя форма AddSource, может использоваться не только для отображения связанных записей. Главное назначение формы AddSource это создание интерфейсов для добавления новых информационных объектов (рис.12). Для выполнения поиска заявок необходимо выбрать пункт меню «ПОИСК», как показано на рис.13.

Рис. 12. Выбор пункта меню поиск для активации поиска по дате заявки

После этого необходимо указать дату поиска (рис. 13).

Рис. 13. Дочерняя форма ParamPoisk с введенным запросом

Для отображения результатов информационного поиска, согласно выбранным настройкам, динамически создается форма ChildTemplateForm. Форма ChildTemplateForm содержит компонент DBGrid, источником данных которого является таблица – результатов динамического поиска, выполняемых при помощи компонентов AdoQuery. Результат выполненного поиска по запросу представлен на рис.14.

Рис.14. Результат выполненного поиска

При задействовании кнопки «Excel»получим отчет в среде Excel (рис.15).

Рис.15. Отчет в среде Excel

Таким образом, на примере этой программы было рассмотрено применение стандартов, как зарубежных (стандарт языка С++), так и отечественных (например, ГОСТ Р ИСО/МЭК 9126-93 Информационная технология. Оценка программной продукции. Характеристики качества и руководства по их применению).

Заключение

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

Прежде всего, было дано определение стандарта. Для того чтобы компиляция одной и той же программы различными компиляторами всегда давала одинаковый результат, разрабатываются стандарты языков программирования. Существует ряд организаций, целенаправленно занимающихся вопросами стандартизации. Это Американский национальный институт стандартов ANSI (American National Standards Institute), Институт инженеров по электротехнике и электронике IEEE (Institute of Electrical and Electronic Engineers), Организация международных стандартов ISO (International Organization for Standardization).

Как правило, при создании языка выпускается частный стандарт, определяемый разработчиками языка. Так как в программировании практически всегда используются зарубежные языки программирования (Паскаль, Бейсик, С++, PHP и т.д.), то большинство стандартов являются медународными. Языки программирования, основанные на русском языке, практически не распространены ни в России, ни за рубежом. Отечественные стандарты в основном регулируют документирование разработок программ, а не сами языки, их семантику, синтаксис. В этом проявляется главное отличие стандартов.

Список использованной литературы

    1. Автоматизированные информационные системы, базы и банки данных. Вводный курс: Учебное пособие. - М.: Гелиос АРВ, 2010. - 368 с.
    2. Вигерс Карл, Разработка требований к программному обеспечению, Пер, с англ. - М.:Издательско-торговый дом "Русская Редакция", 2011. -576с.
    3. Гвоздева Т. В., Б. А. Баллод, Проектирование информационных систем. - М: Феникс, 2012. - 512с.
    4. Голицына О. Л., И. И. Попов, Н. В. Максимов, Т. Л. Партыка, Информационные технологии. – М: Издательство Инфра-М, 2012 г. - 608с.
    5. Емельянова Н. З., Партыка Т. Л., И. И. Попов, Проектирование информационных систем. – М: Форум, 2012. – 432с.
    6. Илюшечкин В. М. Основы использования и проектирования баз данных. – М: Издательство Юрайт, 2010. - 224с.
    7. Пирогов В. Ю., Информационные системы и базы данных. М, Организация и проектирование, Издательство: БХВ-Петербург, 2012 г.528 стр.
    8. Предметно-ориентированные экономические информационные системы.: Финансы и статистика, 2010 г.- 224 стр.

Приложение

Листинг разработанной программы

Главный модуль приложения

//---------------------------------------------------------------------------

// подключение модулей и задания пространства имен

#include <vcl.h>

#include <string.h>

#pragma hdrstop

#include "main.h"

#include "parampoisk.h"

#include "DBDirectoryTemplate.h"

#include "add.h"

#include "ChildTemlate.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

#include "add.h"

// описание основных классов (форм)

Tmainclientsform *mainclientsform;

TDBDirectoryTemplateForm *DirectoryForm;

Taddforms *ProsmForm;

Taddforms *ProsmForm1;

Tparampoiskform *Poisk;

TChildTemplateForm *ChildTemplateForm;

int nomer_poisk;

bool flag1,flag2;

bool mainflag;

int kodzayav, koduch, kodvid, kodzal, kodob, kodsod, otvup, otgot,a, kodzaka;

//---------------------------------------------------------------------------

__fastcall Tmainclientsform::Tmainclientsform(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void BuildGridDatabaseDirectoryItem(String sCaption, TDataSource *ds,

TForm *AFormName,String AMDIChildName )

// генерация форм для отображения справочников */

{ int i;

for ( int i = AFormName->MDIChildCount-1; i>=0; i--)

{

if (AFormName->MDIChildren[i]->Name == AMDIChildName)

{

AFormName->MDIChildren[i]->Free();

} }

DirectoryForm= new TDBDirectoryTemplateForm(Application);

DirectoryForm->TableDBGrid->DataSource=ds;

DirectoryForm->Top=0;

DirectoryForm->Left=0;

DirectoryForm->Width=700;

DirectoryForm->Height=200;

DirectoryForm->Caption=sCaption;

}

void BuildaddForms(String sCaption, TDataSource *ds,

TForm *AFormName,String AMDIChildName )

{ int i;

// генерация формы для просмотра базы данных и добавления записей

for ( int i = AFormName->MDIChildCount-1; i>=0; i--)

{

if (AFormName->MDIChildren[i]->Name == AMDIChildName)

{

AFormName->MDIChildren[i]->Free();

} }

ProsmForm= new Taddforms(Application);

ProsmForm->Top=230;

ProsmForm->Left=0;

ProsmForm->Width=700;

ProsmForm->Height=200;

ProsmForm->Caption=sCaption;

}

void BuildaddForms1(String sCaption, TDataSource *ds,

TForm *AFormName,String AMDIChildName )

{ int i;

// генерация формы для просмотра базы данных и добавления записей

for ( int i = AFormName->MDIChildCount-1; i>=0; i--)

{

if (AFormName->MDIChildren[i]->Name == AMDIChildName)

{

AFormName->MDIChildren[i]->Free();

} }

ProsmForm1= new Taddforms(Application);

ProsmForm1->Top=230;

ProsmForm1->Left=0;

ProsmForm1->Width=700;

ProsmForm1->Height=200;

ProsmForm1->Caption=sCaption;

}

void BuildPoiskForms(String sCaption, TDataSource *ds,

TForm *AFormName,String AMDIChildName )

{ int i;

/*

формирование формы для настройки параметров поиска

*/

for ( int i = AFormName->MDIChildCount-1; i>=0; i--)

{

if (AFormName->MDIChildren[i]->Name == AMDIChildName)

{

AFormName->MDIChildren[i]->Free();

// Break;

} }

Poisk= new Tparampoiskform(Application);

Poisk->Top=50;

Poisk->Left=400;

Poisk->Width=400;

Poisk->Height=400;

Poisk->Caption=sCaption;

}

void __fastcall Tmainclientsform::N3Click(TObject *Sender)

{

mainflag=false;

/* просмотр таблицы документы */

mainclientsform->DataSource1->DataSet=mainclientsform->ADOTable1;

mainclientsform->ADOTable1->Active=true;

BuildGridDatabaseDirectoryItem("Заявки", mainclientsform->DataSource1,mainclientsform,"DBDirectoryTemplateForm" );

DirectoryForm->TableDBGrid->Fields[0]->DisplayLabel="№";

DirectoryForm->TableDBGrid->Fields[1]->DisplayLabel="код заказчика";

DirectoryForm->TableDBGrid->Fields[2]->DisplayLabel="код исполнения";

DirectoryForm->TableDBGrid->Fields[3]->DisplayLabel="код сотрудника";

DirectoryForm->TableDBGrid->Fields[4]->DisplayLabel="Примечание";

DirectoryForm->TableDBGrid->Fields[5]->DisplayLabel="код неисправности";

DirectoryForm->TableDBGrid->Fields[6]->DisplayLabel="код заказа";

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N4Click(TObject *Sender)

{

/* просмотр таблицы Вид документа */

mainflag=false;

mainclientsform->DataSource1->DataSet=mainclientsform->ADOTable2;

mainclientsform->ADOTable2->Active=true;

BuildGridDatabaseDirectoryItem("Отдел", mainclientsform->DataSource1,mainclientsform,"DBDirectoryTemplateForm" );

DirectoryForm->TableDBGrid->Fields[0]->DisplayLabel="№";

DirectoryForm->TableDBGrid->Fields[1]->DisplayLabel="Наименование";

DirectoryForm->TableDBGrid->Fields[2]->DisplayLabel="Телефон";

DirectoryForm->TableDBGrid->Fields[3]->DisplayLabel="Руководитель";

DirectoryForm->TableDBGrid->Fields[4]->DisplayLabel="Режим работы";

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N5Click(TObject *Sender)

{

/* закрытие главной формы */

mainclientsform->Close();

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N6Click(TObject *Sender)

{

/* просмотр таблицы источники документы */

mainflag=false;

mainclientsform->DataSource1->DataSet=mainclientsform->ADOTable3;

mainclientsform->ADOTable3->Active=true;

BuildGridDatabaseDirectoryItem("Исполнение", mainclientsform->DataSource1,mainclientsform,"DBDirectoryTemplateForm" );

DirectoryForm->TableDBGrid->Fields[0]->DisplayLabel="№";

DirectoryForm->TableDBGrid->Fields[1]->DisplayLabel="Дата исполнения";

DirectoryForm->TableDBGrid->Fields[2]->DisplayLabel="Отчеты";

DirectoryForm->TableDBGrid->Fields[3]->DisplayLabel="Работы";

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N7Click(TObject *Sender)

{

/* просмотр таблицы корреспондент */

mainflag=false;

mainclientsform->DataSource1->DataSet=mainclientsform->ADOTable4;

mainclientsform->ADOTable4->Active=true;

BuildGridDatabaseDirectoryItem("Размещение", mainclientsform->DataSource1,mainclientsform,"DBDirectoryTemplateForm" );

DirectoryForm->TableDBGrid->Fields[0]->DisplayLabel="№";

DirectoryForm->TableDBGrid->Fields[1]->DisplayLabel="Корпус";

DirectoryForm->TableDBGrid->Fields[2]->DisplayLabel="Этаж";

DirectoryForm->TableDBGrid->Fields[3]->DisplayLabel="Комната";

DirectoryForm->TableDBGrid->Fields[4]->DisplayLabel="Ip";

DirectoryForm->TableDBGrid->Fields[5]->DisplayLabel="Шлюз";

DirectoryForm->TableDBGrid->Fields[6]->DisplayLabel="Hub";

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N8Click(TObject *Sender)

{

/* просмотр таблицы статус */

mainflag=false;

mainclientsform->DataSource1->DataSet=mainclientsform->ADOTable5;

mainclientsform->ADOTable5->Active=true;

BuildGridDatabaseDirectoryItem("Неисправности", mainclientsform->DataSource1,mainclientsform,"DBDirectoryTemplateForm" );

DirectoryForm->TableDBGrid->Fields[0]->DisplayLabel="№";

DirectoryForm->TableDBGrid->Fields[1]->DisplayLabel="Станция";

DirectoryForm->TableDBGrid->Fields[2]->DisplayLabel="Блок";

DirectoryForm->TableDBGrid->Fields[3]->DisplayLabel="Наименование";

DirectoryForm->TableDBGrid->Fields[4]->DisplayLabel="Код размещения";

DirectoryForm->TableDBGrid->Fields[5]->DisplayLabel="Код сотрудника";

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N9Click(TObject *Sender)

{

mainflag=false;

/* просмотр таблицы исполнитель */

mainclientsform->DataSource1->DataSet=mainclientsform->ADOTable6;

mainclientsform->ADOTable6->Active=true;

BuildGridDatabaseDirectoryItem("Заказчик", mainclientsform->DataSource1,mainclientsform,"DBDirectoryTemplateForm" );

DirectoryForm->TableDBGrid->Fields[0]->DisplayLabel="№";

DirectoryForm->TableDBGrid->Fields[1]->DisplayLabel="Фамилия";

DirectoryForm->TableDBGrid->Fields[2]->DisplayLabel="Имя";

DirectoryForm->TableDBGrid->Fields[3]->DisplayLabel="Отчество";

DirectoryForm->TableDBGrid->Fields[4]->DisplayLabel="Телефон";

DirectoryForm->TableDBGrid->Fields[5]->DisplayLabel="Моб телефон";

DirectoryForm->TableDBGrid->Fields[6]->DisplayLabel="Код отдела";

}//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N10Click(TObject *Sender)

{

mainflag=false;

/* просмотр таблицы резолюция */

mainclientsform->DataSource1->DataSet=mainclientsform->ADOTable7;

mainclientsform->ADOTable7->Active=true;

BuildGridDatabaseDirectoryItem("Заказ", mainclientsform->DataSource1,mainclientsform,"DBDirectoryTemplateForm" );

DirectoryForm->TableDBGrid->Fields[0]->DisplayLabel="№";

DirectoryForm->TableDBGrid->Fields[1]->DisplayLabel="Дата";

DirectoryForm->TableDBGrid->Fields[2]->DisplayLabel="Наименование";

DirectoryForm->TableDBGrid->Fields[3]->DisplayLabel="Количество";

DirectoryForm->TableDBGrid->Fields[4]->DisplayLabel="Срок доставки";

}//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N11Click(TObject *Sender)

{

mainflag=false;

/* просмотр таблицы отдел */

mainclientsform->DataSource1->DataSet=mainclientsform->ADOTable8;

mainclientsform->ADOTable8->Active=true;

BuildGridDatabaseDirectoryItem("Сотрудник", mainclientsform->DataSource1,mainclientsform,"DBDirectoryTemplateForm" );

DirectoryForm->TableDBGrid->Fields[0]->DisplayLabel="№";

DirectoryForm->TableDBGrid->Fields[1]->DisplayLabel="Должность";

DirectoryForm->TableDBGrid->Fields[2]->DisplayLabel="Фамилия";

DirectoryForm->TableDBGrid->Fields[3]->DisplayLabel="Имя";

DirectoryForm->TableDBGrid->Fields[4]->DisplayLabel="Отчество";

DirectoryForm->TableDBGrid->Fields[5]->DisplayLabel="Телефон";

DirectoryForm->TableDBGrid->Fields[6]->DisplayLabel="Моб телефон";

DirectoryForm->TableDBGrid->Fields[7]->DisplayLabel="Статус";

}//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N12Click(TObject *Sender)

{

/* просмотр базы данных */

mainclientsform->N3Click(Sender);

mainflag=true;

flag1=true;

flag2=false;

BuildaddForms("Просмотр базы данных", mainclientsform->DataSource1,mainclientsform,"addforms" );

ProsmForm->GroupBox2->Visible=false;

ProsmForm->GroupBox3->Visible=false;

ProsmForm->GroupBox1->Visible=false;

ProsmForm->GroupBox4->Visible=false;

ProsmForm->GroupBox5->Visible=false;

ProsmForm->Height=800;

mainclientsform->DataSource1->DataSet->Last();

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N16Click(TObject *Sender)

{

mainflag=false;

flag1=false;

flag2=true;

/* добавление записи исполнитель/отдел */

BuildaddForms("Заказчик / отдел", mainclientsform->DataSource1,mainclientsform,"addforms" );

ProsmForm->GroupBox2->Visible=false;

ProsmForm->GroupBox3->Visible=false;

ProsmForm->GroupBox1->Visible=true;

ProsmForm->GroupBox4->Visible=false;

ProsmForm->GroupBox5->Visible=false;

ProsmForm->GroupBox7->Visible=false;

ProsmForm->Height=400;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N17Click(TObject *Sender)

{

mainflag=false;

/* добавление записи Неисправность*/

BuildaddForms("Неисправность", mainclientsform->DataSource1,mainclientsform,"addforms" );

ProsmForm->GroupBox1->Visible=false;

ProsmForm->GroupBox3->Visible=false;

ProsmForm->GroupBox4->Visible=false;

ProsmForm->GroupBox2->Visible=true;

ProsmForm->GroupBox5->Visible=false;

ProsmForm->Height=400;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N18Click(TObject *Sender)

{

/* добавление записи резолюция*/

mainflag=false;

BuildaddForms(" Резолюцию", mainclientsform->DataSource1,mainclientsform,"addforms" );

ProsmForm->GroupBox1->Visible=false;

ProsmForm->GroupBox2->Visible=false;

ProsmForm->GroupBox3->Visible=true;

ProsmForm->GroupBox4->Visible=false;

ProsmForm->GroupBox5->Visible=false;

ProsmForm->Height=400;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N19Click(TObject *Sender)

{

mainflag=false;

/* добавление записи вид документа*/

BuildaddForms("Вид документа", mainclientsform->DataSource1,mainclientsform,"addforms" );

ProsmForm->GroupBox1->Visible=false;

ProsmForm->GroupBox2->Visible=false;

ProsmForm->GroupBox3->Visible=false;

ProsmForm->GroupBox4->Visible=true;

ProsmForm->GroupBox5->Visible=false;

ProsmForm->GroupBox7->Visible=false;

ProsmForm->Height=400;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N14Click(TObject *Sender)

{

/* добавление записи документ*/

BuildaddForms("Создать заявку", mainclientsform->DataSource1,mainclientsform,"addforms" );

ProsmForm->GroupBox1->Visible=false;

ProsmForm->GroupBox2->Visible=false;

ProsmForm->GroupBox3->Visible=false;

ProsmForm->GroupBox4->Visible=false;

ProsmForm->GroupBox5->Visible=true;

ProsmForm->GroupBox7->Visible=false;

ProsmForm->Height=400;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::DataSource1DataChange(TObject *Sender,

TField *Field)

{

/* просмотр записей таблицы*/

if (mainflag )

{

if (flag2) {

int kodzakazchik,kodispoln,kodsotr, kod_neispr,kodzakaz, kodzayavka;

String notes, status;

kodzakazchik =mainclientsform->DataSource1->DataSet->FieldByName("kodzakazchik")->AsInteger;

kodispoln =mainclientsform->DataSource1->DataSet->FieldByName("kodispoln")->AsInteger;

kodsotr =mainclientsform->DataSource1->DataSet->FieldByName("kodsotr")->AsInteger;

kod_neispr =mainclientsform->DataSource1->DataSet->FieldByName("kod_neispr")->AsInteger;

kodzakaz =mainclientsform->DataSource1->DataSet->FieldByName("kodzakaz")->AsInteger;

kodzayavka=mainclientsform->DataSource1->DataSet->FieldByName("kodzayavka")->AsInteger;

notes=mainclientsform->DataSource1->DataSet->FieldByName("notes")->AsString;

status=mainclientsform->DataSource1->DataSet->FieldByName("otmetka")->AsString;

ProsmForm1->Edit70->Text=IntToStr(kodzayavka);

ProsmForm1->Edit71->Text=status;

ProsmForm1->Edit72->Text=notes;

TLocateOptions Options;

Options << loPartialKey,loCaseInsensitive;

mainclientsform->ADOTable3->Active=true;

mainclientsform->ADOTable3->Locate("kodispoln",kodispoln,Options);

ProsmForm1->Edit78->Text=DateToStr(mainclientsform->ADOTable3->FieldByName("dateispoln")->AsDateTime);

ProsmForm1->Edit74->Text=mainclientsform->ADOTable3->FieldByName("otchet")->AsString;

ProsmForm1->Edit76->Text=mainclientsform->ADOTable3->FieldByName("rabot")->AsString;

mainclientsform->ADOTable6->Active=true;

mainclientsform->ADOTable6->Locate("kodzakazchik", kodzakazchik,Options);

ProsmForm1->Edit75->Text=mainclientsform->ADOTable6->FieldByName("fam")->AsString;

ProsmForm1->Edit77->Text=mainclientsform->ADOTable6->FieldByName("name")->AsString;

ProsmForm1->Edit80->Text=mainclientsform->ADOTable6->FieldByName("secname")->AsString;

ProsmForm1->Edit67->Text=mainclientsform->ADOTable6->FieldByName("telefone")->AsString;

ProsmForm1->Edit65->Text=mainclientsform->ADOTable6->FieldByName("mob")->AsString;

mainclientsform->ADOTable5->Active=true;

mainclientsform->ADOTable5->Locate("kod_neispr", kod_neispr,Options);

ProsmForm1->Edit64->Text=mainclientsform->ADOTable5->FieldByName("naimenovanie")->AsString;

ProsmForm1->Edit83->Text=mainclientsform->ADOTable5->FieldByName("block")->AsString;

ProsmForm1->Edit86->Text=mainclientsform->ADOTable5->FieldByName("station")->AsString;

mainclientsform->ADOTable7->Active=true;

mainclientsform->ADOTable7->Locate("kodzakaz", kodzakaz,Options);

ProsmForm1->Edit82->Text=mainclientsform->ADOTable7->FieldByName("naimenovanie")->AsString;

ProsmForm1->Edit87->Text=mainclientsform->ADOTable7->FieldByName("kolvo")->AsString;

mainclientsform->ADOTable8->Active=true;

mainclientsform->ADOTable8->Locate("kodsotr", kodsotr,Options);

ProsmForm1->Edit79->Text=mainclientsform->ADOTable8->FieldByName("fam")->AsString;

ProsmForm1->Edit88->Text=mainclientsform->ADOTable8->FieldByName("name")->AsString;

ProsmForm1->Edit66->Text=mainclientsform->ADOTable8->FieldByName("otch")->AsString;

ProsmForm1->Edit19->Text=mainclientsform->ADOTable8->FieldByName("telefon")->AsString;

ProsmForm1->Edit20->Text=mainclientsform->ADOTable8->FieldByName("mobtel")->AsString;

}

}

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N20Click(TObject *Sender)

{

// настройка параметров поиска

nomer_poisk=1;

int i;

for ( int i = mainclientsform->MDIChildCount-1; i>=0; i--)

{

if (mainclientsform->MDIChildren[i]->Name == "addforms")

{

mainclientsform->MDIChildren[i]->Free();} }

for ( int i = mainclientsform->MDIChildCount-1; i>=0; i--)

{

if (mainclientsform->MDIChildren[i]->Name == "DBDirectoryTemplateForm")

{

mainclientsform->MDIChildren[i]->Free();} }

BuildPoiskForms("Параметры поиска", mainclientsform->DataSource1,mainclientsform,"parampoiskform" );

Poisk->GroupBox3->Visible=false;

Poisk->GroupBox2->Visible=false;

Poisk->GroupBox1->Visible=true;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N23Click(TObject *Sender)

{

// настройка параметров поиска

nomer_poisk=4;

int i;

for ( int i = mainclientsform->MDIChildCount-1; i>=0; i--)

{

if (mainclientsform->MDIChildren[i]->Name == "addforms")

{

mainclientsform->MDIChildren[i]->Free();} }

for ( int i = mainclientsform->MDIChildCount-1; i>=0; i--)

{

if (mainclientsform->MDIChildren[i]->Name == "DBDirectoryTemplateForm")

{

mainclientsform->MDIChildren[i]->Free();} }

BuildPoiskForms("Параметры поиска", mainclientsform->DataSource1,mainclientsform,"parampoiskform" );

Poisk->GroupBox1->Visible=false;

Poisk->GroupBox2->Visible=true;

Poisk->GroupBox3->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N22Click(TObject *Sender)

{

// настройка параметров поиска

nomer_poisk=3;

int i;

for ( int i = mainclientsform->MDIChildCount-1; i>=0; i--)

{

if (mainclientsform->MDIChildren[i]->Name == "addforms")

{

mainclientsform->MDIChildren[i]->Free();} }

for ( int i = mainclientsform->MDIChildCount-1; i>=0; i--)

{

if (mainclientsform->MDIChildren[i]->Name == "DBDirectoryTemplateForm")

{

mainclientsform->MDIChildren[i]->Free();} }

//

BuildPoiskForms("Параметры поиска", mainclientsform->DataSource1,mainclientsform,"parampoiskform" );

Poisk->GroupBox1->Visible=false;

Poisk->GroupBox1->Caption="Неотработанные документы";

Poisk->GroupBox2->Visible=false;

Poisk->GroupBox3->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N21Click(TObject *Sender)

{

// настройка параметров поиска

nomer_poisk=2;

int i;

for ( int i = mainclientsform->MDIChildCount-1; i>=0; i--)

{

if (mainclientsform->MDIChildren[i]->Name == "addforms")

{

mainclientsform->MDIChildren[i]->Free();} }

for ( int i = mainclientsform->MDIChildCount-1; i>=0; i--)

{

if (mainclientsform->MDIChildren[i]->Name == "DBDirectoryTemplateForm")

{

mainclientsform->MDIChildren[i]->Free();} }

BuildPoiskForms("Параметры поиска", mainclientsform->DataSource1,mainclientsform,"parampoiskform" );

Poisk->GroupBox1->Visible=false;

Poisk->GroupBox2->Visible=false;

Poisk->GroupBox3->Visible=true;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::FormCreate(TObject *Sender)

{

/* настройка соединения бвзы данных при открытии */

WideString NewConnection;

WideString qqq;

ADOConnection1->Close();

// указываем файл .udl для ADOConnection1

ADOConnection1->ConnectionString ="Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=ksk;Data Source=MICROSOF-203043";

ADOConnection1->Open();

mainclientsform->ADOTable1->Active=true;

mainclientsform->ADOTable2->Active=true;

mainclientsform->ADOTable3->Active=true;

mainclientsform->ADOTable4->Active=true;

mainclientsform->ADOTable5->Active=true;

mainclientsform->ADOTable6->Active=true;

mainclientsform->ADOTable7->Active=true;

mainclientsform->ADOTable8->Active=true;

}

//---------------------------------------------------------------------------

void __fastcall Tmainclientsform::N24Click(TObject *Sender)

{

mainclientsform->N3Click(Sender);

mainflag=true;

flag2=true;

flag1=false;

BuildaddForms1("Просмотр базы данных", mainclientsform->DataSource1,mainclientsform,"addforms" );

ProsmForm1->GroupBox2->Visible=false;

ProsmForm1->GroupBox3->Visible=false;

ProsmForm1->GroupBox1->Visible=false;

ProsmForm1->GroupBox4->Visible=false;

ProsmForm1->GroupBox5->Visible=false;

ProsmForm1->GroupBox7->Visible=true;

ProsmForm1->Top=150;

ProsmForm1->Height=1000;

ProsmForm1->Width=800;

mainclientsform->DataSource1->DataSet->Last();

}

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------

Модуль addsource.cpp

//---------------------------------------------------------------------------

// подключение модулей и задания пространства имен

#include <vcl.h>

#pragma hdrstop

#include "main.h"

#include "add.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

// описание переменных

Taddforms *addforms;

String Fam, Name1, Sec_Name, Dep, Dolg, Tel, Adres;

String Naimen, Proekc, Inter, Comput, Notes,ruk;

String Ucast, Obesp, Razmesh, mob ;

int Mesto, Kodzaka;

String Technika, Organiz, Content, Target, Firma, regim, telotd;

TDateTime Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Cont, Vremya;

int kodzayav, koduch, kodvid, kodzal, kodob, kodsod, otvup, otgot;

//---------------------------------------------------------------------------

__fastcall Taddforms::Taddforms(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall Taddforms::FormClose(TObject *Sender, TCloseAction &Action)

{

// закрытие формы

Action=caFree;

}

//---------------------------------------------------------------------------

void __fastcall Taddforms::Button1Click(TObject *Sender)

{

// добавление данных отдел

Fam = Edit1->Text;

Name1 = Edit2->Text;

Sec_Name= Edit3->Text;

Dep = Edit4->Text;

telotd = Edit5->Text;

Tel = Edit6->Text;

mob = Edit7->Text;

ruk = Edit89->Text;

regim =Edit90->Text;

mainclientsform->ADOTable2->Active=true;

mainclientsform->ADOTable2->Insert();

mainclientsform->ADOTable2->FieldByName("naimenovanie")->AsString= Dep ;

mainclientsform->ADOTable2->FieldByName("tel")->AsString = Tel;

mainclientsform->ADOTable2->FieldByName("ruk")->AsString = ruk;

mainclientsform->ADOTable2->FieldByName("regime")->AsString = regim;

mainclientsform->ADOTable2->Post();

int kodotd;

kodotd= mainclientsform->ADOTable2->FieldByName("kodotd")->AsInteger;

// добавление данных исполнитель

mainclientsform->ADOTable6->Active=true;

mainclientsform->ADOTable6->Insert();

mainclientsform->ADOTable6->FieldByName("fam")->AsString = Fam;

mainclientsform->ADOTable6->FieldByName("name")->AsString = Name1;

mainclientsform->ADOTable6->FieldByName("secname")->AsString = Sec_Name;

mainclientsform->ADOTable6->FieldByName("telefone")->AsString= Dolg;

mainclientsform->ADOTable6->FieldByName("mob")->AsString = Tel;

mainclientsform->ADOTable6->FieldByName("kodotd")->AsInteger= kodotd;

mainclientsform->ADOTable6->Post();

}

//---------------------------------------------------------------------------

void __fastcall Taddforms::Button2Click(TObject *Sender)

{

// добавление данных корреспондент

Naimen = Edit8->Text;

String station, block;

String korpus, etag, komnata, ip, shluse, hub;

int kodrazm;

korpus= Edit11->Text;

etag= Edit12->Text;

komnata = Edit13->Text;

ip = Edit91->Text;

shluse=Edit92->Text;

hub=Edit93->Text;

mainclientsform->ADOTable4->Active=true;

mainclientsform->ADOTable4->Insert();

mainclientsform->ADOTable4->FieldByName("korpus")->AsString = korpus;

mainclientsform->ADOTable4->FieldByName("etag")->AsString = etag;

mainclientsform->ADOTable4->FieldByName("komnata")->AsString = komnata;

mainclientsform->ADOTable4->FieldByName("ip")->AsString = ip;

mainclientsform->ADOTable4->FieldByName("shluse")->AsString = shluse;

mainclientsform->ADOTable4->FieldByName("hub")->AsString = hub;

mainclientsform->ADOTable4->Post();

kodrazm= mainclientsform->ADOTable4->FieldByName("kodrazm")->AsInteger;

// добавление данных

Naimen = Edit8->Text;

station = Edit9->Text;

block = Edit10->Text;

mainclientsform->ADOTable5->Active=true;

mainclientsform->ADOTable5->Insert();

mainclientsform->ADOTable5->FieldByName("naimenovanie")->AsString = Naimen;

mainclientsform->ADOTable5->FieldByName("station")->AsString = station;

mainclientsform->ADOTable5->FieldByName("block")->AsString = block;

mainclientsform->ADOTable5->FieldByName("kodrazm")->AsInteger = kodrazm;

mainclientsform->ADOTable5->Post();

}

//---------------------------------------------------------------------------

void __fastcall Taddforms::Button3Click(TObject *Sender)

{

String naimenovanie,kolvo;

// добавление данных резолюция

naimenovanie = Edit14->Text;

Date1=StrToDate(Edit15->Text);

Date2=StrToDate(Edit94->Text);

kolvo=Edit16->Text;;

mainclientsform->ADOTable7->Active=true;

mainclientsform->ADOTable7->Insert();

mainclientsform->ADOTable7->FieldByName("naimenovanie")->AsString = naimenovanie;

mainclientsform->ADOTable7->FieldByName("date")->AsDateTime=Date1;

mainclientsform->ADOTable7->FieldByName("srok")->AsDateTime=Date2;

mainclientsform->ADOTable7->FieldByName("kolvo")->AsString = kolvo;

mainclientsform->ADOTable7->Post();

}

//---------------------------------------------------------------------------

void __fastcall Taddforms::Button4Click(TObject *Sender)

{

String otchet,rabot;

Date1=StrToDate(Edit25->Text);

rabot=Edit26->Text;

otchet=Edit24->Text;

// добавление данных типы документов

// добавление данных

mainclientsform->ADOTable3->Active=true;

mainclientsform->ADOTable3->Insert();

mainclientsform->ADOTable3->FieldByName("otchet")->AsString = otchet;

mainclientsform->ADOTable3->FieldByName("rabot")->AsString = rabot;

mainclientsform->ADOTable3->FieldByName("dateispoln")->AsDateTime=Date1;

mainclientsform->ADOTable3->Post();

}

//---------------------------------------------------------------------------

void __fastcall Taddforms::Button5Click(TObject *Sender)

{

int kodzakazchik,kodispoln,kodsotr, kod_neispr,kodzakaz;

// добавление документа

String notes, status;

kodzakazchik=(Edit18->Text).ToInt();

kodispoln=(Edit34->Text).ToInt();

kodsotr=(Edit37->Text).ToInt();

kod_neispr =(Edit31->Text).ToInt();

kodzakaz =(Edit33->Text).ToInt();

status=Edit17->Text;

notes=Edit32->Text;

mainclientsform->ADOTable1->Active=true;

mainclientsform->ADOTable1->Insert();

mainclientsform->ADOTable1->FieldByName("kodzakazchik")->AsInteger = kodzakazchik;

mainclientsform->ADOTable1->FieldByName("notes")->AsString = notes;

mainclientsform->ADOTable1->FieldByName("otmetka")->AsString =status;

mainclientsform->ADOTable1->FieldByName("kodispoln")->AsInteger = kodispoln;

mainclientsform->ADOTable1->FieldByName("kodsotr")->AsString = kodsotr;

mainclientsform->ADOTable1->FieldByName("kod_neispr")->AsInteger =kod_neispr;

mainclientsform->ADOTable1->FieldByName("kodzakaz")->AsInteger =kodzakaz;

mainclientsform->ADOTable1->Post();

}

//---------------------------------------------------------------------------

Parampoisk.cpp

//---------------------------------------------------------------------------

// подключение модулей и задания пространства имен

#include <vcl.h>

#include "main.h"

#include "ChildTemlate.h"

#pragma hdrstop

#include "parampoisk.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

#include "main.h"

extern nomer_poisk;

extern Poisk;

Tparampoiskform *parampoiskform;

TParameter *P1;

String stroka_SQL,S;

TDateTime Data;

//---------------------------------------------------------------------------

__fastcall Tparampoiskform::Tparampoiskform(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall Tparampoiskform::FormClose(TObject *Sender,

TCloseAction &Action)

{

// закрытие формы

Action=caFree;

}

void BuildChildForms(String sCaption, TDataSource *ds,

TForm *AFormName,String AMDIChildName )

{ int i;

for ( int i = AFormName->MDIChildCount-1; i>=0; i--)

{

if (AFormName->MDIChildren[i]->Name == AMDIChildName)

{

AFormName->MDIChildren[i]->Free();

// Break;

} }

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

ChildTemplateForm= new TChildTemplateForm(Application);

ChildTemplateForm->Top=230;

ChildTemplateForm->Left=0;

ChildTemplateForm->Width=1200;

ChildTemplateForm->Height=400;

ChildTemplateForm->Caption=sCaption;

}

//---------------------------------------------------------------------------

void __fastcall Tparampoiskform::Button1Click(TObject *Sender)

{

// выполнение поиска

BuildChildForms("Результаты_поиска", mainclientsform->DataSource1,mainclientsform,"ChildTemplateForm" );

ChildTemplateForm->Left=0;

ChildTemplateForm->Top=3;

mainclientsform->DataSource1->DataSet=mainclientsform->ADOQuery2;

mainclientsform->ADOQuery2->Active=false;

mainclientsform->ADOQuery2->SQL->Clear();

if (nomer_poisk ==1)

{

// поиск документа по номеру

P1=mainclientsform->ADOQuery2->Parameters->AddParameter();

S=Edit3->Text;

P1->Name="P1";

P1->DataType=ftString;

P1->Direction = ptInput;

P1->Value=S;

//P1->Size=Length(S);

P1->Value=S;

stroka_SQL="SELECT * FROM Zayavka,ispolnenie WHERE (((Zayavka.kodzayavka)=:P1) and (ispolnenie.kodispoln=Zayavka.kodispoln))";

if (stroka_SQL!="")

{

mainclientsform->ADOQuery2->SQL->Add(stroka_SQL);

mainclientsform->ADOQuery2->Active=true;

mainclientsform->ADOQuery2->ExecSQL();

}

}

if (nomer_poisk ==2)

{

// поиск документа по дате регистрации

Data=StrToDate(Edit2->Text);

P1=mainclientsform->ADOQuery2->Parameters->AddParameter();

P1->Name="P1";

P1->DataType=ftDate;

P1->Direction = ptInput;

P1->Value=Data;

stroka_SQL="select * from zayavka,ispolnenie where ispolnenie.dateispoln=:P1 " ;

if (stroka_SQL!="")

{

mainclientsform->ADOQuery2->SQL->Add(stroka_SQL);

mainclientsform->ADOQuery2->Active=true;

mainclientsform->ADOQuery2->ExecSQL();

}

}

if (nomer_poisk ==3)

{

// поиск документа поиск неотработанных документов

P1=mainclientsform->ADOQuery2->Parameters->AddParameter();

P1->Name="P1";

P1->DataType=ftInteger;

P1->Direction = ptInput;

P1->Value=1;

stroka_SQL="SELECT * FROM Zayavka,ispolnenie WHERE (((Zayavka.otmetka)<>'выполнено') and (ispolnenie.kodispoln=Zayavka.kodispoln))" ;

if (stroka_SQL!="")

{

mainclientsform->ADOQuery2->SQL->Add(stroka_SQL);

mainclientsform->ADOQuery2->Active=true;

mainclientsform->ADOQuery2->ExecSQL();

}

}

if (nomer_poisk ==4)

{

// поиск исполнителей по фамилии

P1=mainclientsform->ADOQuery2->Parameters->AddParameter();

S=Edit1->Text;

P1->Name="P1";

P1->DataType=ftString;

P1->Direction = ptInput;

S="%"+ S+"%";

P1->Value=S;

// P1->Size=Length(S);

P1->Value=S;

stroka_SQL="select * from Sotrudnyk where Sotrudnyk.Fam Like :P1" ;

if (stroka_SQL!="")

{

mainclientsform->ADOQuery2->SQL->Add(stroka_SQL);

mainclientsform->ADOQuery2->Active=true;

mainclientsform->ADOQuery2->ExecSQL();

}

}

}

//---------------------------------------------------------------------------

/---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "DBDirectoryTemplate.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TDBDirectoryTemplateForm *DBDirectoryTemplateForm;

//---------------------------------------------------------------------------

__fastcall TDBDirectoryTemplateForm::TDBDirectoryTemplateForm(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TDBDirectoryTemplateForm::FormClose(TObject *Sender,

TCloseAction &Action)

{

Action=caFree;

}

//---------------------------------------------------------------------------

---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "main.h"

#include "ChildTemlate.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#include <ComObj.hpp>

#include <utilcls.h>

#pragma resource "*.dfm"

TChildTemplateForm *ChildTemplateForm;

Variant vVarApp,vVarBooks,vVarBook,

vVarSheets,vVarSheet,vVarCell;

//---------------------------------------------------------------------------

__fastcall TChildTemplateForm::TChildTemplateForm(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TChildTemplateForm::FormClose(TObject *Sender,

TCloseAction &Action)

{

Action=caFree;

}

//---------------------------------------------------------------------------

void __fastcall TChildTemplateForm::Button1Click(TObject *Sender)

{

vVarApp=CreateOleObject("Excel.Application");

Variant ws = Unassigned;

AnsiString put = ExtractFilePath(Application->ExeName);

const AnsiString asFileName(put + "zayavka.xlt");

vVarApp.OlePropertySet("Visible",true);

vVarApp.OlePropertyGet("Workbooks").OleProcedure("Open", asFileName.c_str());

ws = vVarApp.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);

mainclientsform->ADOQuery2->First();

int i = 1; // pervaya stroka v Excel

int j; // perviy stolbec

while (!mainclientsform->ADOQuery2->Eof) {

j = 0;

String A= DateToStr(mainclientsform->ADOQuery2->FieldByName("dateispoln")->AsString);

ws.OlePropertyGet("Cells").OlePropertyGet("Cells", i+5, 2).OlePropertySet("Value", WideString(A));

A= mainclientsform->ADOQuery2->FieldByName("otmetka")->AsString;

ws.OlePropertyGet("Cells").OlePropertyGet("Cells", i+5, 3).OlePropertySet("Value", WideString(A));

A= IntToStr(mainclientsform->ADOQuery2->FieldByName("kodzayavka")->AsInteger);

ws.OlePropertyGet("Cells").OlePropertyGet("Cells", i+5, 4).OlePropertySet("Value", WideString(A));

A= mainclientsform->ADOQuery2->FieldByName("otchet")->AsString;

ws.OlePropertyGet("Cells").OlePropertyGet("Cells", i+5, 5).OlePropertySet("Value", WideString(A));

A= mainclientsform->ADOQuery2->FieldByName("rabot")->AsString;

ws.OlePropertyGet("Cells").OlePropertyGet("Cells", i+5, 6).OlePropertySet("Value", WideString(A));

i++;

mainclientsform->ADOQuery2->Next();

}

}

//------