[Access] Verwijderquery maken

Pagina: 1
Acties:
  • 690 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 92703

Topicstarter
Hallo,

Ik ben voor school bezig met Access, er is een database gemaakt met 4 tabellen, "Bestemming", "Boeking", "Klant" en "Reis". (Deze database hoort overigens bij het lesboek) Nu moet ik een verwijderquery maken die klanten verwijderd die geen enkele boeking hebben gedaan.

Dit betekent dat er klanten in de tabel "Klant" staan, die niet voor komen in de tabel "Boeking", dit is te zien aan het klantnummer. (Ik hoop dat je het kunt volgen...)

De helpfunctie van Access geeft alleen aanwijzingen om zaken uit één tabel te verwijderen en mijn lesboek legt alleen uit dat het mogelijk is om in de ene tabel wat op te zoeken en in de andere tabel te verwijderen, maar niet hoe.

Ik hoop dat iemand een idee heeft van wat ik bedoel en mij verder kan helpen. Alvast dank.

P.S. De search hier leverde ook niets op.

[ Voor 8% gewijzigd door Anoniem: 92703 op 09-02-2004 13:51 ]


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je weet hoe je een "Verwijder query" moet maken?

Ik zou eerst een select query maken, waarbij je de te verwijderen klanten krijgt. Vervolgens maak je er een verwijder query van.

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

Anoniem: 34497

JE kunt wel een gewone Query maken om deze mensren boven water te krijgen? Zo niet dan zou ik nog maar wat gaan studeren, want dat is basiskennis
Als je de gewone query hebt en hebt gecontroleerd ! dan verander je die in een verwijderquery. Ofwel in de ontwerpweergave je rechtermuisknop gebruiken en dan bij querytype voor verwijderquery kiezen.

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 08:46

lier

MikroTik nerd

SELECT * vervangen door DELETE in de query...

Eerst het probleem, dan de oplossing


Acties:
  • 0 Henk 'm!

Anoniem: 92703

Topicstarter
Ik heb nu inderdaad een selectiequery gemaakt, door als criterium op te geven "Is Null" en dan krijg ik precies twee personen te zien die niet geboekt hebben. Dat gaat dus wel goed, maar als ik er dan vervolgens een verwijderquery van maak en deze wil uitvoeren, dan zegt Access dat hij niet kan verwijderen uit de tabel Klant.

Het enige dat ik kon bedenken was dat het aan de Join-eigenscahppen misschien lag, maar dit wijzigen helpt niet.

Wat gaat er nog fout??

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 10:36

Dido

heforshe

Wat is je selectiequery?

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Anoniem: 92703

Topicstarter
Uit de tabel "Boeking" kies ik "Klantnummer" en deze geef ik als criterium dus "Is Null". Verder heb ik de complete tabel "Klant" erbij gezet, dit omdat ik alle gegevens van de kalnt uiteindelijk moet verwijderen.

Screenshot:

Afbeeldingslocatie: http://home.planet.nl/~bonen021/Access.jpg

Als ik dit dus vervolgens wijzig naar een verwijderquery, dan snapt Access het niet zo goed meer. (Misschien ik dus wel 8)7 )

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 10:36

Dido

heforshe

Je moet boeking.klantnummer iig niet weergevben, want dan probeert ie die weg te halen :) En dat kan niet, want die is null :)

offtopic:
Dit soort dingen is veel eenvoudiger als je sql gebruikt, wat ok in access kan. Maar dat is geen optie, ben ik bang :)


Ik heb even een testdb-tje gemaakt volgens hetzelfde datmodel, en ik krijg niet het juiste resultaat uit bovenstaande query.
De SQL wordt:
code:
1
2
3
SELECT Boeking.klantnummer, Klant.*
  FROM Klant INNER JOIN Boeking ON Klant.klantnummer = Boeking.klantnummer
 WHERE (((Boeking.klantnummer) Is Null));

En daarvan is het resultaat leeg.
Met een LEFT JOIN werkt ie wel :)
In "design view" verandert er dan niets.

Als jouw query werkt, heb je een vriendelijke wizard :)

Gewoon veranderen in een delete-query geeft nog steeds
code:
1
2
3
DELETE Klant.*, Boeking.klantnummer
FROM Klant LEFT JOIN Boeking ON Klant.klantnummer = Boeking.klantnummer
WHERE (((Boeking.klantnummer) Is Null));

Dus daar moet Boeking.klantnummer nog weer weg, maar hij blijft hem terugzetten.

Als ik de selectquery verander door klant.* en klant.klantnummer te selecteren, met een criterium op die laatste, lukt het wel. Dat criterium is dan een NOT ( IN ( Select .... ))

