2016-08-18 5 views
0

Ich erstelle eine C# Inventory App mit SQL DB. Mit dieser App können Sie einen Artikel auswählen, der gebucht werden soll und wenn er verfügbar ist, wird er gebucht. Klingt ziemlich einfach eh !, dachte ich auch. Hier ist das Problem. Diese App muss auf zwei Bedingungen prüfen.So prüfen Sie, ob Artikel für bestimmte Datumsbereiche verfügbar ist

1) Wenn das Element zwischen bestimmten Datumsbereich (zB verfügbar: 18. August - 23. August)

2) Wenn die erforderliche Menge zur Verfügung steht (zB: 2 oder 3).

Ich habe eine Datenbank, die Artikelname und Anfangsmengen enthält. Ein weiterer, um aktuelle Buchungen zu halten.Was hat folgende Daten.

ID Cottage quantity From Date To Date  Item name 
2 Woodcastle 2  2016-08-18 2016-08-24 Kayaks 

Jetzt, wenn ich 1 Kajak (anfängliche Quantität 3) auswähle, um von 2016-08-19 zu 2016-08-23 zu buchen. Wie mache ich das mit SQL?

Heres, was ich bisher tue aber kein Glück

selecteditem = items_listbox.SelectedItem.ToString(); 
     from_date = from_datepicker.Value.ToString(); 
     to_date = to_datepicker.Value.ToString(); 
     quantity = quantity_need.Text; 
     from_date = Convert.ToDateTime(from_date).ToString("yyyy-MM-dd"); 
     to_date = Convert.ToDateTime(to_date).ToString("yyyy-MM-dd"); 
     int init_i = 0; 
     int taken_i = 0; 
     int dropped_i = 0; 
     string select_init = "SELECT initial_quantity from inventory_items Where item_name LIKE '" + selecteditem + "'; "+ "SELECT COALESCE(SUM(Quantity), 0) from inventory_bookings Where item_name LIKE '" + selecteditem + "' AND '" + from_date + "' between date_from and date_to; "+ "SELECT COALESCE(SUM(Quantity), 0) from inventory_bookings Where item_name LIKE '" + selecteditem + "' AND '" + to_date + "' between date_from and date_to"; 
     conn = new MySqlConnection(connectionstring); 
     MySqlCommand init = new MySqlCommand(select_init, conn); 
     try 
     { 
      conn.Open(); 
      reader = init.ExecuteReader(); 
      while (reader.Read()) 
      { 
       init_i = reader.GetInt32(0); 
      } 
      reader.NextResult(); 
      while (reader.Read()) 
      { 
       taken_i = reader.GetInt32(0); 
      } 
      reader.NextResult(); 
      while (reader.Read()) 
      { 
       dropped_i = reader.GetInt32(0); 
      } 
      int quantity_avail= init_i - taken_i - dropped_i; 
      if (quantity_avail >= Convert.ToInt32(quantity_need.Text)) 
      { 
       checkresult_lbl.Text= "Currently There are "+ quantity_avail + " "+ selecteditem +"/s available in your Inventory, Please Proceed to book"; 
       Booking_btn.Enabled = true; 
      } 
      else 
      { 
       checkresult_lbl.Text = "Currently There are not enough available Items in your Inventory, Please change date or Quantity"; 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
     finally 
     { 
      conn.Close(); 
     } 
+0

Randnotiz - bitte parametrisierte Abfragen verwenden! Sie können hier eine Sicherheitsanfälligkeit einführen, indem Sie den Wert aus dem ausgewählten Listenfeldelement direkt in Ihre Abfrage einfügen. Lesen Sie etwas über SQL-Injection. – Raxr

+0

Ich bleibe immer bei parametrisierten Abfragen. Dies ist nur für die Entwicklungsphase. –

+0

Sie sollten einfach Ihre (schön formatierte) SQL-Datei posten, da dies der Inbegriff Ihres Problems ist, nicht der .net-Code –

Antwort

0

ich in der Lage war, dies mit dieser Logik zu verstehen.

Statement 1: "SELECT initial_quantity from inventory_items Where item_name LIKE '" + selecteditem + "'; " 

Statement 2: "SELECT COALESCE(SUM(Quantity), 0) from inventory_bookings Where item_name LIKE '" + selecteditem + "' AND '" + from_date + "'<= date_to AND date_from < '"+to_date+"'" 

Anweisung # 1 wählt die Anfangswertmenge des Artikels aus. (Sagen wir 3).

Statement # 2 wählt die wie viele Einzelteile sind aus für die Tage (kann sagen, 2)

Dann prüft sie, ob (3-2) mehr als oder gleich benötigte Menge und dann buchen.

Verwandte Themen