Updaten middels berekening in current record

Status
Niet open voor verdere reacties.

vijverbegeman

Gebruiker
Lid geworden
27 apr 2007
Berichten
22
Hallo,

Ik bouw een toepassing voor het registreren van de vliegtijden van een vliegclub. Hieronder een korte omschrijving van het probleem.

Ik heb te maken met een starttijd en een landingstijd. Ik heb deze velden numeric gemaakt omdat ik dan niks te maken heb met het invoerformat "00:00". Bij het invoeren werkt dat soms lastig voor de muisgebruikers onder ons.

In totaal dus 4 velden om de start- en landingstijd te registreren, nl. start_hr, start_min, landing_hr en landing_min. Ik heb een query geschreven die ervoor zorgt dat per vlucht de vluchtduur wordt berekend. Als ik nu deze query gebruik in mijn formulier (die afgaat na wijzigen van het veld landing_min) door gebruik te maken van onderstaand script, dan worden de records in het form geupdate met telkens de eerste berekening uit de query. Er moet dus een link gelegd worden naar het record waar het veld landing_min wordt gewijzigd. Een link naar het unieke id of iets met current record?

Hieronder de gebruikte code:
--------------------------------------------------------------------
Private Sub landing_min_AfterUpdate()

On Error GoTo ERR_FOUT
Dim db As Database
Dim RS As DAO.Recordset
Dim tijd_hr As String
Dim tijd_min As String
Dim sql As String

sql = "SELECT IIf(s.landing_min - s.start_min < 0, (s.landing_hr - s.start_hr - 1), (s.landing_hr - s.start_hr)) As vliegtijd_uren " & _
",IIf(s.landing_min-s.start_min<0,((60-s.start_min)+s.landing_min),(s.landing_min-s.start_min)) AS vliegtijd_min " & _
" FROM t_startlijst AS s"

Set db = CurrentDb
Set RS = db.OpenRecordset(sql)
tijd_hr = RS![vliegtijd_uren]

Set db = CurrentDb
Set RS = db.OpenRecordset(sql)
tijd_min = RS![vliegtijd_min]

'MsgBox ("tijd_hr: " & tijd_hr & "tijd_min: " & tijd_min)

RS.Close
Me.vluchtduur_uren = tijd_hr
Me.vluchtduur_min = tijd_min

Exit Sub
ERR_FOUT: MsgBox ("Er is een fout opgetreden bij het berekenen van de vliegtijd...")
Resume Next
End Sub
--------------------------------------------------------------------

Bedankt voor je reactie.

Pascal
 
Sluier en een tipje daarvan...

Je schrijft er niet bij wat de gewenste situatie moet zijn. Wil je dat alle records worden geupdate of alleen het ene record wat je invoert? Eigenlijk moet je deze waarde niet op willen slaan. Dit is namelijk een proces gegeven. En die sla je niet op. Een proces gegeven is een waarde die berekend kan worden a.d.h.v. gegevens uit dat record en dus redundant.

Wel eens van DateDiff gehoord?

Datediff geeft je aan de hand van je interval (n = minuten) het aantal terug tussen twee tijden. Bijvoorbeeld:
Code:
?datediff("n",now(),now()+1)
1440
Het aantal minuten in een dag.

Hoeveel minuten heb ik gevlogen?
Code:
?datediff("n", "08:20","16:31")
491
Hoeveel uur is dat?
Code:
?datediff("n", "08:20","16:31")/60
8,183333333333333
Dit werkt aanzienlijk sneller dan IIF'jes in een query.
 
Guus, bedankt voor de tips!

De gewenste situatie moet zijn dat de vluchtduur moet worden berekend wanneer iemand de landingstijd invult. Per start wordt nl. een record aangemaakt. Datediff werkt inderdaad eenvoudiger, al moet ik dan wel datetime-velden gebruiken. Dat is overigens niet zo heel erg. Ik kijk nog wel even wat ik daarmee doe.

Voor wat betreft het niet opslaan vs. berekenen van de vluchtduur: Er wordt een groot aantal starts gemaakt per jaar en de rapportage moet ook per jaar worden gedraaid of misschien wel over een aantal jaren. Ik ben bang dat het uitdraaien van zo'n jaarrapportage wel eens lang zou kunnen duren. Maar ook dat zien we dan wel weer.

Nog één ding: De query die momenteel in de landing_min_AfterUpdate() staat, geeft de berekende vluchtduur van alle vluchten. Hoe krijg ik nu de juiste vluchtduur in het juiste record? Ik heb nog even een printscreen gemaakt om het wat te visualiseren (hier staan de start- en landingstijd overigens al in datetime format).

Alvast bedankt voor je reactie!
 

Bijlagen

  • Startlijst ZCNOP.JPG
    Startlijst ZCNOP.JPG
    96,4 KB · Weergaven: 61
De gewenste situatie moet zijn dat de vluchtduur moet worden berekend wanneer iemand de landingstijd invult. Per start wordt nl. een record aangemaakt. Datediff werkt inderdaad eenvoudiger, al moet ik dan wel datetime-velden gebruiken.
Dat hoeft niet zoals je in mijn twee en derde voorbeeld kan zien.

Voor wat betreft het niet opslaan vs. berekenen van de vluchtduur: Er wordt een groot aantal starts gemaakt per jaar en de rapportage moet ook per jaar worden gedraaid of misschien wel over een aantal jaren. Ik ben bang dat het uitdraaien van zo'n jaarrapportage wel eens lang zou kunnen duren. Maar ook dat zien we dan wel weer.
Over hoeveel records praat je dan? Ik heb hier een tabel met 20 velden gevuld met ongeveer 500K aan records. runtime op deze tabel met datediff is 6 seconden. Ligt natuurlijk ook aan de complexiteit van je query en de snelheid van je computer.
Nog één ding: De query die momenteel in de landing_min_AfterUpdate() staat, geeft de berekende vluchtduur van alle vluchten. Hoe krijg ik nu de juiste vluchtduur in het juiste record? Ik heb nog even een printscreen gemaakt om het wat te visualiseren (hier staan de start- en landingstijd overigens al in datetime format).
Het is mij niet duidelijk waarom je een query gebruikt om de vluchttijd te berekenen:
Code:
Private Sub landing_min_AfterUpdate()

  On Error GoTo ERR_FOUT
  Dim intUren As integer
  Dim intMinuten As integer
  Dim strTakeOff as string  
  Dim strLanding as string

  strTakeOff = start_hr & ":" & start_min
  strLanding = landing_hr & ":" & landing_min

  intMinuten = DateDiff("n", strTakeOff, strLanding)
  intUren = intMinuten/60 ' Aantal uren gevlogen
  intMinuten = intMinuten - intUren * 60 'Restant minuten
  
  'MsgBox ("tijd_hr: " & intUren & "tijd_min: " & intMinuten)

  Me.vluchtduur_uren = intUren
  Me.vluchtduur_min = intMinuten

  Exit Sub

  ERR_FOUT: 
  MsgBox ("Er is een fout opgetreden bij het berekenen van de vliegtijd...")
  Resume Next ' Dit betekent dat je ondanks een fout toch door wilt gaan met de code. Weet je dat zeker?

End Sub
From the top of my head.
De getoonde code is niet getest. Er kunnen dus bugs inzitten.

Succes!
 
Laatst bewerkt:
Heel mooi!

Twee tikfoutjes zal ik 't maar noemen:
- strTakeOff wordt gevuld met de landingstijd
- Bij de berekening van het restant minuten wordt een bijvoorbeeld 0,8 afgerond naar boven, terwijl dat toch 0 moet zijn.

Klinkt heel bijdehand, maar dan heeft een ander misschien ook nog wat aan deze code.

Ik kom er wel uit. Maar eerst ga ik even een paar uurtjes horizontaal! Morgen werken... ;)

Groeten en bedankt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan