Как вычесть из 1 строки в другую строку с тем же идентификатором, если запас в 1-й строке недостаточно (FIFO) - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь провести инвентаризацию, используя FIFO. Все работает нормально. Это уже вставка и обновление. Моя проблема заключается в том, что всякий раз, когда в 1-й строке не хватает количества для лекарства, запрашиваемого клиентом, оно меняет значение на -1, а вычитает в другой строке с тем же идентификатором медикамента и обновляет запасы до отрицательного числа. Вот моя таблица Stocks_IN:

stocksID | ID | datereceive | dateexpiry | quantity |remainingstocks
1        | 1  | datehere    | datehere   | 10       | 10
2        | 1  | datehere    | datehere   | 5        | 5

У меня есть этот код в моей кнопке сохранения

private void button9_Click_1(object sender, EventArgs e)
        {
            DataGridViewRow row;
            int quant = 0;

            string query = @"INSERT INTO Stocks_Out(ID,idtran,quantity,user)
                                            Values(@ID,@idtran,@quantity,@user)";

            using (SqlConnection xcon = new SqlConnection(@"Server=MEAND\SQLEXPRESS;Database=SHC;Integrated Security=SSPI;"))
            {
                try
                {
                    xcon.Open();

                    for (int n = 0; n < dataGridView2.Rows.Count - 1; n++)
                    {
                        row = dataGridView2.Rows[n];
                        using (SqlCommand xcom = new SqlCommand(query, xcon))
                        {
                            xcom.CommandType = CommandType.Text;
                            xcom.Parameters.AddWithValue("@ID", row.Cells["ID"].Value);
                            xcom.Parameters.AddWithValue("@idtran", row.Cells["idtran"].Value);
                            xcom.Parameters.AddWithValue("@quantity", row.Cells["quantity"].Value);
                            xcom.Parameters.AddWithValue("@user", row.Cells["user"].Value);
                            xcom.ExecuteNonQuery();
                            xcom.Dispose();


                            connection.Open();
                            quant = Convert.ToInt32(row.Cells["quantity"].Value.ToString());

                            SqlCommand xcom2 = connection.CreateCommand();
                            xcom2.CommandType = CommandType.Text;
                            xcom2.CommandText = "update Stocks_In set remainingquantity=remainingquantity-" + quant + " where ID= '" + row.Cells["ID"].Value + "'";
                            xcom2.ExecuteNonQuery();
                            xcom2.Dispose();

                        }
                    }
                    DialogResult result1 = MessageBox.Show("Are you sure you want to save this?",
                        "Important Question", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (result1 == DialogResult.Yes)
                    {
                        Med b = new Med();
                        b.Show();
                        this.Hide();
                    }
                }

                catch (Exception)
                {
                    throw;

                }
                finally
                {
                    xcon.Close();
                }

            }

        }

Так что, если я получу 11 лекарств, он вставляется в stocks_out и обновляет оставшиеся запасы в stocks_in. Но вместо того, чтобы возвращать значение 1-й строки в 0 и 2-е значение в 4, оно обновляет его до -1 (1-я строка) и -6 (2-я строка). Пожалуйста, помогите мне :( Эта вещь FIFO заставляет меня сходить с ума.

Вот обновленная таблица для Stocks_In:

stocksID | ID | datereceive | dateexpiry | quantity |remainingstocks
1        | 1  | datehere    | datehere   | 10       | -1
2        | 1  | datehere    | datehere   | 5        | -6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...