ЛЕКЦИЯ 6. Интегрированная среда VB 6.0 обработки Баз Данных СОДЕРЖАНИЕ 6. ЛЕКЦИЯ 6. ИНТЕГРИРОВАННАЯ СРЕДА VB 6.0 ОБРАБОТКИ БАЗ ДАННЫХ .................................................................................................................... 2 6.1. Возможности среды VISUAL BASIC 6.0 по обработке Баз данных .................................. 2 6.2. Доступ к базам данных с использованием элемента управления Data .............................. 2 6.2.1. Элемент управления Data. Основные свойства ............................................................. 2 6.2.2. Методы элемента Data ..................................................................................................... 4 6.3. Обработка однотабличной БД с помощью элемента Data .................................................. 4 6.3.1. Способ 1 (обработка таблицы с использованием массива, в который переносятся элементы таблицы) ..................................................................................................................... 5 6.3.2. Способ 2 (непосредственная обработка таблицы) ....................................................... 7 6.4. Обработка двухтабличной БД с помощью элемента DATA ............................................... 8 6.4.1. Обработка таблиц с использованием массивов, в которые переносятся элементы таблиц (Способ 1) ....................................................................................................................... 9 6.4.2. Способ 2 (непосредственная обработка таблиц) ....................................................... 13 1 Барковский В. В. Лекции 6. ЛЕКЦИЯ 6. ИНТЕГРИРОВАННАЯ СРЕДА VB 6.0 ОБРАБОТКИ БАЗ ДАННЫХ 6.1. Возможности среды VISUAL BASIC 6.0 по обработке Баз данных После создания Базы Данных очередной становится задача организации её обработки с целью получения нужной информации. Имеется несколько вариантов работы: доступ к Базам Данных через элемент управления Data; доступ к Базам Данных с использованием языка SQL (Structured Query Language - Структурированный Язык Запросов); доступ к Базам Данных с использованием других средств. Рассмотрим доступ, основывающийся на операциях с элементом управления Data, мощным инструментом для выполнения разнообразнейших операций с Базами Данных. 6.2. Доступ к базам данных с использованием элемента управления Data 6.2.1. Элемент управления Data. Основные свойства Элемент управления Data обеспечивает связь проекта VB (его программы) с Базой Данных, позволяя получить доступ к записям одной таблицы БД. Несколько элементов Data позволят обеспечить доступ ко всем таблицам многотабличной БД. Элемент Data вызывается обычным образом из панели элементов управления Toolbox на форму (рис. 6.1): Кнопка Last позволяет сразу переходить к последней записи таблицы БД Кнопка First позволяет сразу переходить к первой записи таблицы БД Кнопка Previous вызывает переход к предыдущей записи таблицы БД Кнопка Next вызывает переход к следующей записи таблицы БД Рис. 6.1. Экранная форма с элементом Управления Data Указатель (внутренняя переменная) БД позволяет выбрать текущую запись и текущее поле в записи. При просмотре на форме в режиме проектирования указатель по записям можно перемещать с помощью кнопок элемента Data, по элементам (полям) – с помощью мыши. При работе программы VB перемещение по записям (и полям) осуществляется специальными командами. Совместно с элементом Data используются и совокупность других элементов управления Label, TextBox или ListBox. Каждый из совокупности этих элементов (объектов) связывается с 2 ЛЕКЦИЯ 6. Интегрированная среда VB 6.0 обработки Баз Данных определенным полем таблицы БД, показывая содержание поля. Поэтому их называют связанными объектами. Связанных объектов может быть столько, сколько полей в таблице (или меньше, если не все поля нас интересуют). При перемещении указателя таблицы с помощью кнопок Data связанные объекты обновляют свое содержание. Свойства элемента Data: Caption - Имя объекта данных (имя таблицы базы данных, например, Postavka). Name – Имя элемента в программе. По умолчанию Data1, Data2, Font - выбор шрифта для текста, размещаемого на элементе Data. Connect – указывает тип формата Базы данных (например, формат системы Access устанавливается по умолчанию). *DataBaseName – устанавливает полный путь к файлу, где записана База Данных (например, H:\SKLAD, где H – имя рабочего диска, SKLAD – имя БД). RecordSource – устанавливает источник Данных: имя таблицы БД (источник записей) RecordSource = Text1.Text (имя элемента, в котором источник записан Запрос) Данных Запрос (SQL - оператор) Свойство RecordSource (Источник записей) позволяет использовать операторы языка SQL), обеспечивающие выделение подмножества записей, удовлетворяющих заданным условиям, например: RecordSource = “Select * From Postavka Where NameIzd = ‘Дисплей’ ” RecordSetType – устанавливает тип источника (набора) данных: 0 – Table (из таблицы - работа с полной таблицей ); RecordSetType = 1 – Dynaset (из динамического набора, полученного в результате выполнения SQL - запроса; 2 – Snapshot (из моментального списка (копия данных) – только чтение. Для примера разместим на форме (рис. 6.1) массив из нескольких связанных элементов Text1(0), Text1(1), … Text1(k). Далее зададим указанные выше свойства элемента данных, которые свяжут его с БД, и свойства связанных элементов, определяющие источники информации. Свойства связанных элементов: Name = Text1(0) DataSource = Data1 ‘источник данных (записей) DataField = поле1 таблицы Name = Text1(1) DataSource = Data1 ‘источник данных (записей) DataField = поле2 таблицы Напоминаем, DataSource (устанавливает источник Данных для метки Label, текстового поля TextBox или списка ListBox) и DataField (устанавливает связь метки Label, текстового поля TextBox или списка ListBox с интересующим полем таблицы Базы Данных) - это свойства элементов Label, TextBox, ListBox. 3 Барковский В. В. Лекции 6.2.2. Методы элемента Data Элемент Управления Data имеет большой набор методов (напоминаем, методы – это системные подпрограммы, расширяющие функциональные возможности элементов Управления) для непосредственной работы с записями таблиц БД. Методы вызываются из раскрывающегося Меню в момент указания свойства Name элемента Data (Data1) при написании Программного кода и записываются с использованием разделительного символа “.” в виде: Data1.RecordSet.AddNew – добавление новой записи в таблицу; *Data1.RecordSet.MoveLast – переход к последней записи; *Data1.RecordSet.MoveFirst – переход к первой записи; *Data1.RecordSet.MoveNext – переход к следующей записи; *Data1.RecordSet.MovePrevious – переход к предыдущей записи; Data1.RecordSet.Delete – удаление текущей записи; Data1.RecordSet.Edit – переход к редактированию записи; Data1.RecordSet.Update – передача в текущую запись введённых или изменённых данных; Data1.RecordSet.RecordCount – количество записей в текущей таблице; Data1.RecordSet.Fields (K).Value – передача значения K-го поля текущей записи; Data1.RecordSet.Fields (K).Name– передача значения имени K-го поля текущей таблицы; Data1.RecordSet.Fields.Count – количество столбцов текущей таблицы; Data1.RecordSet.Refresh – обновление содержимого всех элементов Экранной формы, связанных с текущей таблицей, в соответствии с её текущим физическим состоянием; Data1.RecordSet.Eof – метка конца текущей таблицы. Действия методов, отмеченных “*”, аналогичны действиям кнопок элемента Data. Пример 1. Фрагмент вычисления среднего значения третьего по порядку числового поля таблицы: ... S=0 Data1.RecordSet.MoveFirst ‘первая запись стала текущей For I=1 To Data1.RecordSet.RecordCount ‘по записям текущей таблицы S=S + Data1.RecordSet.Fields(3).Value Data1.RecordSet.MoveNext ‘к следующей записи таблицы Next I S=S/ Data1.RecordSet.RecordCount ‘искомое среднее значение ... 6.3. Обработка однотабличной БД с помощью элемента Data Пусть имеется поквартальная таблица поставок Postavka комплектующих (объём поставки в рублях): Таблица поставок комплектующих (Postavka) Шифр Наименование Поставка Поставка Поставка Поставка изделия изделия в 1-м кв. во 2-м кв. в 3-м кв. В 4-м кв. (ShIzd) (NameIzd) (Pkv1) (Pkv2) (Pkv3) (Pkv4) IS22 Сканер 30 20 40 35 Д84 Клавиатура 60 20 50 44 BJ Картридж 115 212 100 90 B11 Батарея 20 21 34 37 I18 Источник питания 30 28 15 14 A16 Дисплей 16 27 32 5 C15 Принтер 5 32 27 16 SDR Дисковод 45 50 40 35 4 ЛЕКЦИЯ 6. Интегрированная среда VB 6.0 обработки Баз Данных Таблица создана средствами Visual Data Manager. В ней 8 записей. Необходимо напечатать наименования изделий, объёмы поставок которых по кварталам монотонно падают. 6.3.1. Способ 1 (обработка таблицы с использованием массива, в который переносятся элементы таблицы) Способ 1 основывается на использовании двумерных массивов. В эти массивы переносятся (передаются) значения полей таблиц Базы Данных. Шаги: 1. В секции General Declaration модуля объявить глобальный динамический двумерный массив B, соответствующий таблице Postavka, и глобальные переменные. Public B() As Variant Public I%, J%, K%, P%, F% Замечание: В переменной типа Variant происходит внутреннее преобразование типов в соответствии с полученным значением. Пусть А – переменная этого типа. Пример 1 : А = “123” ‘тип String – содержит строку А = А+5 ‘тип Integer – содержит число 123+5= 128 А = А& “_рублей” ‘тип String – содержит “128_рублей”. Пример 2 : Если необходимо сравнивать числовые значения переменных А и В, имеющих тип Variant, то нужно указать это в виде: If Val (A) < Val (B) Then …. 2. Создать форму: Связанные элементы TextBox Элемент управления Data1 Надпись над элементом ListBox (элемент Lbl1) ListBox (для вывода наименований найденных изделий) Командная кнопка Cmd1 для за пуска программы передачи значений полей записей таблицы Postavka в массив B и в сетку Flp Командная кнопка Cmd3 (выход из программы) Командная кнопка Cmd2 для запуска решения задачи MSFlexGrid – гибкая сетка с именем Flp Рис. 6.2. Экранная форма для работы с БД с одной таблицей (Postavka) На ней расположить: - массив элементов TextBox (Text1(0), Text1(1), …Text1(5)) для полей записей таблицы Postavka (связанные объекты); - элемент управления Data1; 5 Барковский В. В. Лекции - кнопки: Cmd1 – для запуска процедуры передачи значений полей записей таблицы в массив В и в сетку Flp; Cmd2 – для запуска решения задачи; Cmd3 – для выхода из Проекта; – метку: Lbl1 – надпись над элементом ListBox; - элемент ListBox для вывода наименований найденных изделий (с именем Lst1); - элемент MSFlexGrid с именем Flp (Microsoft FlexGrid Control 6.0) – для отображения таблицы Postavka. Элемент управления MSFlexGrid обеспечивает отображение на Экранной форме таблиц БД (двумерных массивов) и существенно облегчает пользователю общение с Базой Данных. В основном наборе панели элементов управления Toolbox он не содержится. Этот элемент включён в дистрибутивное хранилище дополнительных элементов управления Components, которое можно открыть либо, как это указано в Лекции 1, или выполнив последовательность команд: Меню – Проект (Project) – Компоненты … (Components) – окно Components В окне у компоненты Microsoft FlexGrid Control 6.0 поставить галочку и нажать OK. На панели Toolbox появится элемент управления MSFlexGrid в виде . Затем обычным способом вызвать элемент на экранную форму и установить его размеры. Основные свойства элемента MSFlexGrid (его часто называют гибкой сеткой): Name – имя гибкой сетки в программе (по умолчанию MSFlexGrid1). Можно задать Flp; Rows – количество строк в сетке, начиная с нуля (задаётся в окне свойств элементов управления, или в программе); Cols – количество столбцов в сетке, начиная с нуля (задаётся в окне свойств элементов управления, или в программе); DataSource – устанавливает источник данных для MSFlexGrid, например, DataSource = Postavka; Font – выбор шрифта для текста сетки; При использовании элемента управления MSFlexGrid при работе с Базами Данных (и двумерными массивами) удобно использовать его метод TextMatrix (I, J), позволяющий определять координаты ячейки таблицы Базы Данных или массива. Метод Sort обеспечивает упорядочение строк считанной в гибкую сетку таблицы БД по заданному полю, если в программе записано выражение в виде: <имя сетки MSFlexGrid > .Sort = <заданное поле сетки MSFlexGrid > например, Flp.Sort = 1. 3. Установить свойства элемента Data1: *Name = Data1 ‘имя элемента Data Caption = Таблица Postavka ‘надпись на элементе Data1 Connect = Access (или Excel, FoxPro и т.д.) ‘тип Базы Данных * DataBaseName = H:\ … - имя БД ‘полный путь к Базе Данных *RecordSource = Postavka ‘источник данных - имя текущей таблицы БД *RecordSetType = 0 ‘режим обработки (0- из таблицы, где “*” – основные свойства элемента Data. 4. Установить свойства связанных элементов (элементов Text): Name = Text1(0) ‘номер в скобках не устанавливается DataSource = Data1 ‘источник данных (записей) DataField = ShIzd ‘поле текущей таблицы Name = Text1(1) DataSource = Data1 6 ЛЕКЦИЯ 6. Интегрированная среда VB 6.0 обработки Баз Данных DataField = NameIzd . . . Name = Text1(5) DataSource = Data1 DataField = Pkv4 ‘поле текущей таблицы ‘поле текущей таблицы 5. Установить основные свойства сетки MSFlexGrid, элементов ListBox и Label (рис.6. 2). 6. Разработать процедуры Form1: Private Sub Cmd1_Click ( ) ‘считывание таблицы Postavka в массив В и в сетку Flp Data1.RecordSet.MoveFirst ‘переход на первую запись K = Data1.RecordSet.RecordCount ‘количество записей таблицы Postavka L = Data1.RecordSet.Fields.Count ‘количество полей таблицы ReDim B(1 To K, 1 To L) Flp.Rows = K+1: Flp.Cols = 6 ‘установление размеров сетки Flp For I = 1 To K ‘по записям таблицы Postavka For J = 1 To L ‘по полям текущей записи If I = 1 Then Flp.TextMatrix (I-1, J-1) = Data1.RecordSet.Fields(J-1).Name B(I, J) = Text1(J-1) : Flp.TextMatrix(I, J-1) = B(I, J) ‘или = Text1(J-1) или Data1.RecordSet.Fields(J-1).Value Next J Data1.RecordSet.MoveNext ‘переход к следующей записи Next I End Sub Private Sub Cmd2_Click ( ) ‘нахождение изделий, объёмы поставок которых по кварталам монотонно падают P = -1 For I = 1 To K F=0 For J = 3 To 5 If B(I, J) <= B(I, J+1) Then F=1 Next J If F = 0 Then P = P+1 : Lst1.List(P) = B(I, 2) Next I If P = -1 Then Lbl1.Caption = “нет таких изделий” _ Else Lbl1.Caption = “искомые изделия” End Sub Private Sub Cmd3_Click ( ) End End Sub ‘выход из Проекта 6.3.2. Способ 2 (непосредственная обработка таблицы) Способ 2 основывается на использовании Методов элемента управления Data, обеспечивающих возможность непосредственной работы с таблицами Базы Данных. Шаги: 1. Выполнить пункты 2,3,4,5 Способа 1. 7 Барковский В. В. Лекции При создании формы Form1 (рис. 6.2) изменить надпись командной кнопки Cmd1 – на надпись “Таблица в сетку”. 2. Разработать процедуры Form1: Private Sub Cmd1_Click ( ) ‘считывание таблицы Postavka в сетку Flp Dim I%, J%, K% Data1.RecordSet.MoveFirst ‘переход на первую запись таблицы Postavka K= Data1.RecordSet.RecordCount ‘количество записей таблицы Postavka L = Data1.RecordSet.Fields.Count ‘количество полей таблицы Flp.Rows = K+1: Flp.Cols = 6 ‘установление размеров сетки Flp For I = 1 To K ‘по записям таблицы Postavka For J = 1 To L ‘по полям текущей записи If I = 1 Then Flp. Flp.TextMatrix (I-1, J-1)=Data1.RecordSet.Fields(J-1). _ Name Flp.TextMatrix (I, J-1) = Text1(J-1) ‘или = Data1.RecordSet.Fields(J-1).Value Next J Data1.RecordSet.MoveNext ‘переход к следующей записи Next I End Sub Private Sub Cmd2_Click ( ) ‘нахождение изделий, объёмы поставок которых _ по кварталам монотонно падают Dim I%, J%, F%, P% Data1.RecordSet.MoveFirst : P = -1 For I = 1 To Data1RecordSet.RecordCount F=0 For J = 2 To 4 If Data1.RecordSet.Fields(J).Value <= Data1.RecordSet.Fields(J+1).Value _ Then F=1 Next J If F = 0 Then P = P+1 : Lst1.List(P) = Data1.RecordSet.Fields(1).Value Data1.RecordSet.MoveNext Next I If P = -1 Then Lbl1.Caption = “нет таких изделий” Else _ Lbl1.Caption=“иск.изделия” End Sub Private Sub Cmd3_Click ( ) End End Sub ‘выход из Проекта 6.4. Обработка двухтабличной БД с помощью элемента DATA Пусть созданы поквартальная таблица поставок комплектующих изделий Postavka (см. п. 6.3) и таблица комплектующих изделий Izd. 8 ЛЕКЦИЯ 6. Интегрированная среда VB 6.0 обработки Баз Данных Шифр изделия (ShIzd) С15 Д84 IS22 А16 BJ SDR I18 B11 IS16 SDRU Таблица комплектующих изделий (Izd) Наименование Цена (руб.) Вес (кг.) (NameIzd) (Cena) (Ves) Принтер Клавиатура Сканер Дисплей Картридж Дисковод Источник питания Батарея Сканер Дисковод 27000 7500 1550 67000 875 175 75 100 175 200 3.5 1.7 1.4 7.5 0.25 0.25 0.2 0.25 0.2 0.2 В таблице Izd 10 записей. Требуется определить и вывести на элементы формы совокупную стоимость изделий, поставленных в 1- 4 кварталах, а также общий вес годовых поставок. Таблица Postavka может содержать меньше изделий, чем таблица Izd. Порядок размещения записей в таблицах произвольный. 6.4.1. Обработка таблиц с использованием массивов, в которые переносятся элементы таблиц (Способ 1) Шаги: 1. В секции General Declaration модуля объявить динамические глобальные двумерные массивы, соответствующие таблицам Postavka и Izd, и глобальные переменные: Public P () As Variant Public Iz () As Variant Public I%, J%, KztP%, KztI%, L%, F% 2. На форме Form1 расположить: массив элементов TextBox(Text1(0) …Text1(5)) для полей записей таблицы Postavka (связанные объекты); элемент данных Data1; кнопки : Cmd1 – для запуска процедуры передачи значений полей записей таблицы Postavka в массив P и в сетку Flp; Cmd2 – для запуска решения задачи; Сmd3 – для перехода на форму 2; Cmd4 – для выхода из Проекта; метку надписи ”Стоимость” над элементом ListBox (с именем Lbl1); метку для указания искомого веса или сообщения “Таблицы не согласованы” (с именем Lbl2); элемент ListBox (с именем Lst1); элемент MSFlexGrid (с именем Flp) для отображения таблицы Postavka; 9 Барковский В. В. Лекции Связанные элементы TextBox Элемент управления Data1 Lbl2(Указание искомого веса или сообщения – “Таблицы не согласованы”) Надпись над элементом ListBox (элемент Lbl1) ListBox (для вывода определяемых заданием сведений Командная кнопка Cmd4 выхода из Проекта Командная кнопка Cmd3 перехода на форму Form2 MSFlexGrid – Гибкая сетка с именем Flp Командная кнопка Cmd1 запуска программы передачи значений полей таблицы Postavka в массив P и в сетку Flp Командная кнопка Cmd2 запуска решения задачи Рис. 6.3. Экранная форма для работы с БД с таблицей (Postavka) 3. Установить свойства объекта Data1: Name = Data1 Caption = Tаблица Postavka Connect = Access DataBaseName = “H:\ . . . . .” – полный путь к файлу RecordSource = Postavka – имя таблицы – источник записей RecordSetType = 0 4. Установить свойства связанных элементов : Name = Text1(0) DataSource = Data1 - источник записей DataField = ShIzd - поле таблицы Name = Text1(1) DataSource = Data1 DataField = NameIzd . . . Name = Text1(5) DataSource = Data1 DataField = Pkv4 5. Установить основные свойства сетки MSFlexGrid, элементов ListBox и Label : Name = Flp; Name = List1; Name = Lbl1; Name = Lbl2. - элемент данных Data2; 6. Создать Form2. На ней расположить: массив элементов TextBox (Text2(0) …Text2(3)) для полей записей таблицы Izd (связанные объекты); 10 ЛЕКЦИЯ 6. Интегрированная среда VB 6.0 обработки Баз Данных Связанные элементы TextBox Элемент управления Data2 Командная кнопка Cmd5 для запуска процедуры передачи значений полей записей таблицы Izd в массив Iz и в сетку Fli Командная кнопка Cmd6 для перехода на форму Frm1 MSFlexGrid – гибкая сетка с именем FLi Рис. 6.4. Экранная форма для работы с БД (с таблицей Izd) - кнопки: Cmd5 – для запуска процедуры передачи значений полей записей таблицы Izd в массив Iz и в сетку Fli; Сmd6 – для перехода на форму Form1; элемент MSFlexGrid (с именем Fli) для отображения нужных полей таблицы Izd. 7. Установить свойства объекта Data2: Name = Data2 Caption = Tаблица Izd Connect = Access DataBaseName = “H:\ . . . . .” – полный путь к файлу RecordSource = Izd – имя таблицы – источник записей RecordSetType = 0 8. Установить свойства связанных элементов: Name = Text2(0) DataSource = Data2 - источник записей DataField = ShIzd - поле таблицы Name = Text2(1) DataSource = Data2 DataField = NameIzd Name = Text2(2) DataSource = Data2 DataField = Cena Name = Text2(3) DataSource = Data2 DataField = Ves 9. Установить свойства сетки MSFlexGrid : Name = Fli 10. Разработать процедуры Form1: Private Sub Cmd1_Click ( ) ‘процедура (1), считывание таблицы Postavka в _ массив P и в сетку Flp Data1.RecordSet.MoveFirst ‘установка на первую запись таблицы Postavka 11 Барковский В. В. Лекции KztP = Data1.RecordSet.RecordCount ‘количество записей таблицы Postavka KptP = Data.RecordSet.Fields.Count ‘количество полей таблицы Postavka ReDim P(1 To KztP, 1 To KptP) Flp.Rows = KztP+1 : Flp.Cols = KptP ‘установление размеров сетки Flp For I = 1 To KztP For J = 1 To KptP If I = 1 Then Flp.TextMatrix(I-1, J-1) = Data1.RecordSet.Fields(J-1).Name P(I, J) = Text1(J-1) : Flp.TextMatrix(I, J-1) = P(I, J) ‘или = Text1(J-1), _ или Data1.RecordSet.Fields(J-1).Value Next J Data1.RecordSet.MoveNext ‘переход к следующей записи Next I End Sub Private Sub Cmd2_Click ( ) ‘процедура (2), совместная обработка таблиц БД Dim St(1 To 4) As Single ‘массив стоимости поставляемых изделий по кварталам Dim Sh As String , V! ‘Sh – шифр (изделия), V–общий вес изделий искомого шифра KztI = Data2.RecordSet.RecordCount ‘количество записей таблицы Izd V=0 For L = 1 To 4 ‘обнуление массива St St(L) = 0 Next L For I = 1 To KtzP ‘по строкам таблицы Postavka Sh = P(I, 1) ‘В Sh заносится шифр изделия текущей строки таблицы Postavka F=0 ‘флажок For J = 1 To KztI ‘по строкам таблицы Izd If Iz (J, 1) = Sh Then ‘равенство шифров в таблицах Postavka и Izd For L = 1 To 4 St(L) = St(L) + P(I, L+2) * Iz(J,3) ‘вычисление стоимости постав- _ ляемого искомого изделия по кварталам V = V + P(I, L+2) * Iz(J, 4) ‘вычисление общего веса изделия _ искомого шифра Next L F=1 : Exit For ‘Таблицы согласованы. Данные получены. Флажок изменен выход из цикла J End If Next J If F = 0 Then Lbl2.Caption = “Таблицы не согласованы” : Exit Sub Next I Lbl2.Caption = “Искомый вес=” & Str(V) For L=1 To 4 Lst1.List (L-1) = St(L) Next L End Sub Private Sub Form1.Cmd3_Click ( ) ‘ процедура (3) Form1.Hide ‘спрятать форму Form1 Form2.Show ‘показать форму Form2 End Sub Private Sub Form1.Cmd4_Click ( ) End 12 ‘процедура (4), выход из Проекта ЛЕКЦИЯ 6. Интегрированная среда VB 6.0 обработки Баз Данных End Sub Private Sub Cmd5_Click ( ) ‘процедура (5), считывание таблицы Izd в массив Iz _ и в сетку Fli Data2.RecordSet.MoveFirst ‘установка на первую запись таблицы Izd KztI = Data2.RecordSet.RecordCount ‘количество записей таблицы Izd KptI = Data.RecordSet.Fields.Count ‘количество полей таблицы Izd ReDim Iz(1 To KztI, 1 To KptI) Fli.Rows = KztI +1 : Fli.Cols = KptI ‘установление размеров сетки Fli For I = 1 To KztI ‘по строкам таблицы Izd For J = 1 To KptI If I = 1 Then Fli.TextMatrix (I-1, J-1) = Data2.RecordSet.Fields(J-1).Name Iz(I, J) = Text2(J-1) : Fli.TextMatrix(I, J-1) = Iz(I, J) ‘или = Text2(J-1), _ или Data2.RecordSet.Fields(J-1).Value Next J Data2.RecordSet.MoveNext ‘переход к следующей записи Next I End Sub Private Sub Cmd6_Click ( ) Form2.Hide Form1.Show End Sub ‘спрятать форму Form2 ‘показать форму Form1 Действия: - запустить Проект; - на Form1 нажать Cmd1 (выполняется процедура считывания таблицы Postavka в массив P и в сетку Flp), затем Cmd3 (осуществляется переход на форму Form2); - на Form2 нажать Cmd5 (выполняется процедура считывания таблицы Izd в массив Iz и в сетку Fli), затем Cmd6 (осуществляется переход на форму Form1); - на Form1 нажать Cmd2 (решение задачи); - на Form1 нажать Cmd4 (выход из Проекта). 6.4.2. Способ 2 (непосредственная обработка таблиц) В Способе 1 информационная связь между формами осуществляется через глобальные переменные, и в первую очередь, через массивы P и Iz, доступные во всём Проекте. Система Visual Basic 6.0 не может осуществлять другой связи между формами. Поэтому в Способе 2, не использующем глобальные массивы, мы вынуждены ограничиться одной объединённой формой (рис. 6.5), расположив на ней все элементы форм Form1 (рис. 6.3) и Form2 (рис. 6.4) Способа 1 (за исключением кнопок перехода Cmd3 и Cmd6). Способ 2 основывается на использовании Методов элементов Data1 и Data2. Шаги: 1. Выполнить пункты Способа 1: 2 (на форме Form1 кнопка Cmd1 должна иметь надпись “Postavka в сетку Flp”), 3, 4, 5, 6 (кнопка Cmd5 должна иметь надпись “Izd в сетку Fli”), 7, 8, 9. 13 Барковский В. В. Лекции Рис. 6.5. Объединённая форма для работы с двумя таблицами Postavka и Izd 2. Разработать процедуры Form1 (рис. 6.5). Процедуры (1) и (2) перепишутся в виде: Private Sub Cmd1_Click ( ) ‘процедура (1), считывание таблицы Postavka в сетку Flp Dim I%, J%, K% Data1.RecordSet.MoveFirst ‘переход на первую запись таблицы Postavka K= Data1.RecordSet.RecordCount ‘количество записей таблицы Postavka L = Data1.RecordSet.Fields.Count ‘количество полей таблицы Postavka Flp.Rows = K+1: Flp.Cols = L ‘установление размеров сетки Flp For I = 1 To K For J = 1 To L If I=1 Then Flp. Flp.TextMatrix (I-1, J-1)=Data1.RecordSet.Fields(J-1). _ Name Flp.TextMatrix (I, J-1) = Text1(J-1) ‘или = Data1.RecordSet.Fields(J-1).Value Next J Data1.RecordSet.MoveNext ‘переход к следующей записи Next I End Sub Private Sub Cmd2_Click ( ) ‘процедура (2), совместная обработка таблиц БД Dim St(1 To 4) As Single ‘массив стоимости поставляемых изделий по кварталам Dim V! ‘V – общий вес изделий искомого шифра Dim I%, J%, F%, L% V=0 For L = 1 To 4 ‘обнуление массива St St(L) = 0 Next L Data1.RecordSet.MoveFirst ‘установка на 1-ю запись таблицы Postavka For I = 1 To Data1.RecordSet.RecordCount ‘по строкам таблицы Postavka F=0 Data2.RecordSet.MoveFirst ‘установка на 1-ю запись таблицы Izd For J = 1 To Data2.RecordSet.RecordCount ‘по строкам таблицы Izd If Data2.RecordSet.Fields(1).Value=Data1.RecordSet.Fields(1).Value Then For L = 1 To 4 14 ЛЕКЦИЯ 6. Интегрированная среда VB 6.0 обработки Баз Данных St(L)=St(L)+Data1.RecordSet.Fields(L+1).Value* _ Data2.RecordSet.Fields(2).Value V = V + Data1.RecordSet.Fields(L+1).Value* _ Data2.RecordSet.Fields(3).Value Next L F=1 : Exit For End If Data2.RecordSet.MoveNext ‘к следующей записи таблицы Izd Next J If F = 0 Then Lbl2.Caption = “Таблицы не согласованы” : Exit Sub Data1.RecordSet.MoveNext ‘к следующей записи таблицы Postavka Next I Lbl2.Caption = “Искомый вес=” & Str(V) For L=1 To 4 Lst1.List(L-1) = St(L) Next L End Sub Процедура (4) перепишется без изменений из п. 10. Процедура (5) будет выглядеть следующим образом: Private Sub Cmd1_Click ( ) ‘процедура (5), считывание таблицы Izd в сетку Fli Dim I%, J%, K% Data2.RecordSet.MoveFirst ‘переход на первую запись таблицы Izd K= Data2.RecordSet.RecordCount ‘количество записей таблицы Izd L = Data2.RecordSet.Fields.Count ‘количество полей таблицы Izd Fli.Rows = K+1: Fli.Cols = L ‘установление размеров сетки Flp For I = 1 To K For J = 1 To L If I=1 Then Fli.TextMatrix (I-1, J-1)=Data2.RecordSet.Fields(J-1). _ Name Fli.TextMatrix (I, J-1) = Text2(J-1) ‘или = Data2.RecordSet.Fields(J-1).Value Next J Data2.RecordSet.MoveNext ‘переход к следующей записи Next I End Sub Действия: - запустить Проект; - нажать Cmd1 (считывание таблицы Postavka в сетку Flp); - нажать Cmd5 (считывание таблицы Izd в сетку Fli); - нажать Cmd2 (осуществляется совместная обработка таблиц Postavka и Izd); - нажать Cmd4 (выход из Проекта). 15