Avatar billede pdom Nybegynder
27. april 2005 - 16:14 Der er 28 kommentarer og
2 løsninger

Finde sidste post vha. forespørgsel

Hej!

Jeg har en medlemsDB: En tabel (Tabel1) med: MedlemsID, navn, adr., osv. og en tabel (Betaling) med: MedlemsID, periode, Girokortnr.
En Hovedformular (baseret på Tabel1) til indtastning af medlemsoplysninger, og en underformular (baseret på Betaling).
I underformularen kan der selvfølgelig være flere poster pr. Medlem.
Jeg skal nu bruge en forespørgsel, der finder den sidste post i Betaling for hvert medlem. Forespørgslen kan jeg godt lave, det er kriterierne for søgningen jeg er i tvivl om.
Kan løsningen være en "manuel" tæller (autonummerering virker ikke, det har jeg prøvet), hvor jeg selv skriver betalingnr 1, 2, 3 osv.?
Resulatatet af forespørgslen skal bruges til en brevfletning med Word til at udskrive girokort.

Håber nogen kan hjælpe.

MVH
Peter
Avatar billede mugs Novice
27. april 2005 - 16:41 #1
Du kan oprette et felt af typen Dato/klokkeslet i tabellen og sætte det til Now() i standardværdi for nye poster. Herefter kan du bruge en DMax der finder seneste post.
Avatar billede terry Ekspert
27. april 2005 - 18:13 #2
...(tæller (autonummerering virker ikke, det har jeg prøvet)? what is the problem using an autonumber? If the records are created in the correct order then this would be perfect for the job

SELECT TOP 1 * FROM Betaling WHERE MedlemsID = 1234 ORDER BY ID DESC
Avatar billede pdom Nybegynder
27. april 2005 - 21:27 #3
terry > JEg har set at alle andre svarer på dansk til dig - så det gør jeg også!!

Jeg har allerede oprettet 1 post i Betaling for hvert medlem. Da jeg satte et autonummereringsfelt på tabellen, satte den numrene fra 1 til ca. 50 = 1 for hvert medlem.
Men den skal kun tælle 1 for hver post i Betaling for hvert medlem!
Håber jeg har forklaret det ordentligt?

mugs > Jeg vil prøve dit forslag, men har desværre ikke tid i aften - så jeg vender tilbage.

MVH
Peter
Avatar billede terry Ekspert
27. april 2005 - 22:00 #4
Hi pdom> I understand danish almost perfect, hope youdont mind me answering in English?

Maybe I haven't quite understood the problem! Using an Autonumber will help find the last record

SELECT Betaling.*
FROM Betaling
WHERE (((Betaling.ID)=(select Max(ID) FROM Betaling B WHERE B.MedlemsID = Betaling.MedlemsID)));
Avatar billede pdom Nybegynder
28. april 2005 - 06:57 #5
Hej Terry!

Det er muligt den kan bruges. Jeg har endnu ikke prøvet den.
Men lige et spørgsmål:
Hvis jeg sidder en dag og indtaster nye betalingsoplysninger for 10 medlemmer, og den sidste jeg indtaster er medlemsID nr. 29, så vil jeg kun få oplysninger for nr. 29, ikke??? Men jeg skal bruge for ALLE 10!
"Betaling B WHERE B.MedlemsID": Hvad er "B"?? Jeg er ikke så stiv i SQL ;-)

Jeg indser pludselig noget: Hvis jeg bruger autonummerering, så vil den nye post i betaling altid blive det højeste nummer for hvert medlemsID, selvfølgelig!! (DUH)

MVH Peter (Som skal på arbejde nu, øv)
Avatar billede terry Ekspert
28. april 2005 - 09:05 #6
The SQL I gave will give you ONE record (the newest) for each Medlem, in other words 10 records.
Avatar billede pdom Nybegynder
28. april 2005 - 16:43 #7
Ok terry jeg vil prøve din SQL i aften.

