Veld in hoofdformulier - laatste record in subformulier

Status
Niet open voor verdere reacties.

jvandervliet

Gebruiker
Lid geworden
23 mrt 2006
Berichten
234
Beste mensen,

Hoe kan ik een veld in het hoofdformulier laten aftrekken met het laaste record in subformulier.

Het gaat om bijhouden van lichaamsgewicht.

In hoofdformulier staat startgewicht.

Of zijn er andere suggesties?
 
Dat hangt er vanaf wat er op je hoofdformulier staat, en in je subformulier. Ik neem aan dat je subformulier verschillende wegingen door de tijd laat zien? In een aparte tabel?
Je kunt denk ik, als het startgewicht in de (neem ik aan) persoontabel is vastgelegd, wel verrekenen met een waarde die je met DMax ophaalt uit de tabel met mutaties. Daar heb je dus het subformulier niet eens voor nodig (eerste oplossing). Al zou je de laatste waarde in een voettekst van het subformulier kunnen zetten, en in je hoofdformulier verwijzen naar het tekstveld van het subformulier (tweede oplossing).
Of je maakt een functie die het verschil berekent (op basis van recordsets) en in één keer de uitkomst op het formulier zet (derde oplossing ;) )
Ik zou zeggen: zeg maar hoe je het zou willen :)
 
Wat ik wil is het volgende: In het hoofdformulier wil ik startgewicht invoeren en de totalen zien hoeveel er af gegaan is en er bij gekomen. En eventueel een grafiek. In de subformulier datum, gewicht en memo's.
 
Maar ik neem toch aan dat je het startgewicht opslaat in de onderliggende tabel? Of wil je dat niet bewaren? En hoe ga je de grafiek vullen? Met alle ingevoerde waarden, of alleen de eerste (startgewicht) en de laatste?
 
Het is de bedoeling dat je het startgewicht gelijk ziet en de grafiek moet alle ingevoerde waarde.
Naast het grafiek en veld met de laatste stand van zaken. (Startgewicht - laatste invoer.)
 
In beginsel is de functie DMax makkelijk zelf te gebruiken, als je de Functie Opbouwen gebruikt. Die zet de laatste waarde (van het RecordID, dat zou ik dan wel gebruiken) op je formulier in een tekstvak. Vervolgens maak je in een ander tekstvak een formule die de twee waarden van elkaar aftrekt. En dan heb je het verschil.
Ik zou zeggen: maak een voorbeeldje, als je er niet uitkomt.
 
Hoe nu verder met deze regel?

DMax([Subformulier Gewichtlogboekdetails].


De velden in de subformulier zijn:

GewichtID

en Gewicht
 
Deze DMAx gaat niet werken; om te beginnen: je moet een waarde opzoeken in een tabel, en niet in een subformulier. In een tabel staan alle records, dus je moet een criterium gebruiken. En, en dat had je kunnen achterhalen als je in de Help naar DMax opzoekt, Dfuncties (Dlookup, DMax, DMin etc) hebben de parameters tussen dubbele aanhalingstekens staan. Een juiste formule ziet er ongeveer zo uit:
Code:
=Dmax("[Veld Gewicht]";"[Tabel Gewichtmutaties]";"[Sleutelveld Formulier]=" & [KLantnummer op formulier])
Zonder voorbeeld db weet ik uiteraard de juiste tabel- en veldnamen niet, dus die moet je nog aanpassen.
 
Kun je niet een voorbeeldje maken met data er in? Ik heb zelf geen typecursus nodig ;)
 
Ik heb er een functie van gemaakt, die het laatste gewicht ophaalt. Daarmee wordt dan de berekening gemaakt.
 

Bijlagen

Niks, in eerste instantie wilde ik de berekening onder een knop gebruiken, maar dat hoeft niet want hij wordt nu uitgevoerd op de gebeurtenis <Na bijwerken> op het formulier.
 
Van je voorbeeld heb ik alles overgenomen en krijg de volgende foutmelding: Fout 3075 bij uitvoering

) te veel bij Query-expressie ((GwichtID = )).

Dan klik ik op Foutopsporing en dan komt dit geel geaccentueerd tevoorschijn: With CurrentDb.OpenRecordset(strSQL)
 
Dan heb je vermoedelijk toch iets niet hetzelfde gedaan :)
De OpenRecordset regel opent een query, en in mijn voorbeeld wordt die zo opgebouwd:
Code:
strSQL = "SELECT TOP 1 Gewicht, Datum FROM Gewichtlogboekdetails " _
    & "WHERE (GewichtID = " & Forms![Fitness]![Subformulier Gewichtlogboek].Form![GewichtID] & ") " _
    & "ORDER BY Datum DESC;"
Hierbij haal ik de laatste waarden van de velden [Gewicht] en [Datum] uit de tabel [Gewichtlogboekdetails] op, gebaseerd op een aflopende datum. Met TOP 1 geef je aan dat je 1 record wilt zien, en door aflopend op datum te sorteren, pak je automatisch het laatste record. Vervolgens wordt in de code het gewicht toegekend aan de variabele <MaxGewicht> (de functienaam dus).

Als je een foutmelding krijgt, dan komt dat doordat de query geen resultaat oplevert. Dat kan als oorzaak hebben dat er geen record is gevonden. En dat komt dan ofwel doordat de tabel niet bestaat (kan je hem ook niet openen) ofwel doordat het criterium niks oplevert. Dat criterium is: WHERE (GewichtID = " & Forms![Fitness]![Subformulier Gewichtlogboek].Form![GewichtID] & ")
Je zoekt dus in de tabel naar een GewichtID van een record op het subformulier. De reden dat er niks gevonden wordt kan zijn: je hebt een nieuwe klant ingevoerd, en nog geen gewichtmeting gedaan. Dan kun je het GewichtID ook niet opzoeken in de tabel <Gewichtlogboekdetails>. Overigens loopt hij, als ik dat naboots, dan vast op de regel MaxGewicht en niet op OpenRecordset. En dat neigt dan weer naar de conclusie dat de tabel bij jou anders heet.
Het tweede probleem kun je simpel oplossen door een aanpassing van de functie:

Code:
Function MaxGewicht() As Double
Dim strSQL As String
strSQL = "SELECT TOP 1 Gewicht, Datum FROM Gewichtlogboekdetails " _
    & "WHERE ((GewichtID = " & Forms![Fitness]![Subformulier Gewichtlogboek].Form![GewichtID] & ")) " _
    & "ORDER BY Datum DESC;"
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount = 0 Then
            MaxGewicht = 0
        Else
            MaxGewicht = .Fields(0).Value
        End If
    End With
End Function

Daarbij moet ook het tekstvak een andere formule krijgen:
Besturingselementbron: =IIf(MaxGewicht()=0;0;[txtStartgewicht]-MaxGewicht())
 
Was vergeten te melden dat het bij openen van een lege formulier de foutmelding is.

Bij selecteren van andere deelnemer waar niets in staat gebeurt dit ook.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan