{
//при открытии формы заполним список comboBox1
string CommandText = "SELECT T.id, T.name From MyDB.dbo.Table_food T"; //строка запроса
string ConnectionString = ""; //строка подключения
SqlDataAdapter dataAdapter = new SqlDataAdapter(CommandText, ConnectionString);
//Создаем объект DataSet:
DataSet ds = new DataSet();
//Заполняем таблицу Table1 объекта ds данными из базы, это те данные, которые получил запрос:
dataAdapter.Fill(ds, "Table1");
DataTable dt = new DataTable();
dt = ds.Tables["Table1"];
foreach (DataRow row in dt.Rows) //перебираем все строки полученной таблицы
{
string col1 = row["name"].ToString();
comboBox1.Items.Add(col1);
}
}
2. При выборе стола необходимо загрузить таблицу с уже заказанными блюдами.
Если стол занят, то эти блюда должны быть в таблице заказы и флаг активности стола должен быть в положении истина.
Здесь лучше создать и использовать хранимую процедуру.
Процесс создания хранимой процедуры в среде SQL Server Management Studio:
Добавляем новую хранимую процедуру
Устанавливаем параметры
Далее вводим текст хранимой процедуры и нажимаем кнопку выполнить:
В нашем случае код хранимой процедры будет следующим:
CREATE PROCEDURE [dbo].[UpdateOrferFood]
-- Add the parameters for the stored procedure here
@p1 varchar(145) = '', --name стола
@p2 tinyint = 0, --активность стола
@p3 tinyint = 0 --только загрузка
AS
BEGIN
SET NOCOUNT ON;
--получим значения таблицы [dbo].[Order_food] по параметрам стол и активность стола
if @p3=1
begin
SELECT
T.id,
T.table_food_id,
T.Food_id,
T.kol,
T.activity,
F.name,
F.Price,
TF.name
from MyDB.dbo.Order_Food T
inner join MyDB.dbo.Food F
on T.Food_id = F.id
inner join MyDB.dbo.Table_food TF
on T.table_food_id = TF.id
where (TF.name = @p1 and T.activity=@p2) -- активный стол
END
END
Теперь требуется, используя эту хранимую процедуру, загрузить данные в таблицу при выборе стола и настроить код кнопки сохранить.
Дважды щелкаем по списку выбора стола и, тем самым, создаем обработчик события «при изменении». Код будет следующий:
|
dataGridView1.Rows.Clear(); //очистка всей таблицы
try
{
SqlConnection conn = new SqlConnection(); // соединение с сервером
conn.ConnectionString = "";
SqlCommand myCommand = conn.CreateCommand(); //создаем команду
myCommand.CommandType = CommandType.StoredProcedure; //тип команды хр процедура
myCommand.CommandText = "[dbo].[UpdateOrferFood]"; //название процедуры
myCommand.Parameters.Add("@p1", SqlDbType.VarChar, 145); //параметр имя стола
myCommand.Parameters["@p1"].Value = comboBox1.Text;
myCommand.Parameters.Add("@p2", SqlDbType.Int, 1); //параметр активность стола
myCommand.Parameters["@p2"].Value = 1;
myCommand.Parameters.Add("@p3", SqlDbType.Int, 1); //параметр только загрузка
myCommand.Parameters["@p3"].Value = 1;
conn.Open();
SqlDataReader dataReader = myCommand.ExecuteReader();
while (dataReader.Read())
{
int kol = dataReader.GetInt32(3); //количество заказано
decimal pr = dataReader.GetDecimal(6); //цена заказано
decimal sum = kol * pr; //сумма строки
string nameFood = dataReader.GetString(5);//блюдо заказано
//добавляем эти значения в таблицу формы
dataGridView1.Rows.Add(nameFood, Convert.ToString(kol), Convert.ToString(pr), Convert.ToString(sum));
}
}
catch (Exception ex)
{ MessageBox.Show(ex.ToString()); }
Здесь сначала создаем соединение с сервером, затем создаем sql-команду, указываем, что команда является хранимой процедурой. Задаем значения параметрам. Результат чтения выборки помещаем в dataReader, далее в цикле перебираем значения выборки и результат заносим в таблицу на форме.
3. Обработчик нажатия на кнопку сохранить. Добавим еще одну хранимую процедуру. Процедура будет добавлять данные в таблицу Order_Food. Здесь есть один нюанс, если данные в этой таблице есть (т.е. клиент делает дозаказ), тогда надо не записывать данные, а обновлять их, для каждой строки таблицы основной формы. Текст процедуры можно взять следующий:
|
ALTER PROCEDURE [dbo].[UpdateTableFoodOrder]
-- обязательные параметры процедуры
@p1 varchar(145) = '', --name стола
@p2 varchar(145) = '', --name еды
@p3 int = 0, --количество еды
@p4 tinyint = 0 --активность стола
AS
BEGIN
SET NOCOUNT ON;
--переменная @tCount - покажет новый это заказ или дозаказ
--она возвращает количество строк в таблице по заданным условиям
declare @tCount int
set @tCount = (SELECT count(*)
from MyDB.dbo.Order_Food T
left join MyDB.dbo.Food F
on T.Food_id = F.id
left join MyDB.dbo.Table_food TF
on T.table_food_id = TF.id
where (TF.name = @p1 and T.activity = @p4 and F.name = @p2));
if(@tCount=0)
begin
--вставка данных, т.к. новый заказ
insert into MyDB.dbo.Order_Food(table_food_id, Food_id, kol, activity)
VALUES ((select TF.id from MyDB.dbo.Table_food TF where TF.name = @p1), (select TF.id from MyDB.dbo.food TF where TF.name = @p2), @p3,1);
end
else
begin
--обновление данных, т.к. дозаказ
update MyDB.dbo.Order_Food
SET kol = @p3
WHERE (table_food_id =
(select TF.id from MyDB.dbo.Table_food TF where TF.name = @p1)
and Food_id = (select TF.id from MyDB.dbo.food TF where TF.name = @p2)
and activity = 1)
end
END
Код кнопки сохранить:
try
{
using (var sqlConn = new SqlConnection(""))
{
sqlConn.Open();
foreach (DataGridViewRow D in dataGridView1.Rows)
{
var sqlCmd = new SqlCommand("[dbo].[UpdateTableFoodOrder]", sqlConn);
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.Parameters.AddWithValue("@p1", comboBox1.Text); //название стола
sqlCmd.Parameters.AddWithValue("@p2", D.Cells[0].Value); //название блюда параметр
sqlCmd.Parameters.AddWithValue("@p3", D.Cells[1].Value); //заказанное количество
sqlCmd.Parameters.AddWithValue("@p4", 1); //активность стола
sqlCmd.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{ MessageBox.Show(ex.ToString()); }
4. Рассчитать заказ – кнопка по которой на форме появляется надпись с суммой заказа.
Выполнить самостоятельно.
5. Закрыть заказ (обновляет данные в таблице Заказы клиентов, при этом активность стола переводит в положение ложь)
|
Выполнить самостоятельно.
6. При изменении значения столбца количество требуется перерасчет столбца сумма.
Для выполнения этой простой команды потребуется задать обработчик события dataGridView1_CellEndEdit это событие возникает при изменении выбранной ячейки. Код процедуры будет следующий:
int idx = dataGridView1.CurrentRow.Index;
dataGridView1[3, idx].Value = Convert.ToDouble(dataGridView1[1, idx].Value) * Convert.ToDouble(dataGridView1[2, idx].Value);
Здесь мы сначала определили номер текущей строки. Затем для текущей строки посчитали сумму = количество*цена.
7. При нажатии на кнопку Добавить блюда должно открыться диалоговое окно выбора блюда. При выборе блюда требуется перенос данных об этом блюде в таблицу.
Здесь при нажатии на кнопку откроем форму выбора блюд, у нас это форма FormFood. В этой форме необходимо добавить кнопку ОК, при нажатии на которую будем закрывать форму, т.е. код кнопки ОК будет следующим: Close(); А код кнопки Добавить блюдо:
FormFood f = new FormFood(); //создаем объект класса FormFood