Министерство образования и науки Республики Беларусь
Белорусский Государственный Университет Информатики иРадиоэлектроники
Факультет информационных технологий и управления
Кафедра информационных технологий автоматизированных систем
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовому проекту по курсу «Базы и банки данных»
на тему
«АРМ менеджера по продажам комплектующих»
Минск 2000
Содержание
Введение
1. Обзорвозможностей Visual Foxpro
2. Обзорбазовых классов и элементов управления Microsoft Visual Foxpro
3. Описаниефункций и возможностей языка SQL
4. Постановказадачи
5. Руководствопользователя
Заключение
Список использованныхисточников
Приложение 1. Листингпрограммы
Введение
Базы данныхнужны человеку для систематизации своих знаний. На основе этой систематизациион может создать новые знания. Так или иначе, любая база данных служит человекуименно для описания происшедших в прошлом событий и на основе знания этихсобытий помогает принять то или иное решение на будущее. Поясним эту мысльпримерами. Начнем с простых случаев. К примеру, описание склада необходимо длязнания наличия на складе товаров на основе ввода движения товара на склад и сосклада. Иначе, человеку пришлось бы постоянно сверяться с реальным наличием,т.е. пересчитывать товар по-нескольку раз на день перед выписыванием исходящейнакладной. Как дополнительная и нужная функция может рассматриватьсявозможность статистического анализа расхода товара со склада по месяцам. Кпримеру, есть сезонные колебания расхода медикаментов. На основе такихнаблюдений можно прогнозировать план закупок. Бухгалтерские программы позволяютв простейшем случае правильно заплатить налоги. Здесь мы видим классическийпример генерации новых знаний, а именно о финансовом состоянии организации, наоснове обработки проводок. Более сложным является случай рассмотрения баззнаний. База знаний может быть построена как мультимедийный справочник или какнабор текстов и файлов другого формата, проиндексированных по определеннымпризнакам в базе данных. Здесь стоит немного отвлечься и дать определение базыданных в моем понимании этого вопроса. База данных — это набор файловопределенного формата? Да, но не только. База данных — это средство доступа ктаким файлам? Да, но не это главное. По моему мнению, база данных — это, преждевсего, хранилище объектов данных, т.е. набора возможных понятий или событий,описываемых базой данных, с возможностью поиска этих объектов по признакам.Неотъемлемой чертой базы данных является возможность связывания объектов междусобой. Например, шапка накладной и ее содержание (включение), ИНН и реквизитыорганизации (ссылка), т.е. уникальное значение в одном из столбиков таблицы иодно или несколько значений из другой таблицы. Такие связи принято называтьнормализацией базы данных, но об этом позже. Так вот, это лирическоеотступление было мне необходимо для пояснения примера о базах знаний. Я считаю,и думаю, что Вы согласитесь, что базой данных можно считать не только таблицы,индексирующие файлы со знаниями разных форматов, но и сами эти файлы, потому,что они являются не типизированными хранилищами знаний в такой базе данных.Итак, в базах знаний мы накапливаем опыт прошлого. Потом человек может сампринять решение на основе этого опыта (типичный случай с мультимедийнымсправочником) или поставить задачу перед базой данных по поиску решениясогласно сложившейся ситуации (найти закон, поясняющий правило оформлениятаможенной декларации и т.п.). Так происходит в программах справочногохарактера, например «Консультант плюс» и т.д. Как частный случай баз данных,можно рассматривать различные структурированные файлы, например словари дляпереводчиков, форматы файлов RTF, DOC, книги Microsoft Excel, файлы с письмамидля почтовых Internet программ и т.д., жизненно важные функции баз данных, вкоторых реализуются за счет внутренних функций программ работающих с ними. Базыданных могут применяться как вспомогательное средство, позволяющее реализоватькакую-то полезную функцию. Например, хранение настроек программы (реестрMicrosoft Windows), Internet адресов для рассылки рекламы и т.д. Итак, мырассмотрели различные базы данных. Этих примеров достаточно, чтобы оценитьдиапазон применений баз данных в современном мире.
Отличительнойчертой баз данных следует считать то, что данные хранятся совместно с их описанием,а в прикладных программах описание данных не содержится. Независимые отпрограмм пользователя данные обычно называются метаданными. В ряде современныхсистем метаданные, содержащие также информацию о пользователях, форматыотображения, статистику обращения к данным и др. сведения, хранятся в словаребазы данных.
Такимобразом, система управления базой данных (СУБД) — важнейший компонентинформационной системы. Для создания и управления информационной системой СУБДнеобходима в той же степени, как для разработки программы на алгоритмическомязыке необходим транслятор. Основные функции СУБД:
управлениеданными во внешней памяти (на дисках);
управлениеданными в оперативной памяти;
журнализацияизменениий и восстановление базы данных после сбоев;
поддержаниеязыков БД (язык определения данных, язык манипулирования данными).
Обычносовременная СУБД содержит следующие компоненты (см. рис. 1):
ядро,которое отвечает за управление данными во внешней и оперативной памяти ижурнализацию,
процессор языкабазы данных, обеспечивающий оптимизацию запросов на извлечение и изменениеданных и создание, как правило, машинно-независимого исполняемого внутреннегокода,
подсистемуподдержки времени исполнения, которая интерпретирует программы манипуляцииданными, создающие пользовательский интерфейс с СУБД
а такжесервисные программы (внешние утилиты), обеспечивающие ряд дополнительныхвозможностей по обслуживанию информационной системы.
/>
Рис.1 Компоненты СУБД
Созданиепервых баз данных и СУБД стало возможно лишь с появлением достаточно дешевых ипроизводительных устройств внешней памяти, какими стали жесткие диски(винчестеры), появившиеся во второй половине 60-х годов. В 70-е годы шлаинтенсивная разработка теоретических вопросов построения баз данных. Врезультате в начале 80-х годов на рынке появились мощные инструментальныесредства проектирования и построения информациоонных систем. Однако, развитиеинформационных технологий в 90-х привело к появлению новых, более широкихтребований к обработке и представлению данных.
1. Обзорвозможностей Visual FoxPro
VisualFoxPro дает вам больше того, что можно было ожидать от системы управлениябазами данных (СУБД), если говорить о скорости, мощности и гибкости. Болеетого, Visual FoxPro ведет вас в мир нового поколения Xbase-систем, предоставляяновые объектную и событийную модели, которые помогут вам быстрее, чем прежде,создавать и модифицировать приложения.
VisualFoxPro предлагает следующие средства и возможности:
Быстраяразработка приложений:
Мастера ипостроители:
Если выхотите быстро получать результаты, мастера ѕ это то, что вам нужно. Ониразбивают часто встречающиеся в Visual FoxPro задачи на ряд элементарных шагов,сопровождая каждый из них подробными инструкциями по его выполнению. Например,мастер таблиц руководит процессом создания таблицы, мастер формы рассказывает,как строить форму, а мастер запроса показывает, как составить стандартный запрос.
Построителиѕ это визуальные инструментальные средства, помогающие создавать элементыуправления согласно вашим спецификациям. Например, построитель списковпредставляет собой диалоговое окно с вкладками, с помощью которого можносконструировать список в данной форме. Этот построитель позволит задатьсвойства вашего списка.
КонструкторыVisual FoxPro:
Если выхотите обладать более широкими возможностями контроля по сравнению с теми,которые предоставляют мастера и построители, используйте конструкторы VisualFoxPro. Конструкторы обеспечивают графический интерфейс, посредством котороговы можете создавать те или иные компоненты своего приложения. Например, выможете определить форму с помощью конструктора форм или сконструировать таблицус помощью конструктора таблиц.
Стандартныеинтерфейсы приложений
В VisualFoxPro вы можете с помощью конструктора форм включать в приложения мощныеэлементы управления, которые выступают в роли интерфейсов, не требуя (или почтине требуя) при этом никакого кодирования. Элемент управления сетка, связанный содной из таблиц, позволит без труда создавать формы, отражающие отношениеодин-ко-многим: достаточно мышью наложить таблицу на данную форму, чтобысформировать элемент управления сетка. Чтобы обеспечить совместимость с другимиприложениями, вы можете при помощи элемента управления кадр страницы создаватьдиалоги с вкладками или собственные интерфейсы конструирования.
Расширенныевозможности разработки
Объектно-ориентированноепрограммирование
Хотя системаVisual FoxPro по-прежнему поддерживает стандартные методы процедурногопрограммирования Xbase, теперь в ее состав включены средства самого настоящегообъектно-ориентированного программирования. С помощью объектной модели VisualFoxPro вы можете получить доступ ко всем возможностям объектно-ориентированногопрограммирования, включая наследование, инкапсуляцию, полиморфизм и подклассы.Все эти средства реализованы в виде расширений языка Xbase. Вы можете ускоритьразработку приложений, воспользовавшись классами. Например, можно создатьбазовые форму, панель инструментов или страничный кадр с помощью базовыхклассов Form, Toolbar и PageFrame, предусмотренных в составе Visual FoxPro.
Потом выможете повторно использовать свой код и формы, определяя новые классы на основеранее созданных классов. Например, на основе базового класса Form можно создатьпользовательский класс, который автоматически придаст всем формам приложениятребуемый вид и образ действий.
Модельклассов Visual FoxPro дает вам широкие возможности по контролю над объектамивашего приложения. Вы сможете на этапе выполнения управлять внешним видом иповедением объектов формы в том же объеме, что и в конструкторе форм на этаперазработки.
В VisualFoxPro можно создавать классы либо визуально, используя конструктор классов,либо программным путем с помощью команды DEFINE CLASS.
События
В VisualFoxPro можно создавать приложения, полностью управляемые событиями, причем дляэтого вам не понадобятся ни команды READ различных уровней, ни ограничения окнапросмотра, ни самостоятельно написанные программы обработки событий: VisualFoxPro содержит событийную модель, которая выполняет автоматическую обработкусобытий.
Благодаряэтой модели вы получаете доступ ко всем стандартным событиям Windows, таким какдвижение мыши, данное событие позволяет перемещать объекты с помощью мыши. Выможете контролировать события либо визуально, используя окно Properties, либопрограммным путем, с помощью языка Visual FoxPro.
ТехнологияRushMore
Производительностьобработки запросов можно резко повысить с помощью технологии Rushmore: этоуникальная технология, позволяющая быстро выбирать группы записей из таблиц; сее помощью время ответа на запрос сокращается с нескольких часов или минут досекунд.
Приобращении к отдельным таблицам вы можете пользоваться технологией Rushmoreвсякий раз, когда встречается предложение FOR.
Взаимодействиес другими приложениями
Панелиинструментов
Как и вдругих приложениях Microsoft, в Visual FoxPro для удобства работы предусмотреныпанели инструментов. Они состоят из кнопок, которые представляют частовстречающиеся задачи или часто используемые объекты. Чтобы выполнить задачу иливоспользоваться объектом, достаточно нажать соответствующую кнопку.
Вы можетеадаптировать панели инструментов, поступающие в составе Visual FoxPro, а такжеопределять пользовательские панели инструментов для своих приложений.
Совместноеиспользование данных с другими приложениями
В VisualFoxPro довольно просто обеспечить совместное использование данных с другимиприложениями. Например, пользоваться данными Visual FoxPro совместно с Excelпозволяет мастер опорных таблиц, а совместно с Word мастер автоматизированнойрассылки.
Можновключать объекты из другого приложения, связывая или внедряя их в таблицы или вформы. Затем эти объекты можно редактировать непосредственно, не выходя изVisual FoxPro.
АвтоматизацияOLE
Средстваавтоматизации OLE позволяют расширить возможности приложения: вы можетепрограммным способом контролировать работу других приложений. Например, можносделать так, чтобы приложение Excel выполнило определенные вычисления,приложение Graph построило график на основании полученных результатов, а затемсохранить этот график в поле типа General в таблице Visual FoxPro — и все это врамках кода Visual FoxPro.
Импортированиеи экспортирование данных
Вы можетеимпортировать и экспортировать данные между Visual FoxPro и многими другимиприложениями, используя разнообразные форматы файлов: текст, электроннуютаблицу и другие. Данные можно легко добавлять в существующие таблицы. Мастеримпорта поможет вам принять решение о структуре, которую будут иметь данные,импортированные в Visual FoxPro.
Средствасвязанные со средой клиент/сервер
Словарьданных
Базы данныхVisual FoxPro (файлы.DBC) предоставляют вам словарь данных, который позволяетопределять представления и соединения, а также правила, триггеры и постоянныеотношения для любой таблицы, принадлежащей базе данных.
В базеданных можно определять следующие элементы.
Правилауровня поля или уровня записи, соблюдение которых Visual FoxPro отслеживает прикаждом использовании таблицы в приложении.
Ключипервичного индекса и индекса-кандидата.
Локальные иудаленные представления.
Триггеры.
Постоянныеотношения между таблицами базы данных.
Соединения судаленными источниками данных.
Хранимыепроцедуры.
Значения,принимаемые для полей по умолчанию.
Длинныеимена таблиц и полей.
Помимоэтого, вы можете обеспечить для каждого постоянного отношения целостность науровне ссылок, определив с помощью построителя ссылочной целостности правилаопераций добавления, обновления и удаления.
VisualFoxPro также поддерживает значения NULL в таблицах, что существенно повышаетсовместимость с другими источниками данных, такими как Microsoft Access, VisualBasic и серверы на базе SQL.
Удалённые игетерогенные представления
Вы можетеразработать и протестировать на своем локальном компьютере приложениеклиент/сервер, использующее данные из удаленных, локальных или многотабличныхгетерогенных представлений. В локальных представлениях используются таблицы,размещенные на локальном компьютере, но не таблицы удаленного сервера, а вмноготабличных представлениях ѕ связанные данные из различных таблиц. Можносоздавать параметризованные представления, чтобы из сервера извлекалось какможно меньше данных, а затем обновлять удаленные данные из приложения VisualFoxPro.
Транзакции
Вы можетеразработать приложение таким образом, чтобы оно обеспечивало совместный доступк данным. Совместный доступ подразумевает коллективное использование данныхнесколькими пользователями, а также ограничение доступа в случае необходимости.Применение транзакций и буферизации (жесткой или мягкой, на уровне записей илина уровне таблицы) означает, что вам придется меньше программировать. Процессобновления данных в многопользовательской среде значительно упрощаетсяблагодаря встроенной пакетной обработке и средствам детализированного контролянад конфликтами при обновлении.
Поддержкасистемы клиент/сервер
VisualFoxPro можно использовать как среду разработки приложений клиент/сервер. В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
Создаетметку, в которой отображается текст.
Метка — этографический элемент управления, отображающий текст, который нельзя изменитьнепосредственно. Однако поскольку метка обладает полным комплектом свойств,событий и методов, как и прочие элементы управления, она может реагировать насобытия и может быть изменена на этапе выполнения.
Чтобыназначить метке клавишу доступа, поставьте в ее названии обратную косую черту изнак меньше (\
Названияотображаются на экране по-разному, в зависимости от объекта.
Учтите, чтомаксимальное число символов, допустимое для свойства 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 SystemR упоминаются два вида таких структур: индексы и связи (links). Индекс в егоабстрактном языковом представлении — это инвертированный файл, обеспечивающийдоступ к кортежам соответствующего отношения на основе заданных значений одногоили нескольких столбцов, составляющих ключ индекса. Операторы языка позволялисоздавать и уничтожать индексы, но никаким образом не давали возможности явноуказать на необходимость использования существующего индекса при выполненииоператора выборки, решение об этом возлагалось на реализацию.
С помощьюоператора определения индекса можно было выразить два дополнительныхутверждения, касающихся логической схемы отношения и физической структуры егохранения. Использование при определении индекса ключевого слова UNIQUEозначало, что ключ этого индекса является возможным ключом соответствующегоотношения. Фактически это означает наличие дополнительного механизмаопределения ограничения целостности отношения. Один из индексов для данногоотношения мог быть определен с ключевым словом CLUSTERING. Это означаеттребование физической кластеризации во внешней памяти кортежей отношения сравными или близкими значениями ключа индекса.
Операторыопределения связи позволяли в стиле сетевой модели данных организовать вовнешней памяти списки кортежей указанного отношения. Как и в случае индексов,операторы позволяли создавать и уничтожать такие списки, но не даваливозможности явно указать на необходимость использования существующих списковпри выполнении операторов выборки. Большая трудоемкость поддержания списков привыполнении операторов манипулирования данными и трудность выполнения оценокстоимости их использования при выполнении операторов выборки привели к тому,что механизм связей исчез из языка уже на поздней стадии проекта System R. Стех пор этот механизм, насколько нам известно, не появлялся ни в одном вариантеSQL.
ВстроенныйSQL
В SQL SystemR присутствуют специальные операторы, поддерживающие встраивание операторов 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 –добавить пустую запись.
(аналогичнокнопке «Новая запись» страницы «Тек. запись»)
Deleterecord – удалить текущую запись.
(аналогичнокнопке «Удалить» страницы «Тек. запись»)
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).
Списокиспользованных источников
1. И.Ю. Баженова «VisualFoxPro 6.0» – Москва, «Диалог-МИФИ», 1999
2. Л. Омельченко«Самоучитель Visual FoxPro 6.0» – «BHV-Санкт-Петербург», 1999
3. М. Базиян и др.«Использование Visual FoxPro 6» – Москва, Санкт-Петербург, Киев, Издательскийдом «Вильямс», 1999
4. А.А. Попов «Созданиеприложений для FoxPro 2.5/2.6 в DOS и WINDOWS» – Москва, «ДЕСС», 1999
5. MicrosoftDeveloper Network (MSDN) Documentation On Visual FoxPro.
6. alpha.netis.ru/win/db/toc.html
7. www.cit-forum.com/
8. www.vlata.com/vfp
Приложение1.Листинг программы
В качествелистинга программы выступают процедуры и методы-обработчики визуальных компонентизменённые вручную, а также текст меню сгенерированный программой.
Form1.init
SETSAFETY OFF
SETDELETED ON
copystructure to temp.dbf
setorder to pozic ASCENDING
DOmenu1.mpr WITH THISFORM,.T.
THIS.pageframe1.page3.cboField1.clear
THIS.pageframe1.page3.cboField2.clear
THIS.pageframe1.page3.cboField3.clear
FORnLoop = 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
IFUSED(THIS.Alias)
USEIN (THIS.Alias)
ENDIF
Form1.Destroy
PACK
reindex
closedatabases
Form1.bldsql
LOCALlcOperand1,lcOperand2,lcWHERE;
lcField1,lcRelation1, lcValue1,;
lcField2,lcRelation2, lcValue2,;
lcField3,lcRelation3, lcValue3,;
lcAlias,lcSQL, lcType
Testto make sure all values that are required have been entered
*------------------------------------------------------------------
IFEMPTY(THISFORM.pageframe1.page3.cboField1.Value)
HISFORM.pageframe1.page3.cmdExecute.Enabled=.F.
RETURN
ELSE
IFTHISFORM.pageframe1.page3.opgOperand1.Value > 0 AND;
EMPTY(THISFORM.pageframe1.page3.cboField2.Value)
THISFORM.pageframe1.page3.cmdExecute.Enabled=.F.
RETURN
ELSE
IFTHISFORM.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)
DOCASE
CASETHISFORM.pageframe1.page3.opgOperand1.Value = 0
lcOperand1= ""
CASETHISFORM.pageframe1.page3.opgOperand1.Value = 1
lcOperand1= " AND "
CASETHISFORM.pageframe1.page3.opgOperand1.Value = 2
lcOperand1= " OR "
ENDCASE
DOCASE
CASETHISFORM.pageframe1.page3.opgOperand2.Value = 0
lcOperand2= ""
CASETHISFORM.pageframe1.page3.opgOperand2.Value = 1
lcOperand2= " AND "
CASETHISFORM.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
LPARAMETERSoSource, oTxt
LOCALlcType
oTxt.Value= ""
lcType= TYPE(oSource.Value)
DOCASE
CASElcType = «D»
oTxt.Format= «D»
CASElcType = «L»
oTxt.Inputmask= ".T.,.F."
oTxt.Format= «M»
CASElcType = «T»
oTxt.Inputmask= «99/99/99 99:99:99»
ENDCASE
Form1.validatetype
LPARAMETERSlField, lcValue
LOCALlcType
lcType= TYPE(lField)
DOCASE
CASElcType $ «CM»
lcValue= CHR(34) + lcValue + CHR(34)
CASElcType $ «DT»
lcValue= "{" + lcValue + "}"
CASElcType $ «NY»
IFEMPTY(lcValue)
lcValue= «0»
ENDIF
CASElcType $ «L»
IF!INLIST(UPPER(lcValue),".T.", ".F.")
lcValue= ".T."
ENDIF
ENDCASE
RETURNlcValue
Form1.PageFrame1.Grid1.Column1.Header1.MouseUp
LPARAMETERSnButton, nShift, nXCoord, nYCoord
IFnShift = 2
SETORDER TO razdel DESCENDING
ELSE
SETORDER TO razdel ASCENDING
ENDIF
GOTOP
THISFORM.Refresh
Form1.PageFrame1.Grid1.Column2.Header1.MouseUp
LPARAMETERSnButton, nShift, nXCoord, nYCoord
IFnShift = 2
SETORDER TO pozic DESCENDING
ELSE
SETORDER TO pozic ASCENDING
ENDIF
GOTOP
THISFORM.Refresh
Form1.PageFrame1.Grid1.Column3.Header1.MouseUp
LPARAMETERSnButton, nShift, nXCoord, nYCoord
IFnShift = 2
SETORDER TO garant DESCENDING
ELSE
SETORDER TO garant ASCENDING
ENDIF
GOTOP
THISFORM.Refresh
Form1.PageFrame1.Grid1.Column4.Header1.MouseUp
LPARAMETERSnButton, nShift, nXCoord, nYCoord
IFnShift = 2
SETORDER TO cena_1 DESCENDING
ELSE
SETORDER TO cena_1 ASCENDING
ENDIF
GOTOP
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
appendblank
thisform.refresh
thisform.pageframe1.page2.commandgroup1.command3.Click
Form1.PageFrame1.Page2.commandgroup1.Command5.Click
ifmessagebox(«Вы действительно хотите удалить эту запись?», 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
gobottom
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
LOCALlcOldAlias
lcOldAlias= ALIAS()
cMacro= ALLTRIM(THISFORM.DataSql) + «INTO CURSOR TEMPQUERY»
&cMacro
IF_TALLY = 0
#DEFINEMSG_LOC «No records were found to match the criteria you specified.»
#DEFINETITLE_LOC «No Results»
=MESSAGEBOX(MSG_LOC,64+0+0,TITLE_LOC)
ELSE
BROWSENORMAL TITLE SUBSTR(THISFORM.DataSql, AT(«WHERE»,THISFORM.DataSql)+6)
ENDIF
IFUSED(«TEMPQUERY»)
USEIN TEMPQUERY
ENDIF
IFUSED(lcOldAlias)
SELECT(lcOldAlias)
ENDIF
Form1.PageFrame1.Page3.cmdClear.Click
THISFORM.ClearSQL
Form1.FormExit.Click
thisform.release
MainMenu
LPARAMETERSoFormRef, getMenuName, lUniquePopups, parm4, parm5, parm6, parm7, parm8, parm9
LOCALcMenuName, nTotPops, a_menupops, cTypeParm2, cSaveFormName
IFTYPE(«m.oFormRef») # «O» OR;
LOWER(m.oFormRef.BaseClass)# 'form' OR;
m.oFormRef.ShowWindow# 2
MESSAGEBOX([Thismenu can only be called from a Top-Level form. Ensure that your form'sShowWindow property is set to 2. Read the header section of the menu's MPR filefor more details.])
RETURN
ENDIF
m.cTypeParm2= TYPE(«m.getMenuName»)
m.cMenuName= SYS(2015)
m.cSaveFormName= m.oFormRef.Name
IFm.cTypeParm2 = «C» OR (m.cTypeParm2 = «L» AND m.getMenuName)
m.oFormRef.Name= m.cMenuName
ENDIF
IFm.cTypeParm2 = «C» AND!EMPTY(m.getMenuName)
m.cMenuName= m.getMenuName
ENDIF
DIMENSIONa_menupops[3]
IFTYPE(«m.lUniquePopups»)=«L» AND m.lUniquePopups
FORnTotPops = 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
LOCALlHasNewMenu
lHasNewMenu= (TYPE(«CNTPAD(m.cMenuName)») # «N»)
IFm.lHasNewMenu
DEFINEMENU (m.cMenuName) IN (m.oFormRef.Name) BAR
ENDIF
DEFINEPAD _03s1d879u OF (m.cMenuName) PROMPT "\
KEYALT+F, ""
DEFINEPAD _03s1d879v OF (m.cMenuName) PROMPT "\
KEYALT+E, ""
DEFINEPAD _03s1d879w OF (m.cMenuName) PROMPT "\
KEYALT+Q, ""
DEFINEPAD _03s1d879x OF (m.cMenuName) PROMPT "\
KEYALT+H, ""
ONPAD _03s1d879u OF (m.cMenuName) ACTIVATE POPUP (a_menupops[1])
ONPAD _03s1d879v OF (m.cMenuName) ACTIVATE POPUP (a_menupops[2])
ONSELECTION PAD _03s1d879w OF (m.cMenuName);
DO_03s1d879z;
INLOCFILE(«MY\MENU1»,«MPX;MPR|FXP;PRG»,«WHERE isMENU1?»)
ONPAD _03s1d879x OF (m.cMenuName) ACTIVATE POPUP (a_menupops[3])
DEFINEPOPUP (a_menupops[1]) MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINEBAR 1 OF (a_menupops[1]) PROMPT "\
MESSAGE«Выход из программы»
ONSELECTION BAR 1 OF (a_menupops[1]);
DO_03s1d87a4;
INLOCFILE(«MY\MENU1»,«MPX;MPR|FXP;PRG»,«WHERE isMENU1?»)
DEFINEPOPUP (a_menupops[2]) MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINEBAR 1 OF (a_menupops[2]) PROMPT "\
DEFINEBAR 2 OF (a_menupops[2]) PROMPT "\
DEFINEBAR 3 OF (a_menupops[2]) PROMPT "\
ONSELECTION BAR 1 OF (a_menupops[2]);
DO_03s1d87a6;
INLOCFILE(«MY\MENU1»,«MPX;MPR|FXP;PRG»,«WHERE isMENU1?»)
ONSELECTION BAR 2 OF (a_menupops[2]);
DO_03s1d87a8;
INLOCFILE(«MY\MENU1»,«MPX;MPR|FXP;PRG»,«WHERE isMENU1?»)
ONSELECTION BAR 3 OF (a_menupops[2]);
DO_03s1d87aa;
INLOCFILE(«MY\MENU1»,«MPX;MPR|FXP;PRG»,«WHERE isMENU1?»)
DEFINEPOPUP (a_menupops[3]) MARGIN RELATIVE SHADOW COLOR SCHEME 4
DEFINEBAR 1 OF (a_menupops[3]) PROMPT "\
ONSELECTION BAR 1 OF (a_menupops[3]);
DO_03s1d87ac;
INLOCFILE(«MY\MENU1»,«MPX;MPR|FXP;PRG»,«WHERE isMENU1?»)
ACTIVATEMENU (m.cMenuName) NOWAIT
IFm.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
doform Fabout.scx