Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
laboratornye_raboty.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.27 Mб
Скачать

Практическая часть

На этом уроке мы дополним нашу базу еще двумя таблицами для учета информации о расходе. Создадим SQL запросы к базе для формирования остатков продуктов на складе и создадим форму для просмотра остатков продуктов по этим запросам. Прежде чем приступить к созданию формы, необходимо добавить в нашу базу две таблицы первая для хранения информации о расходных накладных (назовем ее rashod_doc, она является аналогом таблицы prihod) и вторая для хранения информации о расходе продуктов по расходной накладной (назовем ее rashod, является аналогом таблицы storage). Откроем нашу базу storage.mdb в MS Access 2007 и создадим таблицу с именем rashod_doc. Далее создаем следующие поля таблицы rashod_doc: id (счетчик) – нужно задать как ключевое, number_docum (текстовый, в свойствах поля- размер поля- 20) – номер расходной накладной date_rashoda (тип данных - Дата/время) – дата расхода, sum (тип данных -числовой, в свойствах поля- размер поля- Одинарное с плавающей точкой) – сумма расхода.

Затем создаем таблицу rashod со следующими полями: id  (счетчик) – нужно задать как ключевое, id_product (тип данных –числовой, в свойствах поля- размер поля- Длинное целое) – код продукта, id_product_group (тип данных –числовой, в свойствах поля- размер поля- Длинное целое) – код  группы продуктов, quantity (тип данных -числовой, в свойствах поля- размер поля- Одинарное с плавающей точкой) – количество, price (тип данных -числовой, в свойствах поля- размер поля- Одинарное с плавающей точкой) – цена, id_rashod_doc (тип данных –числовой, в свойствах поля- размер поля- Длинное целое) – код расхода. id_ed_izmer (тип данных –числовой, в свойствах поля- размер поля- Длинное целое) – код единицы измерения.

Сейчас немножко о том, как это все будет работать.  Для того, чтобы посмотреть остатки продуктов на складе мы создадим три запроса к нашей базе. Первый запрос будет группировать продукты из таблицы storage  по полям id_product и id_ed_izmer с одновременным суммированием по количеству (поле quantity) и сумме (поле price* quantity). Второй запрос будет делать тоже, что и первый, но по таблице rashod. А третий запрос будет находить разницу между первым и вторым запросом, и выводить эти данные в нашу форму. И так приступим к созданию формы. Запускает наш проект, и создаем новую форму File->New->Form –Delphi В инспекторе объектов  устанавливаем следующие свойства для новой формы Caption -> Остатки на складе; FormStyle -> fsMDIChild; Name -> Form_ostatki; Сохраните модуль с именем ostatki. Пропишем Uses general, unit_dm; после раздела implementation в программном модуле unit ostatki.  А программном модуле unit general главной формы пропишем Uses ostatki; Переходим в дата модуль (unit_dm) и размещаем там три компонента TADOQuery из вкладки dbGo (ADO) и один компонент TDataSource из вкладки Data Access. Для ADOQuery1 в инспекторе объектов устанавливаем следующие свойства: Connection-> Form_general.ADOConnection1; Name-> ADOQuery_prihod;

SQL-> (TStrings) -> вставляем следующий запрос

SELECT storage.id_product, Sum([storage].[price]*[storage].[quantity]) AS sum_price, Sum(storage.quantity) AS [Sum-quantity], storage.id_ed_izmer FROM storage GROUP BY storage.id_product, storage.id_ed_izmer;

Свойство Active устанавливаем в True; Для ADOQuery2 в инспекторе объектов устанавливаем следующие свойства: Connection-> Form_general.ADOConnection1; Name-> ADOQuery_rashod; SQL-> (TStrings) -> вставляем следующий запрос

SELECT rashod.id_product, Sum([rashod].[price]*[rashod].[quantity]) AS sum_price, Sum(rashod.quantity) AS [Sum-quantity], rashod.id_ed_izmer FROM rashod GROUP BY rashod.id_product, rashod.id_ed_izmer;

Свойство Active устанавливаем в True; Для ADOQuery3 в инспекторе объектов устанавливаем следующие свойства: Connection-> Form_general.ADOConnection1; Name-> ADOQuery_ostatki; SQL-> (TStrings) -> вставляем следующий запрос

SELECT products.product_name, ADOQuery_prihod.id_product, [ADOQuery_prihod].[Sum-quantity]-IIf([ADOQuery_rashod].[Sum-quantity]>0,[ADOQuery_rashod].[Sum-quantity],0) AS ostatok, [ADOQuery_prihod].[sum_price]-IIf([ADOQuery_rashod].[sum_price]>0,[ADOQuery_rashod].[sum_price],0) AS summa, ADOQuery_prihod.id_ed_izmer, products.id_product_group, ed_izmer.ed_name FROM ((ADOQuery_prihod LEFT JOIN ADOQuery_rashod ON ADOQuery_prihod.id_product = ADOQuery_rashod.id_product) LEFT JOIN ed_izmer ON ADOQuery_prihod.id_ed_izmer = ed_izmer.id) LEFT JOIN products ON ADOQuery_prihod.id_product = products.id;

Свойство Active устанавливаем в True; Для составления запросов я использовал конструктор запросов в MS Access 2007, затем затем переключался в режим SQL и копировал запрос из в наш проект в Delphi. Созданные запросы в режиме конструктора MS Access 2007 можно посмотреть в исходниках к этому уроку в файле storage.mdb. Они называются ADOQuery_ostatki, ADOQuery_prihod, ADOQuery_rashod. Для просмотра запроса в режиме конструктора в MS Access 2007 нажмите правую кнопку мыши на этом запросе и выберите конструктор.     Внимание в этом уроке была обнаружена ошибка (смотрите комментарии 3-6) запросы ADOQuery_prihod, ADOQuery_rashod должны быть созданы в самой базе. Для их создания откройте базу storage.mdb в MS Access  выберите создание -> конструктор запросов, закройте добавление таблиц и щелкнув правой кнопкой мыши выберите режим SQL. Далее скопируйте туда текст соответствующего запроса и сохраните его под соответствующим именем. К  сожалению другого варианта исправления ошибки пока предложить не могу. Добавленные в Unit_dm компоненты ADOQuery_prihod и ADOQuery_rashod нужно удалить.   Для компонента DataSource1 устанавливаем свойства: DataSet->ADOQuery_ostatki; Name->ostatki.

Далее переходим к нашей форме ostatki и размещаем на ней из вкладки Data Controls компонент  TDBGrid. Для него устанавливаем следующие свойства: Align-alClient; DataSource->dm.ostatki; Options->dgRowSelect->True. Сейчас мы выберем нужные нам поля из запроса ADOQuery_ostatki для отображения их в форме. Для этого перейдем в дата модуль (unit_dm) проекта и выберем компонент ADOQuery_ostatki. В структуре (Structure) -> ADOQuery_ostatki -> Fields -> щелкнем правой кнопкой мыши и выберем Add all fields.

Выбираем поле product_name и в инспекторе объектов устанавливаем свойство: DisplayLabel -> Продукт; DisplayWidth -> 30; Выбираем поле ed_name и в инспекторе объектов устанавливаем свойство: DisplayLabel -> Ед.изм.; DisplayWidth -> 10; Выбираем поле id_product и в инспекторе объектов устанавливаем свойство: Visible->False; Выбираем поле ostatok и в инспекторе объектов устанавливаем свойство: DisplayFormat ->.### DisplayLabel -> Остаток; DisplayWidth -> 10; Выбираем поле summa и в инспекторе объектов устанавливаем свойство: DisplayFormat ->.## DisplayLabel ->Сумма; DisplayWidth -> 10; Выбираем поле id_ed_izmer и в инспекторе объектов устанавливаем свойство: Visible->False; Выбираем поле id_product_group и в инспекторе объектов устанавливаем свойство: Visible->False; Далее создаем вычисляемое поле sred_price  для вычисления средней стоимости продуктов» . Для этого в структуре (Structure) -> products -> Fields -> щелкнем правой кнопкой мыши и выберем New  field….

и заполняем

Name->sred_price; Type->Float; Calculated; жмем ОК. Выбираем созданное поле (sred_price) и в инспекторе объектов устанавливаем свойство: DisplayFormat ->.## DisplayLabel ->Средняя цена; DisplayWidth -> 10; переходим на вкладку Events и дважды жмем мышь на событии OnCalcFields;

В открывшемся обработчике событий пишем следующий код:

procedure Tdm.ADOQuery_ostatkiCalcFields(DataSet: TDataSet); begin //если остатки продуктов не равны 0 то вычисляем среднюю стоимость продукта  if ADOQuery_ostatki.FieldByName('ostatok').Value<>0 then  ADOQuery_ostatki.FieldByName('sred_price').Value:= ADOQuery_ostatki.FieldByName('summa').Value/ ADOQuery_ostatki.FieldByName('ostatok').Value                                                      else  ADOQuery_ostatki.FieldByName('sred_price').Value:=0; end;

Возвращаемся снова к нашей форме ostatki и в обработчике событий для события OnActivate пишем следующий код:

procedure TForm_ostatki.FormActivate(Sender: TObject); begin // переоткрываем запросы при активации формы //тем самым обновляем данные на форме dm.ADOQuery_ostatki.Active:=false; dm.ADOQuery_ostatki.Active:=true; end;

Для события OnClose:

procedure TForm_ostatki.FormClose(Sender: TObject; var Action: TCloseAction); begin //закрываем запросы и закрываем форму dm.ADOQuery_ostatki.Active:=false; Action:=cafree; end;

Сейчас сделаем запуск формы «Остатки на складе» из главной формы. Для этого выбираем в меню Project -> Options… Выбираем Forms и перемещаем Form_ostatki из Auto-create forms  в Avalable forms. Переходим на главную форму, щелкаем мышкой по компоненту MainMenu1, а затем по пункту Просмотр склада И пишем следующий обработчик события:

procedure TForm_general.N9Click(Sender: TObject); begin f:=0; //проверяем, активна ли наша форма if ActiveMDIChild.Caption<>'Остатки на складе' then begin //если нет то ищем ее среди неактивных  и если находим, то показываем ее for i:=0 to form_general.MDIChildCount-1 do if form_general.MDIChildren[i].Caption='Остатки на складе' then begin MDIChildren[i].Show;f:=1;end; end                                                else f:=1; //если форма еще не создана, то создаем ее if f<>1 then Tform_ostatki.Create(Application); end;

Вот и все готово, сохраняем и запускаем проект.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]