Berekeningen met queries

Status
Niet open voor verdere reacties.

rvdsch

Gebruiker
Lid geworden
18 jun 2009
Berichten
170
Beste forummers,

Ik wil graag berekeningen uitvoeren met queries. Het zijn geen moeilijke berekeningen, uitsluitend optellen en aftrekken.

Ik wil graag een formulier maken waarin de gebruiker kan aangeven welke product van welke leverancier hij wil zien en dat dan de bestellingen in een bepaalde periode te zien zijn. Dit gedeelte lukt me wel.

Het probleem is daarna. Ik wil graag dat dan het totaal wordt opgeteld van wat er te zien is. Dan moeten er nog andere berekeningen worden uitgevoerd. Ik wil graag dat de gebruiker een begin inventaris maakt en dat er dan automatisch het totaal erbij opgeteld wordt.

Ik heb wat zitten proberen in een vrij formulier maar het lukt niet echt. Is het slim om eerst de querie apart te bouwen of moet ik het rechtstreeks in het formulier doen??
Hoe kan ik mijn querie het makkelijkst voor de gebruiker weergeven? En hoe kan de gebruiker het beste er door heen filteren?
 
Laatst bewerkt:
Dat zijn een hoop vragen...
Je kunt eigenlijk twee uitgangspunten nemen: je kunt een query maken met alle velden die je door de gebruiker wilt laten invullen/filteren, en daar de berekeningen in meenemen. Je hebt tenslotte de velden, dus je kunt de berekening gewoon maken, door de veldverwijzingen in je formules op te nemen.
Vervolgens kun je een formulier maken op basis van deze query, waarbij je bijvoorbeeld de berekende velden zodanig instelt, dat de gebruiker er niet bij kan. (bij Eigenschappen: Ingeschakeld=Nee, Vergrendeld=Ja). Zodra er een waarde wordt ingevuld/aangepast, wordt de berekening uitgevoerd, en zie je gelijk de uitkomst. Deze berekeningen zijn dan wel tijdelijk, want er is geen veld voor in je tabel.
Als je een gegevensbron (query of tabel) als bron gebruikt, kun je een keuzelijst met opzoekvak maken, waarin je een bepaald record kunt opzoeken. Kwestie van de Wizard doorlopen, kom je denk ik wel uit.
Je kunt de berekeningen ook op het formulier maken, en dan kun je een tabel als bron nemen, of eventueel een query voor het ophalen van gegevens uit andere tabellen. Maakt niet zoveel uit. Je hebt dan geen berekeningen nodig in de query, maar doet ze dan op het formulier. De werkwijze is hetzelfde: veldverwijzingen gebruiken in je formules.
Wil je de gegevens opslaan, dan moet je daar dus velden voor hebben. In dat geval zou ik de berekening op het formulier uitvoeren, en het formulierveld(en) met de berekening koppelen aan dit veld(en). Met een knop Opslaan sla je de gegevens dan op in de tabel.

Wil je alles op een niet-gebonden formulier, dan zul je eerst in de gebeurtenis <Bij Laden> een SQL string moeten maken, die je vervolgens toewijst aan het object Me.Form.Recordsource. Vervolgens kun je dan op het formulier met bladerknoppen door je records lopen, alsof het een normaal formulier is.
Om de gegevens nu op te slaan, zul je ofwel een Insert Into SQL string moeten maken, als je nieuwe gegevens wilt toevoegen, ofwel een Update sql string om de gegevens bij te werken met de waarden uit het formulier.

Het werken met een niet-gebonden formulier heeft als voordeel dat de gebruiker niet gelijk in een record zit te werken; pas bij opslaan worden de gegevens toegevoegd/bijgewerkt. Als je het formulier sluit zonder op te slaan, ben je dus alles kwijt. In een gebonden formulier werkt alles wat je doet gelijk door in de tabel. Is dus minder veilig...

Wil je verdere uitleg, je weet ons te vinden...

Michel
 
Hey Michel,

Ik heb het inmiddels op een freeform gedaan. De querie staat er, ik wil dat toekomstige gebruikers een filter toepassen om de juiste records te zien te krijgen. Het probleem is hoe kan ik een veld maken wat de gefilterde records bij elkaar opteld, het gaat dus om het totaal? De rest heb ik eigenlijk opgelost.

Ik heb nu een veld gemaakt met Som(Hoeveelheid) maar dat werkt niet echt. Ik heb dat dus als besturingselement gemaakt, maar hij pakt het niet.
 
Je kunt in de voettekst van het formulier een tekstvak maken, met de formule =Som([Waardevak]) als Besturingselementbron.

Michel
 
Ik heb de query nu helemaal omgebouwd en hij loopt. Het probleem is nu dat ik de query in een formulier wil weergeven. Dat lukt ook maar nu komt het probleem. De gebruiker kan op het formulier invoeren op welke leverancier en product hij wil zoeken. Dan krijg ik de resultaten te zien maar niet de prijs en dus ook niet de kosten.

De gebruiker vult dus een productID en ik denk dat het daar misgaat want ProductID is het veld wat de tabellen AlleOrders en Producten verbind. De SQL van de query is als volgt:
Code:
SELECT AlleOrders.LocatieID, AlleOrders.LeverancierID, AlleOrders.ProductID, AlleOrders.TransporteurID, AlleOrders.Transportmiddel, AlleOrders.KlantID, AlleOrders.Datum, AlleOrders.Doorgeleverd, AlleOrders.Hoeveelheid, AlleOrders.Notities, Producten.Prijs, [Hoeveelheid]*[Prijs] AS Kosten, AlleOrders.[Factuur geaccordeerd]
FROM Producten INNER JOIN AlleOrders ON Producten.ProductID = AlleOrders.ProductID
WHERE (((AlleOrders.LeverancierID)=[forms]![Facturen].[Leverancier_Factuur]) AND ((AlleOrders.ProductID)=[forms]![Facturen].[Product_Factuur]));

Wat is handig? Ik kan de gebruiker ook gewoon laten filteren op het formulier in de query, maar dat werd me afgeraden door iemand die zei dat ik gewoon beter invoervakken op het formulier kon maken.
 
Ik zie dat je in de query het veld prijs hebt opgenomen, dus ik zie geen reden waarom je dat veld niet zou kunnen zien op het formulier. Ik kan zo alleen bedenken, dat je geen formulierveld hebt gekoppeld aan de prijs. Kan het zo simpel zijn :)

Michel
 
Hey Michel,

Ik vrees dat dat het niet is. De besturingselementbron op het formulier is prijs. De query loopt ook buiten het formulier niet goed meer. In het formulier zelf loopt die wel maar geeft die in het vak Prijs dit weer: #Naam?
Er gaat dus ergens iets fout. Het is gekomen toen ik in de query aangaf dat ProductID en LeverancierID moeten lopen op de invoer vanuit het formulier dus ik denk dat daar ergens de fout zit
 
Iemand enige hulp??

Ik weet zeker dat de query klopt en werkt. In de gegevensblad weergave loopt die als een tierelier. Alleen in het formulier gaat het fout. In het formulier vul ik op twee invoerlijsten met keuzevak maar zonder besturingselementbron het ID in van de leverancier en het product. Vervolgens druk ik op deze knop met de volgende code:
Code:
Private Sub Knop31_Click()

Dim strTabel As String
strTabel = "AlleOrders Query2"
strSQL = "Select * From " & strTabel & vbCrLf
Me.RecordSource = strSQL
Me.Requery


 End Sub
Op zich moet deze code werken want ik gebruik hem vaker maar op dit formulier doet hij het niet. De query toont dus alle resultaten en heeft dus niet gefilterd op leverancier en product...
 
De query die je nu op het formulier gebruikt, laat alle records zien. Daar zorgt
strSQL = "Select * From " & strTabel & vbCrLf
voor.

De filtering die je wilt, op leverancier en / of product, moet de bron van het formulier aanpassen, dus dan moet je de SQL string van het formulier uitbreiden met
WHERE [LeverancierID]=Me.cboLeverancier.Value
(of zoiets)...

Als je de filtering in de query "AlleOrders Query2" hebt gezet, door in de query in Criteria de formuliervelden te zetten, dan gaat die knop dus niet zoveel doen; je kunt dan zelfs volstaan met de regel
Me.Requery
Omdat je geen nieuwe SQL op het formulier plaatst.

Zelf zou ik de filtering altijd via het formulier aansturen, en de filtering dus niet in de query zetten. Nu kun je de query niet draaien zonder dat het formulier geopend is, en wat doet de query als je nog geen selectie hebt?

Michel
 
Ok ik heb de VBA aangepast maar hij loopt niet als ik op de knop druk het probleem zit hem in de vierde en vijfde regel (RecordSource en de Requery)

Code:
Private Sub Knop31_Click()
Dim strTabel As String
strTabel = "AlleOrders Query"
strSQL = "Select * From & strTabel & vbCrLf & WHERE(([LeverancierID]=Me.Leverancier_Factuur.Value) And (([ProductID]=Me.Product_Factuur.Value))"
strSQL = Me.RecordSource
Me.Requery

End Sub

Ik snap niet dat dit niet goed loopt
 
Ik wel...;)

Er zitten wat foutjes in de code. Hij moet er zo uit zien:

Code:
Private Sub Knop31_Click()
Dim strTabel As String

strTabel = "AlleOrders Query"
strSQL = "Select * From & strTabel & vbCrLf _ 
	& "WHERE(([LeverancierID]=" & Me.Leverancier_Factuur.Value & ") " _
	& "And ([ProductID]= " & Me.Product_Factuur.Value & "))"
strSQL = Me.RecordSource
Me.Requery

End Sub

Foutje 1: De hele WHERE was in één string gezet. Dat kan in dit geval niet, omdat je binnen de string informatie ophaalt van je formulier. Deze variabelen moet je apart aanroepen. Vandaar dat er nu wat & tekens bij zijn gekomen, om de string te combineren met de formuliergegevens.
Foutje 2: Het aantal haakjes klopte niet. Je moet elk haakje openen combineren met een haakje sluiten. Access gooit bij het minste of geringste een haakje in de strijd... Zelf gooi ik die allemaal weer weg, want ze zijn zelden nodig, en vertroebelen het zicht op de feitelijke functie die je maakt.
Probeer hem zo nog maar eens!

Michel
 
Ik krijg hem niet aan de praat. Ik heb alle criteria uit de query gehaald. Als ik het formulier open staan dus alle records erin die ook in de query zitten. Dan probeer ik dus te zoeken op leverancier en product en ik druk op de knop... en er gebeurt niets, alle records blijven gewoon staan...
 
Als je de code letterlijk hebt overgenomen, dan verbaast mij dat niets... :)
Ik heb zelf ook licht zitten slapen, want dit foutje had ik er eigenlijk ook uit moeten halen... :o

Code:
strSQL = "Select * From & strTabel & vbCrLf _ 
	& "WHERE(([LeverancierID]=" & Me.Leverancier_Factuur.Value & ") " _
	& "And ([ProductID]= " & Me.Product_Factuur.Value & "))"
[B][COLOR="Red"]Me.RecordSource=strSQL[/COLOR][/B]
Me.Requery

In je laatste codevoorbeeld heb je een verkeerde code aan de RecordSource gehangen: i.p.v. de nieuwe SQL aan de recordsource te koppelen, heb je de oude code aan de variabele toegewezen... Had ik uiteraard moeten zien. Ik heb me echter alleen met de foute SQL beziggehouden, en niet naar de rest gekeken.
Aan de andere kant: in je vorige post stond de code wèl goed! Enig idee waarom je hem hebt aangepast?

Michel
 
Hoi Michel,

Ik heb het aangepast. Ik had de code omgedraaid omdat er een syntax fout in zat. Ik heb nu deze code;
Code:
Dim strTabel As String

strTabel = "AlleOrders Query"
strSQL = "Select * From & strTabel & vbCrLf" _
    & "WHERE(([LeverancierID]=" & Me.Leverancier_Factuur.Value & ") " _
    & "And ([ProductID]= " & Me.Product_Factuur.Value & "))"
Me.RecordSource = strSQL
Me.Requery

Hij geeft nu als foutmelding: de component From heeft een syntaxis fout.
Hij verwijst dan naar de 4e regel: Me.RecordSource = strSQL
Ik snap niet wat hij ermee bedoelt

Gr, Rob
 
Waarschijnlijk een overbodige vraag, maar zijn je sleutelvelden LeverancierID en ProductID numeriek?

Michel
 
ja klopt
ik heb ook al geprobeerd alleen een getal in te voeren dat hielp niets
 
Kun je de sgl afvangen met onderstaande inputbox, en hem posten? Ik wil eigenlijk wel ziet wat hij nu echt aanmaakt:

tmp=Inputbox("","",strSQL)

De tekst die je in de inputbox krijgt, ff kopieren en hier plakken!
(misschien moet je ook nog de variabele declareren met Dim tmp As String)

Michel
 
Hey Michel,

als ik jouw code invoer krijg ik dit
Code:
Select * From & [AlleOrders Query] & vbCrLf WHERE(([LeverancierID]=1)  And ([ProductID]= 1))
Dat klopt want ik heb dan ook een product en een leverancier met nr 1 uitgezocht.
Hij loopt niet want hij geeft aan dat de Me.RecordSource = AlleOrders Query en strSQL is de code die ik hierboven heb genoemd. De regel Me.RecordSource = strSQL geeft dus de problemen.
 
Dan heb ik het al gezien:
Dit is de goede code:

strSQL = "Select * From " & strTabel & vbCrLf _
& "WHERE (([LeverancierID]=" & Me.Leverancier_Factuur.Value & ") " _
& "And ([ProductID]= " & Me.Product_Factuur.Value & "))"

Zie je het verschil ;)

Michel
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan