Verwijder query

Status
Niet open voor verdere reacties.

Sytse1

Gebruiker
Lid geworden
9 aug 2007
Berichten
584
Office versie
miDer
Beste experts,

Volgens mij maak ik een eenvoudige verwijder query maar de query doet niet wat hij moet doen.
Dus zal ik ongetwijfeld is fout doen.
Van een medewerker wordt verlof, ziekte, doktersbezoek enz vastgelegd in de tabel T_mw1
Als de medewerker vertrekt wordt de datum van zijn vertrek in de tabel T_mw ingevuld.
Alle (eventuele) vooraf ingevulde verlof van na de vertrekdatum moet dan worden verwijderd.
De datum wordt ingevuld in het venster ([Formulieren]![F_mw]) waarin het record van de medewerker wordt getoond.
Na deze invulling moet dan de verwijder-query de overbodige records in de tabel T_mw1 worden verwijderd.
Criteria om te verwijderen is het id (IdMw) van de medewerker en de datum van uitdiensttreding (Uitdienst)
Beide velden staan ik het venster/formulier met de veldnamen IdMw en Uitdienst.
Ik krijg dan de melding dat er 0 records worden verwijderd.
Terwijl er wel records die verwijderd moeten worden aanwezig zijn.
Dit is de niet werkende query

Code:
DELETE T_mj1.IdMw
FROM T_mj1
WHERE (((T_mj1.IdMw)=[Formulieren]![F_mw]![IdMw] And (T_mj1.IdMw)=[Formulieren]![F_mw]![Uitdienst]));

Iemand enig idee wat er fout is?
Sytse
 
Je hebt wellicht zelf al gezien wat je fout doet: je gebruikt T_mj1.IdMw=[Formulieren]![F_mw]![Uitdienst]. En je delete maar één veld, is ook niet overdreven handig.
Dat kan uiteraard niet, IdMw is geen datum. Sowieso ga je alleen datums verwijderen die identiek zijn, en je wilt alles vanaf een datum. Dus het moet een beetje anders. Ik zou dit eens proberen (of wellicht nog eerst aanpassen)

PHP:
DELETE FROM T_mj1
WHERE IdMw=[Formulieren]![F_mw]![IdMw] 
And CDbl(DatumVerlof)>=CDbl([Formulieren]![F_mw]![Uitdienst]))
 
Met je aanpassing heb ik getracht de query aan te passen.
Het IdMw wordt ook direct gevonden.
Waar het fout gaat is het volgende.
Het veld uitdienst komt niet voor in de tabel T_mw1.
Dit veld staat in de tabel T_mw (het personeelsrecord).
De basis van verwijdering is het IdMw (komt in beide tabellen voor) en het veld uitdienst die alleen in de tabel T_mw voorkomt.
Dus na de uitdienst invulling in de tabel T_mw moet in de andere tabel (T_mw1) de records die aan de criteria voldoen verwijderd worden.
De criteria staan dan in het formulier van de medewerker met als basis de tabel T_mw.
Ik wil dan records verwijderen in een tabel waarvan 1 van de criteria (de belangrijkste, uitdienst) niet in de tabel voorkomt.
Als ik beide tabellen koppel obv het IdMw kan ik volgens mij de records in de tabel T_mw1 niet verwijderen.
Misschien moet ik een tijdelijk tabel met 1 record maken.
Het Idmw en de datum in Uitdienst.
Het Idmw wordt dan gevonden in de tabel T_mw1 en op basis van de datum in Uitdienst wordt de > dan datum in de tabel _T_mw1 veld Datum wordt het record verwijderd.
 
Laatst bewerkt:
Je maakt een ongelooflijke denkfout, en die beschrijf je zelf al in de derde/vierde regel. Je hoeft natuurlijk ook geen veld DatumUitdienst in je verloftabel te hebben, dat veld is alleen bedoeld als filter voor je verloven die je wilt verwijderen. Omdat ik je tabel niet heb, heb ik een dummynaam (DatumVerlof) gebruikt, de echte naam zal je zelf wel weten. Maar je moet in je query wel degelijk filteren op de uitdiensttreding datum van je formulier.
 
Beste OctaFish
Ik heb inderdaad het veld alleen nodig voor te filteren.
Ik heb je aanpassing gemaakt in mijn query.
Jouw datumverlof heb ik Uitdienst genoemd.
Dit is de naam in het Form F_mw waar de criteria staat.

Waarom je CDbl (Double-gegevenstype) gebruik snap ik niet, het is datum/tijd veld.
Ik heb dan ook CDbl gewijzigd in CDate.
Maar ook dan moet ik de parameter invullen.
Ik krijg dan geen foutmelding meer maar ook niet het beoogde resultaat.

Ik dacht te begrijpen dat bij de Where AND ((CDate([Uitdienst]))>=CDate([Formulieren]![F_mw]![Uitdienst])));
dat de vergelijking CDate[Uitdienst] in de tabel moest voorkomen in de tabel T_mw1, (waar het veld niet in voorkomt).

Maar desondanks werkt de query niet.

De onderstaande query vraag om de parameter Uitdienst (die in het Form F_mw staat).
Als ik de parameter invul krijg ik vervolgens een leeg overzicht.

Wellicht zie je wat ik fout doe.
bvd,
Sytse

Code:
SELECT T_mj1.[IdMw]
FROM T_mj1
WHERE (((T_mj1.[IdMw])=[Formulieren]![F_mw]![IdMw]) AND ((CDate([Uitdienst]))>=CDate([Formulieren]![F_mw]![Uitdienst])));
 

Bijlagen

  • foutmelding.jpg
    foutmelding.jpg
    93,5 KB · Weergaven: 50
Laatst bewerkt:
Waarom je CDbl (Double-gegevenstype) gebruik snap ik niet, het is datum/tijd veld. Ik heb dan ook CDbl gewijzigd in CDate.
Ik zou zeggen, als je iets niet begrijpt: eerst vragen, dan veranderen. Jouw aanpassing maakt het (eventuele) probleem namelijk groter. Lijkt mij niet de bedoeling. Ga er maar vanuit dat ik een goede reden heb om dat te doen :).

Ik dacht te begrijpen dat bij de Where AND ((CDate([Uitdienst]))>=CDate([Formulieren]![F_mw]![Uitdienst]))); dat de vergelijking CDate[Uitdienst] in de tabel moest voorkomen in de tabel T_mw1, (waar het veld niet in voorkomt).

Ik zal proberen het wat duidelijker uit te leggen. Ik heb mijn antwoord gebaseerd op dit stuk uit je vraag:
Als de medewerker vertrekt wordt de datum van zijn vertrek in de tabel T_mw ingevuld. Alle (eventuele) vooraf ingevulde verlof van na de vertrekdatum moet dan worden verwijderd.
In de tabel [T_mw1] heb je dus een startdatum staan voor het verlof, en (neem ik aan) een einddatum, al kan je ook met één datumveld volstaan en het aantal dagen van het verlof invullen. Daarbij is de waarde 1 dan één dag verlof, en 5 een week. Twee datums lijkt mij overigens logischer, maar aangezien ik je db niet weet, en het niet uitmaakt of je één datumveld hebt, of twee, heb ik daar geen rekening mee gehouden. Er is dus minstens één verlofdatum in de tabel. In de tabel [T_mw] staan de persoonsgegevens, en dus ook de uitdienst datum. Volgens je vraag wil je alle verloven verwijderen die na de uitdienstdatum liggen. Dan heb je het dus over de verlofdatum die in de tabel [T_mw1] wordt ingevuld, en niet over de uitdienstdatum uit de tabel [T_mw]. Maar die uitdienstdatum heb je dus nodig om de tabel [T_mw1] te kunnen filteren: alle verloven na de uitdienstdatum, waarvan de verlofdatum dus groter is dan de uitdienstdatum, moeten weg.
Dan heb je dus twee criteria:
PHP:
1. IdMw=[Formulieren]![F_mw]![IdMw] 
2. VerlofDatum>[Formulieren]![F_mw]![Uitdienst]
Je query werkt niet omdat het datumveld [Uitdienst] niet in de verloftabel staat. Logisch, hopelijk nu ook voor jou. OK, nu de uitleg waarom je 'verbetering' van mijn code niet zo'n best idee is :).
Code wordt gecodeerd via de Amerikaanse datumnotatie. Daarbij krijg je eerst de maand, dan de dag en dan het jaar. Bij ons staat de dag voorop. Dat betekent dat de datum 7-9-2017 op twee manieren te lezen is: als 9 juli 2017 en als 7 september. En dat is natuurlijk vervelend, want dan gooi je in sommige gevallen (23-4-2017 levert geen probleem op) verkeerde records weg. De opgeslagen datum is een getal, en dat getal verandert niet. Dat is een telling vanaf het jaar 0. Dus wat doe ik, om er voor te zorgen dat ik altijd met de juiste waarde vergelijk? Ik zet de datum terug naar een getal, en ik vergelijk dus twee getallen met elkaar. En dat gaat nooit fout. Wat doe jij? Jij converteert een datum naar een datum. Oftewel: jij verandert niks.

Je mag mijn code uiteraard best naar eigen inzichten verbeteren, maar maak hem dan beter, niet slechter :).
Kijk maar eens of je hier wat mee kan. Zo niet: geef dan in ieder geval de velden die in de tabel [T_mw1] zitten die we nodig hebben om de verwijderquery te kunnen maken.
 
Geweldig bedankt voor je uitstekend en uitgebreide uitleg.
Ik snap nu je CDbl. En het veld Verlofdatum is in mijn tabel gewoon datum.
De verwijderquery werkt nu uitstekend.
Weer wat geleerd (learning all the time)
Sytse
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan