Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem SQL pomocné proměnné, trigger

Ahoj,
mám datový model ve kterém mám tabulku ZBOZI s atributem pocet_ks_na_sklade a potom mám tabulku "nakupuje", kde je atribut pocet_ks_koupeno.
Teď bych potřeboval příkaz do SQL, pravděpodobně pomocná proměnná nebo trigger, aby se opravdu odečítalo z pocet_ks_na_sklade - pocet_ks_koupeno a databáze teda byla pořád aktuální, nějaké rady?
Díky!

Předmět Autor Datum
A provést 2x po sobě příkaz UPDATE pro každou tabulku zvlášť nejde?
host 21.12.2016 16:43
host
Tohle se řeší v uložené proceduře a ještě zapouzdřené do transakce, abys měl jistotu, že se buď oba…
Jan Fiala 21.12.2016 17:02
Jan Fiala
mám to udělané takhle, bohužel nevim jak se píšou ty updaty, mohl by jsi mi sem napsat co přesně vlo…
martinSQLmartin 21.12.2016 18:54
martinSQLmartin
No upřímně řečeno, tohle není zrovna dobrý návrh databáze.
Wikan 21.12.2016 18:57
Wikan
Pokial to cele este len tvoris, tak popracuj najprv na navrhu tej DB az potom zistuj ako urobit neja…
wam_Spider007 21.12.2016 19:23
wam_Spider007
Updaty se pisou v SQL jazyku databaze. Presny format zalezi na pouzite dadabazi, i kdyz nejaka norma…
Jan Fiala 21.12.2016 21:37
Jan Fiala
Co sa tohto pripadu tyka, tak trigger tu naozaj nema co hladat. Kazdopadne, triggre maju svoje opods…
wam_Spider007 21.12.2016 19:28
wam_Spider007
Ano, veta je vseobecna. Znamena triggerum se vyhybej, pokud to nejde udelat jinak. Pokud to jinak (j…
Jan Fiala 21.12.2016 21:27
Jan Fiala
Nechci slovíčkařit, ale nemělo by místo slova "nejde" být "jde"? To by zcela měnilo smysl a podle mě…
host 21.12.2016 21:42
host
Ty jsi tu větu otočil: Triggerum se vyhybej, pokud to jde udelat jinak. Pokud to jinak (jednoduseji…
Jan Fiala 22.12.2016 06:43
Jan Fiala
Nic jsem neotočil... Jenom jsem upravil větu, aby dávala smysl. Ta druhá věta je v pořádku, tam jse…
host 22.12.2016 17:29
host
Promiň, oči mi už neslouží, spát mi nechutná, jíst mi nechutná. To jsem se zas unavila, unavila...
Jan Fiala 23.12.2016 10:14
Jan Fiala
... a ještě si navíc pleteš světové strany! :-p A tím bych tento Tvůj politováníhodný omyl uzavřel.…
host 23.12.2016 11:55
host
Se stranami jsem měl vždy problém. Proto jsem zůstal nestraníkem. Chtěl jsem k tobě zajít na návštěv… poslední
Jan Fiala 23.12.2016 13:17
Jan Fiala

Tohle se řeší v uložené proceduře a ještě zapouzdřené do transakce, abys měl jistotu, že se buď oba příkazy provedou nebo že se neprovede žádný.

Provedeš zápis do tabulky s nakupem a následně upravíš množství v tabulce se stavem skladu.
Trigger sice řešení je, ale čím víc triggerů tam dáš, tím větší to bude mít dopad na výkon => pokud můžeš, tak se triggerům vyhýbej.

Pak by ses měl zamyslet nad názvy tabulek. "Zboží" je obvykle název pro číselník, ne pro stav skladu. Skladů může být několik a pak to zboží bude úplně zavádějící.
O názvu "nakupuje" už vůbec nemluvím. Slovesem se objekty nepojmenovávají. U tebe by to mělo být spíš Nakupy, lépe Prijmy, protože jsou to příjmy do skladu.

Predstav si, ze budes mit stovky tabulek a pak budeš hledat, kam se zapisují příjmy do skladu. Napadne tě po roce, že to bude v tabulce "nakupuje"? Pokud chceš, aby to vypadalo profesionálněji (to platí i pro domácí úkol), vymysli si nějaký systém označování. Třeba všechny číselníky budou začínat Cis, všechny věci se skladem (příjmy, výdeje, stavy, inventury) pak Skl apod.
Takze pak budeš mít:
CisZbozi - ciselnik s položkami
SklPrijem - příjmy do skladu
SklStav - stav skladu
atd.

Když se na to pak koukneš v nějakém správci databáze, uvidíš vše, co spolu souvisí pěkně pohromadě

mám to udělané takhle, bohužel nevim jak se píšou ty updaty, mohl by jsi mi sem napsat co přesně vložit do sql? mam to na zkousku a víc se tím zabývat nehodlám.

Mám 3 sklady a zboží se nerozlišuje na jakem je skladu (jedná se o eshop, takže pokud si pražák objedná macbook, který není v pražským skladě, nevadí a pošlou ho z moravy)

fyzikc.png

Pokial to cele este len tvoris, tak popracuj najprv na navrhu tej DB az potom zistuj ako urobit nejaky update v transakcii. Ako uz bolo spomenute, nic nehovoriace nazvy tabuliek.
Nedodrzujes ziadne konvencie. Ak uz pises nazvy tabuliek velkymi, tak to rob vsade. A nie raz tak, raz tak. To plati aj o stlpcoch. To pouzivanie podciarkovnika v nazvoch stlpcov je dost des.
Dalej ... co ked budes mat aj ine typy tovarov ako notebook a pocitac? Co ak bude zakaznik chciet kupit viac ako jeden tovar? Nemas tam hlavicku nakupu.

Takto z rychlika, potrebujes tieto entity:
Sklad - Zoznam skladov
Zamestnanec - Zoznam zamestnancov
SkladZamestnanec - Priradenie zamestnanca ku skladu
Zakaznik - Zoznam zakaznikov
Tovar - vseobecny ciselnik zbozia
SkladTovar - tu budes mat aky tovar je na akom sklade a s akym poctom kusov. Tu ani na tovare nema co byt ID zamestnanca.
Objednavka - objednavka, ktoru vytvara zakaznik. Toto je v podstate hlavicka. Mozes tu mat aj ID zamestnanca, ktory zakaznika obsluzil.
ObjednavkaTovar (pripadne: ObjednavkaPolozka) - tu budes mat zoznam tovarov, ktore k objednavke patria. Vazba na tovar (pripadne sklad ak moze byt na viacerych skladoch). Pocet kusov. Cena je na tovare. Tu mozes mat pripadne nejaku akciovu cenu alebo zlavu v percentach....

Celkovu cenu nakupu nemusis mat fyzicky ulozenu v tabulke ako to je v tvojom pripade. Vies ju vypocitat z poloziek v objednavke.

No a nakoniec:
Tie tabulky Pocitac a Notebook. Pokial mas XY druhov tovarov, tak kazdy tovar ma nejake spolocne atributy (tabulka Tovar) a nejake, ktore sa odlisuju. Tie sa spravidla riesia metadatovou tabulkou napriklad: TovarAtribut. Ta obsahuje pre kazdy tovar tolko riadkov, kolko atributov chces evidovat. Kazdy riadok obsahuje ID tovaru, nazov atributu a hodnotu atributu. Vies potom (ak je to nejaky e-shop) na zaklade tychto atributov neskor aj jednoducho filtrovat.

Je tam toho este kopec na vysvetlovacku (stavy objednavok, co ked na sklade tovar nebude, ciastocne vydanie objednavky, ....), ale na zaciatok by mohlo stacit.

Updaty se pisou v SQL jazyku databaze. Presny format zalezi na pouzite dadabazi, i kdyz nejaka norma ANSI SQL existuje a v zakladech je stejna.

Jak zjistis stav skladu pro konkretni polozku? Prikaz SELECT
Jak zmenis stav nejake polozky? Prikazy INSERT, UPDATE, DELETE.
Delas to na zkousku, tak projev aspon trosku snahy a zaklad tech prikazu se nauc.

Jak psal wam_Spider007, ten navrh databaze je v nejakych pripadech uplne nesmyslny. Treba vazba Sklad -> Zamestnanec -> Polozka
Co budes delat v pripade, kdy budes mit na skladu 2 zamestnance? To budes pro kazdeho na skladu zakladat zvlastni polozky?

Dalsi nesmysl jsou zvlastni tabulky pro kazde zbozi, navazane pres ID do tabulky zbozi. Jakym zpusobem budes zjistovat parametry dane polozky? Dotazem do nekolika tabulek, zda tam dane ID je? Kdyz budes mit 1000 polozek, budes mit 1000 tabulek a dotazovat 1000 dotazy nez najdes, kde to zbozi mas?
A jak budes resit pridani nove polozky? To bude obsluha vytvaret novou tabulku?

Nechci slovíčkařit, ale nemělo by místo slova "nejde" být "jde"? To by zcela měnilo smysl a podle mě by to pak bylo správně:

Ano, veta je vseobecna. Znamena triggerum se vyhybej, pokud to jde udelat jinak.
Pokud to jinak (jednoduseji) udelat nejde, pak ma jeho pouziti opodstatneni ;-)

Nic jsem neotočil... Jenom jsem upravil větu, aby dávala smysl.

Ta druhá věta je v pořádku, tam jsem nic neměnil:

Pokud to jinak (jednoduseji) udelat nejde, pak ma jeho pouziti opodstatneni

Ale první věta má mít význam takový, že se má triggerům vyhýbat, za předpokladu, že to jde udělat nějak jinak...

Zpět do poradny Odpovědět na původní otázku Nahoru