Diskuze: Access - sečtení dat dvou tabulek

Software Microsoft Office a kancelářské aplikace Access - sečtení dat dvou tabulek

Avatar
Filip Peterek:

Zdravím všechny,

předělávám otci jednu malou dtb v accessu pro evidenci oprav automobilu. Na zakázce jsou 2 typy evidovaných věcí a to práce a použité díly.

Ve formuláři si vybírá díly, které se zapisují do tbl DílyNaZakázce a dále pak provedenou práci, které se zapisují do tbl PráceNaZakazce.

Každá práce a díl má svou cenu. Dělám zvlášť součty pro použité díly na zakázce a práce. To mi funguje skvěle. Problém je, když chci sečíst práce a díly na zakázce dohromady. Pokud je u zakázky evidována jak práce tak díly, dotaz proběhne korektně a vše mi sečte jak má. Jenže, pokud je u zakázky evidovány jen práce, bez použití jakéhokoliv dílu(nebo naopak) dotaz nemá co sečíst, resp.má, ale chybí mu druhá hodnota, takže nevypočte nic.

Proto prosím o radu, jestli by mi někdo neporadil, jak vytvořit dotaz či sestavit funkci tak, aby

  1. když budou u zakázky evidovány jak díly, tak práce aby je sečetl a vyplivl součet
  2. když budou evidovány jen díly, tak aby zobrazil cenu za díly

3.když bude evidována jen práce, aby zobrazil tedy cenu součtu všech prací

Moc si netykám s VBA, ale pokud by mi někdo poradil co a jak, byl bych rád. Nejsem si jist, jestli jde taková funkce sestavit jako výraz v dotazu, nebo se to musí řešit přes VBA či makra.

 
Odpovědět 12.7.2015 19:45
Avatar
Odpovídá na Filip Peterek
Michal Štěpánek:

Napiš sem, dotaz, kterým to sčítáš. Já bych použil JOIN na tabulky při součtu v SQL dotazu...

Nahoru Odpovědět 13.7.2015 9:52
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Filip Peterek:

Děkuji za radu. Nakonec jsem tabulky spojil pomoci Left a Right Join a podmínkami ve výrazu jsem si zajistil, aby se mi vždy ukázala celková cena bez ohledu, jestli jsou použity díly/práce nebo každý zvlášť. Stačil mi jen ten join, zbytek jsem si už nějak dohledal na internetu

 
Nahoru Odpovědět 13.7.2015 18:23
Avatar
Filip Peterek:

Aha, tak jak to tak projíždím, tak to mám stejně blbě. JOIN funguje skvěle, až moc. Pokud vytvořím k zakázce 3 entity dílů a jednu entitu úkonů, tak mi to ke každému dílu přiřadí jeden a ten samý úkon, takže cena je v tomto případě 3* vyšší. Prostě mi to přiřadí ke každé entitě díly úkon, který už jednou přiřazen byl...

 
Nahoru Odpovědět 13.7.2015 18:59
Avatar
Filip Peterek:
SELECT *
FROM tblDílyNaZakázce LEFT JOIN tblÚkonyNaZakázce ON tblDílyNaZakázce.KódZakázky = tblÚkonyNaZakázce.KódZakázky;


UNION

Select *
FROM tblDílyNaZakázce right JOIN tblÚkonyNaZakázce ON tblDílyNaZakázce.[KódZakázky] = tblÚkonyNaZakázce.[KódZakázky];

Problém je v tom kódu zakázky, ten je pro všechny záznamy dílů i úkonů stejný, takže se u dané zakázky stále opakuje, proto ten JOIN může přiřadit jeden úkon k několika dílům a naopak. Chtělo by to nějak ošetřit, aby se mohlo opakovat číslo úkonu a dílu jen jednou pro danou zakázku. Protože na zakázce 2* stejný úkon/díl vybrat nemůžu, to mám ošetřeno, na to tam je počet kusů/hodin.

 
Nahoru Odpovědět 13.7.2015 19:10
Avatar
Filip Peterek:

Našel jsem si řešení, ale nevím jak jej do výše zmíněného napsat. Řešení bude asi DISTINCTROW pro unikátní kombinaci IDZakazky,IDDilu a IDUkonu

 
Nahoru Odpovědět 13.7.2015 20:07
Avatar
Odpovídá na Filip Peterek
Michal Štěpánek:

Kdybys dal "odpovědět", věděl bych už včera, že jsi reagoval...
Podle mě ti tam chybí jen nějaká podmínka, něco jako

where zakazka = něco

UNION bych tam vůbec nedával, podle mě je to zbytečný.
Děj sem někam strukturu těch tabulek a nějaký příklad toho, co chceš vytáhnout...

Nahoru Odpovědět 14.7.2015 7:42
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Filip Peterek:

http://i60.tinypic.com/2q9vwjn.jpg

takhle vypadají ty tabulky ve spojení se zakázkou. Z každé z tabulek si pomocí dotazu a výrazů umím spočítat cenu za díly a za úkony na zakázce. Ale jen každou zvlášť. Problém byl v sečtení celkové ceny. Když jsem na zakázce neměl použité díly, nemohl jsem nic sečíst. Snažil jsem se to řešit i podmínkami, ale pokud jsem dal do dotazu obě tabulky a jedna z nich byla prázdná, ani dotaz se nespustil a objevilo se jen bílé okno.

Proto jsem ty 2 tabulky chtěl pomocí left a roght spojit dohromady, abych mohl dotazy tvořit nad tímto.Problém je ta duplikace hodnot, že se snaží ke každému řádku docpat řádek z druhé tabulky, i za cenu duplikace. Podle internetu je to častá věc, ale netuším, jak se toho zbavit. Ani do jedné tabulky nemůžu dát k jedné zakázce dva stejné úkony/díly, ale join to naprosto ignoruje.

Cílem tedy je spojit jen ty 2 tabulky tak, že když budu mít 3 záznamy dílů a 1 úkonu, tak po spojení budu mít 1 řádek obsazen celý a 2 zbylé jen s dílem a část s úkony bude prázdná(momentálně to právě ten jeden úkon zkopíruje do všech neobsazených řádků)

 
Nahoru Odpovědět 14.7.2015 13:01
Avatar
Odpovídá na Filip Peterek
Michal Štěpánek:

Tabulky nevidím, normálně sem napiš strukturu tabulek

Nahoru Odpovědět 14.7.2015 13:04
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Filip Peterek:

Momentálně nemám projekt u sebe, jsem mimo domov, upnul to za mě bratr to bratr.

http://postimg.org/…e/l4dibk5b3/

 
Nahoru Odpovědět 14.7.2015 13:21
Avatar
Odpovídá na Filip Peterek
Michal Štěpánek:

Toto bych asi nespojoval, zbytečně si tím přitížíš. Počítal bych to jako dvě oddělené ceny a pak bych je sečetl, abych dostal celkovou sumu. Ty ceny bych však zahrnul do tabulky "tblZakázky", abych je nemusel při každém zobrazení znovu počítat... Přidal bych tam sloupce, něco jako "CenaPráce", "CenaPrácePoSlevě", "CenaDílů",
CenaDílůPo Slevě" a "CelkováCena" a pokud bych chtěl detaily, pak bych je zobrazil z příslušných tabulek.

Nahoru Odpovědět 14.7.2015 13:29
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Filip Peterek:

Tak jsem to nakonec částečně pořešil dle rady. Do tabulky Zakýzky jsem si přidal pole CenaDily a CenaUkony. Pomocí dotazů jsem si nad tabulkami spočítal celkové ceny za Díly a úkony a ty jsem pak překopíroval do těch polí v tabulce zakázky.

Problém stejně byl ty hodnoty tam přesunout. Jelikož jsme to dělal z dotazu, tak mi Access nechtěl povolit přidání hodnot do tabulky(na netu jsem se pak dočetl, že to nedovolí nikdy, pokud se jedná o nějaké pole, které se počítá)

Takže řešením bylo si vytvořit fiktivní tabulky, které obsahují hodnoty dotazů pro celkové sumy úkonů a dílů zakázek a následně přidávací dotaz pro překopírování hodnot z fiktivních tabulek. To jsem spojil do makra a pak pomocí VBA vypnul ty otravné upozornění u vytvářecích a přidávacích dotazů.

Celkově mi řešení příjde jako prasárna, která zbytečně zatěžuje systém jako takový, protože při každé změně vytváří a přepisuje hodnoty z fiktivních tabulek.

 
Nahoru Odpovědět 14.7.2015 20:15
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 12 zpráv z 12.