АРМ менеджера по продажам комплектующих
Министерство образования и науки Республики Беларусь
Белорусский Государственный Университет Информатики и Радиоэлектроники
Факультет информационных технологий и управления
Кафедра информационных технологий автоматизированных систем
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по курсу «Базы и банки данных»
на тему
«АРМ менеджера по продажам комплектующих»
Минск 2000
Содержание
Введение
Обзор возможностей Visual Foxpro
Обзор базовых классов и элементов управления Microsoft Visual Foxpro
Описание функций и возможностей языка SQL
Постановка задачи
Руководство пользователя
Заключение
Список использованных источников
Приложение 1. Листинг программы
Введение
Базы данных нужны человеку для систематизации своих знаний. На основе этой систематизации он может создать новые знания. Так или иначе, любая база данных служит человеку именно для описания происшедших в прошлом событий и на основе знания этих событий помогает принять то или иное решение на будущее. Поясним эту мысль примерами. Начнем с простых случаев. К примеру, описание склада необходимо для знания наличия на складе товаров на основе ввода движения товара на склад и со склада. Иначе, человеку пришлось бы постоянно сверяться с реальным наличием, т.е. пересчитывать товар по-нескольку раз на день перед выписыванием исходящей накладной. Как дополнительная и нужная функция может рассматриваться возможность статистического анализа расхода товара со склада по месяцам. К примеру, есть сезонные колебания расхода медикаментов. На основе таких наблюдений можно прогнозировать план закупок. Бухгалтерские программы позволяют в простейшем случае правильно заплатить налоги. Здесь мы видим классический пример генерации новых знаний, а именно о финансовом состоянии организации, на основе обработки проводок. Более сложным является случай рассмотрения баз знаний. База знаний может быть построена как мультимедийный справочник или как набор текстов и файлов другого формата, проиндексированных по определенным признакам в базе данных. Здесь стоит немного отвлечься и дать определение базы данных в моем понимании этого вопроса. База данных - это набор файлов определенного формата? Да, но не только. База данных - это средство доступа к таким файлам? Да, но не это главное. По моему мнению, база данных - это, прежде всего, хранилище объектов данных, т.е. набора возможных понятий или событий, описываемых базой данных, с возможностью поиска этих объектов по признакам. Неотъемлемой чертой базы данных является возможность связывания объектов между собой. Например, шапка накладной и ее содержание (включение), ИНН и реквизиты организации (ссылка), т.е. уникальное значение в одном из столбиков таблицы и одно или несколько значений из другой таблицы. Такие связи принято называть нормализацией базы данных, но об этом позже. Так вот, это лирическое отступление было мне необходимо для пояснения примера о базах знаний. Я считаю, и думаю, что Вы согласитесь, что базой данных можно считать не только таблицы, индексирующие файлы со знаниями разных форматов, но и сами эти файлы, потому, что они являются не типизированными хранилищами знаний в такой базе данных. Итак, в базах знаний мы накапливаем опыт прошлого. Потом человек может сам принять решение на основе этого опыта (типичный случай с мультимедийным справочником) или поставить задачу перед базой данных по поиску решения согласно сложившейся ситуации (найти закон, поясняющий правило оформления таможенной декларации и т.п.). Так происходит в программах справочного характера, например «Консультант плюс» и т.д. Как частный случай баз данных, можно рассматривать различные структурированные файлы, например словари для переводчиков, форматы файлов RTF, DOC, книги Microsoft Excel, файлы с письмами для почтовых Internet программ и т.д., жизненно важные функции баз данных, в которых реализуются за счет внутренних функций программ работающих с ними. Базы данных могут применяться как вспомогательное средство, позволяющее реализовать какую-то полезную функцию. Например, хранение настроек программы (реестр Microsoft Windows), Internet адресов для рассылки рекламы и т.д. Итак, мы рассмотрели различные базы данных. Этих примеров достаточно, чтобы оценить диапазон применений баз данных в современном мире.
Отличительной чертой баз данных следует считать то, что данные хранятся совместно с их описанием, а в прикладных программах описание данных не содержится. Независимые от программ пользователя данные обычно называются метаданными. В ряде современных систем метаданные, содержащие также информацию о пользователях, форматы отображения, статистику обращения к данным и др. сведения, хранятся в словаре базы данных.
Таким образом, система управления базой данных (СУБД) - важнейший компонент информационной системы. Для создания и управления информационной системой СУБД необходима в той же степени, как для разработки программы на алгоритмическом языке необходим транслятор. Основные функции СУБД:
управление данными во внешней памяти (на дисках);
управление данными в оперативной памяти;
журнализация изменениий и восстановление базы данных после сбоев;
поддержание языков БД (язык определения данных, язык манипулирования данными).
Обычно современная СУБД содержит следующие компоненты (см. рис. 1):
ядро, которое отвечает за управление данными во внешней и оперативной памяти и журнализацию,
процессор языка базы данных, обеспечивающий оптимизацию запросов на извлечение и изменение данных и создание, как правило, машинно-независимого исполняемого внутреннего кода,
подсистему поддержки времени исполнения, которая интерпретирует программы манипуляции данными, создающие пользовательский интерфейс с СУБД
а также сервисные программы (внешние утилиты), обеспечивающие ряд дополнительных возможностей по обслуживанию информационной системы.
Рис.1 Компоненты СУБД
Создание первых баз данных и СУБД стало возможно лишь с появлением достаточно дешевых и производительных устройств внешней памяти, какими стали жесткие диски (винчестеры), появившиеся во второй половине 60-х годов. В 70-е годы шла интенсивная разработка теоретических вопросов построения баз данных. В результате в начале 80-х годов на рынке появились мощные инструментальные средства проектирования и построения информациоонных систем. Однако, развитие информационных технологий в 90-х привело к появлению новых, более широких требований к обработке и представлению данных.
1. Обзор возможностей Visual FoxPro
Visual FoxPro дает вам больше того, что можно было ожидать от системы управления базами данных (СУБД), если говорить о скорости, мощности и гибкости. Более того, Visual FoxPro ведет вас в мир нового поколения Xbase-систем, предоставляя новые объектную и событийную модели, которые помогут вам быстрее, чем прежде, создавать и модифицировать приложения.
Visual FoxPro предлагает следующие средства и возможности:
Быстрая разработка приложений:
Мастера и построители:
Если вы хотите быстро получать результаты, мастера ѕ это то, что вам нужно. Они разбивают часто встречающиеся в Visual FoxPro задачи на ряд элементарных шагов, сопровождая каждый из них подробными инструкциями по его выполнению. Например, мастер таблиц руководит процессом создания таблицы, мастер формы рассказывает, как строить форму, а мастер запроса показывает, как составить стандартный запрос.
Построители ѕ это визуальные инструментальные средства, помогающие создавать элементы управления согласно вашим спецификациям. Например, построитель списков представляет собой диалоговое окно с вкладками, с помощью которого можно сконструировать список в данной форме. Этот построитель позволит задать свойства вашего списка.
Конструкторы Visual FoxPro:
Если вы хотите обладать более широкими возможностями контроля по сравнению с теми, которые предоставляют мастера и построители, используйте конструкторы Visual FoxPro. Конструкторы обеспечивают графический интерфейс, посредством которого вы можете создавать те или иные компоненты своего приложения. Например, вы можете определить форму с помощью конструктора форм или сконструировать таблицу с помощью конструктора таблиц.
Стандартные интерфейсы приложений
В Visual FoxPro вы можете с помощью конструктора форм включать в приложения мощные элементы управления, которые выступают в роли интерфейсов, не требуя (или почти не требуя) при этом никакого кодирования. Элемент управления сетка, связанный с одной из таблиц, позволит без труда создавать формы, отражающие отношение один-ко-многим: достаточно мышью наложить таблицу на данную форму, чтобы сформировать элемент управления сетка. Чтобы обеспечить совместимость с другими приложениями, вы можете при помощи элемента управления кадр страницы создавать диалоги с вкладками или собственные интерфейсы конструирования.
Расширенные возможности разработки
Объектно-ориентированное программирование
Хотя система Visual FoxPro по-прежнему поддерживает стандартные методы процедурного программирования Xbase, теперь в ее состав включены средства самого настоящего объектно-ориентированного программирования. С помощью объектной модели Visual FoxPro вы можете получить доступ ко всем возможностям объектно-ориентированного программирования, включая наследование, инкапсуляцию, полиморфизм и подклассы. Все эти средства реализованы в виде расширений языка Xbase. Вы можете ускорить разработку приложений, воспользовавшись классами. Например, можно создать базовые форму, панель инструментов или страничный кадр с помощью базовых классов Form, Toolbar и PageFrame, предусмотренных в составе Visual FoxPro.
Потом вы можете повторно использовать свой код и формы, определяя новые классы на основе ранее созданных классов. Например, на основе базового класса Form можно создать пользовательский класс, который автоматически придаст всем формам приложения требуемый вид и образ действий.
Модель классов Visual FoxPro дает вам широкие возможности по контролю над объектами вашего приложения. Вы сможете на этапе выполнения управлять внешним видом и поведением объектов формы в том же объеме, что и в конструкторе форм на этапе разработки.
В Visual FoxPro можно создавать классы либо визуально, используя конструктор классов, либо программным путем с помощью команды DEFINE CLASS.
События
В Visual FoxPro можно создавать приложения, полностью управляемые событиями, причем для этого вам не понадобятся ни команды READ различных уровней, ни ограничения окна просмотра, ни самостоятельно написанные программы обработки событий: Visual FoxPro содержит событийную модель, которая выполняет автоматическую обработку событий.
Благодаря этой модели вы получаете доступ ко всем стандартным событиям Windows, таким как движение мыши, данное событие позволяет перемещать объекты с помощью мыши. Вы можете контролировать события либо визуально, используя окно Properties, либо программным путем, с помощью языка Visual FoxPro.
Технология RushMore
Производительность обработки запросов можно резко повысить с помощью технологии Rushmore: это уникальная технология, позволяющая быстро выбирать группы записей из таблиц; с ее помощью время ответа на запрос сокращается с нескольких часов или минут до секунд.
При обращении к отдельным таблицам вы можете пользоваться технологией Rushmore всякий раз, когда встречается предложение FOR.
Взаимодействие с другими приложениями
Панели инструментов
Как и в других приложениях Microsoft, в Visual FoxPro для удобства работы предусмотрены панели инструментов. Они состоят из кнопок, которые представляют часто встречающиеся задачи или часто используемые объекты. Чтобы выполнить задачу или воспользоваться объектом, достаточно нажать соответствующую кнопку.
Вы можете адаптировать панели инструментов, поступающие в составе Visual FoxPro, а также определять пользовательские панели инструментов для своих приложений.
Совместное использование данных с другими приложениями
В Visual FoxPro довольно просто обеспечить совместное использование данных с другими приложениями. Например, пользоваться данными Visual FoxPro совместно с Excel позволяет мастер опорных таблиц, а совместно с Word мастер автоматизированной рассылки.
Можно включать объекты из другого приложения, связывая или внедряя их в таблицы или в формы. Затем эти объекты можно редактировать непосредственно, не выходя из Visual FoxPro.
Автоматизация OLE
Средства автоматизации OLE позволяют расширить возможности приложения: вы можете программным способом контролировать работу других приложений. Например, можно сделать так, чтобы приложение Excel выполнило определенные вычисления, приложение Graph построило график на основании полученных результатов, а затем сохранить этот график в поле типа General в таблице Visual FoxPro - и все это в рамках кода Visual FoxPro.
Импортирование и экспортирование данных
Вы можете импортировать и экспортировать данные между Visual FoxPro и многими другими приложениями, используя разнообразные форматы файлов: текст, электронную таблицу и другие. Данные можно легко добавлять в существующие таблицы. Мастер импорта поможет вам принять решение о структуре, которую будут иметь данные, импортированные в Visual FoxPro.
Средства связанные со средой клиент/сервер
Словарь данных
Базы данных Visual FoxPro (файлы.DBC) предоставляют вам словарь данных, который позволяет определять представления и соединения, а также правила, триггеры и постоянные отношения для любой таблицы, принадлежащей базе данных.
В базе данных можно определять следующие элементы.
Правила уровня поля или уровня записи, соблюдение которых Visual FoxPro отслеживает при каждом использовании таблицы в приложении.
Ключи первичного индекса и индекса-кандидата.
Локальные и удаленные представления.
Триггеры.
Постоянные отношения между таблицами базы данных.
Соединения с удаленными источниками данных.
Хранимые процедуры.
Значения, принимаемые для полей по умолчанию.
Длинные имена таблиц и полей.
Помимо этого, вы можете обеспечить для каждого постоянного отношения целостность на уровне ссылок, определив с помощью построителя ссылочной целостности правила операций добавления, обновления и удаления.
Visual FoxPro также поддерживает значения NULL в таблицах, что существенно повышает совместимость с другими источниками данных, такими как Microsoft Access, Visual Basic и серверы на базе SQL.
Удалённые и гетерогенные представления
Вы можете разработать и протестировать на своем локальном компьютере приложение клиент/сервер, использующее данные из удаленных, локальных или многотабличных гетерогенных представлений. В локальных представлениях используются таблицы, размещенные на локальном компьютере, но не таблицы удаленного сервера, а в многотабличных представлениях ѕ связанные данные из различных таблиц. Можно создавать параметризованные представления, чтобы из сервера извлекалось как можно меньше данных, а затем обновлять удаленные данные из приложения Visual FoxPro.
Транзакции
Вы можете разработать приложение таким образом, чтобы оно обеспечивало совместный доступ к данным. Совместный доступ подразумевает коллективное использование данных несколькими пользователями, а также ограничение доступа в случае необходимости. Применение транзакций и буферизации (жесткой или мягкой, на уровне записей или на уровне таблицы) означает, что вам придется меньше программировать. Процесс обновления данных в многопользовательской среде значительно упрощается благодаря встроенной пакетной обработке и средствам детализированного контроля над конфликтами при обновлении.
Поддержка системы клиент/сервер
Visual FoxPro можно использовать как среду разработки приложений клиент/сервер. В Visual FoxPro сочетается высокоуровневая поддержка обновляемых представлений данных сервера с непосредственным доступом к собственному синтаксису сервера с помощью технологии сквозного запроса SQL pass-through, что обеспечивает солидный фундамент для создания универсальных приложений клиент/сервер. В вашем распоряжении имеется все необходимое для разработки ѕ словарь данных, локальные и удаленные представления, поддержка значений NULL, транзакции, доступ к любому источнику данных ODBC.
2. Обзор базовых классов и элементов управления Microsoft Visual Foxpro
Развитие графического интерфейса пользователя привело к созданию гибкого и мощного инструментария, обеспечивающего в любой момент времени взаимооднозначное соответствие программного кода и разрабатываемых экранных форм. Это позволило уйти от утомительной и постоянной генерации кода.
Элемент управления CheckBox
Создает флажок.
Флажок используется для перехода между двумя состояниями, такими как «истина» (.T.) и «ложь» (.F.), «да» и «нет». Когда требуемое условие истинно, на кнопке флажка появляется значок X. С помощью свойства Caption можно задать текст, который появится возле флажка. Используя свойство Picture, можно задать рисунок флажка.
Объект Column
Создает столбец сетки.
Число столбцов сетки определяется свойством сетки ColumnCount.
Столбец сетки может содержать данные из табличного поля или значение выражения. С помощью свойства DataSource можно задать данные, которые будут фигурировать в столбце. Столбец может содержать элементы управления. Они включаются в столбец сетки с помощью метода AddObject события Init формы, содержащей данную сетку. Чтобы определить активный элемент управления сетки, используйте свойство CurrentControl. Заметьте, что доступ к верхним и нижним колонтитулам Column не может быть получен до возникновения события Init для Grid.
Элемент управления CommandButton
Создает одиночную командную кнопку.
Командная кнопка обычно используется для запуска события, выполняющего некоторое действие, например закрытие формы, переход к другой записи, печать отчета и т.д. Чтобы создать группу командных кнопок, которыми можно манипулировать как индивидуально, так и в целом, используйте элемент управления CommandGroup.
С помощью свойства Caption можно задать текст, появляющийся возле командной кнопки. Используя свойство Picture, можно задать рисунок для командной кнопки.
Вы можете нажать командную кнопку, щелкнув ее мышью или, если значение свойства Default ѕ «истина» (.T.), нажав клавишу ENTER в тот момент, когда командная кнопка выделена. Если значением свойства Cancel командной кнопки является «истина» (.T.), вы можете нажать эту кнопку, нажав клавишу ESC.
Элемент управления CommandGroup
Создает группу командных кнопок.
С помощью элемента управления CommandGroup можно создать группу командных кнопок, которыми можно манипулировать индивидуально и как единым целым. Чтобы создать отдельную командную кнопку, используйте элемент управления CommandButton.
С помощью свойства ButtonCount можно задать количество командных кнопок в группе, а с помощью свойства Caption ѕ название группы командных кнопок.
Элемент управления ComboBox
Создает поле ввода с раскрывающимся списком.
Если выбрать поле ввода с раскрывающимся списком, оно открывается и показывает список элементов, из которых можно выбрать нужный. Элемент управления ComboBox сочетает в себе свойства элементов управления TextBox (текстовое поле) и ListBox (список). Вы можете либо вводить информацию в текстовом поле, либо выбирать элементы из списка.
Тип поля ввода со списком определяется свойством Style. Если значение свойства Style установлено равным 0, создается поле ввода с раскрывающимся списком. Если значение свойства Style равно 2, создается список.
Объект Container
Создает объект, который может вмещать другие объекты.
Объекты-контейнеры могут содержать другие объекты и разрешать доступ к этим объектам. Например, если вы создали объект-контейнер, состоящий их двух списков и двух командных кнопок, а затем включили его в форму, то этими списками и кнопками можно будет манипулировать на этапе разработки и на этапе выполнения.
Объект Custom
Пользовательский класс можно создать с помощью команды DEFINE CLASS или с помощью конструктора классов. Чтобы открыть конструктор классов, выдайте команду CREATE CLASS.
Пользовательские классы - это классы, обладающие свойствами, событиями и методами, но не имеющие визуального представления. Эти классы определяются в соответствии с теми же общими правилами, что и классы других типов.
Элемент управления EditBox
Создает поле редактирования.
Используйте элемент управления EditBox для редактирования переменной памяти, элемента массива, поля или memo-поля, имеющих символьный тип.
В поле редактирования можно пользоваться всеми стандартными возможностями редактирования Visual FoxPro - вырезать, копировать и вставлять фрагменты и т.п. Текст в поле редактирования прокручивается вертикально, а слова переносятся горизонтально.
Объект Form
Создает форму.
Используйте данный объект для создания формы, в которой размещаются элементы управления. Также можете использовать конструктор форм. Формы обладают свойствами, которые определяют их внешний вид (например позицию, размер и цвет) и некоторые аспекты поведения (например возможность изменения размера).
Формы также реагируют на события, инициируемые пользователем или системой. Например, вы можете написать код для процедуры обработки события Click некоторой формы, который будет изменять цвет формы, когда вы щелкнете ее мышью.
Помимо свойств и событий, вы можете использовать методы для манипулирования формами. Например, с помощью метода Move можно изменять местоположение и размер формы.
Конструируя формы, используйте свойство BorderStyle для создания обрамления формы и свойство Caption для определения текста в строке заголовка. Если установить значение свойства BorderStyle равным 0, обрамление будет удалено. В рамках программы можно использовать методы Hide и Show для того, чтобы делать формы прозрачными или видимыми на этапе выполнения.
Элемент управления Grid
Создает сетку.
Сетка - это объект-контейнер, который отображает данные по строкам и столбцам; он напоминает по внешнему виду окно просмотра. Сетка как контейнер содержит объекты-столбцы. Столбец может содержать объект-заголовок и элементы управления. Поскольку сетка, как и ее столбцы, заголовки и элементы управления, имеет собственные наборы свойств, вы получаете полный контроль над каждым элементом сетки. Можно создать сетку интерактивно, используя построитель сетки.
Объект Header
Создает заголовок для столбца элемента управления сетка.
Столбцы, образующие сетку, имеют заголовки. Объект-заголовок отображает название вверху столбца и может реагировать на события.
Элемент управления Image
Создает изображение ѕ элемент управления, отображающий на экране рисунок файла.BMP.
Изображение - это графический элемент управления, отображающий рисунок.BMP, который нельзя изменить непосредственно. Однако поскольку это изображение обладает полным комплектом свойств, событий и методов, как и прочие элементы управления, оно может реагировать на события и может быть изменено динамически на этапе выполнения.
Элемент управления Label
Создает метку, в которой отображается текст.
Метка - это графический элемент управления, отображающий текст, который нельзя изменить непосредственно. Однако поскольку метка обладает полным комплектом свойств, событий и методов, как и прочие элементы управления, она может реагировать на события и может быть изменена на этапе выполнения.
Чтобы назначить метке клавишу доступа, поставьте в ее названии обратную косую черту и знак меньше (\<) непосредственно перед символом, который вы решили использовать в качестве клавиши доступа. Когда метка отображается, этот символ будет выделен подчеркиванием. При нажатии клавиши доступа метки активизируется следующий элмент управления в порядке табуляции. Для назначения метке порядка табуляции используйте свойство TabIndex.
Названия отображаются на экране по-разному, в зависимости от объекта.
Учтите, что максимальное число символов, допустимое для свойства Caption элемента управления Label, равно 256.
Элемент управления ListBox
Создает поле ввода со списком
Список содержит перечень элементов, из которого вы можете выбрать нужные. Список напоминает поле ввода с раскрывающимся списком, только последнее первоначально отображает один элемент.
Связанный элемент управления OLE
Создает связанный элемент управления OLE.
В форме или отчете связанный элемент управления OLE позволяет отображать содержимое объекта OLE (такого как объект Microsoft Word или Microsoft Excel) в табличном поле типа General.
В отличие от элементов управления OLE, вставляемые объекты OLE не обладают собственным набором событий. Кроме того, связанные элементы управления OLE, в отличие от контейнерных элементов управления OLE, привязаны к полю типа General в таблице Visual FoxPro.
Элемент управления OLE – контейнер
Создает элемент управления типа OLE-контейнер.
OLE-контейнер дает возможность включать OLE-объекты в приложения. К числу OLE-объектов относятся объекты OLE Control (файлы.OCX) и вставляемые OLE-объекты, созданные в других приложениях, таких как Microsoft Word и Microsoft Excel. В отличие от объектов OLE Control (файлов.OCX), вставляемые OLE-объекты не располагают собственным набором событий. Элементы управления типа OLE-контейнер, в отличие от элементов управления OLE Bound, не привязаны к полю типа General в таблице Visual FoxPro.
Элемент управления OptionButton
Создает одиночный переключатель.
Одиночный переключатель можно добавить только в группу переключателей.
Элемент управления OptionGroup
Создает группу переключателей.
Группы переключателей представляют собой контейнеры, содержащие переключатели. Группа переключателей предоставляет возможность выбора одного из них. Если установить какой-либо переключатель, он становится текущим и при этом сбрасывается ранее установленный переключатель. Установленный в данный момент переключатель помечается символом бюллетеня. Например, с помощью переключателей можно направить вывод в файл, на принтер или в окно.
Объект Page
Создает страницу в страничном кадре.
С помощью страниц можно создавать табулированные формы или диалоговые окна. Набор страниц содержится в страничном кадре.
Вы можете ссылаться на страницу в страничном кадре по имени, как это сделано в следующем примере:
myFrame.MyPage1
Вы можете также ссылаться на страницу по ее номеру индекса, используя ключевое слово PAGES. Тем самым достигается единообразие с наборами элементов управления в других контейнерах FoxPro.
myFrame.PAGES(2).Visible =.T.
Заметьте, что этот индекс не обязательно совпадает со значением свойства PageOrder. Пусть у вас есть три страницы со значениями PageOrder, равными 2, 3 и 5. Вы можете следующим образом сформировать ссылки на эти страницы:
myFrame.PAGES(1)
myFrame.PAGES(2)
myFrame.PAGES(3)
Обратите внимание, что обновляется только активный объект Page при возникновении метода Refresh для формы, в которой находится объект Page.
Элемент управления PageFrame
Создает страничный кадр, в который будут включаться страницы.
Страничный кадр - это объект-контейнер, содержащий страницы. Страницы в свою очередь могут содержать какие-то элементы управления. Следует заметить, что страничный кадр становится видимым при включении в форму.
Страничный кадр определяет глобальные характеристики страницы в данной форме: размеры и расположение, стиль обрамления, какая страница активна и т.д.
Страничный кадр определяет, где размещается страница и какая ее часть должна быть видимой. Страницы располагаются в левом верхнем углу страничного кадра. Если перемещать страничный кадр, вместе с ним перемещаются и его страницы.
Страничный кадр содержит отдельные страницы, которым по умолчанию присваиваются имена Page0, Page1, Page2 и т.д.
Элемент управления TextBox
Создает элемент управления TextBox.
Создает поле ввода, в котором можно редактировать содержимое переменной памяти, элемента массива или поля. В поле ввода можно пользоваться всеми стандартными возможностями редактирования Visual FoxPro ѕ вырезать, копировать и вставлять фрагменты и т.п.
Используя свойства InputMask и Format, можно определять, как значения вводятся в поле ввода и отображаются в нем.
Элемент управления Shape
Создает фигуру - элемент управления, отображающий прямоугольник, круг или эллипс.
Фигура - это графический элемент управления, отображающий прямоугольник, круг или эллипс, которые нельзя изменить непосредственно. Однако поскольку фигура обладает полным комплектом свойств, событий и методов, как и прочие элементы управления, она может реагировать на события и может быть изменена динамически на этапе выполнения.
Свойство Curvature определяет, какая именно фигура отображается, и может изменяться в диапазоне от 0 до 99. Значение 0 задает нулевую кривизну и строит прямые углы; 99 задает максимальную кривизну и строит окружности и эллипсы.
3. Описание функций и возможностей языка SQL
Язык для взаимодействия с БД SQL появился в середине 70-х и был разработан в рамках проекта экспериментальной реляционной СУБД System R. Исходное название языка SEQUEL (Structered English Query Language) только частично отражает суть этого языка. Конечно, язык был ориентирован главным образом на удобную и понятную пользователям формулировку запросов к реляционной БД, но на самом деле уже являлся полным языком БД, содержащим помимо операторов формулирования запросов и манипулирования БД средства определения и манипулирования схемой БД; определения ограничений целостности и триггеров; представлений БД; возможности определения структур физического уровня, поддерживающих эффективное выполнение запросов; авторизации доступа к отношениям и их полям; точек сохранения транзакции и откатов. В языке отсутствовали средства синхронизации доступа к объектам БД со стороны параллельно выполняемых транзакций: с самого начала предполагалось, что необходимую синхронизацию неявно выполняет СУБД.
Запросы и операторы манипулирования данными
Как известно, двумя фундаментальными языками запросов к реляционным БД являются языки реляционной алгебры и реляционного исчисления. При всей своей строгости и теоретической обоснованности эти языки редко используются в современных реляционных СУБД в качестве средств пользовательского интерфейса. Запросы на этих языках трудно формулировать и понимать. SQL представляет собой некоторую комбинацию реляционного исчисления кортежей и реляционной алгебры, причем до сих пор нет общего согласия, к какому из классических языков он ближе. При этом возможности SQL шире, чем у этих базовых реляционных языков, в частности, в общем случае невозможна трансляция запроса, сформулированного на SQL, в выражение реляционной алгебры, требуется некоторое ее расширение.
Существенными свойствами подъязыка запросов SQL являются возможность простого формулирования запросов с соединениями нескольких отношений и использование вложенных подзапросов в предикатах выборки. Вообще говоря, одновременное наличие обоих средств избыточно, но это дает пользователю при формулиро-вании запроса возможность выбора более понятного ему варианта.
В предикатах со вложенными подзапросами в SQL System R можно употреблять теретико-множественные операторы сравнения, что позволяет формулировать квантифицированные запросы (эти возможности обычно труднее всего понимаются пользователями и поэтому в дальнейшем в SQL появились явно квантифицируемые предикаты).
Существенной особенностью SQL является возможность указания в запросе потребности группирования отношения-результата по указанным полям с поддержкой условий выборки на всю группу целиком. Такие условия выборки могут содержать агрегатные функции, вычисляемые на группе. Эта возможность SQL главным образом отличает этот язык от языков реляционной алгебры и реляционного исчисления, не содержащих аналогичных средств.
Еще одним отличием SQL является необязательное удаление кортежей-дубликатов в окончательном или промежуточных отношениях-результатах. Строго говоря, результатом оператора выборки в языке SQL является не отношение, а мультимножество кортежей. В тех случаях, когда семантика запроса требует наличия отношения, уничтожение дубликатов производится неявно.
Самый общий вид запроса на языке SQL представляет теоретико-множественное алгебраическое выражение, составленное из элементарных запросов. В SQL System R допускались все базовые теретико-множественные операции (UNION, INTERSECT и MINUS).
Работа с неопределенными значениями в SQL System R до конца продумана не была, хотя неявно предполагалось использование трехзначной логики при вычислении логических выражений.
Операторы манипулирования данными UPDATE и DELETE построены на тех же принципах, что и оператор выборки данных SELECT. Набор кортежей указанного отношения, подлежащих модификации или удалению, определяется входящим в соответствующий оператор логическим выражением, которое может включать сложные предикаты, в том числе и с вложенными подзапросами.
В операторе вставки кортежа(ей) в указанное отношение заносимый кортеж может задаваться как в литеральной форме, так и с помощью внутреннего подоператора выборки.
Представления базы данных
В языке допускалось использование хранимых отношений БД и представляемых отношений. Наиболее удачным решением было использование для определения представлений общего аппарата операторов выборки. Любой оператор выборки может быть использован для определения представления.
В языке отсутствуют какие-либо ограничения по поводу использования представлений: в любом операторе SQL, в котором допускается использование имени хранимого отношения, допускается и использование имени представления. В SQL System R ничего не говорится о рекомендуемом способе реализации доступа к представлениям, но при любом способе эффект должен быть таким, как если бы выполнить полную материализацию представления до выполнения оператора.
Массу проблем, исследований и предложений породила потенциальная возможность выполнения операторов манипулирования данными над представлениями. Понятно, что эта возможность легко реализуема для простых представлений, но в более сложных случаях не только реализация, но и семантика операций становится нетривиальной. Кстати, в System R операторы манипулирования данными допускались только над простыми представлениями.
Определение управляющих структур
Внесение в реляционный язык, каким является SQL, явных операторов порождения и уничтожения структур физического уровня, поддерживающих эффективное выполнение запросов к БД, явилось в SQL System R чисто прагматическим решением, обеспечивающим возможность всех видов работ с БД с помощью одного языка.
В SQL System R упоминаются два вида таких структур: индексы и связи (links). Индекс в его абстрактном языковом представлении - это инвертированный файл, обеспечивающий доступ к кортежам соответствующего отношения на основе заданных значений одного или нескольких столбцов, составляющих ключ индекса. Операторы языка позволяли создавать и уничтожать индексы, но никаким образом не давали возможности явно указать на необходимость использования существующего индекса при выполнении оператора выборки, решение об этом возлагалось на реализацию.
С помощью оператора определения индекса можно было выразить два дополнительных утверждения, касающихся логической схемы отношения и физической структуры его хранения. Использование при определении индекса ключевого слова UNIQUE означало, что ключ этого индекса является возможным ключом соответствующего отношения. Фактически это означает наличие дополнительного механизма определения ограничения целостности отношения. Один из индексов для данного отношения мог быть определен с ключевым словом CLUSTERING. Это означает требование физической кластеризации во внешней памяти кортежей отношения с равными или близкими значениями ключа индекса.
Операторы определения связи позволяли в стиле сетевой модели данных организовать во внешней памяти списки кортежей указанного отношения. Как и в случае индексов, операторы позволяли создавать и уничтожать такие списки, но не давали возможности явно указать на необходимость использования существующих списков при выполнении операторов выборки. Большая трудоемкость поддержания списков при выполнении операторов манипулирования данными и трудность выполнения оценок стоимости их использования при выполнении операторов выборки привели к тому, что механизм связей исчез из языка уже на поздней стадии проекта System R. С тех пор этот механизм, насколько нам известно, не появлялся ни в одном варианте SQL.
Встроенный SQL
В SQL System R присутствуют специальные операторы, поддерживающие встраивание операторов SQL в традиционные языки программирования (в System R основным таким языком был PL/1).
Основная проблема встраивания SQL в язык программирования состояла в том, что SQL - реляционный язык, т.е. его операторы большей частью работают со множествами, в то время как в языках программирования основными являются скалярные операции. Решение SQL состоит в том, что в язык дополнительно включаются операторы, обеспечивающие покортежный доступ к результату запроса к БД.
Для этого в язык вводится понятие курсора, с которым связывается оператор выборки. Над определенным курсором можно выполнять оператор OPEN, означающий материализацию отношения-результата запроса, оператор FETCH, позволяющий выбрать очередной кортеж результирующего отношения в память программы, и оператор CLOSE, означающий конец работы с данным курсором.
Дополнительную гибкость при создании прикладных программ со встроенным SQL обеспечивает возможность параметризации операторов SQL значениями переменных включающей программы.
Динамический SQL
Для упрощения создания интерактивных SQL-ориентированных систем в SQL System R были включены операторы, позволяющие во время выполнения транзакции откомпилировать и выполнить любой оператор SQL.
Оператор PREPARE вызывает динамическую компиляцию оператора SQL, текст которого содержится в указанной переменной-символьной строке включающей программы. Текст может быть помещен в переменную при выполнении программы любым допустимым способом, например, введен с терминала.
Оператор DESCRIBE служит для получения информации об указанном операторе SQL, ранее подготовленном с помощью оператора PREPARE. C помощью этого оператора можно узнать, во-первых, является ли подготовленный оператор оператором выборки, и во-вторых, если это оператор выборки, получить полную информацию о числе и типах столбцов результирующего отношения.
Для выполнения ранее подготовленного оператора SQL, не являющегося оператором выборки, служит оператор EXECUTE. Для выполнения динамически подготовленного оператора выборки используется аппарат курсоров с некоторыми отличиями по части задания адресов переменных включающей программы, в которые должны быть помещены значения столбцов текущего кортежа результата.
Подводя итог приведенному краткому описанию основных черт SQL System R, отметим, что несмотря на недостаточную техническую проработку, в идейном отношении язык содержал все необходимые средства, позволяющие использовать его как базовый язык СУБД
4. Постановка задачи
СУБД менеджера по продажам комплектующих должна выполнять функции облегчающие работу с перечнем комплектующих, имеющихся на складе фирмы. Программа должна выполнять поиск необходимых комплектующих с заданными параметрами. Необходимо предусмотреть вывод всех наименований изделий, добавление записей в базу данных, удаление записей, а также редактирование записей. При выводе всех наименований требуется осуществить сортировку по всем отображаемым полям. Структура базы данных должна быть идентична структуре прайс-листов компьютерных фирм г. Минска. В качестве примера выступает прайс-лист фирмы «Конструктив».
Комплектующие характеризуются следующими параметрами:
Раздел – наименование изделия.
Позиция – информация о производителе и модели изделия.
Характеристики - дополнительные параметры.
Гарантия – гарантийный срок эксплуатации изделия.
Розничная цена.
Мелкооптовая цена.
Оптовая цена.
Три последних поля введены из-за необходимости работы фирмы с различными клиентами.
Программа должна осуществлять управление БД с помощью интуитивно понятного современному пользователю интерфейса, предлагаемого операционной системой Windows 95/98, используя стандартные элементы управления.
5. Руководство пользователя
Разработка программы велась на языке управления базами данных Visual FoxPro 6.0 использующем технологию объектно-ориентированного визуального программирования.
Элементы использованные при разработке программы являются стандартными для ОС Windows и описаны выше в п.2 данной записки.
После запуска программы появляется главное окно (рис.2), которое содержит меню для работы с формой, таблицу, содержащую все записи базы данных, а также закладки для перехода на страницу работы с отдельной записью и страницу формирования SQL-запроса.
Рис.2
В этом окне можно осуществить сортировку записей по всем признакам с возможностью сортировки по возрастанию и убыванию. Это действие выполняется нажатием левой кнопки мыши при подведении курсора к заголовку поля. Причём сортировка по убыванию осуществляется с нажатием кнопки Ctrl на клавиатуре и щелчком мыши по заголовку поля, в котором требуется произвести сортировку. Перемещение по таблице выполняется с помощью курсоров клавиатуры, а также с помощью мыши и правого скроллера. Редактировать или каким-нибудь образом изменять содержимое БД из этого окна нельзя.
Для этого необходимо переместится на страницу Тек. Запись. (рис. 3)
Рис. 3
При этом запись, на которой находился курсор на предыдущей странице будет отображаться на этой.
Эта страница содержит кнопки навигации по базе данных, кнопки удаления, редактирования.
«Начало»- перемещение указателя БД на первую запись.
«Вверх»- перемещение указателя на одну запись вверх.
«Редактировать»- разрешает изменение значений полей текущей записи.
«Новая запись» - добавление новой пустой записи и возможность ввода значений.
«Удалить» - удаление после утвердительного ответа на подтверждающий запрос.
«Вниз» – перемещение указателя текущей записи на одну запись вниз.
«Конец» - перемещение указателя БД на последнюю запись.
При нажатии кнопки «Редактировать» поля записи становятся доступными для изменения.
Главное окно содержит кнопку «Выход», которая доступна со всех страниц.
Пункты меню, также доступные с любой страницы. Рассмотрим их.
File – пункт меню для работы с файлами, содержит одну опцию – Quit.
Edit – пункт меню для редактирования базы данных, содержит 3 опции:
Add record – добавить пустую запись.
(аналогично кнопке «Новая запись» страницы «Тек. запись»)
Delete record – удалить текущую запись.
(аналогично кнопке «Удалить» страницы «Тек. запись»)
Edit record – редактировать текущую запись.
(аналогично кнопке «Редактировать» страницы «Тек. запись»)
Query - делает активной страницу формирования запроса
(аналогично нажатию закладки «Запрос»)
Help – пункт меню помощи, содержит одну опцию About – вызов окна «О программе»
Выбор закладки «Запрос» главного окна делает активным страницу формирования SQL -запроса.(рис. 4)
Рис. 4
Элементы данной страницы позволяют создать SQL- запрос по трём полям базы данных с различными знаками связок в условиях и соединений (и/или) критериев отбора между собой. Выбор поля, по которому осуществляется запрос происходит из элемента управления ComboBox, который содержит все наименования полей базы. Если не указаны имена полей для выборки, кнопка «Выполнить», которая запускает сформированный запрос, неактивна.
Кнопка «Очистить» приводит форму создания запроса в исходное состояние и очищает её от ранее введённых значений.
Приведём пример создания запроса по разделу «Мониторы» с обязательным размером по диагонали 17 дюймов или гарантией больше 12 месяцев. Заполнив соответствующие поля и нажав кнопку выполнить, наблюдаем следующие результаты (рис. 5)
Рис. 5
Результаты работы запроса выводятся в стандартном окне «Browse». Если в базе данных нет записи полностью удовлетворяющей созданному запросу, на экран будет выдано соответствующее сообщение.
При выборе пункта меню Help/About на экран выводится окно с информацией о программе и её разработчике:
Программа выполняет основные требования, которые предъявлялись к ней на этапе постановки задач, обладая при этом интуитивно понятным интерфейсом.
При внесении определённых корректив в функции программы, она вполне может стать действующей АРМ менеджера по продажам комплектующих.
Заключение
Среда программирования Visual FoxPro является составной частью интегрированного пакета программ VISUAL STUDIO. Это предоставляет пользователю комфортный и унифицированный интерфейс разработки приложений для различных языков программирования, включая Visual Basic и C++. Также это позволяет использовать общие сервисные программы, например для тестирования объектов ActiveX.
Набор команд и функций предлагаемых разработчикам программных продуктов в среде FoxPro, по мощи и гибкости отвечает любым современным требованиям к представлению и обработке данных. Здесь может быть реализован максимально удобный, гибкий и эффективный пользовательский интерфейс. Visual FoxPro является первым продуктом разработки, предназначенным для создания общекорпоративных, объектно-ориентированных приложений типа клиент/сервер, работающих как в локальном, так и в глобальном варианте (т.е. в Internet).
Список использованных источников
И.Ю. Баженова «Visual FoxPro 6.0» – Москва, «Диалог-МИФИ», 1999
Л. Омельченко «Самоучитель Visual FoxPro 6.0» – «BHV-Санкт-Петербург», 1999
М. Базиян и др. «Использование Visual FoxPro 6» – Москва, Санкт-Петербург, Киев, Издательский дом «Вильямс», 1999
А.А. Попов «Создание приложений для FoxPro 2.5/2.6 в DOS и WINDOWS» – Москва, «ДЕСС», 1999
Microsoft Developer Network (MSDN) Documentation On Visual FoxPro.
http://alpha.netis.ru/win/db/toc.html
http://www.cit-forum.com/
http://www.vlata.com/vfp
Приложение1. Листинг программы
В качестве листинга программы выступают процедуры и методы-обработчики визуальных компонент изменённые вручную, а также текст меню сгенерированный программой.
Form1.init
SET SAFETY OFF
SET DELETED ON
copy structure to temp.dbf
set order to pozic ASCENDING
DO menu1.mpr WITH THISFORM,.T.
THIS.pageframe1.page3.cboField1.clear
THIS.pageframe1.page3.cboField2.clear
THIS.pageframe1.page3.cboField3.clear
FOR nLoop = 1 TO THIS.nFields
IF!THIS.aStructure[nLoop,2]$"MGO"
THIS.pageframe1.page3.cboField1.AddItem(THIS.aStructure[nLoop,1])
THIS.pageframe1.page3.cboField2.AddItem(THIS.aStructure[nLoop,1])
THIS.pageframe1.page3.cboField3.AddItem(THIS.aStructure[nLoop,1])
ENDIF
ENDFOR
Form1.load
THIS.Alias = ALIAS()
THIS.nFields = AFIELDS(THIS.aStructure)
Form1.unload
IF USED(THIS.Alias)
USE IN (THIS.Alias)
ENDIF
Form1.Destroy
PACK
reindex
close databases
Form1.bldsql
LOCAL lcOperand1,lcOperand2,lcWHERE;
lcField1, lcRelation1, lcValue1,;
lcField2, lcRelation2, lcValue2,;
lcField3, lcRelation3, lcValue3,;
lcAlias, lcSQL, lcType
Test to make sure all values that are required have been entered
*------------------------------------------------------------------
IF EMPTY(THISFORM.pageframe1.page3.cboField1.Value)
HISFORM.pageframe1.page3.cmdExecute.Enabled =.F.
RETURN
ELSE
IF THISFORM.pageframe1.page3.opgOperand1.Value > 0 AND;
EMPTY(THISFORM.pageframe1.page3.cboField2.Value)
THISFORM.pageframe1.page3.cmdExecute.Enabled =.F.
RETURN
ELSE
IF THISFORM.pageframe1.page3.opgOperand2.Value > 0 AND;EMPTY(THISFORM.pageframe1.page3.cboField3.Value)THISFORM.pageframe1.page3.cmdExecute.Enabled =.F.
RETURN
ENDIF
ENDIF
ENDIF
*-------------------------------------------------------------------
lcWHERE = ""
lcAlias = ALIAS()
** Retrieve the values of the controls into variables
lcField1 = THISFORM.pageframe1.page3.cboField1.Value
lcRelation1 = THISFORM.pageframe1.page3.cboRelation1.Value
lcValue1 = ALLTRIM(THISFORM.pageframe1.page3.txtValue1.Value)
DO CASE
CASE THISFORM.pageframe1.page3.opgOperand1.Value = 0
lcOperand1 = ""
CASE THISFORM.pageframe1.page3.opgOperand1.Value = 1
lcOperand1 = " AND "
CASE THISFORM.pageframe1.page3.opgOperand1.Value = 2
lcOperand1 = " OR "
ENDCASE
DO CASE
CASE THISFORM.pageframe1.page3.opgOperand2.Value = 0
lcOperand2 = ""
CASE THISFORM.pageframe1.page3.opgOperand2.Value = 1
lcOperand2 = " AND "
CASE THISFORM.pageframe1.page3.opgOperand2.Value = 2
lcOperand2 = " OR "
ENDCASE
lcField2 = THISFORM.pageframe1.page3.cboField2.Value
lcRelation2 = THISFORM.pageframe1.page3.cboRelation2.Value
lcValue2 = ALLTRIM(THISFORM.pageframe1.page3.txtValue2.Value)
lcField3 = THISFORM.pageframe1.page3.cboField3.Value
lcRelation3 = THISFORM.pageframe1.page3.cboRelation3.Value
lcValue3 = ALLTRIM(THISFORM.pageframe1.page3.txtValue3.Value)
** Need to put the proper delimiters around comparison values of certain types
lcValue1 = THISFORM.ValidateType(THIS.pageframe1.page3.cboField1.Value,lcValue1)
** Create the second part of the WHERE condition
IF!EMPTY(lcOperand1)
lcValue2 = THISFORM.ValidateType(THIS.pageframe1.page3.cboField2.Value,lcValue2)
lcWHERE = lcOperand1 + " " + lcField2 + " " +;
lcRelation2 + " " + lcValue2
ENDIF
IF!EMPTY(lcOperand2)
lcValue3 = THISFORM.ValidateType(THIS.pageframe1.page3.cboField3.Value,lcValue3)
lcWHERE = lcWhere + " " + lcOperand2 + " " + lcField3 + " " +;
lcRelation3 + " " + lcValue3
ENDIF
** Create the first part of the WHERE condition
lcWHERE = "WHERE " + lcField1 + " " + lcRelation1 + " ";
+ lcValue1 + " " + lcWHERE
** Create the full SQL command using the base table for the form
lcSQL = "SELECT * FROM " + lcAlias + " " + lcWHERE
THISFORM.DataSql = lcSQL
THISFORM.pageframe1.page3.cmdClear.Enabled =.T.
THISFORM.pageframe1.page3.cmdExecute.Enabled =.T.
Form1.clearsql
THISFORM.pageframe1.page3.cboField1.Value = ""
THISFORM.pageframe1.page3.cboRelation1.Value = "="
THISFORM.pageframe1.page3.txtValue1.Value = ""
THISFORM.pageframe1.page3.opgOperand1.Value = 0
THISFORM.pageframe1.page3.cboField2.Value = ""
THISFORM.pageframe1.page3.cboRelation2.Value = "="
THISFORM.pageframe1.page3.cboField2.Enabled =.F.
THISFORM.pageframe1.page3.cboRelation2.Enabled =.F.
THISFORM.pageframe1.page3.txtValue2.Enabled =.F.
THISFORM.pageframe1.page3.txtValue2.Value = ""
THISFORM.pageframe1.page3.opgOperand2.Value = 0
THISFORM.pageframe1.page3.cboField3.Value = ""
THISFORM.pageframe1.page3.cboRelation3.Value = "="
THISFORM.pageframe1.page3.txtValue3.Value = ""
THISFORM.pageframe1.page3.cboField3.Enabled =.F.
THISFORM.pageframe1.page3.cboRelation3.Enabled =.F.
THISFORM.pageframe1.page3.txtValue3.Enabled =.F.
THISFORM.pageframe1.page3.cmdClear.Enabled =.F.
THISFORM.pageframe1.page3.cmdExecute.Enabled =.F.
Form1.Settexboxformat
LPARAMETERS oSource, oTxt
LOCAL lcType
oTxt.Value = ""
lcType = TYPE(oSource.Value)
DO CASE
CASE lcType = "D"
oTxt.Format = "D"
CASE lcType = "L"
oTxt.Inputmask = ".T.,.F."
oTxt.Format = "M"
CASE lcType = "T"
oTxt.Inputmask = "99/99/99 99:99:99"
ENDCASE
Form1.validatetype
LPARAMETERS lField, lcValue
LOCAL lcType
lcType = TYPE(lField)
DO CASE
CASE lcType $ "CM"
lcValue = CHR(34) + lcValue + CHR(34)
CASE lcType $ "DT"
lcValue = "{" + lcValue + "}"
CASE lcType $ "NY"
IF EMPTY(lcValue)
lcValue = "0"
ENDIF
CASE lcType $ "L"
IF!INLIST(UPPER(lcValue), ".T.", ".F.")
lcValue = ".T."
ENDIF
ENDCASE
RETURN lcValue
Form1.PageFrame1.Grid1.Column1.Header1.MouseUp
LPARAMETERS nButton, nShift, nXCoord, nYCoord
IF nShift = 2
SET ORDER TO razdel DESCENDING
ELSE
SET ORDER TO razdel ASCENDING
ENDIF
GO TOP
THISFORM.Refresh
Form1.PageFrame1.Grid1.Column2.Header1.MouseUp
LPARAMETERS nButton, nShift, nXCoord, nYCoord
IF nShift = 2
SET ORDER TO pozic DESCENDING
ELSE
SET ORDER TO pozic ASCENDING
ENDIF
GO TOP
THISFORM.Refresh
Form1.PageFrame1.Grid1.Column3.Header1.MouseUp
LPARAMETERS nButton, nShift, nXCoord, nYCoord
IF nShift = 2
SET ORDER TO garant DESCENDING
ELSE
SET ORDER TO garant ASCENDING
ENDIF
GO TOP
THISFORM.Refresh
Form1.PageFrame1.Grid1.Column4.Header1.MouseUp
LPARAMETERS nButton, nShift, nXCoord, nYCoord
IF nShift = 2
SET ORDER TO cena_1 DESCENDING
ELSE
SET ORDER TO cena_1 ASCENDING
ENDIF
GO TOP
THISFORM.Refresh
Form1.PageFrame1.Page2.Activate
this.refresh
Form1.PageFrame1.Page2.commandgroup1.Command1.Click
go top
if BOF ()
MESSAGEBOX("Вы достигли первой записи",0+64+0,"Уведомление")
endif
_screen.activeForm.refresh()
Form1.PageFrame1.Page2.commandgroup1.Command2.Click
if!bof()
skip -1
else
MESSAGEBOX("Вы достигли первой записи",0+64+0,"Уведомление")
endif
_screen.activeForm.refresh()
Form1.PageFrame1.Page2.commandgroup1.Command3.Click
hisform.pageframe1.page2.command1.visible =.T.
thisform.pageframe1.page2.cmdCancel.visible =.T.
thisform.pageframe1.page2.text1.readonly =.F.
thisform.pageframe1.page2.text2.readonly =.F.
thisform.pageframe1.page2.text3.readonly =.F.
thisform.pageframe1.page2.text4.readonly =.F.
thisform.pageframe1.page2.text5.readonly =.F.
thisform.pageframe1.page2.text6.readonly =.F.
thisform.pageframe1.page2.text7.readonly =.F.
thisform.pageframe1.page2.commandgroup1.command1.enabled =.F.
thisform.pageframe1.page2.commandgroup1.command2.enabled =.F.
thisform.pageframe1.page2.commandgroup1.command3.enabled =.F.
thisform.pageframe1.page2.commandgroup1.command4.enabled =.F.
thisform.pageframe1.page2.commandgroup1.command5.enabled =.F.
thisform.pageframe1.page2.commandgroup1.command6.enabled =.F.
thisform.pageframe1.page2.commandgroup1.command7.enabled =.F.
Form1.PageFrame1.Page2.commandgroup1.Command4.Click
append blank
thisform.refresh
thisform.pageframe1.page2.commandgroup1.command3.Click
Form1.PageFrame1.Page2.commandgroup1.Command5.Click
if messagebox("Вы действительно хотите удалить эту запись?", 4+48+256, "Комплектующие")=6
delete
reindex
thisform.pageframe1.page1.grid1.Refresh
thisform.refresh
thisform.pageframe1.ActivePage = 1
endif
Form1.PageFrame1.Page2.commandgroup1.Command6.Click
skip
if!eof()
skip
else
MESSAGEBOX("Вы достигли последней записи",0+64+0,"Уведомление")
skip-1
thisform.Refresh()
endif
thisform.Refresh()
Form1.PageFrame1.Page2.commandgroup1.Command7.Click
go bottom
thisform.pageframe1.page2.Refresh
Form1.PageFrame1.Page2..Command1.Click
thisform.pageframe1.page2.command1.visible =.F.
pozic = thisform.pageframe1.page2.text2.value
razdel = thisform.pageframe1.page2.text1.value
charakt= thisform.pageframe1.page2.text3.value
garant = thisform.pageframe1.page2.text4.value
cena_1 = thisform.pageframe1.page2.text5.value
cena_2 = thisform.pageframe1.page2.text6.value
cena_3 = thisform.pageframe1.page2.text7.value
thisform.pageframe1.page1.grid1.refresh
thisform.pageframe1.page2.text1.readonly =.T.
thisform.pageframe1.page2.text2.readonly =.T.
thisform.pageframe1.page2.text3.readonly =.T.
thisform.pageframe1.page2.text4.readonly =.T.
thisform.pageframe1.page2.text5.readonly =.T.
thisform.pageframe1.page2.text6.readonly =.T.
thisform.pageframe1.page2.text7.readonly =.T.
thisform.pageframe1.page2.commandgroup1.command1.enabled =.T.
thisform.pageframe1.page2.commandgroup1.command2.enabled =.T.
thisform.pageframe1.page2.commandgroup1.command3.enabled =.T.
thisform.pageframe1.page2.commandgroup1.command4.enabled =.T.
thisform.pageframe1.page2.commandgroup1.command5.enabled =.T.
thisform.pageframe1.page2.commandgroup1.command6.enabled =.T.
thisform.pageframe1.page2.commandgroup1.command7.enabled =.T.
thisform.pageframe1.ActivePage = 1
Form1.PageFrame1.Page3.cboField1.InteractiveChange
THISFORM.SetTextboxFormat(THIS, THISFORM.pageframe1.page3.txtValue1)
THISFORM.BldSQL
Form1.PageFrame1.Page3.cboField2.InteractiveChange
THISFORM.SetTextboxFormat(THIS, THISFORM.pageframe1.page3.txtValue2)
THISFORM.BldSQL
Form1.PageFrame1.Page3.cboField3.InteractiveChange
THISFORM.SetTextboxFormat(THIS, THISFORM.pageframe1.page3.txtValue3)
THISFORM.BldSQL
Form1.PageFrame1.Page3.cboRelation1.InteractiveChange
THISFORM.BldSQL
Form1.PageFrame1.Page3.cboRelation2.InteractiveChange
THISFORM.BldSQL
Form1.PageFrame1.Page3.cboRelation3.InteractiveChange
THISFORM.BldSQL
Form1.PageFrame1.Page3.txtValue1
THISFORM.BldSQL
Form1.PageFrame1.Page3.txtValue2
THISFORM.BldSQL
Form1.PageFrame1.Page3.txtValue3
THISFORM.BldSQL
Form1.PageFrame1.Page3.opgOperand1. InteractiveChange
THISFORM.pageframe1.page3.cboField2.Enabled =.T.
THISFORM.pageframe1.page3.cboRelation2.Enabled =.T.
THISFORM.pageframe1.page3.txtValue2.Enabled =.T.
THISFORM.BldSQL
Form1.PageFrame1.Page3.opgOperand2. InteractiveChange
THISFORM.pageframe1.page3.cboField3.Enabled =.T.
THISFORM.pageframe1.page3.cboRelation3.Enabled =.T.
THISFORM.pageframe1.page3.txtValue3.Enabled =.T.
THISFORM.BldSQL
Form1.PageFrame1.Page3.cmdExecute.Click
LOCAL lcOldAlias
lcOldAlias = ALIAS()
cMacro = ALLTRIM(THISFORM.DataSql) + "INTO CURSOR TEMPQUERY"
&cMacro
IF _TALLY = 0
#DEFINE MSG_LOC "No records were found to match the criteria you specified."
#DEFINE TITLE_LOC "No Results"
=MESSAGEBOX(MSG_LOC,64+0+0,TITLE_LOC)
ELSE
BROWSE NORMAL TITLE sub>STR(THISFORM.DataSql, AT("WHERE",THISFORM.DataSql)+ 6)
ENDIF
IF USED("TEMPQUERY")
USE IN TEMPQUERY
ENDIF
IF USED(lcOldAlias)
SELECT (lcOldAlias)
ENDIF
Form1.PageFrame1.Page3.cmdClear.Click
THISFORM.ClearSQL
Form1.FormExit.Click
thisform.release
Main Menu
LPARAMETERS oFormRef, getMenuName, lUniquePopups, parm4, parm5, parm6, parm7, parm8, parm9
LOCAL cMenuName, nTotPops, a_menupops, cTypeParm2, cSaveFormName
IF TYPE("m.oFormRef") # "O" OR;
LOWER(m.oFormRef.BaseClass) # 'form' OR;
m.oFormRef.ShowWindow # 2
MESSAGEBOX([This menu can only be called from a Top-Level form. Ensure that your form's ShowWindow property is set to 2. Read the header section of the menu's MPR file for more details.])
RETURN
ENDIF
m.cTypeParm2 = TYPE("m.getMenuName")
m.cMenuName = SYS(2015)
m.cSaveFormName = m.oFormRef.Name
IF m.cTypeParm2 = "C" OR (m.cTypeParm2 = "L" AND m.getMenuName)
m.oFormRef.Name = m.cMenuName
ENDIF
IF m.cTypeParm2 = "C" AND!EMPTY(m.getMenuName)
m.cMenuName = m.getMenuName
ENDIF
DIMENSION a_menupops[3]
IF TYPE("m.lUniquePopups")="L" AND m.lUniquePopups
FOR nTotPops = 1 TO ALEN(a_menupops)
a_menupops[m.nTotPops]= SYS(2015)
ENDFOR
ELSE
a_menupops[1]="file"
a_menupops[2]="edit"
a_menupops[3]="help"
ENDIF
LOCAL lHasNewMenu
lHasNewMenu = (TYPE("CNTPAD(m.cMenuName)") # "N")
IF m.lHasNewMenu
DEFINE MENU (m.cMenuName) IN (m.oFormRef.Name) BAR
ENDIF
DEFINE PAD _03s1d879u OF (m.cMenuName) PROMPT "\<File" COLOR SCHEME 3;
KEY ALT+F, ""
DEFINE PAD _03s1d879v OF (m.cMenuName) PROMPT "\<Edit" COLOR SCHEME 3;
KEY ALT+E, ""
DEFINE PAD _03s1d879w OF (m.cMenuName) PROMPT "\<Query" COLOR SCHEME 3;
KEY ALT+Q, ""
DEFINE PAD _03s1d879x OF (m.cMenuName) PROMPT "\<Help" COLOR SCHEME 3;
KEY ALT+H, ""
ON PAD _03s1d879u OF (m.cMenuName) ACTIVATE POPUP (a_menupops[1])
ON PAD _03s1d879v OF (m.cMenuName) ACTIVATE POPUP (a_menupops[2])
ON SELECTION PAD _03s1d879w OF (m.cMenuName);
DO _03s1d879z;
IN LOCFILE("MY\MENU1","MPX;MPR|FXP;PRG","WHERE is MENU1?")
ON PAD _03s1d879x OF (m.cMenuName) ACTIVATE POPUP (a_menupops[3])
DEFINE POPUP (a_menupops[1]) MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINE BAR 1 OF (a_menupops[1]) PROMPT "\<Quit";
MESSAGE "Выход из программы"
ON SELECTION BAR 1 OF (a_menupops[1]);
DO _03s1d87a4;
IN LOCFILE("MY\MENU1","MPX;MPR|FXP;PRG","WHERE is MENU1?")
DEFINE POPUP (a_menupops[2]) MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINE BAR 1 OF (a_menupops[2]) PROMPT "\<Add record"
DEFINE BAR 2 OF (a_menupops[2]) PROMPT "\<Delete record"
DEFINE BAR 3 OF (a_menupops[2]) PROMPT "\<Edit record"
ON SELECTION BAR 1 OF (a_menupops[2]);
DO _03s1d87a6;
IN LOCFILE("MY\MENU1","MPX;MPR|FXP;PRG","WHERE is MENU1?")
ON SELECTION BAR 2 OF (a_menupops[2]);
DO _03s1d87a8;
IN LOCFILE("MY\MENU1","MPX;MPR|FXP;PRG","WHERE is MENU1?")
ON SELECTION BAR 3 OF (a_menupops[2]);
DO _03s1d87aa;
IN LOCFILE("MY\MENU1","MPX;MPR|FXP;PRG","WHERE is MENU1?")
DEFINE POPUP (a_menupops[3]) MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINE BAR 1 OF (a_menupops[3]) PROMPT "\<About"
ON SELECTION BAR 1 OF (a_menupops[3]);
DO _03s1d87ac;
IN LOCFILE("MY\MENU1","MPX;MPR|FXP;PRG","WHERE is MENU1?")
ACTIVATE MENU (m.cMenuName) NOWAIT
IF m.cTypeParm2 = "C"
m.getMenuName = m.cMenuName
m.oFormRef.Name = m.cSaveFormName
ENDIF
PROCEDURE _03s1d879z
mainform.pageframe1.Activepage = 3
PROCEDURE _03s1d87a4
mainform.release
PROCEDURE _03s1d87a6
mainform.pageframe1.Activepage = 2
mainform.pageframe1.page2.commandgroup1.command4.Click()
PROCEDURE _03s1d87a8
mainform.pageframe1.Activepage = 2
mainform.pageframe1.page2.commandgroup1.command5.Click(PROCEDURE _03s1d87aa
mainform.pageframe1.Activepage = 2
mainform.pageframe1.page2.commandgroup1.command3.Click
PROCEDURE _03s1d87ac
do form Fabout.scx