Создание документа входящей информации с помощью обьекта DataSet
Лабораторная работа 9.
Результатом выполнения лабораторной работы должно быть приложение, позволяющее создать документ «Накладная». Структура документа и таблицы справочной информации, необходимые для создания документа описаны в лабораторной работе №8. Экранная форма создания накладных представлена на рис. 1
Рис. 1
Для выполнения работы необходимо:
1. Создать графические элементы для отображения информации справочной и первичной информации.
2. Для создания подключения к таблицам базы данных. Выбрать пункт Choose Data Source → Add Project Data Set объектов DataGridView.
3. Добавить таблицы naklad, tov_nakl, post, tovar в создаваемый DataSet.
4. Для таблиц naklad, tov_nakl – создать внешний ключ;
5. Задать свойство DataMember :
DataGridView | DataMember |
DataGridView1 | post |
DataGridView2 | tovar |
DataGridView3 | tov_nakl |
6. В результате автоматично создастся код, позволяющий заполнить данными графические компоненты:
private void Form1_Load(object sender, EventArgs e)
{
//this.tov_naklTableAdapter.Fill(this.tovarDataSet.tov_nakl);
this.nakladTableAdapter.Fill(this.tovarDataSet.naklad);
this.tovarTableAdapter.Fill(this.tovarDataSet.tovar);
this.postTableAdapter.Fill(this.tovarDataSet.post);
}
Строку, заполняющую таблицу tov_nakl закомментировать, чтобы при загрузке формы не заполнялся DataGridView3 – он будет заполняться значения только в момент заполнения данными.
7. Для компонентов TextBox задать свойства:
TextBox | DataBinding.Tag | DataBinding.Text | ReadOnly |
TextBox2 | postBindingSource - kod_post | postBindingSource - nazv | true |
TextBox3 | postBindingSource - kod_post | postBindingSource - adres | true |
TextBox4 | tovarBindingSource - kod_tov | tovarBindingSource - nazv | true |
TextBox5 | tovarBindingSource - kod_tov | tovarBindingSource - gost | true |
8. Для отображения значений «Название товара», «ГОСТ» вместо «Код_товара» необходимо создать запрос вида (рис. 2):
Рис. 2
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
WHERE (tov_nakl.kod_nakl = @kod_nakl)
Обратить внимание на ограничение WHERE (tov_nakl.kod_nakl = @kod_nakl). Поле kod_nakl – задается как поле фильтрации, для того, чтобы в DataGridView3 отображались не все записи товаров по накладной, а только те, которые принадлежать текущей накладной.
Запрос создается путем:
8.1 В контекстном меню таблицы tov_nakl выбрать пункт Add – Query
8.2. В мастере конфигурации объекта TableAdapter выбрать пункт Use SQL statements
8.3. Задать тип запроса. Выборка с возращением массива записей.
8.4. Добавить таблицу tovar в конструктор запросов, при этом создаться естественное объединение двух таблиц (INNER JOIN) по полям kod_tov. Задать фильтр = @kod_nakl для поля = kod_nakl для отображения.
8.5. Проверить правильность выборки данных (Execute Query).
8.6. Задать имя созданного запроса или использовать созданное по умолчанию (FillBy).
9. Создать поле sum в tov_nakl для расчета суммы товара (kol*cena). Для этого:
9.1. Открыть схему;
9.2 В В контекстном меню таблицы tov_nakl выбрать пункт Add – Coulmn;
9.3. Задать имя поля sum;
9.4. Свойству Expression задать значение kol*cena;
10. В DataGridView3 добавить поля для отображения «Название товара», «ГОСТ», «Суммы». Для этого:
10.1. В контекстном меню DataGridView3 выбрать пункт Add Column
10.2 Задать свойства полей:
DataPropertyValue | Name | Header Text |
Nazv | Naim | Название товара |
Gost | gost | ГОСТ |
Sum | Suma | Сумма |
где свойство DataPropertyValue – это свойство, которое задает поле, значение которого будет отображаться (Nazv, Gost – из таблицы tovar).
11. Создать обработчик события нажатия кнопки „Создать накладную”. Для добавления новых записей будет использоватьcя метод Insert объекта nakladTableAdapter.
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length > 0)
{
if (MessageBox.Show("Ви дійсно бажаєте створити накладку?", "Підтвердження", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
nakladTableAdapter.Insert(Convert.ToInt32(textBox1.Text), dateTimePicker1.Value,(int)textBox2.Tag);
nakladTableAdapter.Update(tovarDataSet.naklad);
nakladTableAdapter.Fill(tovarDataSet.naklad);
}
}
else
MessageBox.Show("Ви маєте ввести номер наказу", "Повідомлення", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
12. Создать обработчик события нажатия кнопки „Создать накладную”. Для добавления новых записей будет использоватьcя метод Insert объекта tov_naklTableAdapter. Необходимо обратить внимание, что в таблице tov_nakl – есть внешний ключ kod_nakl, значение которого необходимо также заполнить. Для этого необходимо знать значение первичного ключа вновь созданной записи таблицы nakl, что можно сделать, создав запрос (рис. 3):
.
Рис. 3
Для создания запроса необходимо:
12.1 В контекстном меню таблицы naklad выбрать пункт Add – Query
12.2. В мастере конфигурации объекта TableAdapter выбрать пункт Use SQL statements
12.3. Задать тип запроса. Выборка с возращением одного значения (Scalar).
12.4. Записать запрос
SELECT MAX(kod_nakl) AS Expr1
FROM naklad
12.5. Задать имя созданного запроса (MаxQuery).
Результатом выполнения этого запроса будет значение первичного ключа последней созданной записи таблицы naklad, передача значения, возвращаемого этим запросом выделена красным цветом в листинге.
private void button2_Click(object sender, EventArgs e)
{
if (MessageBox.Show("Додати до розрахунку?", "Підтвердження", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
kol++; // переменная для хранения количества товаров по накладной
tov_naklTableAdapter.Insert((int)nakladTableAdapter.MaxQuery(), (int)textBox4.Tag, Convert.ToInt32(textBox6.Text), Convert.ToDecimal(textBox7.Text));
tov_naklTableAdapter.Update(tovarDataSet.tov_nakl);
tov_naklTableAdapter.FillBy(tovarDataSet.tov_nakl, (int)nakladTableAdapter.MaxQuery());
allsum += (decimal)dataGridView3.Rows[kol - 1].Cells["sum"].Value; //переменная для хранения общей суммы по накладной
label13.Text = "Всього на суму " + allsum.ToString() + " грн.";
}
}