IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Maros2470
Člen
Avatar
Maros2470:26.6.2014 8:35

Zdravím všechny. Potřeboval bych poradit z dotazem na databázi. Mám napsán dotaz takto:

string connectionString = cesta;
                using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
                {
                    spojeni.Open();
                    string dotaz = "SELECT s. SkladId, s.CenikId, s.UzivatelId, s.JednotkaId, s.ZrcadloId, s.Nakup, s.Zasoby, s.Zustatek, s.Sklad, s.Trzba, s.Datum, u.UzivatelId, u.Prijmeni, j.JednotkaId, j.Jednotka, c.CenikId, c.Zbozi, c.Cena, c.JednotkaId FROM Sklad s LEFT JOIN Cenik c ON s.CenikId = c.CenikId AND s.JednotkaId = c.JednotkaId LEFT JOIN Uzivatel u ON s.UzivatelId = u.UzivatelId LEFT JOIN Jednotky j ON s.JednotkaId = j.JednotkaId ";
                    using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
                    using (DataSet vysledky = new DataSet())
                    {
                        adapter.Fill(vysledky);
                        foreach (DataRow radek in vysledky.Tables[0].Rows)
                        {

                            skladDataGrid.Rows.Add(radek["SkladId"], radek["CenikId"], radek["UzivatelId"], radek["JednotkaId"], radek["ZrcadloId"], radek["Zbozi"], radek["Cena"], radek["Nakup"], radek["Zasoby"], radek["Sklad"], radek["Jednotka"], radek["Trzba"], radek["Prijmeni"], radek["Datum"]);  // načtení ceníku
                        }
                    }
                    spojeni.Close();
                }

Potřeboval bych poradit jak tento dotaz upravit, abych získal výpis položek s nejvyšším datumem.

Děkuji za rady

 
Odpovědět
26.6.2014 8:35
Avatar
Odpovídá na Maros2470
Neaktivní uživatel:26.6.2014 8:43

Přidáš jen na konec dotazu

ORDER BY s.Datum DESC
LIMIT 1
Nahoru Odpovědět
26.6.2014 8:43
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:26.6.2014 8:44

Nevím co myslíš tím nejvyšším datumem, s limitem ti to vrátí pouze jednu s tím nejvyšším datumem, bez něj seřazené od nejnovější po nejstarší.

Nahoru Odpovědět
26.6.2014 8:44
Neaktivní uživatelský účet
Avatar
Maros2470
Člen
Avatar
Odpovídá na Neaktivní uživatel
Maros2470:26.6.2014 8:57

Jedná se o sklad, kde každá změna u položky skladu se ukládá jako nový záznam. Po načtení databáze do gridu potřebuji zobrazit všechny položky skladu s nejvyšším datem. Asi bude problém s tím, že mi to načte jen tu položku, kde je nejvyšší datum. V podstatě potřebuji u každé položky načíst tu s poslední změnou.

Editováno 26.6.2014 8:59
 
Nahoru Odpovědět
26.6.2014 8:57
Avatar
Odpovídá na Maros2470
Neaktivní uživatel:26.6.2014 10:31

Dej mi příklad, asi nechápu, co jsou všechny položky s nejvyšším datem :D

Editováno 26.6.2014 10:31
Nahoru Odpovědět
26.6.2014 10:31
Neaktivní uživatelský účet
Avatar
Maros2470
Člen
Avatar
Odpovídá na Neaktivní uživatel
Maros2470:26.6.2014 11:15

Ve skladu jsou např. Cihla, Cement, Vápno.

23.6.2012 Cihla cena 5,-
23.6.2012 Vápno cena 140,-
23.6.2012 Cement cena 135,-
24.6.2013 Cihla cena 5,50
25.7.2014 Vápno cena 155,-
26.9.2014 Cement cena 145,-

Potřebuji načíst
24.6.2013 Cihla cena 5,50
25.7.2014 Vápno cena 155,-
26.9.2014 Cement cena 145,-

Prostě poslední změny u všech položek

 
Nahoru Odpovědět
26.6.2014 11:15
Avatar
Odpovídá na Maros2470
Neaktivní uživatel:26.6.2014 12:03
SELECT id, name, price, max(date)
FROM `devbook_obchod`
GROUP BY name

Doplň si tam ten join a je to hotové :)

Nahoru Odpovědět
26.6.2014 12:03
Neaktivní uživatelský účet
Avatar
Maros2470
Člen
Avatar
Odpovídá na Neaktivní uživatel
Maros2470:26.6.2014 12:19

Díky za radu

 
Nahoru Odpovědět
26.6.2014 12:19
Avatar
Maros2470
Člen
Avatar
Odpovídá na Neaktivní uživatel
Maros2470:26.6.2014 15:12

Na vyzkoušení jsem si udělal dvě tabulky, napsal jsem to takto:

string connectionString = @"Data Source=MyDatabase.sdf";
            using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
            {
                spojeni.Open();
                string dotaz = "SELECT a.Id, a.Clovek, a.BarvaId, MAX(a.Datum), b.Id, b.Barva FROM Lidi a LEFT JOIN Barvy b ON a.BarvaId = b.Id GROUP BY a.Id  ";
                using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
                using (DataSet vysledky = new DataSet())
                {
                    adapter.Fill(vysledky);
                    foreach (DataRow radek in vysledky.Tables[0].Rows)
                    {

                        dataGridView1.Rows.Add(radek["Id"], radek["BarvaId"], radek["Clovek"], radek["Barva"], radek["datum"] );
                    }
                }
                spojeni.Close();
            }

ale vyhazuje mi to chybu: In aggregate and grouping expressions, the SELECT clause can contain only aggregates and grouping expressions. [ Select clause = a,Clovek ]

Dělám to jako CE databázi

Editováno 26.6.2014 15:13
 
Nahoru Odpovědět
26.6.2014 15:12
Avatar
vidlec
Člen
Avatar
vidlec:26.6.2014 15:52

Zkus použít Select distinct s.JmenoVyrobku, s.SkladId, atd..

Na konci musí být ORDER BY datum, nebo co já vím, jak to chceš řadit

 
Nahoru Odpovědět
26.6.2014 15:52
Avatar
Odpovídá na Maros2470
Neaktivní uživatel:26.6.2014 16:36

Nikdy jsem v CE nedělal, tady už bohužel neporadím.

Nahoru Odpovědět
26.6.2014 16:36
Neaktivní uživatelský účet
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Maros2470
Jan Vargovský:26.6.2014 16:39

Když používáš agregační funkce (sum, max, avg, ...) tak musíš dát všechny ostatní sloupce do klauzule group by.

 
Nahoru Odpovědět
26.6.2014 16:39
Avatar
Maros2470
Člen
Avatar
Odpovídá na Jan Vargovský
Maros2470:26.6.2014 17:19

Možná se mi to podařilo složitě, alu funguje mi to. Mám to takto:

string connectionString = @"Data Source=MyDatabase.sdf";
            using (SqlCeConnection spojeni = new SqlCeConnection(connectionString))
            {
                spojeni.Open();
                string dotaz = "SELECT l.Id, l.BarvaId,  l.Clovek, l.Datum, b.Id, b.Barva FROM Lidi l LEFT JOIN Barvy b ON l.BarvaId = b.Id JOIN (SELECT Clovek, max(Datum) Datum FROM Lidi GROUP BY Clovek) k2 ON l.Clovek=k2.Clovek AND l.Datum=k2.Datum ";
                using (SqlCeDataAdapter adapter = new SqlCeDataAdapter(dotaz, spojeni))
                using (DataSet vysledky = new DataSet())
                {
                    adapter.Fill(vysledky);
                    foreach (DataRow radek in vysledky.Tables[0].Rows)
                    {

                        dataGridView1.Rows.Add(radek["Id"], radek["BarvaId"], radek["Clovek"],radek["Barva"], radek["Datum"]);
                    }
                }
                spojeni.Close();
            }

Funguje to, ale nevím zda je to optimální řešení

 
Nahoru Odpovědět
26.6.2014 17:19
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Maros2470
Jan Vargovský:26.6.2014 17:31
"SELECT a.Id, a.Clovek, a.BarvaId, MAX(a.Datum), b.Id, b.Barva FROM Lidi a LEFT JOIN Barvy b ON a.BarvaId = b.Id GROUP BY a.Id, a.Clovek, a.BarvaId, b.Id, b.Barva";
 
Nahoru Odpovědět
26.6.2014 17:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.