//V tuto chvíli nepoužité USING //using System.Text; //using System.Windows.Data; //using System.Windows.Documents; //using System.Windows.Media; //using System.Windows.Media.Imaging; //using System.Windows.Shapes; //using System; using System.Collections.Generic; using System.Linq; using System.Windows.Input; using System.Windows; using System.Windows.Controls; namespace PM_view { /// /// Definice okna pro sestavování uživatelských SQL dotazů /// Uživatel si může výseldný SQL dotaz upravit v okně Výsledný dotaz, nicméně to není doporučováno, vzhledem k tomu, že zde není možná validace SQL dotazů /// public partial class QueryBuilder : Window { public QueryBuilder() { InitializeComponent(); } string jmeno = ""; // jméno sloupce string node = ""; // jméno tabulky string lastnode = null; // pamatuje si posledni tabulku (kvůli tovrbě ON podmínk u JOIN) List nodes = new List(); //Seznam pouzitych tabulek bool vicprvku = false; //logická proměnná, zda v SELECTu je vybráno víc prvků bool victab = false; //logická proměnná zda jsou vybrány prvky z více tabulek bool contains = false; // logická proměnná zda je již vybraná tabulka v JOIN klauzuli obsažena bool jeObec = false; // z důvodu fungování aplikace a zobrazení grafů je nutné aby vždy na prvním místě nezávisel na dotazu byla obec, tato logická proměnná "hlídá" zda tomu tak je string FromBox = ""; //definice stringu pro zápis podmínky FOR string SelectBox = ""; // definice stringu pro zápis vybraných prvků SELECT bool kde = false; //logická proměnná, na jejímž zákaldě se budou zapisovat jména sloupců buď do Selectu nebo WHERE string prvni_obec = ""; // jak bylo řečeno první sloupec musí bt vždy obec, to představuje tento string /// /// Událost, která vybírá prvky, do SELECT a nebo WHERE boxu /// Na prvek je nutné pro výběr udělat dvou-klik!!!!! /// V příapdě že uživatel klikne na jméno tabulky, je tato vyjímka zachycena v chatch bloku /// /// /// private void treeView1_MouseDoubleClick(object sender, MouseButtonEventArgs e) { try { TreeViewItem prvek = new TreeViewItem(); //prvek představující sloupec TreeViewItem rodic = new TreeViewItem(); //prvek představující "rodiče sloupce" - jméno tabulky prvek = treeView1.SelectedItem as TreeViewItem; //naplnění prkvy, je zde hlídána konverze na ty TreeView pomocí AS rodic = prvek.Parent as TreeViewItem; jmeno = prvek.Header.ToString(); // naplnění jména tabulky if (!kde) //podminka zda to prvky bude dávat do Where nebo Select { node = rodic.Header.ToString(); //naplnění uzlů - jména tabulek prvni_obec = "obec"+rodic.Header.ToString(); node = node.Replace("\'", ""); //odstraní jednoduché uvozovky a nahradí je volným místem prvni_obec = "obec" + node; //vytvoří název pro první obec, protože obec musí být první sloupec - kvůli grafům node = "[" + node + "]"; //doplní zavorky //hlídá zda je název tabulky obsažen contains = nodes.Any(node.Contains); nodes.Add(node); //pokud na prvním místě není obec, provede se tato podmínka if (!jeObec) { SelectBox = "[" + prvni_obec + "]" + ", "; jeObec = true; vybrane_sloupce.Items.Add(prvni_obec); } //pokud je v Selectu víc prvků než jeden je nutné doplnit čárku if (vicprvku) { SelectBox = SelectBox + "," + "\n"; } //pokud existuje víc tabulek, které nejsou již obsaženy - tvroba JOIN / ON if (victab & !contains) { FromBox = FromBox + "\n" + " JOIN " + "\n" + node + "\n" + "ON " + lastnode + ".ID = " + node + ".ID"; } else if (FromBox.Length == 0) { FromBox = node; victab = true; } //tvorba Select prvků SelectBox = SelectBox + " " + "[" + jmeno + "]"; vybrane_sloupce.Items.Add(jmeno); //tato tabulak se změní na minulou tabulku - kvůli ON podmínce lastnode = node; node = null; vicprvku = true; //pokud se prvek podaří přidat můžeme povolit Where if (vybrane_sloupce.Items.Count > 0) { checkBox1.IsEnabled = true; } } else //pokud Where je zaškrtnuto { WhereBox.Text = WhereBox.Text + "[" + jmeno + "]" + "\n"; } //provede se aktualizace boxu s výsledným dotazem aktualizace(); } //hlídá pokud by uživatel vybrla místo názvu sloupce - uzel - celý název tabulky catch { MessageBox.Show("Není možné vybrat kořenový prvek"); } } /// /// Metoda používaná v událostech. /// Tato metoda při každém svém zavolání zobrazí v příslušném poli aktuální stav dotazu /// zároveň změna povoli tlačítko provedení dotatu, neboť se předpokládá že nebudeli uživatel dotaz nijak upravovat, měl by být platný /// private void aktualizace() { textVysledek.Text = "SELECT" + "\n" + SelectBox + "\n" + " FROM" + "\n" + FromBox + " " + WhereBox.Text; AskBtn.IsEnabled = true; } /// /// Zavře okno /// kontroluje zde je v doatzu nějaký text /// délka je vybrána z toho důvodu, že musí jít minimálně o text: /// Select * From a, cože je právě alespoň 15 znaků /// Do budoucna zde bude uístěn validátor /// /// /// private void button15_Click(object sender, RoutedEventArgs e) { if (textVysledek.Text.Length > 15) { this.Close(); } else { MessageBox.Show("Špatný nebo žádný dotaz"); } } /// /// Přepne výběr z tabulek z prvku SELECT na podmínku WHERE /// Jen v případě, že je již v SELECT nějaký prvek vybrán, do té doby je tento checkbox zakázán /// /// /// private void checkBox1_Checked(object sender, RoutedEventArgs e) { WhereBox.IsEnabled = true; WhereBox.Text = "WHERE " + "\n"; wrapPanel1.IsEnabled = true; wrapPanel2.IsEnabled = true; wrapPanel3.IsEnabled = true; kde = true; } /// /// Tlačítko, které smaže vše a uvede okno do stavu jako při spuštení /// /// /// private void delBtn_Click(object sender, RoutedEventArgs e) { SelectBox = ""; FromBox = ""; WhereBox.Clear(); jmeno = "nic"; node = "nic"; lastnode = null; vicprvku = false; victab = false; contains = false; vybrane_sloupce.Items.Clear(); textVysledek.Clear(); jeObec = false; checkBox1.IsEnabled = false; AskBtn.IsEnabled = false; } /// /// Událost při odškrtnutí (vypnutí) WHERE podmínky /// jsou zakázána tlačítka, hodnota kde nastavena na false, což znamená, že se vybrané prvky budou opět zapisovat do SELECT /// Záznam where je vymazán jak z pole, tak i z výsledného dotazu /// Box pro záspis podmínky je zakázán /// /// /// private void checkBox1_Unchecked(object sender, RoutedEventArgs e) { WhereBox.Clear(); WhereBox.IsEnabled = false; wrapPanel1.IsEnabled = false; wrapPanel2.IsEnabled = false; wrapPanel3.IsEnabled = false; kde = false; } #region //Tlačítka pro podmínku WHERE /// /// Do podmínky where vloží číslo 0 /// /// /// private void button0_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "0"; } /// /// Do podmínky where vloží číslo 1 /// /// /// private void button1_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "1"; } /// /// Do podmínky where vloží číslo 2 /// /// /// private void button2_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "2"; } /// /// Do podmínky where vloží číslo 3 /// /// /// private void button3_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "3"; } /// /// Do podmínky where vloží číslo 4 /// /// /// private void button4_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "4"; } /// /// Do podmínky where vloží číslo 5 /// /// /// private void button5_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "5"; } /// /// Do podmínky where vloží číslo 6 /// /// /// private void button6_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "6"; } /// /// Do podmínky where vloží číslo 7 /// /// /// private void button7_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "7"; } /// /// Do podmínky where vloží číslo 8 /// /// /// private void button8_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "8"; } /// /// Do podmínky where vloží číslo 9 /// /// /// private void button9_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "9"; } /// /// Přidá rovná se do podmínky Where /// /// /// private void button_eq_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "="; } /// /// Přidá menší do podmínky Where /// /// /// private void button_men_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "<" ; } /// /// Přidá větší do podmínky Where /// /// /// private void button_vet_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + ">"; } /// /// Přidá krát do podmínky Where /// /// /// private void button_krat_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "*"; } /// /// Přidá děleno do podmínky Where /// /// /// private void button_del_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "/"; } /// /// Přidá plus do podmínky Where /// /// /// private void button_plus_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "+"; } /// /// Přidá minus do podmínky Where /// /// /// private void button_minus_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + "-"; } /// /// Přidá kulaté závorky do podmínky Where /// /// /// private void button_zav_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " ( ) "; } /// /// Přidá hodnotu Like do podmínky Where /// /// /// private void button_like_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " LIKE "; } /// /// Přidá hodnotu NOT do podmínky Where /// /// /// private void button_not_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " NOT "; } /// ///Přidá hodnotu AND do podmínky Where /// /// /// private void button_and_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " AND "; } /// /// Přidá hodnotu SUM do podmínky Where /// /// /// private void button_Sum_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " SUM "; } /// /// Přidá hodnotu COUNT do podmínky Where /// /// /// private void button_Count_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " COUNT "; } /// /// Přidá hodnotu AVG do podmínky Where /// /// /// private void button_Avg_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " AVG "; } /// /// Přidá hodnotu Between do podmínky Where /// /// /// private void button_Between_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " BETWEEN "; } /// /// Událost, která při změne podmínky aktualizuje TextBox s výsledným dotazem /// /// /// private void WhereBox_TextChanged(object sender, TextChangedEventArgs e) { aktualizace(); } /// /// Přidá hodnotu IS do podmínky Where /// /// /// private void button_Is_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " IS "; } /// /// Přidá hodnotu NULL do podmínky Where /// /// /// private void button_Null_Click(object sender, RoutedEventArgs e) { WhereBox.Text = WhereBox.Text + " NULL "; } #endregion } }