Лабораторная работа 10.
Создание выходящей информации
Пример 1. Выборка данных с использованием представлений и объекта SqlDataAdapter
Создать представление MYVIEW в MSSQLServer c полями data, nazv_tov, navz_post, kol, которые хранятся в таблицах:
товар (код товара, название товара, ГОСТ);
поставщик (код поставщика, название, адрес);
накладная (код, номер накладной, дата накладной, код поставщика)
товар по накладной (код накладной, код, код товара, количество, цена)
SELECT dbo.nakl.data, dbo.tovar_po_nakl.kol, dbo.post.nazv, dbo.tovar.nazv AS Expr1
FROM dbo.nakl INNER JOIN
dbo.tovar_po_nakl ON dbo.nakl.kod = dbo.tovar_po_nakl.kod_nakl INNER JOIN
dbo.post ON dbo.nakl.kod_post = dbo.post.kod INNER JOIN
dbo.tovar ON dbo.tovar_po_nakl.kod_tovara = dbo.tovar.kod
Создать приложение в котором происходить выборка данных по дате из созданного представления:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace lab_2_9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat("(Data >= '{0}')", dateTimePicker1.Value.ToShortDateString());
sb.AppendFormat(" and (Data <= '{0}')", dateTimePicker2.Value.ToShortDateString());
view1BindingSource.Filter = sb.ToString();
}
private void Form1_Load(object sender, EventArgs e)
{
sqlDataAdapter1.Fill(dataSet11);
}
}
}
Пример 2. Выборка данных с использование запросов объекта DataSet.
С использованием таблиц:
Товар (код товара, название товара, гост);
поставщик (код поставщика, название, адрес);
накладная (код, номер накладной, дата накладной, код поставщика)
товар по накладной (код накладной, код, код товара, количество, цена)
Создать приложение, в котором осуществляется выборка созданных накладных.
Входными параметрами запроса являются: временной период и название поставщика. Подключение к БД осуществляется при использовании объекта DataSet (примеры лаб. 8,9). Отображение данных в DataGridView осуществляется при создании вручную запросов Query объекта DataSet.
Для отображения неотфильтрованных по параметрам запроса данных о всех созданных накладных создается запрос FillByPost вида:
SELECT naklad.kod_nakl, naklad.nomer, naklad.data, naklad.kod_post, post.nazv, post.adres
FROM naklad INNER JOIN
post ON naklad.kod_post = post.kod_post
Для отображения товаров к накладным (без фильтрации) создается запрос FillBytovar вида:
SELECT tov_nakl.kod_nakl, tov_nakl.kod, tov_nakl.kod_tov, tov_nakl.kol, tov_nakl.cena, tovar.nazv, tovar.gost
FROM tov_nakl INNER JOIN
tovar ON tov_nakl.kod_tov = tovar.kod_tov
Для отображения неотфильтрованных данных о накладных и товаров по ним в обработчике загрузки формы необходимо заменить код на:
this.tov_naklTableAdapter.FillBytovar(this.tovarDataSet.tov_nakl);
this.nakladTableAdapter.FillByPost(this.tovarDataSet.naklad);
Для внесения в запрос временного периода необходимо в сheckBoх1 установить галочку и задать в dataTimePicker1 и dataTimePicker2 параметры запроса (дата, внесенная в dataTimePicker1 должна быть меньше, чем дата, внесенная в dataTimePicker2).
Для того, чтобы создать проверку правильности введения дат в обработчике события изменения значения во втором dataTimePicker2 необходимо создать код:
private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
{
if (dateTimePicker1.Value > dateTimePicker2.Value)
{
MessageBox.Show("Друга дата має бути більша за першу!", "Помилка", MessageBoxButtons.OK, MessageBoxIcon.Hand);
dateTimePicker2.Value = dateTimePicker1.Value;
}
}
При загрузке формы объекты DataTimePicker – не доступны (свойство Enabled=false). После установке галочки выбора в сheckBoх1 можно задать временной период:
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked == true)
{
dateTimePicker1.Enabled = true;
dateTimePicker2.Enabled = true;
}
else {
dateTimePicker1.Enabled = false;
dateTimePicker2.Enabled = false;
}
}
В компоненте ComboBox будет отображаться список всех пользователей, значение которого можно задать как критерий поиска. Для этого необходимо задать свойства:
Свойство |
Значение |
DataSource |
postBindingSource |
DisplayMember |
nazv |
ValueMember |
kod_post |
DataBinding.Tag |
kod_post |
Для осуществления выборки накладных, в зависимости от конкретного заданного поставщика необходимо создать запрос FillBy для таблицы naklad вида:
SELECT naklad.kod_nakl, naklad.nomer, naklad.data, naklad.kod_post, post.nazv, post.adres
FROM naklad INNER JOIN
post ON naklad.kod_post = post.kod_post
WHERE (naklad.kod_post = @kod_post)
В обработчике события нажатии на кнопку «Пошук» записать код:
nakladTableAdapter.FillBy(tovarDataSet.naklad, (int)comboBox1.Tag);
this.tov_naklTableAdapter.FillBytovar(this.tovarDataSet.tov_nakl);
Для добавления в запрос выборки данных временной период необходимо создать запрос FillByDate для таблицы naklad вида:
SELECT naklad.kod_nakl, naklad.nomer, naklad.data, naklad.kod_post, post.nazv, post.adres
FROM naklad INNER JOIN
post ON naklad.kod_post = post.kod_post
WHERE (naklad.kod_post = @kod_post) AND (naklad.data >= @date1) AND (naklad.data <= @date2)
В обработчике события нажатии на кнопку «Пошук» изменить код на:
if (checkBox1.Checked == true)
{ nakladTableAdapter.FillByDate(tovarDataSet.naklad, (int)comboBox1.Tag, dateTimePicker1.Value, dateTimePicker2.Value);
this.tov_naklTableAdapter.FillBytovar(this.tovarDataSet.tov_nakl);
}
else
{
nakladTableAdapter.FillBy(tovarDataSet.naklad, (int)comboBox1.Tag);
this.tov_naklTableAdapter.FillBytovar(this.tovarDataSet.tov_nakl);
}
Домашнее задание. Лабораторная работа 10.
Для созданных документов (из лаб. 8) Создать выборку данных по параметрам, указанных в вариантах задания. Выбор параметров запроса организовать на форме с помощью компонентов CheckBox или RadioButton.
Вариант 1.
Параметры запросов:
1) выдать все договора и товары к ним по указанному временному периоду;
2) выдать все договора и товары к ним по указанному поставщику и указанному временному периоду;
3) выдать все договора и товары к ним по указанному поставщику;
4) выдать все действующие договора («Дата действия по» меньше текущей даты)
Для перечисленных запросов в компонент textBox1 выдать общее количество договоров, а в компонент textBox2 – общую сумму по всем договорам.
5) выдать весь товар за указанный временной период;
Для запроса 5 в компонент textBox1 выдать общее количество товара, а в компонент textBox2 – общую сумму по товарам.