[Access] Volgende datum via Max([Datum])+1

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

  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Ik ben een (simpel) urenregistratieprogramma aan het ontwikkelen. Hiervoor heb ik reeds een formulier en database. In het formulier moet men de huidige datum opvoeren. Omdat men wel eens dagen niet op kantoor komt is het niet handig de datum van vandaag te pakken maar de laatst opgeveorde datum + 1.

Ik dacht hier de volgende code voor te gebruiken: "=Max([Datum])+1. Deze code werkt alleen bij het tweede opgevoerde record. Bij de eerste kom "Max" met waarde 1 (1899 of zo). Hoe kan ik direct bij het openen van het formulier de goede waarde opvragen.

Ik heb reeds gezocht maar kom alleen bij dode topics uit. Ik heb recent geleerd geen oude koeie uit de sloot te halen, dus vandaar dit topic.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23:25

Janoz

Moderator Devschuur®

!litemod

Welke datum moet je nu eigenlijk hebben? De dag na de laatst ingevulde of de huidige?

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


  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
De huidige is geen probleem (=Date$()). Ik wil juist de laatst ingevulde datum. Dus in de rij "Datum" de laatst ingevulde datum + 1 = de nieuwe datum.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


Verwijderd

Well duh...

Voor het eerste record levert Max([Datum]) natuurlijk 0 op (immers, er zijn nog geen records om het maximum van te nemen), en 1 erbij opgeteld levert dan 1 op.

Een oplossing zou zijn, iets als:

code:
1
=IF(Max([Datum])+1 > 1, Max([Datum])+1, Date$())


Of zoiets, ik weet niet precies in wat voor syntax het uiteindelijk moet komen...

  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Verwijderd schreef op 26 juli 2004 @ 15:28:
Well duh...

Voor het eerste record levert Max([Datum]) natuurlijk 0 op (immers, er zijn nog geen records om het maximum van te nemen), en 1 erbij opgeteld levert dan 1 op.

Een oplossing zou zijn, iets als:

code:
1
=IF(Max([Datum])+1 > 1, Max([Datum])+1, Date$())


Of zoiets, ik weet niet precies in wat voor syntax het uiteindelijk moet komen...
Max([Datum]) levert in een database vol met (test)gegevens nog steeds standaard 1 op. Pas bij het aanmaken van de tweede nieuwe record (naast de reeds bestaande records) geeft Max([Datum]) de grootste datum. Om dit probleem gaat dit hele topic ;-)
Dus als ik het formulier sluit en opnieuw open moet ik eerst 2 record aanmaken voordat deze functie werkt.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


Verwijderd

Ah, op die manier tweede record.

Dat is zeer waaz. Na het aanmaken van een nieuw record, levert Max([Datum]) dan de hoogste datum of de zojuist toegevoegde datum?

Wat houdt de referentie [Datum] eigenlijk in? Misschien worden de oude gegevens daar niet in meegenomen ofzo...

  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Verwijderd schreef op 26 juli 2004 @ 16:04:
Ah, op die manier tweede record.

Dat is zeer waaz. Na het aanmaken van een nieuw record, levert Max([Datum]) dan de hoogste datum of de zojuist toegevoegde datum?

Wat houdt de referentie [Datum] eigenlijk in? Misschien worden de oude gegevens daar niet in meegenomen ofzo...
Max([Record]) geeft de hoogste waarde in het record weer. In mijn geval (Urenregsitratie) is dat de hoogste datum die hij kan vinden.
Dit werkt dus pas als er twee records opgevoerd zijn. Erg vaag inderdaad.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • Boss
  • Registratie: September 1999
  • Laatst online: 23:23

Boss

+1 Overgewaardeerd

En als je DateAdd (zie help) gebruikt ipv +1 om er een dag bij op te tellen?

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Verwijderd

mbooij schreef op 27 juli 2004 @ 09:24:
[...]

Max([Record]) geeft de hoogste waarde in het record weer. In mijn geval (Urenregsitratie) is dat de hoogste datum die hij kan vinden.
Dit werkt dus pas als er twee records opgevoerd zijn. Erg vaag inderdaad.
Je bedoelt Max([Veld]) geeft de hoogste waarde in het veld, denk ik? En [Veld] geeft dan de verzameling waarden uit alle records in de kolom Veld? Uit de huidige tabel? Ik heb hier helaas geen Access dus ik kan niet checken.

Ik heb namelijk het idee dat er iets misgaat bij die referentie; namelijk dat [Veld] pas geldig wordt zodra je een record hebt toegevoegd.

De precieze oorzaak daarvan ontgaat me wel, maar dat is ook omdat ik eigenlijk nauwelijks ervaring heb met Access.

  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Verwijderd schreef op 27 juli 2004 @ 09:42:
[...]


Je bedoelt Max([Veld]) geeft de hoogste waarde in het veld, denk ik? En [Veld] geeft dan de verzameling waarden uit alle records in de kolom Veld? Uit de huidige tabel? Ik heb hier helaas geen Access dus ik kan niet checken.

Ik heb namelijk het idee dat er iets misgaat bij die referentie; namelijk dat [Veld] pas geldig wordt zodra je een record hebt toegevoegd.

De precieze oorzaak daarvan ontgaat me wel, maar dat is ook omdat ik eigenlijk nauwelijks ervaring heb met Access.
Sorry voor het misverstand. Ik bedoel inderdaad gewoon de rij in de tabel en niet de tabel zelf. Hiervan moet de hoogste waarde weergegeven worden.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Boss schreef op 27 juli 2004 @ 09:31:
En als je DateAdd (zie help) gebruikt ipv +1 om er een dag bij op te tellen?
Het probleem zit em niet in het optellen maar in het opvragen van de hoogste waarden. Dit vertikt Access gewoon als er geen nieuw record aangemaakt is.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Iemand nog een slim idee?

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • Bolhuis
  • Registratie: Juli 2004
  • Laatst online: 11-10-2006
mbooij schreef op 30 juli 2004 @ 10:39:
Iemand nog een slim idee?
Volgens mij is het probleem dat je bij het opvragen van de max datum niet verwijst naar de oorspronkelijke tabel waaruit die gehaald moet worden. Volgens mij creert access op het moment dat je een nieuw record toevoegd een seperate tijdelijke tabel waarin de nieuwe records worden opgenomen, dit om een rollback te kunnen doen. Ik zoiets ook eens gedaan maar dan via een aparte query waaruit ik de nog niet gebruikte items kon filteren.

Je kunt dit ook eventueel via een sql statement proberen, maar dat is afhankelijk van de plaats waar je de datum wilt opvragen

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Bij mij doet hij het gewoon met =Max([Datum]). Ik hoef daarvoor dus geen nieuwe records aan te maken ofzo, maar hij leest hem meteen tijdens het laden al uit. Kijk eens of je niet ergen toevallig met events heb lopen klooien ofzo die de boel in de war schoppen.

Ik heb even mijn testdb geupload waar hij het dus wel doet, kun je even vergelijken. URL: testdb.mdb

[ Voor 26% gewijzigd door eghie op 30-07-2004 11:27 ]


  • nescafe
  • Registratie: Januari 2001
  • Nu online
Probeer het eens met DMax(), dan werk je in ieder geval buiten je huidig formulier om. Kun je overigens "Bij de eerste kom "Max" met waarde 1 (1899 of zo)." even uitleggen?

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • Bolhuis
  • Registratie: Juli 2004
  • Laatst online: 11-10-2006
eghie schreef op 30 juli 2004 @ 11:24:
Bij mij doet hij het gewoon met =Max([Datum]). Ik hoef daarvoor dus geen nieuwe records aan te maken ofzo, maar hij leest hem meteen tijdens het laden al uit. Kijk eens of je niet ergen toevallig met events heb lopen klooien ofzo die de boel in de war schoppen.

Ik heb even mijn testdb geupload waar hij het dus wel doet, kun je even vergelijken. URL: testdb.mdb
Ja in een formulier kan dit zo, maar volgens mij wil hij de max datum vooraf ingevuld hebben in het datum veld van het nieuwe record.

Overigens MBooij hoe wil je omgaan met tweede en derde nieuwe records moeten die ook standaard weer op een dag later staan? Of wil je dit een keer vaststellen en dan de hele dag gebruiken? Dat heeft wel invloed op de manier waarop je dit probleem moet aanpakken.

  • eghie
  • Registratie: Februari 2002
  • Niet online

eghie

Spoken words!

Bolhuis schreef op 30 juli 2004 @ 11:34:
[...]


Ja in een formulier kan dit zo, maar volgens mij wil hij de max datum vooraf ingevuld hebben in het datum veld van het nieuwe record.

Overigens MBooij hoe wil je omgaan met tweede en derde nieuwe records moeten die ook standaard weer op een dag later staan? Of wil je dit een keer vaststellen en dan de hele dag gebruiken? Dat heeft wel invloed op de manier waarop je dit probleem moet aanpakken.
mbooij schreef op 26 juli 2004 @ 14:47:
...

Hoe kan ik direct bij het openen van het formulier de goede waarde opvragen.

...
Tenminste daaruit maak ik het op dat hij het zo wil.

  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Bolhuis: Het is een urenverantwoordingws db. Hierin moet men per dag de aangeven wat er allenmaal gedaan is. Iedere dag dus een erbij. Als er meer zijn dan gewoon de laatstopgevoerde datum + 1.

eghie: mijn formulier is gebasseerd op een query, die van jou direct op de tabel. Mogelijk zit daar het verschil.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Nope, heb het formulier nu direct op de tabel gezet en nog steeds geen resultaat.

Ik gebruikte =Max([Datum])+1 als standaard waarde. eghie als besturingselement bron. Als besturingelementbron werkt hij wel, maar dan wordt de datum niet opgeslagen in de db.
Kan ik hem als besturingselement bron gebruiken en toch opslaan in de db? Hij moet alleen eenkeer ingevuld worden en dus niet iedere keer als het formulier geopend wordt bijgewert worden, vandaar dat ik de standaardwaarde gebruikte.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Aha, als ik maxdata in een ander veld laat berekenen en als standaard laat opvragen bij het datum veld wordt hij wel netjes gevuld met de goede (laatst opgevoerde) datum.

gorgi_19: ik zal er in het vervolg op proberen te letten ;-)

[ Voor 17% gewijzigd door mbooij op 30-07-2004 12:43 ]

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:53

gorgi_19

Kruimeltjes zijn weer op :9

mbooij
Kan je voortaan de Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/got/images/icons/edit.gif knop gebruiken als je nog wat wilt toevoegen aan je post, in plaats van steeds er een nieuw bericht onder te plaatsen? :) Veel mensen vinden het rottig lezen om steeds halve posts van iemand te lezen, terwijl het in de volgende post weer verder gaat :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij zit je nu te verwachten van access dat het zich aanpast naar jouw manier van denken.

Het idee van Max (en dat is de functie die je gebruikt) is dat de maximale waarde wordt opgehaald over het bereik wat je opgeeft. Als er geen maximale waarde is, dan geeft hij de waarde 0 terug, gewoon omdat op die manier er altijd een waarde wordt teruggegeven.

Als jij in dat geval niet 0 maar de huidige datum wil, dan zul je dat dus zelf moeten uitzonderen. Is er in Jet SQL niet een CASE statement te maken waarmee je dat kan? Ik ben zelf SQL Server gewend en daar kan dat mee.

  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
bigbeng schreef op 30 juli 2004 @ 12:44:
Volgens mij zit je nu te verwachten van access dat het zich aanpast naar jouw manier van denken.

Het idee van Max (en dat is de functie die je gebruikt) is dat de maximale waarde wordt opgehaald over het bereik wat je opgeeft. Als er geen maximale waarde is, dan geeft hij de waarde 0 terug, gewoon omdat op die manier er altijd een waarde wordt teruggegeven.

Als jij in dat geval niet 0 maar de huidige datum wil, dan zul je dat dus zelf moeten uitzonderen. Is er in Jet SQL niet een CASE statement te maken waarmee je dat kan? Ik ben zelf SQL Server gewend en daar kan dat mee.
Read above... het is al gefixed tnx to eghie!!!

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Omdat ik "=Max([Datum])" als standaartwaarde gebruik moet deze bij het laden van het formulier berekend zijn. Dit gebeurd bij langzame computers soms niet optijd. Het resultaat is dat hij dan de max van de vorige keer toont. Hoe kan ik Max gebruiken in een module of vbscript zodat ik deze in de achtergrond kan laten berekenen?

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


Verwijderd

Ken je de functie datepart() ?

Wat ik daarmee ook gedaan heb is inderdaad een datum een maand verder zetten, uitgaande vanaf de datum van vandaag. Mocht je een scriptvoorbeeldje willen dan kan`k je die geven...

tijd over :P :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Function datesamenstel() As Double

  Dim dbs As DAO.Database
   Dim rst As DAO.Recordset
   Dim Date1 As String
   Dim Date2 As String
   Dim Date3 As String
   Dim Date1t As String
   Dim Date2t As String
   Dim Date3t As String
   
 Date1t = DatePart("d", Date)
 Date2t = DatePart("m", Date)
 Date3t = DatePart("yyyy", Date)
 
 If Date1t <= 9 Then
 Date1 = "0" & Date1t
 Else
 Date1 = Date1t
 End If
 
 If Date2t <= 9 Then
 Date2 = "0" & Date2t
 Else
 Date2 = Date2t
 End If
 
 If Date3t <= 9 Then
 Date3 = "0" & Date3t
 Else
 Date3 = Date3t
 End If
 
datesamenstel = Date1 & Date2 & Date3


ZOals je ziet is hij vrij lang voor zo`n simpele functie, maar je moet rekening houden dat er maar 12 maanden zijn, dus als hij er 1 bij op teld dat het niet maand 13 word maar 1, eh, 31 dagen blablabla... dat soort dingen zitten er allemaal in...

Tis een Vbscript, die pleurt je in een module, en afhankelijk van welke naam je dit script geeft (bij mij dus datesamenstel() ) kan je het instellen als standaardwaarde.


Rob

[ Voor 81% gewijzigd door Verwijderd op 25-08-2004 11:23 . Reden: ff scriptje ingevoegd ]


Verwijderd

sorry, nu een reply op jouw vraag. Zet dit in een module:

code:
1
2
3
Function dateMax() As Double

datemax= Max([Datum])


zet dan dateMax() in je standaardwaardevak, en klaar is kloris.

  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
In de module wordt het veld datum niet herkend. Hoe vertel ik acces dat hij nu in de database moet zoeken? Ik heb tabel.datum geprobeert maar deze blijkt in de module onbekend.

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • jwpmzijl
  • Registratie: December 2002
  • Laatst online: 20:46
In een module moet je eerst een recordset openen. Dus om een max van een bepaald veld te krijgen heb je deze code nodig. Onderstaand voorbeeld kun je gebruiken natuurlijk moet je wel je eigen velden en tabellen invullen. Verder is dit een programmeermethode die door Microsoft uitgefaseerd wordt maar het werkt.

code:
1
2
3
4
5
6
7
8
9
10
11
dim rst as recordset, dim sql as string, dim result as date

sql = "Select max(datum) as maxdatum from [urenlijst];"

set rst = currentdb.openrecordset(sql)
rst.openrecordset
if rst.recordcount > 0 then
  result = maxvandatum
 else
  result = date() ' als er geen resultaat is kan de huidige datum getoond worden
end if

[ Voor 3% gewijzigd door jwpmzijl op 25-08-2004 12:24 ]

Hans van Zijl


  • Boss
  • Registratie: September 1999
  • Laatst online: 23:23

Boss

+1 Overgewaardeerd

Ja jongens, maak het lekker ingewikkeld. Recordsets openen enzo om een max waarde uit een tabel te halen?

Wat gaat er nou mis met die functie? De juiste syntax is toch nog altijd:
code:
1
MaximaleWaarde = DMAX("veldnaam","tabelnaam","criteria")


Als jer nog iets bij op wilt tellen (een dag bijvoorbeeld) doe je dat met DateAdd. De syntax daarvan is dan
code:
1
NieuweDatum = DateAdd("d",1,MaximaleWaarde )

In plaats van "d" kan je ook de volgende intervallen gebruiken:
yyyy Jaar
q Kwartaal
m Maand
y Dag van het jaar
d Dag
w Dag van de week
ww Week
h Uur
m Minuut
s Seconde

Tot slot kan je de twee functies nog samenvoegen tot
code:
1
Uitkomst = DateAdd("d",1,DMAX("veldnaam","tabelnaam","criteria"))

Uitkomst is dan de laatste dag + 1 uit de kolom "veldnaam" in de tabel "tabelnaam". "kriteria" kan je leeglaten.

[ Voor 10% gewijzigd door Boss op 26-08-2004 12:01 ]

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


  • mbooij
  • Registratie: September 2002
  • Laatst online: 22-05 15:38

mbooij

De Mosselman

Topicstarter
Boss schreef op 25 augustus 2004 @ 12:31:
Ja jongens, maak het lekker ingewikkeld. Recordsets openen enzo om een max waarde uit een tabel te halen?

Wat gaat er nou mis met die functie? De juiste syntax is toch nog altijd:
[code]
MaximaleWaarde = DMAX("veldnaam","tabelnaam","criteria")
[code]

Als jer nog iets bij op wilt tellen (een dag bijvoorbeeld) doe je dat met DateAdd. De syntax daarvan is dan
code:
1
NieuweDatum = DateAdd("d",1,MaximaleWaarde )

In plaats van "d" kan je ook de volgende intervallen gebruiken:
yyyy Jaar
q Kwartaal
m Maand
y Dag van het jaar
d Dag
w Dag van de week
ww Week
h Uur
m Minuut
s Seconde

Tot slot kan je de twee functies nog samenvoegen tot
code:
1
Uitkomst = DateAdd("d",1,DMAX("veldnaam","tabelnaam","criteria"))

Uitkomst is dan de laatste dag + 1 uit de kolom "veldnaam" in de tabel "tabelnaam". "kriteria" kan je leeglaten.
You the Man 8)

Intel i5 3570K@4.2Ghz, 2x4GB, MSI Z77A-G45, Club3D Radeon HD 7970 royalKing


  • jwpmzijl
  • Registratie: December 2002
  • Laatst online: 20:46
Recordsets openen lijkt overbodig en is het in deze toepassing wellicht ook. Ik werk echter normaal met multiuser applicaties (toevallig ook urenregistratie etc). In dat geval ontkom je niet aan het gebruik van recordsets om de meest actuele data te tonen.

Kortom het is maar net wat je nodig hebt.

Hans van Zijl


  • Boss
  • Registratie: September 1999
  • Laatst online: 23:23

Boss

+1 Overgewaardeerd

Het gaat hier over Access, toch?

Dan hoef je echt niet met recordsets te werken voor de meest recente data hoor. Updates worden direct verwerkt (zodra je naar een ander record gaat of opslaat). Data op de server = in dat geval data bij de client.

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.

Pagina: 1