[ Voor 66% gewijzigd door Dido op 09-02-2004 15:08 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Anoniem: 92703

Topicstarter
Het maakt niks uit als je boeking.klantnummer niet laat wergeven, zodra je er een verwijderquery van maakt, heb je die keus ook niet:

Afbeeldingslocatie: http://home.planet.nl/~bonen021/Access2.jpg

Erg vervelend dat ik er niet uit kan komen, ben gewoon al 2 uur aan het prutsen met dit rotding :(

Anders vraag ik het gewoon op school, misschien dat die slimme |:( leraren van mij het weten.

Mischien moet ik er wel bij vermelden dat er nog twee tabellen zijn die ook een relatie hebben. Er is een tabel Bestemming die via "Bestemmingscode" een relatie heeft met tabel reis. Tabel reis heeft een relatie met tabel Boeking via "Reisnummer" Op zich zou dat verder niks uit moeten maken, maar ik volg er echt niks meer van.

offtopic:
Nee, SQL is geen optie, want dit zijn allemaal bestaande databases die bij het lesboek horen, maar goed, ik zal eerst dit maar eens gaan snappen voordat ik SQL ga proberen te begrijpen 8)7

[ Voor 22% gewijzigd door Anoniem: 92703 op 09-02-2004 15:14 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 30-04 22:14
Zo kun je de klanten met nul boekingen selecten:
code:
1
2
3
4
5
6
7
8
9
10
11
select 
  count(b.boekingnummer) as aantal, 
  klantnaam 
from 
  klant k 
left outer join 
  boeking b on b.klantnummer = k.klantnummer 
where 
  aantal = 0 
group by 
  b.boekingnummer;

Maar als ik een delete wil maken:
code:
1
2
3
4
5
6
7
8
delete from 
  klant k 
left outer join 
  boeking b on b.klantnummer = k.klantnummer
where 
  count(b.boekingnummer) = 0 
group by 
  b.boekingnummer;

Krijg ik een syntax error?

[ Voor 11% gewijzigd door Skaah op 09-02-2004 15:10 ]


Acties:
  • 0 Henk 'm!

Anoniem: 63989

Anoniem: 92703 schreef op 09 februari 2004 @ 15:05:
Het maakt niks uit als je boeking.klantnummer niet laat wergeven, zodra je er een verwijderquery van maakt, heb je die keus ook niet:

[afbeelding]

Erg vervelend dat ik er niet uit kan komen, ben gewoon al 2 uur aan het prutsen met dit rotding :(

Anders vraag ik het gewoon op school, misschien dat die slimme |:( leraren van mij het weten.

offtopic:
Nee, SQL is geen optie, want dit zijn allemaal bestaande databases die bij het lesboek horen, maar goed, ik zal eerst dit maar eens gaan snappen voordat ik SQL ga proberen te begrijpen 8)7
Moet goed zijn zo. Misschien dat je de gegevenstypen van je tabel eens na moet kijken. (met name klantnummer)

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 10:36

Dido

heforshe

Jeroen: zie mijn edit. Ik gebruik in het criterium wel sql, ik weet niet of er een manier voor is om het zonder te doen. Je wilt als criterium op klant.klantnummer dus hebben dat ie niet voorkomt in de klantnummers uit boeking.

Skaah: Ten eerste gaat het niet over mysql, de ts wil geen sql gebruiken.
Ten tweede helpt het als je eens kijkt naar de sybtax van het delete statement. Dat mag je zelf opzoeken, want daar ging de topic niet over ;)

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 30-04 22:14
Skaah schreef op 09 februari 2004 @ 15:07:
Zo kun je de klanten met nul boekingen selecten:
code:
1
2
3
4
5
6
7
8
9
10
11
select 
  count(b.boekingnummer) as aantal, 
  klantnaam 
from 
  klant k 
left outer join 
  boeking b on b.klantnummer = k.klantnummer 
where 
  aantal = 0 
group by 
  b.boekingnummer;

Maar als ik een delete wil maken:
code:
1
2
3
4
5
6
7
8
delete from 
  klant k 
left outer join 
  boeking b on b.klantnummer = k.klantnummer
where 
  count(b.boekingnummer) = 0 
group by 
  b.boekingnummer;

Krijg ik een syntax error?
Edit:
Volgens Dido zou het zo moeten zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
delete from 
  klant k 
where
 not in
    (
    select 
      count(b.boekingnummer) as aantal, 
      klantnaam 
    from 
      klant k 
    left outer join 
      boeking b on b.klantnummer = k.klantnummer 
    where 
      aantal != 0 
    group by 
      b.boekingnummer
    )

Volledig offtopic: werkt niet in MySQL 3.x dus heb ik niet getest

/* Skaah slapt zichzelf voor moeilijk doen. Respect Dido! _/-\o_

[ Voor 8% gewijzigd door Skaah op 09-02-2004 15:22 ]


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 10:36

Dido

heforshe

Anoniem: 63989 schreef op 09 februari 2004 @ 15:11:
[...]


Moet goed zijn zo. Misschien dat je de gegevenstypen van je tabel eens na moet kijken. (met name klantnummer)
Als je kijkt naar wat acces er voor sql van maakt, dan zie je dat ie probeert boeking.klantnummer te verwijderen. Dat gaat niet.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Hoppie
  • Registratie: Februari 2001
  • Niet online
Anoniem: 92703 schreef op 09 februari 2004 @ 15:05:
offtopic:
Nee, SQL is geen optie, want dit zijn allemaal bestaande databases die bij het lesboek horen, maar goed, ik zal eerst dit maar eens gaan snappen voordat ik SQL ga proberen te begrijpen 8)7
Ook in bestaande (ACCESS) databases kun je gewoon SQL gebruiken!
Open de query in design view. Klik vervolgens met de rechter muisknop op de titelbalk en kies "SQL-view".
Probeer vervolgens de voorbeelden die hierboven zijn getoond maar 's.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 10:36

Dido

heforshe

Skaah schreef op 09 februari 2004 @ 15:13:
Edit:
Volgens Dido zou het zo moeten zijn:
Nee. Volgens mij moet je, als je toch SQL gebruikt, eerst eens kijken naar de syntax van je DELETE :) Jij geeft niet aan wat je wilt deleten, dus werkt het nergens (hoop ik!).

Verder is je constructie met count() erg omslachtig.

Een correcte verwijderquery ziet er bijvoorbeeld zo uit:
code:
1
2
3
DELETE *
  FROM Klant
 WHERE Klantnummer NOT IN (SELECT Klantnummer FROM Boeking);


Hoe je acces zover krijgt dat ie via "design view" (een irritante wizard!) die sql aanmaakt zonder sql in het selectiecriterium te gebruiken is me een raadsel.

Je zou een selectiequery kunnen maken van alle klantnummers in Boeking, en vervolgens je sql verdoezelen door in de verwijderquery te gebruiken (op klant.klantnummer) NOT IN Query2 (hoewel ik niet weet of dat werkt :) )

[ Voor 3% gewijzigd door Dido op 09-02-2004 15:21 ]

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

Anoniem: 92703

Topicstarter
Ok, dat laatste wist ik niet.

@ Dido: Ik snap wel wat je bedoelt, maar hij blijft dan met dezelfde foutmelding komen, dat Access dus geen gegevens kan verwijderen uit de opgegeven tabel. Ik ga het gewoon navragen, maar de kans igroot dat ze het zelf niet weten, want dat heb ik in twee lessen al drie keer gehad. En dan komt het antwoordenboek met een schitterende oplossing die niet eens geeft wat er volgens het boek uit moet komen. Het is werkelijk een fantastische lesmethode |:(

Maar wel erg bedankt voor de hulp allemaal. _/-\o_

Acties:
  • 0 Henk 'm!

  • RMRJ
  • Registratie: Februari 2004
  • Laatst online: 28-11-2024
Heb je in het scherm 'Relaties' bij de betreffende relatie (met rechter muisknop op drukken) wel de juiste veldjes aan gevinkt, zoals bv 'gerelateerde records trapsgewijs verwijderen'

Acties:
  • 0 Henk 'm!

Anoniem: 92703

Topicstarter
Zover mijn kennis gaat zal dat goed zijn. Ik heb het in ieder geval op alle mogelijke manieren uitgeprobeerd. Geen enkele manier werkt.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 10:36

Dido

heforshe

De enige tabel waaruit acces niet kan verwijderen is de tabel boeking. De kunst is dus om in je query de tabel boeking helemaal niet te gebruiken ;)

Je gebruikt hem slecht als selectiecriterium.

Kijk voor de aardigheid eens wat acces ervan maakt in sql. Het bijt niet, kijken kan geen kwaad, en het is alleen maar leerzaam. SQL is niets anders dan een heel eenvoudig taaltje waarmee je een programma vertelt dat ie iets met een database moet doen.

[ Voor 40% gewijzigd door Dido op 09-02-2004 15:35 ]

Wat betekent mijn avatar?

Pagina: 1