Databáze a výpis sumy   otázka

VB.NET, SQL, Databáze

Dobrý den.

Ačkoli jsem si přečetl články tady a i příspěvky, a ačkoli jsem se dozvěděl z jednoho příspěvku, že "programování databázových aplikací je snadné", prosím o pomoc s konkrétním případem, kde jsem se už ztratil.

Mám databázi výrobků a u každého eviduji jeho nákupní cenu, od koho to kupuju (celkem 5 dodavatelů) a počet kusů.

A potřebuji do 5ti textlabelů zobrazovat okamžitý součet nákupních cen a množství od jednotlivých dodavatelů, čili součin množství krát cena u každého výrobku a od každého dodavatele.

Myslel jsem, že nějaký příkaz SQL "nabinduju" do hodnoty vlastnosti text a že vnitřní mechanismy Visual Basicu se již postarají o jeho neustálou aktualizaci. Šlo by to tak?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ptáte se na tři věci najednou. Co Vám není jasné?

1) jak sestavit dotaz pro databázi?

2) jak převést data z databáze do objektů z jazyce VB.NET?

3) jak zobrazit objekty z VB.NET na formuláři pomocí databindingu?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za reakci.

ad 1) SQL dotaz pro databazi bych i nějak sesmolil, připadá mi, že tohle vede ke správnému výsledku:

SELECT SUM(ObjMn * NakupC) AS HodnotaObjednavky

FROM SKz

WHERE (RefAD = 85)

kde ObjMn je objednané množství, NakupC je nákupní cena, a SUM to všechno sečte pro to zboží, u kterého je vybrán dodavatel s referenčním číslem 85 (příklad je to, to je jasné)

ad 2) data z databáze sice neumím převést kódem, ale VB udělá všechno za mně, takže prostě mám v projektu DataSet, který se jmenuje třeba Produkty a má v sobě výše zmíněnou tabulku skladových zásob SKz. Ve skutečnosti do VB nepředávám kompletní databázi, ale jenom ty produkty, u nichž je ObjMn větší než 0. Tu podmínku jsem zadal při tvorbě TableAdapteru, ale co všechno kolem toho VB udělal za černou práci za mně, to nevím. Ale prostě mám v projektu ten Dataset objednaných výrobků.

ad 3) ano, to je asi to, co bych potřeboval. Jak jednoduše při návrhu formuláře udělat TextLabel, ve kterém se bude neustále automaticky zobrazovat ta hodnota provedeného SQL příkazu uvedeného nahoře. Protože nejde do property DataBinding -> Text jenom tak napsat ten SQL příkaz. A z menu nejde vybrat ten dotaz, tam jde vybrat jen např. pole tabulky.

To musím udělat nějakou uloženou proceduru v té databázi a tu tam pak přiřadit? Nebo to musím ošetřit kódem a přes databinding to nepůjde? Fakt teď nevím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem to zatím vyřešil tak, že jsem si do DataSetu přidal dotazy na všechny součty u všech dodavatelů a pak jsem do formuláře přidal čudlík, který po zmáčknutí provede ty výpočty jednotlivých hodnot objednávek a sumu objednávek celkem.

Private Sub ButtonObjednavkyCelkem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonObjednavkyCelkem.Click
        LabelHodnotaEDS.Text = Me.SKzTableAdapter.HodnotaEDS()
        LabelHodnotaSWS.Text = Me.SKzTableAdapter.HodnotaSWS()
        LabelHodnotaABA.Text = Me.SKzTableAdapter.HodnotaABA()
        LabelHodnotaVsech.Text = Me.SKzTableAdapter.HodnotaVsech()
End Sub

Nic jiného mně nenapadlo, to bindování asi nejde a pokud jsem výše uvedený kód chtěl navázat na nějakou událost ve formuláři, tak mně nenapadalo na jakou, aby se změna prováděla automaticky. A navíc se mi zdálo, jakoby ty výpočty sum trvaly strašně dlouho, když jsem to navázal na event TextChanged u nějakého políčka.

Takhle sice nevidím okamžitě změnu, pokud změním počet kusů, nebo pro výrobek vyberu jiného dodavatele, ale stačí holt zmáčknout čudl a ty součty se provedou.

Sice je to velmi amatérské a spousta zbytečného duplicitního kódu, ale já, který jsem se zabýval programováním naposledy v době strukturovaného programování, asi přechod na OOP nějak nezvládám.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

U události TextChanged bude s pomalostí asi ten problém, že se mění při jakékoliv změně textu (to znamená spouštět se bude asi mnohokrát, nevím, kolik TextBoxů tam máte, ale chybu hledejte tam).

S tím přechodem na OOP jsou to jenom výmluvy. Problém může být jedině čas nebo chuť naučit se něco nového. Ale opakováním duplicitního kódu a opravováním chyba na padesáti různých místech toho času velmi záhy proplýtváte daleko víc.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, neviděl bych to s tou nechutí učit se tak přísně. Popravdě, v knihách o VB čtu poměrně často, ale bohužel četnost četby nemusí být nutně v přímé úměře s mírou pochopení. Programování mně neživí a musím během svého života se věnovat i jiným věcem, než věnování se VB. Popravdě se k němu stále vracím v jakýchsi vlnách, jak mi dovolí čas a jak vznikne potřeba něco drobného vyřešit.

A co se týče OOP, tam je potřeba, aby mi "docvakla" zcela jistě nějaká drobnost, která moje myšlení překlopí z procedurálního na OOP. Zatím se prostě neumím dívat na věci kolem sebe očima OOP, to nejde naučit, to se musí pochopit a vstřebat a ztotožnit se s tímhle modelem.

Ale jinak souhlas, že ztráta mého času se může silně kompenzovat přiučením se něčeho nového.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přijde mi, že prostě řešíte více věcí a neumíte si to rozdělit na menší logické části. Data máte, fajn. Zbývá Vám:

1) Určit si, kdy to refreshovat (při změně textu? Na tlačítko? Timerem? Při otevření okna?)

2) Jak nacpat hodnoty z objektu do (například) textových políček ve formuláři. Databinding! Kód co máte výše není třeba psát, pokud se prokoušete tématem popisujícím BindingSource, Datasource a Datafield ;-) v každém lepším tutorialu na toto téma.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback