Jump to content
aty

MS Access - Kérdések és válaszok

Recommended Posts

heja1944

Elnézést, ha nagyon primitív a kérdésem, de nem sikerült megoldanom.

Milyen SQL utasítással érhetõ el a következõ cél? Egy tábla egyik oszlopa szerint csoportosítani kell, és a csoportokon belül egy másik oszlop értékének MAX-hoz tartozó rekord(ok) jelenjenek meg. Tehát kellenek a teljes rekordok, de csoportonként csak 1, ami a MAX feltételnek megfelel. A MAX helyett felmerülhet még pl. MIN, FIRST, LAST függvény hasonló felhasználása is is (ez utóbbi kettõ nyilván egyértelmû, de MAX és a MIN nem okvetlenül, de tegyük fel, hogy az adatok olyanok, hogy azok is egyértelmûek).

Elõre is köszönöm a segítséget.

Edited by KGigi

Share this post


Link to post
Share on other sites
KGigi

SELECT amivel csoportosítasz, max(amit csoportosítasz)

FROM ...

WHERE ...

GROUP BY amivel csoportosítasz;

 

De ezt simán meg lehet csinálni a lekérdezés tervező nézetével is. Az első megtalált maximális érték fog szerepelni. Oracle-nél meg lehet oldani, hogy az összes, de az Access mögött értelemszerűen Microsoft szerver van.

Share this post


Link to post
Share on other sites
heja1944

Kedves kGigi.

Köszönöm a gyors reagálást, de az a probléma, hogy a SELECT-ben fel kell sorolni a kigyűjteni kívánt oszlopokat, és nem fogad el pl

SELECT csopotositandó, MAX(vizsgálandó), egyéb1, egyéb2 ....

és persze a Tábla.* (tehát az összes oszlop) nem megy. Az a hibajelzés, hogy ezek a mezők nem szerepelnek összesítő fv részeként.

Még valami. Szintaktikailag helyes (bár nagyon erőszakoltnak látszik) a következő:

SELECT csoportosító, MAX(vizsgálandó),MAX(egyéb1),MAX(egyéb2),....

Ez lefut, de minden mezőre a csoport maximumát adja, amik nem okvetlenül azonos rekordból származnak.

Én pedig azt a rekordot keresem ami a csoportban csak a Vizsgálanó mező maximumához tartozik.

Mellesleg Access(2007)-ben próbálom.

Köszi a választ

Edited by heja1944

Share this post


Link to post
Share on other sites
KGigi

Persze. Hiszen ha csoportosítasz, akkor csak olyan értékek kerülhetnek utána melléje, amik az egész csoportra vonatkoznak. Átlag, maximum, minimum, stb. Ha meg akarod jeleníteni azokat az értékeket, amik a maximumhoz tartoznak, akkor ezeket a mezõket is be kell tenni, mint csoportosítani kívánt mezõk. Tehát a GROUP BY mögött az lesz, hogy csoportosítandó, egyéb1, egyéb2, ...

Share this post


Link to post
Share on other sites
heja1944

Köszönöm, valóban úgy működik, hogy a Group by-ba kell felsorolni.

Az zavar egy kicsit, hogy indokolatlannak tűnik a többi mezőt a Group-ban felsorolni mert azok többnyire egyediek és semmi szükségem a csoportosításukra. Vajon miért nem engedi a nyelv a mezők felsorolását a SELECT-ben? Ha a válasz az hogy CSAK, akkor ezt el kell fogadnom, de hátha van ésszerű magyarázat.

Kösz a választ.

 

Sajnos mégsem jó a megoldás, mert egy csoporthoz nem csak a MAX(vizsgálandó)-hoz tartozó rekordot gyűjti ki hanem a Group-ban felsorolt egyéb mezők értékeinek egyedisége miatt a csoport több rekordja is kigyűjtésre kerül (felteszem, hogy minden oszlop MAX-a szerint).

Edited by heja1944

Share this post


Link to post
Share on other sites
KGigi

Aha, jogos. Bocsánat, fáradt vagyok. Szerintem nincs jobb megoldás, mint ezt az egészet betenni a FROM listára, aztán megnézni, hogy ezek az értékek hová tartoznak. Pl. az én példaadatbázisomon ez így néz ki:

 

SELECT csop, maxfiz, nev
FROM dolgozo, (
     SELECT foglalkozas csop, max(fizetes) maxfiz 
     FROM dolgozo
     GROUP BY foglalkozas)
WHERE maxfiz = fizetes;

Ez kiírja, hogy az adott beosztásnál mekkora a legmagasabb fizetés, és ez kihez tartozik. Ha több embernek ugyanakkor a fizetése, akkor az a beosztás többször szerepel, más-más emberrel. Szerintem neked is ez kell.

Share this post


Link to post
Share on other sites
heja1944

Kedves KGigi!

Köszönöm a javaslatot és elnézést kérek, hogy fárasztó munka között zavartalak, de termésetesen nem várok azonnali gyors válaszokat. Azért kések a mostani reagálással mert a javaslatodat próbálgattam felhasználni, sajnos sikertelenül. Rájöttem, hogy ennek egyik oka, hogy én a problémámat nem elég precízen írtam le. Az általad vázolt feladat jellegzetes és fontos lesz nekem is de a mostani problémám ettõl kissé eltér, amit az alábbi kis példával mutatok be:

 

Tábla:Kezelések (ahol a Betegség az egyéb adatokat jelképezi)

 

BetegSorszám BeutalásSorszám Betegség

2 1 b

1 2 b

2 2 a

1 2 c

1 3 c

 

Az általam várt eredmény (Betegenként a MAX BeutalásSorszámokhoz tartozó sorok):

 

1 3 c

2 2 a

 

Erre természetesen nem alkalmas a te javaslatod, ezért az eredményt nem is közlöm itt, azonban az általad jelzett feladatra is kipróbáltam a következõ adatokkal:

 

Tábla: Dolgozo

Nev Foglalkozas Fizetes

1.1 1 1

1.2 1 3

1.3 1 2

2.1 2 4

2.2 2 2

3.1 3 3

 

 

Az általam várt eredmény:

Csop Maxfiz Nev

1 3 1.2

2 4 2.1

3 3 3.1

 

 

Az Accessben kapott eredmény:

1 3 3.1

1 3 1.2

2 4 2.1

3 3 3.1

3 3 1.2

 

Ezt nem tudom értelmezni. Talán hibáztam valahol, az általam beírt SQL az access szintakszis szerint némileg átírva az AS miatt:

 

SELECT csop, maxfiz, nev

FROM dolgozo, (

SELECT foglalkozas AS csop, max(fizetes) AS maxfiz

FROM dolgozo

GROUP BY foglalkozas)

WHERE maxfiz = fizetes;

 

Eddigi segítségesedet is köszönve. Üdv

Share this post


Link to post
Share on other sites
KGigi

A WHERE-be még tedd be azt is, hogy AND csop = foglalkozas. Csak ez azonosítja egyértelműen az adott embereket.

 

A hiba oka az, hogy amit írtam, az képzi a csoportokat a foglalkozás szerint, és kigyűjti hozzájuk a maximális fizetést. Ezután pedig megkeresi, hogy az eredeti táblában kiknek volt ez a fizetése, és ezeket a hozzá tartozó csoporttal együtt kiírja. Most ugrik a majom a vízbe. Elfelejtettem, hogy két ember fizetése lehet azonos. Így az eredménybe azok is bekerülnek, akiknek ugyanannyi a fizetésük, mint azoknak, akiket valóban ki akarunk gyűjteni. A megoldás az, hogy az eredményt még az alapján is meg kell szűrni, hogy az adott csoporton belül egyezzen meg a fizetés, mert azon belül már vagy egyedi lesz, vagy az összes ilyet ki akarjuk írni. Elnézést, nem volt jó a rögtönzött példatáblám, és nem bukott ki nálam a hiba, amikor kipróbáltam.

 

Helyesen tehát:

 

SELECT csop, maxfiz, nev
FROM dolgozo, (
     SELECT foglalkozas AS csop, max(fizetes) AS maxfiz 
     FROM dolgozo
     GROUP BY foglalkozas)
WHERE maxfiz = fizetes AND csop = foglalkozas;

Share this post


Link to post
Share on other sites
heja1944

Tökéletesnek látszik az én esetemre is. Köszönöm.

Share this post


Link to post
Share on other sites
Fujitsu

Őszintén szólva nagyjából ezer évvel ezelőtt foglalkoztam utoljára adatbázisokkal, úgyhogy lehet, hogy hülyeség, amit most kérdezni fogok, de egyszerűen nem találok megoldásra, pedig már ömlik a liquor az agyamból.

Szóval a helyzet a következő. Van egy adatbázis, benne egy lekérdezés (group by-jal összesítve), eredménye 7 db rekord. Van egy másik lekérdezés is, hasonló az elsőhöz, de itt két tábla is van, meg kapcsolat is (ez is group by-jal összesítve). Ennek az eredménye 2 db rekord. (Ez a 2 rekord megtalálható az első lekérdezés eredményei között is.)

Hogyan tudnék készíteni egy harmadik lekérdezést, ami felsorolja az első lekérdezés eredményeként kapott rekordokat a második lekérdezés eredményeként kapott két rekord kivételével? Tehát eredményként 5 rekordot kéne kapnom. Bármit próbáltam eddig, nem volt jó. Vagy nem jelent meg semmi a kimeneten, vagy teljes baromságokat kaptam eredményül. :S

Share this post


Link to post
Share on other sites
arpsoft

Nem tudom, hogy az Access kápes-e erre, de az SQL-ben létezik a NOT IN záradék:

 

select mezok from elso_lekerdezes where kulcsmezo not in (select kulcsmezo from masik_lekerdezes)

Share this post


Link to post
Share on other sites
Fujitsu

Tökéletes megoldás, pontosan erre volt szükségem! Köszönöm! :istenvagy: Sõt, ezzel most sikerült megoldani, hogy a 3 lekérdezés helyett csak 1 kelljen. :éljen:

Share this post


Link to post
Share on other sites
BBajnok58

Sziasztok!

A következő probléma megoldásában kérem hozzáértők segítségét.

Három táblából álló (OSZTÁLYOK, TANÁROK, TANTÁRGYAK) megosztott adatbázisomban űrlapot készítettem, ahol legördülő listából lehet kiválasztani az osztályt, tanárt, tantárgyat, majd az űrlapon lévő kérdésekre adott válaszokat bejelölni. Ez így működik, de mivel a legördülő listában mindig minden tanár és tantárgy megjelenik, sok a tévesztési lehetőség a kiválasztásnál.

Azt szeretném, ha:

1. – mindaddig, amíg a tanuló dolgozik az űrlapon, ne kelljen újra bejelölni az osztályát, az automatikusan kerüljön be a következő rekordba, csak a kilépéskor törlődjön,

2. – ha kiválasztotta az osztályát, akkor a TANÁROK legördülőben csak azok a tanárok jelenjenek meg , akik tanítják azt az osztályt, illetve azokat a tantárgyakat lehessen csak kiválasztani, amelyeket a kiválasztott tanár tanít,

3. – mivel megosztott adatbázissal dolgozunk (egyszerre akár 30-an is), egy új megnyitáskor a legutóbb mentett rekord adatai jelennek meg. Szeretném, ha üres rekorddal lehetne indítani, de ez mindeddig nem sikerült.

Remélem elég érthetően írtam le a gondokat, várom a hozzáértők segítségét, ha lehet „szájbarágósan”, mert nem vagyok nagy guru.

Előre is köszönöm mindenkinek.

Üdv.

 

Már van Access téma! Összevontam. <KGigi>

Share this post


Link to post
Share on other sites
heja1944

Segítségre van szükségem!

 

Vista (32bit) alatt Access 2007 programot írtam. Ennnek egy táblázatos jelentésében a mezõkre feltételes formázástokat alkalmaztam, hogy bizonyos elemek más háttérszínnel jelenjenek meg. Ez tökéletesen mûködik is, de amikor a programot átvittem Win7 (starter és prof) alá akkor a jelentés nyomtatási képében és a nyomtatásban is üres helyek vannak ezen mezõk helyén. A dologban külön furcsa, hogy a mezõk bekerettezetten vannak a tervezõ nézetben és a nyomtatási képben ezek a keretek se látszanak. Maga a jelentés "jelentés" nézetben rendben lévõnek látszik. Természetesen ez az információ túl kevés lehet, de egylõre nem tudom mit kéne még hozzáfûzni.

 

Nagyon megköszönöm, ha valakinek használható ötlete van a magyarázatra vagy a megoldásra.

heja

Share this post


Link to post
Share on other sites
mizsi

Sziasztzok!

Egy kis segítségre lenne szükségem! Adott egy ûrlap, melyen egy kombipanel látható. A panel adatait egy táblából veszem ki. Kérdésem: megoldható-e, hogy a kombipanel "Engedélyezve" állapota csak akkor legyen Igen, ha új rekordot rögzítek a táblába az ûrlapon? Azaz, egy már rögzített rekord esetén a kombipanel ne legyen engedélyezett, új rekord felvitele esetén igen.

Köszönöm a válaszokat!

 

Share this post


Link to post
Share on other sites
arpsoft

Ûrlap beforeinsert és afterinsert eseménye nem jó? A beforeinsert akkor fut le, amikor elkezdene felvenni egy új adasort. Alapesetben legyen tiltott a panel, és csak a beforeinsert-ben állítsad engedélyezettre,majd az afterinsert-ben megint letiltod.

Share this post


Link to post
Share on other sites
mizsi

Megpróbáltam azt, hogy a kombinált lista alapból ne legyen látható, de a

Private Sub Form_BeforeInsert(Cancel As Integer)
[KombináltLista20].[Visible] = True
End Sub

Private Sub Form_AfterInsert(Cancel As Integer)
[KombináltLista20].[Visible] = False
End Sub

nem megy, abszolúte nem látható a kombilista.

Share this post


Link to post
Share on other sites
mizsi

Közben megoldottam, egyszerûbben, mint hittem:

alapból beállítottam, hogy a [KombináltLista20].[Enabled] = False, az új rekord rögzítésre gombra [KombináltLista20].[Visible] = True, majd az adatok beviteln után újra False.

Share this post


Link to post
Share on other sites
arpsoft

Mondjuk mondhattad volna, hogy külön gomb van az új rekordra. :P

Share this post


Link to post
Share on other sites
mizsi

:D

Azért köszi, a gondolatmenet jó volt.

Share this post


Link to post
Share on other sites
mizsi

Sziasztok!

Lenne egy trivális kérdésem: hogy tudom megoldani, hogy egy lekérdezésnél csak a folyó havi adatok jelenjenek meg (tehát júniusban csak a júniusi, júliusban csak a júliusi és így tovább...)? (van Dátum mezõ). Egyszerûen nem találok rá megoldást...

Share this post


Link to post
Share on other sites
arpsoft

where ... and month(datummezo)=month(date()) and year(datummezo)=year(date()) ...

vagy

where ... and year(datummezo)*100+month(datummezo)=year(date())*100+month(date()) ...

Share this post


Link to post
Share on other sites
mizsi
:istenvagy:

Share this post


Link to post
Share on other sites
TheSaurida

Van egy problémám, hátha tud valaki segíteni.

Készítettem egy leltáradatbázist az iskola IT-eszközeiről (100+ gép, nyomtatók, stb.). A nyomtatóknál van egy olyan mező, hogy utolsó csere időpontja (tonerenként persze), meg egy "Ma" nevű nyomógomb az űrlapon. ha cserélem a tonert, rákattintok a gombra, és beírja a dátumot, eddig jó. Felvettem viszont egy újabb mezőt (tonerenként), miszerint "Előző csere". A nyomógombhoz szeretném hozzárendelni azt, hogy előbb az utolsó csere időpontját átmásolja az előző cserébe, aztán az utolsó cserébe beírja a mai dátumot. Ez a bonyolult kód így nézne ki:

Private Sub Parancsgomb39_Click()

ElőzőSCsere.Value = SárgaCsere.Value

SárgaCsere.Value = Now()

End Sub

És erre kapok egy Runtime Error '424'-et. (Object required). valaki?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...