Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СРС_проект_ИС.doc
Скачиваний:
18
Добавлен:
11.08.2019
Размер:
3.38 Mб
Скачать

5.4. Создание форм ввода новых данных

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

Чтобы выполнить модификацию НД, надо прежде всего убедиться, что он открыт. Состояние НД проверяется значением свойства Active, которое в этом случае должно быть равно True. Открытие НД выполняется с помощью метода Open (без параметров). Данные могут добавляться (метод Insert без параметров) или модифицироваться (метод Edit без параметров). После выполнения всех изменений их необходимо зафиксировать в БД (метод Post) или отказаться от сохранения (метод Cancel). Подобный подход удобен тем, что позволяет отменить изменения, внесенные в текущую запись, если вдруг обнаружится, что значение одного из полей указано некорректно.

Чтобы получить возможность редактировать, добавлять или удалять записи таблиц Izdelie и Zakazcik, писать программный код не требуется. Данные вводятся в сетку DBGrid набором с клавиатуры. Курсор при этом должен быть установлен в нужное поле. Выбор необходимой операции осуществляется с помощью соответствующих кнопок компонента DBNavigator.

Организовать добавление новых записей в таблицы Naklad, Snakl, Plateg, Splat с помощью элемента DBGrid довольно сложно. Это связано с тем, что в таблицах хранятся значения ключей из других таблиц (например, в поле NZKod). Редактировать такие значения вручную, не зная, какому названию соответствует определенное значение, бессмысленно. Добавление новых записей в такие сложные таблицы проще осуществлять в отдельных формах программы.

Создадим новую рабочую форму «Новая накладная» командой File > New > Form. Сохраним модуль этой формы под именем fmNewNakUnit и добавим его в проект Sale командой Project > Add to Project. Изменим некоторые свойства формы:

Caption = ‘Новая накладная’ BorderStyle = bsDialog

Name = FNewNak BorderWidth = 2

Height = 219 Width = 385

Разместим на форме компонент Panel1 (Align = alBottom, Caption = ‘ ‘). Расположим на панели кнопки BitBtn1 (Kind = bkOK) и BitBtn2 (Kind = bkCancel). В оставшейся свободной части формы разместим компонент Panel2 (Align = alClient, Caption = ‘ ‘). На этой панели расположим компоненты Edit1 (Номер ТТН), Edit2 (Дата отгрузки), Edit3 (Сумма отгрузки), DBLookupComboBox1 (Наименование заказчика), DBEdit1 (Код заказчика). Разместим также все необходимые подписи.

Командой File > Use Unit свяжем модуль fmNewNakUnit с модулем данных dmSaleUnit. Сохраним все сделанные изменения. Для компонента DBLookupComboBox1 в свойстве DataSource выберем значение DM.SourceNak, в свойстве DataField – значение Naim. Для компонента DBEdit1 в свойстве DataSource выберем значение DM.SourceZak, в свойстве DataField – значение ZKod.

В ид окна после всех сделанных изменений показан на рис. 36.

Рис. 36. Рабочее окно «Новая накладная»

Программное внесение изменений в поля текущей записи выполняется с помощью обычных операторов присваивания. Поля текущей записи хранятся в свойстве НД Fields. Это список элементов типа TField, описывающих конкретные поля. Нумерация полей начинается с нуля. Класс TField имеет набор удобных свойств, позволяющих обращаться к каждому полю в зависимости от его реального типа в БД (табл. 17). При этом следует учитывать реальный тип поля в БД, чтобы не возникало ошибочных ситуаций типа попытки записать строку в числовое поле.

Таблица 17

Свойство

Назначение

Свойство

Назначение

AsString

AsBoolean

AsDateTime

AsCurrency

Формат String

Формат Boolean

Формат DateTime

Формат Currency

AsFloat

AsInteger

AsVariant

Формат Double

Формат Integer

Формат Variant

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

ВНИМАНИЕ! На практике при вводе данных в конкретные поля совершаются самые разные ошибки. Если для обычной программы это чревато ее аварийным завершением, то для БД такая ситуация может закончиться плачевно, вплоть до потери большого объема данных. Поэтому всегда необходимо контролировать возникновение конфликтов с помощью блока try / except и осуществлять всевозможные проверки корректности значений, введенных пользователем.

Создадим обработчик события OnClick для кнопки BitBtn1 формы:

procedure TFNewNak.BitBtn1Click(Sender: TObject);

begin

with DM.Naklad do

begin

Fields[0].AsString:=Edit1.Text;

Fields[1].AsDateTime:=StrToDateTime(Edit2.Text);

Fields[2].AsCurrency:=StrToCurr(Edit3.Text);

Fields[3].AsString:=DBEdit1.Text;

Post;

end;

end;

Создадим обработчик события OnClick для кнопки BitBtn2 формы:

procedure TFNewNak.BitBtn2Click(Sender: TObject);

begin

DM.Naklad.Cancel;

end;

Поскольку на главной форме не предусмотрена специальная кнопка для вызова рабочей формы «Новая накладная», свяжем вызов этой формы с соответствующим пунктом контекстного меню рабочей формы «Обработка накладных». Щелкнем правой кнопкой мыши на компоненте PopupMenu1, расположенном на этой форме. Выберем пункт Menu Designer. Для первого элемента меню (объект N1) в свойстве Caption укажем – «Ввод новой ТТН». Напишем процедуру обработки события OnClick для этого элемента меню:

procedure TFObrNak.N1Click(Sender: TObject);

begin

DM.Naklad.Insert;

FNewNak.ShowModal;

end;

Для формы FObrNak раскроем список значений свойства PopupMenu и выберем элемент PopupMenu1. Командой File > Use Unit добавим модуль fmNewNakUnit в раздел implementation модуля fmObrNakUnit.

Создадим новую рабочую форму «Новая строка накладной» командой File > New > Form. Сохраним модуль этой формы под именем fmNewSnaUnit и добавим его в проект Sale командой Project > Add to Project. Изменим некоторые свойства:

Caption = ‘Новая строка накладной’ BorderStyle = bsDialog

Name = FNewSna BorderWidth = 2

Height = 219 Width = 385

Разместим на форме компонент Panel1 (Align = alBottom, Caption = ‘ ‘). Расположим на панели кнопки BitBtn1 (Kind = bkOK) и BitBtn2 (Kind = bkCancel). В оставшейся свободной части формы разместим компонент Panel2 (Align = alClient, Caption = ‘ ‘). На этой панели расположим компоненты DBEdit1 (Номер ТТН), DBLookupComboBox1 (Наименование изделия), DBEdit2 (Код изделия), DBEdit3 (Цена изделия), Edit1 (Отгруженное количество). Разместим необходимые подписи.

Командой File > Use Unit свяжем модуль fmNewSnaUnit с модулем данных dmSaleUnit. Сохраним все сделанные изменения. Для компонента DBEdit1 в свойстве DataSource выберем значение DM.SourceSna, в свойстве DataField – значение SnNNom. Для компонента DBLookupComboBox1 в свойстве DataSource выберем значение DM.SourceSna, в свойстве DataField – значение Name. Для компонента DBEdit2 в свойстве DataSource выберем значение DM.SourceIzd, в свойстве DataField – значение IKod. Для компонента DBEdit3 в свойстве DataSource выберем значение DM.SourceIzd, в свойстве DataField – значение ICena.

В ид окна после всех сделанных изменений показан на рис. 37.

Рис. 37. Рабочее окно «Новая строка накладной»

Создадим обработчик события OnClick для кнопки BitBtn1 формы:

procedure TFNewSna.BitBtn1Click(Sender: TObject);

begin

with DM.Snakl do

begin

Fields[0].AsString:=DBEdit1.Text;

Fields[1].AsString:=DBEdit2.Text;

Fields[2].AsInteger:=StrToInt(Edit1.Text);

Post;

end;

end;

Создадим обработчик события OnClick для кнопки BitBtn2 формы:

procedure TFNewSna.BitBtn2Click(Sender: TObject);

begin

DM.Snakl.Cancel;

end;

Свяжем вызов формы «Новая строка накладной» с соответствующим пунктом контекстного меню рабочей формы «Обработка накладных». Щелкнем правой кнопкой мыши на компоненте PopupMenu1, расположенном на этой форме. Выберем пункт Menu Designer. Для второго элемента меню (объект N2) в свойстве Caption укажем – «Ввод новой строки ТТН». Напишем процедуру обработки события OnClick для этого элемента меню:

procedure TFObrNak.N2Click(Sender: TObject);

begin

DM.Snakl.Insert;

FNewSna.ShowModal;

end;

Командой File > Use Unit добавим модуль fmNewSnaUnit в раздел implementation модуля fmObrNakUnit.

Создадим новую рабочую форму «Новое платежное требование» выбрав команду File > New > Form. Сохраним модуль этой формы под именем fmNewPlatUnit и добавим его в проект Sale командой Project > Add to Project. Изменим некоторые свойства формы:

Caption = ‘Новое платежное требование’ BorderStyle = bsDialog

Name = FNewPlat BorderWidth = 2

Height = 219 Width = 385

Разместим на форме компонент Panel1 (Align = alBottom, Caption = ‘ ‘). Расположим на панели кнопки BitBtn1 (Kind = bkOK) и BitBtn2 (Kind = bkCancel). В оставшейся свободной части формы разместим компонент Panel2 (Align = alClient, Caption = ‘ ‘). На этой панели расположим компоненты Edit1 (Номер ПТР), Edit2 (Номер ТТН), Edit3 (Дата оплаты), Edit4 (Сумма оплаты), DBLookupComboBox1 (Наименование заказчика), DBEdit1 (Код заказчика). Разместим также все необходимые подписи.

Командой File > Use Unit свяжем модуль fmNewPlatUnit с модулем данных dmSaleUnit. Сохраним все сделанные изменения. Для компонента DBLookupComboBox1 в свойстве DataSource выберем значение DM.SourcePlat, в свойстве DataField – значение Naim. Для компонента DBEdit1 в свойстве DataSource выберем значение DM.SourceZak, в свойстве DataField – значение ZKod.

В ид окна после всех сделанных изменений показан на рис. 38.

Рис. 38. Рабочее окно «Новое платежное требование»

Создадим обработчик события OnClick для кнопки BitBtn1 формы:

procedure TFNewPlat.BitBtn1Click(Sender: TObject);

begin

with DM.Plateg do

begin

Fields[0].AsString:=Edit1.Text;

Fields[1].AsString:=DBEdit1.Text;

Fields[2].AsString:=Edit2.Text;

Fields[3].AsDateTime:=StrToDateTime(Edit3.Text);

Fields[4].AsCurrency:=StrToCurr(Edit4.Text);

Post;

end;

end;

Создадим обработчик события OnClick для кнопки BitBtn2 формы:

procedure TFNewPlat.BitBtn2Click(Sender: TObject);

begin

DM.Plateg.Cancel;

end;

Свяжем вызов формы «Новое платежное требование» с соответствующим пунктом контекстного меню рабочей формы «Обработка платежных требований». Щелкнем правой кнопкой мыши на компоненте PopupMenu1, расположенном на этой форме. Выберем пункт Menu Designer. Для первого элемента меню (объект N1) в свойстве Caption укажем – «Ввод нового ПТР». Напишем процедуру обработки события OnClick для этого элемента меню:

procedure TFObrPlat.N1Click(Sender: TObject);

begin

DM.Plateg.Insert;

FNewPlat.ShowModal;

end;

Для формы FObrPlat раскроем список значений свойства PopupMenu и выберем элемент PopupMenu1. Командой File > Use Unit добавим модуль fmNewPlatUnit в раздел implementation модуля fmObrPlatUnit.

Создадим новую рабочую форму «Новая строка платежного требования» командой File > New > Form. Сохраним модуль этой формы под именем fmNewSplaUnit и добавим его в проект Sale командой Project > Add to Project. Изменим некоторые свойства формы:

Caption = ‘Новая строка платежного требования’ BorderStyle = bsDialog

Name = FNewSna BorderWidth = 2

Height = 219 Width = 385

Разместим на форме компонент Panel1 (Align = alBottom, Caption = ‘ ‘). Расположим на панели кнопки BitBtn1 (Kind = bkOK) и BitBtn2 (Kind = bkCancel). В оставшейся свободной части формы разместим компонент Panel2 (Align = alClient, Caption = ‘ ‘). На этой панели расположим компоненты DBEdit1 (Номер ПТР), DBEdit2 (Код заказчика), DBEdit3 (Наименование заказчика), DBLookupComboBox1 (Наименование изделия), DBEdit4 (Код изделия), DBEdit5 (Цена изделия), Edit1 (Оплаченное количество). Разместим все необходимые подписи.

Командой File > Use Unit свяжем модуль fmNewSplaUnit с модулем данных dmSaleUnit. Сохраним все сделанные изменения. Для компонента DBEdit1 в свойстве DataSource выберем значение DM.SourceSpl, в свойстве DataField – значение SpPNom. Для компонента DBEdit2 в свойстве DataSource выберем значение DM.SourceSpl, в свойстве DataField – значение SpZKod. Для компонента DBEdit3 в свойстве DataSource выберем значение DM.SourceZak, в свойстве DataField – значение ZNaim. Для компонента DBLookupComboBox1 в свойстве DataSource выберем значение DM.SourceSpl, в свойстве DataField – значение Name. Для компонента DBEdit4 в свойстве DataSource выберем значение DM.SourceIzd, в свойстве DataField – значение IKod. Для компонента DBEdit5 в свойстве DataSource выберем значение DM.SourceIzd, в свойстве DataField – значение ICena.

В ид окна после всех сделанных изменений показан на рис. 39.

Рис. 39. Рабочее окно «Новая строка платежного требования»

Создадим обработчик события OnClick для кнопки BitBtn1 формы:

procedure TFNewSpla.BitBtn1Click(Sender: TObject);

begin

with DM.Splat do

begin

Fields[0].AsString:=DBEdit1.Text;

Fields[1].AsString:=DBEdit2.Text;

Fields[2].AsString:=DBEdit4.Text;

Fields[3].AsInteger:=StrToInt(Edit1.Text);

Post;

end;

end;

Создадим обработчик события OnClick для кнопки BitBtn2 формы:

procedure TFNewSpla.BitBtn2Click(Sender: TObject);

begin

DM.Splat.Cancel;

end;

Свяжем вызов формы «Новая строка платежного требования» с соответствующим пунктом контекстного меню рабочей формы «Обработка платежных требований». Щелкнем правой кнопкой мыши на компоненте PopupMenu1, расположенном на этой форме. Выберем пункт Menu Designer. Для второго элемента меню (объект N2) в свойстве Caption укажем – «Ввод новой строки ПТР». Напишем процедуру обработки события OnClick для этого элемента меню:

procedure TFObrPlat.N2Click(Sender: TObject);

begin

DM.Splat.Insert;

FNewSpla.ShowModal;

end;

Командой File > Use Unit добавим модуль fmNewSplaUnit в раздел implementation модуля fmObrPlatUnit.