
3.3. Запити до бд
Показати постачальників
select*from postachalnyky;
Показати покупців
select*from pokupci;
Показати виробників
select*from vyrobnyky;
Показати товар
select*from tovar;
Показати сутність продаж
select*from prodazh;
Показати проданий товар і покупця на дату
SELECT p.buyer_name, t.product_name, t.model FROM pokupci p, tovar t, prodazh pr WHERE p.id_buyer = pr.id_buyer AND t.id_product = pr.id_product and
pr.date_of_sale = “23-02-2010”;
Показати кількість продаж за період
SELECT sum (pr.count_of_saled) as Sales_count, select (sum ((t.price_for_sale - tovar.price_for_buy)*prodazh.count_of_saled) as Summary_profit) FROM prodazh pr, tovar t) WHERE pr.id_product = t.id_product and pr.date_of_sale between “23-02-2010” and “27-02-2010”;
4. Програмне забезпечення
Для реалізації даного проекту потрібен ПК зі середньостатистичними характеристиками, на якому додатково встановлено PostgreSQL.
Інтерфейс створено за допомогою C#. Проте для користування базою наявність цього компілятора не потрібна.
C# (виголошується сі-шарп) — об'єктно-орієнтована мова програмування. C# відноситься до сім'ї мов з c-подібнім синтаксисом, з них його синтаксис найбільш близький до C++ і Java. Мова має статичну типізацію, підтримує поліморфізм, перевантаження операторів (у тому числі операторів явного і неявного приведення типа), делегати, атрибути, події, властивості, узагальнені типи і методи, ітератори, анонімні функції з підтримкою замикань, LINQ, виключення, коментарі у форматі XML.
5. Програмна реалізація
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;
using Npgsql; //компонент для работы с субд Postgresql
namespace torg_project
{
public partial class Form1 : Form
{
//обьявим глобальные переменные
//инициализируем соединение к серверу postgresql и нашей базе данных
NpgsqlConnection connection = new NpgsqlConnection(
"Server=127.0.0.1;Port=5432;User Id=postgres; Password=masterkey;Database=shop;");
NpgsqlCommand command; //обьект прямой sql команды
NpgsqlDataAdapter adapter; //обьект адаптера данных
NpgsqlCommandBuilder builder; //обьект конструктора sql команд для обновления ланных
DataSet ds; //обьект локальной бд
//Определение строковых переменных, которые будут добавлены в список sql запросов
const string query1 = "Показать поставщиков";
const string query2 = "Показать покупателей";
const string query3 = "Показать изготовителей";
const string query4 = "Показать товар";
const string query5 = "Показать таблицу продаж";
const string query6 = "Показать проданный товар и покупателя по дате";
const string query7 = "Показать имеющийся товар по изготовителю";
const string query8 = "Показать количество продаж и прибыль за промежуток времени";
const string query9 = "Показать наиболее продаваемый товар";
//переменная sql запроса
string sqlquery;
public Form1()
{
InitializeComponent();
panel8.Enabled = false;
}
private void Form1_Load(object sender, EventArgs e) //событие - загрузка формы
{
//добавление в список строк, описывающих запросы
listBox1.Items.Add(query1);
listBox1.Items.Add(query2);
listBox1.Items.Add(query3);
listBox1.Items.Add(query4);
listBox1.Items.Add(query5);
listBox1.Items.Add(query6);
listBox1.Items.Add(query7);
listBox1.Items.Add(query8);
listBox1.Items.Add(query9);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)//событие - выбор значения из списка
{
switch (listBox1.Text) //если выбранное значение списка ...
{
case query1: //... соответствует значению переменной query1 ("Показать поставщиков")
{
label5.Visible = false; //выполняем установки невидимости ненужных элементов
manufacturer.Visible = false;
monthCalendar1.Visible = false;
//определяем запрос
sqlquery =
" SELECT distinct postachalnyky.provider_name, postachalnyky.country, " +
" postachalnyky.adress, postachalnyky.phone FROM public.postachalnyky ";
//если флажок top10 выбран, то к запросу добавляем limit 10 (будут выводиться перве 10 записей)
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery); //вызов метода наполнения таблиц
break; //выход
}
case query2:
{
label5.Visible = false;
manufacturer.Visible = false;
monthCalendar1.Visible = false;
sqlquery =
" SELECT distinct pokupci.buyer_name, pokupci.pasport, pokupci.phone, " +
" pokupci.num_credit_account FROM public.pokupci ";
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
break;
}
case query3:
{
label5.Visible = false;
manufacturer.Visible = false;
monthCalendar1.Visible = false;
sqlquery =
"SELECT distinct vyrobnyky.manufacter_name, vyrobnyky.country, vyrobnyky.adress, " +
" vyrobnyky.phone FROM public.vyrobnyky ";
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
break;
}
case query4:
{
label5.Visible = false;
manufacturer.Visible = false;
monthCalendar1.Visible = false;
sqlquery =
"SELECT distinct tovar.product_name, tovar.model, tovar.production_date, " +
" tovar.price_for_sale, tovar.price_for_buy, tovar.guarantee_years FROM public.tovar ";
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
break;
}
case query5:
{
label5.Visible = false;
manufacturer.Visible = false;
monthCalendar1.Visible = false;
sqlquery =
" SELECT pokupci.buyer_name, tovar.product_name, tovar.model, prodazh.abatement_percents, " +
" prodazh.date_of_sale, prodazh.count_of_saled FROM public.prodazh, public.tovar, " +
" public.pokupci WHERE prodazh.id_product = tovar.id_product AND pokupci.id_buyer = prodazh.id_buyer " ;
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
break;
}
case query6:
{
label5.Visible = false;
manufacturer.Visible = false;
monthCalendar1.Visible = true;
sqlquery =
" SELECT pokupci.buyer_name, tovar.product_name, tovar.model " +
" FROM public.pokupci, public.tovar, public.prodazh WHERE " +
" pokupci.id_buyer = prodazh.id_buyer AND tovar.id_product = prodazh.id_product and" +
" prodazh.date_of_sale = '" + monthCalendar1.SelectionStart.ToShortDateString() + "'";
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
break;
}
case query7:
{
label5.Visible = true;
manufacturer.Visible = true;
monthCalendar1.Visible = false;
//для наполнения combobox (с именем manufacturer) данными о производителях
//откроем соединение
connection.Open();
//определим прямую sql команду
command = new NpgsqlCommand(
"SELECT distinct vyrobnyky.manufacter_name from public.vyrobnyky", connection);
//определим обьект NpgsqlDataReader - для бысторого считывания данных из бд
NpgsqlDataReader reader;
//выполним команду
reader = command.ExecuteReader();
//пока есть данные будем поочередно добавлять их в combobox manufacturer
while (reader.Read())
{
manufacturer.Items.Add(reader[0].ToString().Trim());
}
//закроем соединения и удалим привязку dataGridView если она была
reader.Close();
connection.Close();
dataGridView1.DataSource = null;
break;
}
case query8:
{
label5.Visible = false;
manufacturer.Visible = false;
monthCalendar1.Visible = true; //сделаем видимым календарь
break;
}
case query9:
{
label5.Visible = false;
manufacturer.Visible = false;
monthCalendar1.Visible = false;
sqlquery =
" SELECT prodazh.count_of_saled, tovar.product_name, " +
" tovar.model FROM public.tovar, public.prodazh " +
"WHERE prodazh.id_product = tovar.id_product " +
" order by prodazh.count_of_saled desc " ;
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
break;
}
case "Таблица Покупатели": //случай возможен в режиме редактирования
{
sqlquery =
" SELECT * From public.pokupci "; //заполним таблицу всеми данными
buildTable(sqlquery);
dataGridView1.ReadOnly = false; //допустим возможность редактирования
break;
}
case "Таблица Поставщики":
{
sqlquery =
" SELECT * From public.postachalnyky ";
buildTable(sqlquery);
dataGridView1.ReadOnly = false;
break;
}
case "Таблица Товар":
{
sqlquery =
" SELECT * From public.tovar ";
buildTable(sqlquery);
dataGridView1.ReadOnly = false;
break;
}
case "Таблица Изготовители":
{
sqlquery =
" SELECT * From public.vyrobnyky ";
buildTable(sqlquery);
dataGridView1.ReadOnly = false;
break;
}
case "Таблица Продажи":
{
sqlquery =
" SELECT * From public.prodazh ";
buildTable(sqlquery);
dataGridView1.ReadOnly = false;
break;
}
}
}
private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e) //событие -изменение даты в календаре
{
if (listBox1.Text == query6) //событие возможно когда календарь видимый, т.е. либо при выборе query6...
{
sqlquery =
" SELECT pokupci.buyer_name, tovar.product_name, tovar.model " +
" FROM public.pokupci, public.tovar, public.prodazh WHERE " +
" pokupci.id_buyer = prodazh.id_buyer AND tovar.id_product = prodazh.id_product and" +
" prodazh.date_of_sale = '" +e.Start.ToShortDateString() + "'";
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
}
if (listBox1.Text == query8) //...либо query8
{
sqlquery =
"SELECT sum (prodazh.count_of_saled) as Sales_count, " +
" sum ((tovar.price_for_sale - tovar.price_for_buy)*prodazh.count_of_saled) as Summary_profit " +
" FROM public.prodazh, public.tovar WHERE prodazh.id_product = tovar.id_product and" +
" prodazh.date_of_sale between '" + e.Start.ToShortDateString() + "' and '" + e.End.ToShortDateString() + "'";
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
//e.Start.ToShortDateString() - первая дата из выбранного промежутка в календаре
}
}
private void manufacturer_SelectedIndexChanged(object sender, EventArgs e) //событие - изменение значения в combobox manufacturer
{
sqlquery =
"SELECT tovar.product_name, tovar.model, tovar.production_date " +
" FROM public.vyrobnyky, public.tovar WHERE tovar.id_manufacter = vyrobnyky.id_manufacter" +
" and vyrobnyky.manufacter_name = '" + manufacturer.Text + "'";
if (top.Checked == true)
sqlquery = sqlquery + " limit 10";
buildTable(sqlquery);
//manufacturer.Text - выбранное значение combobox manufacturer
}
private void top_CheckedChanged(object sender, EventArgs e) //событие - изменение состояние флажка Top10
{
listBox1_SelectedIndexChanged(sender, e); //для обновления выводимых данных вызовем обрабчик события для выбора из списка запроса
}
private void query_CheckedChanged(object sender, EventArgs e) //выбор переключателя запрос
{
if (query.Checked == true) //если он выбран, то переходим в режим запроса
{
panel8.Enabled = false;
dataGridView1.DataSource = null;
listBox1.Items.Clear();
Form1_Load(sender, e);
top.Enabled = true;
}
}
private void editing_CheckedChanged(object sender, EventArgs e) //выбор переключателя редактирование
{
if (editing.Checked == true) //если он выбран, то переходим в режим редактирование
{
dataGridView1.DataSource = null;
listBox1.Items.Clear();
listBox1.Items.Add("Таблица Покупатели");
listBox1.Items.Add("Таблица Поставщики");
listBox1.Items.Add("Таблица Товар");
listBox1.Items.Add("Таблица Изготовители");
listBox1.Items.Add("Таблица Продажи");
panel8.Enabled = true;
top.Enabled = false;
}
}
private void show_Click(object sender, EventArgs e)
{
}
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
}
void buildTable(string query) //метод наполняющий таблицыу dataGridView данными
{
connection.Open(); //открываем соединение
ds = new DataSet(); //определяем обьект DataSet
adapter = new NpgsqlDataAdapter(query, connection); //определяем
adapter.Fill(ds, "table"); //наполняем в соответствии с запросом обьект DataSet и обьект таблицы DataTable
dataGridView1.ReadOnly = true; //элемент dataGridView только для чтения
dataGridView1.DataSource = ds; //привяжем элемент dataGridView к обьекту DataSet
dataGridView1.DataMember = "table"; //и талице "table"
connection.Close(); //закрываем соединение
set_true_column_names();
}
private void buttonexit_Click(object sender, EventArgs e) // нажатие кнопки выход
{
this.Close();
Application.Exit();
}
void set_true_column_names() //метод, устанавливающий правильные заголовки стоблцов, вместо по-умолчанию
{
foreach (DataGridViewColumn c in dataGridView1.Columns)
{
switch (c.HeaderText)
{
case "model":
c.HeaderText = "Модель";
break;
case "id_provider":
c.HeaderText = "Ид_поставщика";
break;
case "provider_name":
c.HeaderText = "Название поставщика";
break;
case "country ":
c.HeaderText = "Страна";
break;
case "adress":
c.HeaderText = "Адрес";
break;
case "phone":
c.HeaderText = "Телефон";
break;
case "id_buyer":
c.HeaderText = "Ид_покупателя";
break;
case "buyer_name":
c.HeaderText = "Имя покупателя";
break;
case "pasport":
c.HeaderText = "Паспорт";
break;
case "num_credit_account":
c.HeaderText = "Номер счета";
break;
case "id_sale":
c.HeaderText = "Ид_продажи";
break;
case "id_product":
c.HeaderText = "Ид_товара";
break;
case "abatement_percents":
c.HeaderText = "Скидка";
break;
case "date_of_sale":
c.HeaderText = "Дата продажи";
break;
case "count_of_saled":
c.HeaderText = "К-во продаж";
break;
case "id_manufacter":
c.HeaderText = "Ид_производителя";
break;
case "product_name":
c.HeaderText = "Название товара";
break;
case "production_date":
c.HeaderText = "Дата изготовления";
break;
case "price_for_sale":
c.HeaderText = "Цена продажи";
break;
case "price_for_buy":
c.HeaderText = "Цена закупки";
break;
case "guarantee_years":
c.HeaderText = "гарантия (лет)";
break;
case "manufacter_name":
c.HeaderText = "Название изготовителя";
break;
}
}
}
private void button2_Click(object sender, EventArgs e) //удалить выбранную строку
{
connection.Open();
command = new NpgsqlCommand();
command.Connection = connection;
string value;
switch (listBox1.Text) //для каждого случая составим свою команду
{
case "Таблица Покупатели":
value = dataGridView1.SelectedCells[0].OwningRow.Cells["id_buyer"].Value.ToString().Trim();
command.CommandText = "delete from pokupci where id_buyer = '" + value+ "'";
break;
case "Таблица Поставщики":
value = dataGridView1.SelectedCells[0].OwningRow.Cells["id_provider"].Value.ToString().Trim();
command.CommandText = "delete from postachalnyky where id_provider = '" + value+ "'";
break;
case "Таблица Товар":
value = dataGridView1.SelectedCells[0].OwningRow.Cells["id_product"].Value.ToString().Trim();
command.CommandText = "delete from tovar where id_product = '" + value + "'";
break;
case "Таблица Изготовители":
value = dataGridView1.SelectedCells[0].OwningRow.Cells["id_manufacter"].Value.ToString().Trim();
command.CommandText = "delete from vyrobnyky where id_manufacter = '" + value + "'";
break;
case "Таблица Продажи":
value = dataGridView1.SelectedCells[0].OwningRow.Cells["id_sale"].Value.ToString().Trim();
command.CommandText = "delete from prodazh where id_sale = '" + value + "'";
break;
}
try
{
command.ExecuteNonQuery(); //выполним эту команду
}
catch (Npgsql.NpgsqlException ex) //если н евыйдет
{
MessageBox.Show(ex.ToString()); //выведем сообщения
}
connection.Close();
listBox1_SelectedIndexChanged(sender, e);
}
private void panel8_Paint(object sender, PaintEventArgs e)
{
}
private void button1_Click(object sender, EventArgs e) //принять изменения
{
connection.Open();
NpgsqlCommandBuilder builder = new NpgsqlCommandBuilder(adapter);
try
{
adapter.Update(ds, "table"); //медод обновляющий источник
}
catch (Npgsql.NpgsqlException ex)
{
MessageBox.Show(ex.Message);
}
connection.Close();
}
private void button3_Click(object sender, EventArgs e) //очистить таблицу
{
connection.Open();
command = new NpgsqlCommand();
command.Connection = connection;
switch (listBox1.Text)
{
case "Таблица Покупатели":
command.CommandText = "delete from pokupci";
break;
case "Таблица Поставщики":
command.CommandText = "delete from postachalnyky";
break;
case "Таблица Товар":
command.CommandText = "delete from tovar";
break;
case "Таблица Изготовители":
command.CommandText = "delete from vyrobnyky";
break;
case "Таблица Продажи":
command.CommandText = "delete from prodazh";
break;
}
try
{
command.ExecuteNonQuery();
}
catch (Npgsql.NpgsqlException ex)
{
MessageBox.Show(ex.ToString());
}
connection.Close();
listBox1_SelectedIndexChanged(sender, e);
}
private void button4_Click(object sender, EventArgs e) //кнопка установления соединения не по-умолчанию
{
connection = new NpgsqlConnection(
"Server=127.0.0.1;Port=5432;User Id=postgres; Password=" + password.Text.Trim() + ";Database=" + d_name.Text.Trim() + ";");
try
{
connection.Open();
MessageBox.Show("Соединение установлено");
connection.Close();
}
catch
{
MessageBox.Show("Ошибка при соединении");
}
}
private void password_TextChanged(object sender, EventArgs e)
{
}
}
}