1 sidste spørgsmål: Hele sætningen sættes ind i kriteriefeltet i min forespørgsel, ikke?
SELECT Betaling.*
FROM Betaling
WHERE (((Betaling.ID)=(select Max(ID) FROM Betaling B WHERE B.MedlemsID = Betaling.MedlemsID)));
I sætningen skriver du: "FROM Betaling B"! Hvad er "B". Det forstår jeg ikke!
MVH Peter
Avatar billede terry Ekspert
28. april 2005 - 19:11 #8
this is ONLY an example, it all depends on the table field names!

Sorry, forgort to answer your question "Hvad er "B"??

B is just an alias for table Betaling, it could as well have been X or Y
Avatar billede pdom Nybegynder
28. april 2005 - 19:14 #9
Hej Terry!

Nu har jeg prøvet din sql, og jeg kan ikke få den til at virke!
Du får lige navnene på de væsentlige felter i de 2 tabeller:

Tabel1: MedlemID (med relation til Betaling), Navn, Adresse, osv.
Betaling: MedlemID (med relation til Tabel1), Medlemskabsdato, Medlemindtil, GKnr, Taeller (mit nye autonummereringsfelt).
Efter lidt tilretninger ser din sql-sætning sådan ud. Jeg har sat den som Kriterie i forespørgslen under feltet Taeller:
=(SELECT Betaling.* FROM Betaling WHERE (((Betaling.Taeller)=(select Max(Taeller) FROM Betaling B WHERE B.MedlemID = Betaling.MedlemID))))

Men den giver en fejl:
"Du har skrevet en underforespørgsel, der kan returnere mere end ét felt uden at bruge det reserverede ord EXISTS i hovedforespørgslens FROM-delsætning. Ret SELECT-sætningen i underforespørgslen, så den kun kræver et felt." Jeg kan vælge Ok eller Hjælp (og hjælp giver ingenting).

Kan du hjælpe??
MVH Peter
Avatar billede mugs Novice
28. april 2005 - 19:19 #10
Terry's SQL er ikke noget kriterie. Det er selve forespørgslen's SQL. Kopier sætningen og åbn en ny forespørgsel i designvisning og laf være at kalde tabeller ind i den. Vis > SQL og her paster du terry's SQL.

Der er "indbygget" et kriterie i terry's SQL:

...WHERE (((Betaling.Taeller)=(select Max(Taeller) FROM Betaling B WHERE B.MedlemID = Betaling.MedlemID))))

hvor Where delen er kriteriet.
Avatar billede pdom Nybegynder
28. april 2005 - 19:29 #11
Hej mugs og terry!

Nu ser den sådan ud:
SELECT Betaling.*
FROM Betaling
WHERE (((Betaling.Taeller)=(select Max(Taeller) FROM Betaling WHERE Betaling.MedlemID = Betaling.MedlemID)))

Men den giver kun 1 post, nemlig den sidst indtastede.

Hvad går der galt?
MVH Peter
Avatar billede terry Ekspert
28. april 2005 - 19:36 #12
can you send me you your databse so I can take a look?

eksperten@NOSPAMsanthell.dk
remove NOSPAM
Avatar billede terry Ekspert
28. april 2005 - 19:41 #13
from the example I have made
ID    MedlemsID
1    1234
2    4567
3    1234
4    1234

using this SQL
SELECT Betaling.*
FROM Betaling
WHERE (((Betaling.ID)=(select Max(ID) FROM Betaling B WHERE B.MedlemsID = Betaling.MedlemsID)));


I get this
ID    MedlemsID
2    4567
4    1234
Avatar billede terry Ekspert
28. april 2005 - 19:44 #14
Ah!

SELECT Betaling.*
FROM Betaling
WHERE (((Betaling.Taeller)=(select Max(Taeller) FROM Betaling B WHERE B.MedlemID = Betaling.MedlemID)))
Avatar billede terry Ekspert
28. april 2005 - 19:44 #15
you MUST use an alias (B)
Avatar billede terry Ekspert
28. april 2005 - 19:49 #16
the table in SUB select has to have an alias (B in this example) so that its possible to compare the data in the record of the table MAIN select Betaling

otherwise your comparing the ID (Taeller) of the main table with itself
Avatar billede pdom Nybegynder
28. april 2005 - 20:09 #17
NU ser det ud til at fungere! ;-D
SELECT Betaling.*
FROM Betaling
WHERE (((Betaling.Taeller)=(select Max(Taeller) FROM Betaling B WHERE B.MedlemID = Betaling.MedlemID)));
Hvis jeg så vil sætte endnu et kriterie ind, som f.eks. (Betaling.Medlemskabsdato)=("01-04-05"), hvordan gør man så?
Denne: ....WHERE B.MedlemID = Betaling.MedlemID)) AND (Betaling.Medlemskabsdato)=("01-04-05")); Virker ikke! Men det er nok ikke AND man skal bruge?

Som sagt: jeg er ikke så stiv i sql (endnu)!
Avatar billede pdom Nybegynder
28. april 2005 - 20:16 #18
Got it!

SELECT Betaling.*
FROM Betaling
WHERE (((Betaling.Taeller)=(select Max(Taeller) FROM Betaling B WHERE B.MedlemID = Betaling.MedlemID)) AND ([Betaling]![Medlemskabsdato]=#4/1/2005#));

MVH Peter
Avatar billede terry Ekspert
28. april 2005 - 20:20 #19
great :o)
Avatar billede pdom Nybegynder
28. april 2005 - 20:28 #20
Takker mange gange for hjælpen, og lukker denne!

(Og åbner snart en ny ;-)
Avatar billede pdom Nybegynder
28. april 2005 - 20:52 #21
Jeg ville gerne give points, men de ser ikke ud til at gå ind!?
Avatar billede mugs Novice
28. april 2005 - 20:55 #22
Du skal markere een eller flere brugere i den lille boks med listren over brugere der har svaret og derefter trykke på accepter.
Avatar billede pdom Nybegynder
28. april 2005 - 20:57 #23
Det har jeg gjort, men der sker tilsyneladende ikke noget.
Jeg kan ikke se, at der bliver trukket nogle points på min konto!
Avatar billede mugs Novice
28. april 2005 - 20:59 #24
Prøv senere eller imorgen, eksperten er ikke kendt for sin stabilitet.
Avatar billede pdom Nybegynder
28. april 2005 - 21:01 #25
OK ;-)
Avatar billede terry Ekspert
29. april 2005 - 17:37 #26
thanks and good weekend to all
Avatar billede mugs Novice
29. april 2005 - 17:39 #27
Tak for point, omend jeg nok føler terry burde have haft alle.
Også god weekend herfra.
Avatar billede pdom Nybegynder
29. april 2005 - 17:59 #28
mugs > jamen du har da også hjulpet til ;-)

Og jeg er helt ny med det her point-system. Så jeg ved ikke helt hvordan det var rimeligt at fordele pointene.

God weekend!
Avatar billede mugs Novice
29. april 2005 - 18:04 #29
Ja - Jeg har hjulpet, men mener ikke at mit svar bidrog til den endelige løsning. Det er altid en følelsessag om man vil give point til en bruger, der har leveret "sekundære" forslag. Det har du valgt i dette tilfælde, og det er helt fint. Men vi er ikke alle af den opfattelse. Men når du synes det er rimeligt, så er det OK, for det er spørgeren der suverænt bestemmer hvordan poinrfordelingen skal være.

Jeg kan se, at du er ny bruger her på eksperten og dette er dit første spørgsmål. Velkommen til - Vi "tales" nok ved en anden gang.
Avatar billede terry Ekspert
29. april 2005 - 18:04 #30
I dont think I am going to miss 5 points mugs, but hanks for the kind thought :o)
and when it comes down to it, it is actuallly up to the person placing the question who decides who gets. So I'm happy as long as you dont feel to bad about it :o)

once again good weekend, now I'm off for some food and drink (wine)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester