Toon posts:

ACCESS --> SQL & de eerstvolgende verjaardag

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

Verwijderd

Topicstarter
Hallo,

ik wil in het hoofdmenu van de database weergeven wanneer de eerstvolgende verjaardag van een werknemer is.

In de tabel tblDatabaseUsers wordt in het veld Birthday (type date) de geb datum opgeslagen in formaat dd-mm-yyyy

Met welke query krijg ik de eerstvolgende verjaardag als resultaat?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Wat heb je al geprobeert, en waar loopt het spaak?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Toink
  • Registratie: Januari 2000
  • Niet online
Nou, wat je zou kunnen doen is (beetje omweg, maar werkt altijd).

1) haal datum van vandaag op en plaats in dit formaat: jjjjmmdd
2) haal datum verjaardagen op en plaats in dit formaat: jjjjmmdd

Nu kun je deze twee als getallen met elkaar vergelijken. Degene met het kleinste positieve verschil is de eerstvolgende verjaardag. Is een beetje werk, geef ik toe, maar het werkt altijd en met wat net programmeerwerk heb je dat in 20 minuutjes klaar.

Ik ga het je niet compleet voordoen, maar bij concrete vragen wil ik er best eens naar kijken.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Toink schreef op 17 oktober 2002 @ 15:14:
Nou, wat je zou kunnen doen is (beetje omweg, maar werkt altijd).

1) haal datum van vandaag op en plaats in dit formaat: jjjjmmdd
2) haal datum verjaardagen op en plaats in dit formaat: jjjjmmdd

Nu kun je deze twee als getallen met elkaar vergelijken. Degene met het kleinste positieve verschil is de eerstvolgende verjaardag. Is een beetje werk, geef ik toe, maar het werkt altijd en met wat net programmeerwerk heb je dat in 20 minuutjes klaar.


Nou, ik denk niet dat dit gaat werken, aangezien de meeste werknemers wel ouder dan 1 jaar zullen zijn :)...

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Bezig geweest in SQL met o.a. DateDiff maar het probleem daar is het jaartal. Met datediff kan ik het aantal dagen tot of vanaf een bepaalde datum verkrijgen, maar dat gaat mis ivm de jaartallen.

Vervolgens heb ik met Day(Birthday) & Month(Birthday) & Year (date()) geprobeerd om iets te krijgen. Leek te werken, totdat ik 01-01 bij een werknemer had. Dat ligt namelijk niet in de toekomst dus klopt die waarde niet.

vb met deze truuk
nu birthday DaysUntilBirthday
17-10-2002 14-11-2002 28
17-10-2002 01-01-2002 -289

  • Toink
  • Registratie: Januari 2000
  • Niet online
Janoz schreef op 17 oktober 2002 @ 15:15:

[...]


Nou, ik denk niet dat dit gaat werken, aangezien de meeste werknemers wel ouder dan 1 jaar zullen zijn :)...
Dankje :) je moet natuurlijk het jaar hierin gewoon negeren want dat is niet relevant. Voor de rest is het idee goed, toch?

Verwijderd

SELECT TOP 1 Table1.datum
FROM Table1
WHERE (((Table1.Datum)>Date()));

ik heb gewoon een datumpje gepakt incl. jaar. kan me voorstellen dat jij dat niet hebt, dan moet je ff crea worden met datepart om jaar achter de verjaardag te plakken

Verwijderd

Topicstarter
Verwijderd schreef op 17 oktober 2002 @ 15:17:
SELECT TOP 1 Table1.datum
FROM Table1
WHERE (((Table1.Datum)>Date()));

ik heb gewoon een datumpje gepakt incl. jaar. kan me voorstellen dat jij dat niet hebt, dan moet je ff crea worden met datepart om jaar achter de verjaardag te plakken
Dat werkt niet omdat 14-11-1979 > 17-10-2002 niet waar is. Dus ik krijg een ongeldig resultaat

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Toink schreef op 17 oktober 2002 @ 15:16:
[...]


Dankje :) je moet natuurlijk het jaar hierin gewoon negeren want dat is niet relevant. Voor de rest is het idee goed, toch?


mwah, sorry, maar niet echt.. Dit zijn typisch dingen die je gewoon door de db moet laten afhandelen ipv eigen code.

Aantal methoden:

-Verjaardagen niet alleen het huidige jaar toevoegen, maar ook het volgende jaar (desnoods met een union)

-Gebruik maken van juliaanse datum (dagen in dit jaar en jaartal). Het aantal dagen in het huidige jaar bepalen. Dit van de geboortedatum aftrekken en vervolgens de dagen in het jaar met elkaar vergelijken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

code:
1
2
3
SELECT Top 1 PersonID, datum
FROM Table1
WHERE (((CDate(Day([datum]) & "-" & Month([datum]) & "-" & Year(Date())))>Date()));


verbetering

[ Voor 0% gewijzigd door Verwijderd op 17-10-2002 15:38 . Reden: top 1 vergeten ]


  • Toink
  • Registratie: Januari 2000
  • Niet online
Dat ligt er maar net aan hoe moeilijk je het jezelf wil maken. Het omzetten naar een optel-en-aftrek-formaat kan in de database zelf tijdens een select-query en stelt niks voor. Daar kun je ook al direct de datum van vandaag af laten halen. Als je ze rangschikt op het resultaat ervan dan weet je dat de bovenste (of onderste, afhankelijk van rangschikking) de eerstvolgende jarige is. Daar komt nog geen stuk programmacode aan toe.

Verwijderd

Topicstarter
Verwijderd schreef op 17 oktober 2002 @ 15:27:
code:
1
2
3
SELECT Top 1 PersonID, datum
FROM Table1
WHERE (((CDate(Day([datum]) & "-" & Month([datum]) & "-" & Year(Date())))>Date()));


verbetering
Verbetering, maar nog niet optimaal

want in de populatie
Persoon 1, 14-11-1979
Persoon 2, 12-11-1979

Geeft ie met deze query Persoon 1 als de volgende en dat is niet waar...

In deze query zeg je eigenlijk laat alleen het eerste record zien uit de tabel waarvoor geldt dat de birthday (met 2002 als jaartal) groter is dan de huidige datum.

Die vergelijking gaat mank omdat zowel 12-11-2002 als 14-11-2002 groter zijn dan de huidige datum. In deze query wordt niet gesorteerd dus vandaar de fout. Als de eerstvolgende verjaardag in het nieuwe jaar ligt heb je helemaal een probleem, want 01-01-2002 is niet groter dan de huidige datum en krijg je dus geen resultaten.

Verwijderd

Topicstarter
Toink schreef op 17 oktober 2002 @ 15:27:
Dat ligt er maar net aan hoe moeilijk je het jezelf wil maken. Het omzetten naar een optel-en-aftrek-formaat kan in de database zelf tijdens een select-query en stelt niks voor. Daar kun je ook al direct de datum van vandaag af laten halen. Als je ze rangschikt op het resultaat ervan dan weet je dat de bovenste (of onderste, afhankelijk van rangschikking) de eerstvolgende jarige is. Daar komt nog geen stuk programmacode aan toe.
Kun je een concreet voorbeeld daarvan geven?

Verwijderd

En dan nu even hoe ik het heb gedaan:

code:
1
2
3
4
SELECT TOP 1 Naam, Month(Geboortedatum), Day(Geboortedatum), Year(Date())
FROM Werknemer
WHERE (Day(Geboortedatum) & Month(Geboortedatum) & Year(Date()) > Date()
ORDER BY Month(Geboortedatum), Day(Geboortedatum);


Dit is dus een combi van SQL en VBA.

Zo, hier heb je als het goed is de verjaardag van je eerste werknemer.

Verwijderd

Topicstarter
Ok Toink, ik heb het volgende:

SELECT FamilyName, Birthday
FROM tblDatabaseUsers
ORDER by (Month(date())&Day(date()))-(Month(birthday)&Day(Birthday))

dat werkt bij maanden groter dan 10. De reden hiervoor is dat de datum 01-01-1978 door access wordt opgeslagen als 1-1-1978. Op dat moment trek je dus van 1017 (vandaag) geen 0101 (=101) af, maar slechts 11.

Heb je daar ook toevallig een oplossing voor?

Verwijderd

Snaak1979 in reactie op mijn laatste post

inderdaad. had de order by datum er nog niet bijgezet, dan is hij m.i. goed.

Verwijderd

[quote]Verwijderd schreef op 17 oktober 2002 @ 16:18:
quote]


en nu nog alleen de VOLGENDE verjaardag vanaf vandaag tonen waar de topic starter mee zit

Verwijderd

Topicstarter
Verwijderd schreef op 17 oktober 2002 @ 16:20:
Snaak1979 in reactie op mijn laatste post

inderdaad. had de order by datum er nog niet bijgezet, dan is hij m.i. goed.
Nee, dat is ie nog niet goed want hij skipt de verjaardag van de persoon die bijvoorbeeld op 1 januari 1967 geboren is. Reden: 01-01-2002 is niet groter dan 17-10-2002 terwijl dat toch best de eerstvolgende verjaardag zou kunnen zijn

Verwijderd

Topicstarter
[quote]Verwijderd schreef op 17 oktober 2002 @ 16:22:
Verwijderd schreef op 17 oktober 2002 @ 16:18:
quote]


en nu nog alleen de VOLGENDE verjaardag vanaf vandaag tonen waar de topic starter mee zit
Exact.....

Verwijderd

Dohh! idd...

ermz ff wat meer gegevens. Je zei hoofdscherm van de database.... maar moet denk wat anders zijn. Wat voor database, code mogelijkheden

Verwijderd

Topicstarter
Ms Access 2000 database. Codemogelijkheden zijn dus ook VB.

Verwijderd

k. vanavond gaat ik proberen op te lossen. moet toch niet zo moeilijk zijn......

Verwijderd

Het is gelukt! (denk dat je het zo wilt)

zit een gebeurtenis bij den onLoad van het form. misschien moet je je verwijzing (in je VBA editor) naar DAO aanvinken en zover mogelijk bovenin zetten, maar check deze database maar.....


http://www.heao-bi.nl/seminar/verjaardag.zip

Verwijderd

Snaak1979....... gelukt?

Verwijderd

Topicstarter
Ja zeker iruoy, ontzettend bedankt!

Gr. Joshua
Pagina: 1