Лабораторная работа № 5 Тема: Форма «Заказ фирмы». Каскадное удаление данных. Цель: Приобретения навыков работы с выпадающими списками для внесения данных в связные таблицы. Реализация принципа каскадного удаления данных из связных таблиц. Контрольный пример: Преобразуем закладку «Заказы» в более удобную форму для работы пользователя. То есть, вместо двух табличных форм представления данных будем использовать списки и поля для ввода. Для этого создадим новую закладку на Form2 и назовем ее «Заказ товара». Разместим на ней следующие компоненты: 5 Label с названиями: «Фирма», «Код заказа», «Товар», «Количество» и «На складе». 1. Для того чтобы можно было выбирать фирму, на форму необходимо расположить выпадающий список, который позволит видеть все фирмы, а при выборе определенной фирмы возвращает код товара. То есть, перемещается по записям таблицы «Фирма». Для этих целей идеально подходит DBLookupComboBox, который располагается на закладке Data Controls. Расположим один DBLookupComboBox напротив надписи «Фирма», а второй - напротив надписи «Товар». 2. Для того чтобы отображался необходимый нам список, установим следующие свойства для компонента DBLookupComboBox, соответствующего наименованию фирмы: Listsource – DM.DS_firma (DataSource, связанный с таблице «Фирма»); ListField – Firma (что именно необходимо отображать в списке); KeyField – ID_Firma (ключевое поле). 3. Аналогичным образом установим свойства для DBLookupComboBox, соответствующего наименованию товара. компонента 4. Расположим на форме два компонента Edit, которые соответствуют надписям «Код заказа» и «Количество». Установим количество по умолчанию 0 (свойство Edit~Text~0). Поле ввода для «Кода заказа» сделаем не доступным для пользователя, установив либо свойство Enabled~False, либо ReadOnly~True, а свойство Text оставим пустым. 5. Расположим две кнопки «Новый заказ для выбранной фирмы» и «Добавить выбранный товар к заказу». 6. Напротив надписи «На складе» расположим DBEdit, соответствующий полю Sklad таблицы «Товар». Сделаем его недоступным для редактирования пользователем. 7. Обработаем процедуру внесения заказа фирмы. То есть нам необходимо в таблицу «Заказ фирмы» (z_f.db) внести код фирмы и дату заказа (сегодня). А так же отобразить код заказа в соответствующем поле ввода. Для того чтобы внести данные в таблицу будем использовать следующий код: DataModule.Таблица.Поле_с_именем(‘Имя’).Тип_данных:= данные; Таким образом код будет иметь следующий вид: {открываем таблицу и вставляем запись}dm.z_f.Open; dm.z_f.Insert; {заносим данные, используя функцию now для указания сегодняшней даты} dm.z_f.FieldByName('Data').AsDateTime:= now; {заносим код выбранной фирмы. Функция FieldValues['Имя поля'] возвращает значение указанного поля} dm.z_f.FieldByName('ID_firma').AsInteger:= strtoint(dm.firma.FieldValues['ID_firma']); {сохраняем и закрываем таблицу} dm.z_f.Post; dm.z_f.close; {открываем таблицу и находим последнюю запись} dm.z_f.open; dm.z_f.FindLast; {отображаем код заказа в поле ввода} edit1.Text:= dm.z_f.FieldValues['ID_zakaz']; 8. Теперь необходимо сделанному заказу добавить товары. То есть, в таблицу «Заказ товара» (z_t.DB) внести код товара, код заказа и количество. Приведенный ниже код позволит сделать это. dm.z_t.Open; dm.z_t.Insert; dm.z_t.FieldByName('ID_Zakaz').AsInteger:=strtoint(edit1.Text); dm.z_t.FieldByName('ID_tovar').AsInteger:= strtoint(dm.tovar.FieldValues['ID_tovar']); dm.z_t.FieldByName('kol').AsInteger:= strtoint(edit2.Text); dm.z_t.post; Результат преобразования форму приведен на рис.1 Рис.1 Заказ товара фирмой Доработаем меню, добавив подпункт меню Ввод данных ~ Заказ товара, который бы открывал закладку «Заказ товара». Для того чтобы произвести каскадное удаление необходимо реализовать следующий алгоритм (на примере таблиц «Заказ фирмы» и «Заказ товара»): 1. В таблицы «Заказ товара» перейти на первую запись. 2. В цикле проверять соответствие полей «Код заказа» (таблица «Заказ фирмы») и «Код заказа» (таблица «Заказ товара»). Если в таблице «Заказ товара» обнаружен необходимый код заказа, запись удаляется. 3. По окончанию цикла (то есть после удаления всех заказов с необходимым кодом из таблицы «Заказ товара») удаляется запись из таблицы «Заказ фирмы». Для того чтобы реализовать этот алгоритм в Delphi можно использовать следующие методы работы с записями таблицы: цикл в таблице желательно «загонять» по количеству записей (dm.z_t.RecordCount); для нахождения соответствия можно использовать метод Locate, имеющий вид dm.z_t.Locate('ID_Zakaz', dm.z_f.FieldValues['ID_zakaz'], []) DataModule.Таблица.Locate(‘Где искать (имя поля)’, что, параметры) Индивидуальное задание (самостоятельно): 1. Обработайте процедуру каскадного удаления заказов фирмы. Для этого создайте DBLookupComboBox, связанный с таблицей «Заказ фирмы». При указании свойства ListSource будьте внимательны – необходимо ссылаться на DataSource, связанный с таблицей, а не с запросом, обрабатывающим эту таблицу. Удаления заказа разместите на закладке «Заказ товара». 2. Варианты 1, 3, 4, 6, 9,11, 13, 14 – преобразуйте процедуру добавления товара так, чтобы из таблицы «Товар» колонке Sklad вычиталось количество, указанное в заказе. Если на складе количество товара меньше, чем указано в заказе, должно выдаваться сообщения о недостатке товара и товар к заказу не добавляться. 3. Варианты 2, 5, 7, 8, 10, 12, 15 – создайте процедуру добавления товара к ранее созданному заказу. 4. Четные варианты. Преобразуйте форму «Заказ товара» так чтобы нельзя было выбрать товар, пока заказ не сделан (недоступен выпадающий список товара). 5. Нечетные варианты. Преобразуйте форму «Заказ товара» так чтобы нельзя было добавить товар, пока заказ не сделан (недоступна кнопка добавления).