//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
}
}