27. april 2005 - 16:14Der 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.
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.
...(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
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.
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)
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
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).
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))))
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.
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
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?
SELECT Betaling.* FROM Betaling WHERE (((Betaling.Taeller)=(select Max(Taeller) FROM Betaling B WHERE B.MedlemID = Betaling.MedlemID)) AND ([Betaling]![Medlemskabsdato]=#4/1/2005#));
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.
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)
Synes godt om
Ny brugerNybegynder
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.