Rekenen

Status
Niet open voor verdere reacties.

Zurrik

Gebruiker
Lid geworden
17 mrt 2006
Berichten
221
Ik heb op een formulier mijn oppervlakte uit kunnen rekenen. Mooi dus. Nu moet ik de prijs per produkt berekenen. Dat is de oppervlakte (die dus al berekent is) * prijs per dm². Maar dit hangt ook nog af van hoe moeilijk een produkt te bewerken is. Dus hoe moeilijker hoe duurder. En van het soort behandeling, vb zwart, rood, naturel.

Ik neem:
oppervlakte = produkt 1 = 5dm², produkt 2 = 10 dm².
bewerking = produkt1 = makkelijk, produkt2 = moelijk.
behandeling = produkt1 =zwart, produkt2 = naturel.

Nu heb ik een tabel met alle mogelijkheden erin, dat zijn 540 records, want ik heb 18(behandelingen) * 3(bewerking) * 10(oppervlaktematen). Achter iedere mogelijkheid heb ik een prijs neergezet. Hoe kan ik nu de prijs ophalen?

Ik moet nog wel met die prijs gaan rekenen.
 
Als ik het zo lees dan heb je een tabel met alle gegevens erin.
Nu wil de prijs berekenen.
Maak een query en selecteer daar alles in wat je nodig hebt en dan maar berekenen.
 
ik weet wel hoe ik een query kan maken:

select prijs from prijzen where soortbewerking = "3" and categorie = "2" and oppervlakte-id = "5".

Maar hoe moet ik hier nu mee rekenen? ik wil de uitkomst van de berekening in een textvak laten zien en opslaan in een tabel. Kan dat?
 
Ik dacht aan procedures maken, maar ik weet nog niet hoe dat moet.
 
Dat weet ik ook niet hoe dat moet.
sorry
 
Maakt niet uit, fijn dat je me wil helpen.

Misschien iemand anders?
 
aan alle een code geven 1-540 bv
deze onder elkaar zetten en daar de prijs achter zetten per oppervlakte eenheidzet in een cel vertikaal zoeken code

zie bijlage
 

Bijlagen

Uh, denk dat je me niet goed begrijpt.
Ik dacht hieraan, alleen dan moet het simpeler kunnen:
if Me.Oppervlakte > 0 And Me.Oppervlakte < 2 then
if soort = 1 then
if categorie = 1 then
Me.opp * 0,42 = me.Prijsperproduct
if categorie = 2 then
Me.opp * 0,41 = me.Prijsperproduct
if categorie = 3 then
Me.opp * 0,40 = me.Prijsperproduct
if soort = 2 then
if categorie = 1 then
Me.opp * 0,45 = me.Prijsperproduct
if categorie = 2 then
Me.opp * 0,44 = me.Prijsperproduct
if categorie = 3 then
Me.opp * 0,43 = me.Prijsperproduct
if soort = 3 then
if categorie = 1 then
Me.opp * 0,48 = me.Prijsperproduct
if categorie = 2 then
Me.opp * 0,47 = me.Prijsperproduct
if categorie = 3 then
Me.opp * 0,46 = me.Prijsperproduct
if Me.Oppervlakte >= 2 And Me.Oppervlakte < 5 then


enzovoort voor 10 diverse oppervlakten, 18 soorten en 3 categorien
 
Hoi,

Is natuurlijk niet zo moeilijk.

In access heb je allerlei ontzettend handige functies.
Een van die functies is de dFirst() functie.

Even terug naar jou select statement:
select prijs from prijzen where soortbewerking = "3" and categorie = "2" and oppervlakte-id = "5"

Dat kun je daarvoor gebruiken, alleen klopt ie niet helemaal. De id's zijn numerieke waarden (lange integers) dus daar mogen geen quotes omheen. Quotes zet je alleen om strings (tekst velden).

Wat je dus moet doen is de prijs ophalen uit de tabel. Daarvoor kun je de dFirst() functie gebruiken. Functies geven namelijk een waarde terug, en die waarde kun je gebruiken in berekeningen.

Aangenomen dat de prijs een double is, kun je dat met de volgende code doen:

Dim dblPrijs as Double
dblPrijs = dFirst("Prijs", "prijzen", "soortbewerking = 3 and categorie = 2 and oppervlakte-id = 5")

Vervolgens kun je met het dblPrijs gaan rekenen.

Waarschijnlijk lees je de verschillende id's van je formulier af, dan moet je de aanroep van de dFirst functie als volgt aanpassen:
dblPrijs = dFirst("Prijs", "prijzen", "soortbewerking =" & cstr(me.soortbewerking) & " and categorie = " & cstr(me.categorie) " and oppervlakte-id = " cstr(me.oppervlakte-id))

Kijk maar eens goed in de access help naar beschrijving van de dfirst() functie. Als je wat verder zoekt in de access help zul je nog veel meer handige functies tegenkomen.
 
Hartelijk dank. Heb ff gezweet, was bang dat ik alles moest typen.
 
Private Sub txtOppervlakte_BeforeUpdate(Cancel As Integer)
Dim dblPrijs As Double
Dim intOpp As Integer

If Me.txtOppervlakte > 0 & Me.txtOppervlakte <= 2 Then
intOpp = 1
Else
If Me.txtOppervlakte > 2 & Me.txtOppervlakte <= 5 Then
intOpp = 2
Else
If Me.txtOppervlakte > 5 & Me.txtOppervlakte <= 10 Then
intOpp = 3
Else
If Me.txtOppervlakte > 10 & Me.txtOppervlakte <= 20 Then
intOpp = 4
Else
If Me.txtOppervlakte > 20 & Me.txtOppervlakte <= 50 Then
intOpp = 5
Else
If Me.txtOppervlakte > 50 & Me.txtOppervlakte <= 250 Then
intOpp = 7
Else
If Me.txtOppervlakte > 250 Then
intOpp = 9



dblPrijs = dFirst("Prijzen", "prijzen", "Soortbewerking =" & cstr(me.cmbBewerking) & " and Categorie-id = " & cstr(me.cmbCategorie) "and Oppervlakte-id =" intOpp)
Me.txtStukprijs = dblPrijs
End Sub


Werkt niet? Hoe kan dat.
 
Zonder je database kan ik het niet met zekerheid zeggen.
Ik vermoed dat je de eerste parameter van de dFirst functie niet goed hebt.
Deze parameter moet het de naam van het veld bevatten dat je wilt uitlezen.
Moet dat niet prijs zijn in plaats van Prijzen?
 
Nee zo heb ik dat genoemd, vba heeft het over een

Compileerfout: Verwacht: lijstscheidingsteken of )
 
Kijk, met de foutmelding kun je ook wat gerichter zoeken!
Geef zoveel mogelijk informatie, dan is het makkelijker om de fout te vinden!

De fout zit in deze regel:
dblPrijs = dFirst("Prijzen", "prijzen", "Soortbewerking =" & cstr(me.cmbBewerking) & " and Categorie-id = " & cstr(me.cmbCategorie) "and Oppervlakte-id =" intOpp)

Het laatste argument van de dFirst functie is de WHERE clausule van het SELECT statement dat access voor je gaat uitvoeren. Jouw WHERE clausule is een concatinatie van strings. Concatinatie is een moeilijk woord voor aan elkaar plakken.
Strings plak je aan elkaar door het & teken: Totaalstring = string1 & string2.
In dit voorbeeld plak je dus de inhoud van de variabelen string1 en string2 aan elkaar en stopt het resultaat in Totaalstring. Als je niet met variabelen werkt dan ziet een concatinatie er als volgt uit: Totaalstring = "Een " & "foutje"
Het resultaat is de inhoud van variabele Totaalstring "Een foutje" wordt.
Jij bent in het laatste argument van de dFirst functie op een aantal plaatsen het concatinatie teken & vergeten.
Ook moeten alle zaken die je aan elkaar wilt plakken van het gegevenstype string zijn. De variabele intOpp is hoogstwaarschijnlijk een integer en dus geen string. Die zul je moeten converteren naar een string. Dat doe je met de cStr() functie. Dat stukje moet dus .... & cStr(intOpp) worden.

De regel moet er dus als volgt uitzien:
dblPrijs = dFirst("Prijzen", "prijzen", "Soortbewerking =" & cstr(me.cmbBewerking) & " and Categorie-id = " & cstr(me.cmbCategorie) & "and Oppervlakte-id =" & cStr(intOpp))
 
Bedankt voor de zeer duidelijke uitleg. Ik had idd het gevoel dat er iets fout zat met de & tekens, alleen kon ik nergens vinden waar die voor dienden.
 
Ik kom er niet uit,

mijn tabel prijzen ziet er zo uit:

Prijs-id numeriek dubbele precisie
Soortbewerking-id numeriek Lange Integer
Categorie-id numeriek Lange Integer
Oppervlakte-id numeriek Lange Integer
Prijzen numeriek Dubbele precisie

Mijn code ziet er alsvolgt uit:

Dim dblPrijs As Double
Dim intOpp As Integer

If Me.txtOppervlakte > 0 And Me.txtOppervlakte <= 2 Then
intOpp = 1
ElseIf Me.txtOppervlakte > 2 And Me.txtOppervlakte <= 5 Then
intOpp = 2
ElseIf Me.txtOppervlakte > 5 And Me.txtOppervlakte <= 10 Then
intOpp = 3
ElseIf Me.txtOppervlakte > 10 And Me.txtOppervlakte <= 20 Then
intOpp = 4
ElseIf Me.txtOppervlakte > 20 And Me.txtOppervlakte <= 50 Then
intOpp = 5
ElseIf Me.txtOppervlakte > 50 And Me.txtOppervlakte <= 250 Then
intOpp = 7
ElseIf Me.txtOppervlakte > 250 Then
intOpp = 9
End If

dblPrijs = DFirst("Prijzen", "prijzen", "Soortbewerking =" & CStr(Me.cmbBewerking) & " and Categorie-id = " & CStr(Me.cmbCategorie) & "and Oppervlakte-id =" & CStr(intOpp))
Me.txtStukprijs = CStr(dblPrijs)

en mijn foutmelding is:

fout 2001 tijdens uitvoering:
u hebt de vorige bewerking geannuleerd

en dan wordt de volgende regel aangewezen:
dblPrijs = DFirst("Prijzen", "prijzen", "Soortbewerking =" & CStr(Me.cmbBewerking) & " and Categorie-id = " & CStr(Me.cmbCategorie) & "and Oppervlakte-id =" & CStr(intOpp))

Wat doe ik nu fout?
 
Vanuit deze code is de oorzaak niet aan te wijzen. Access is meestal duidelijk in zijn foutmeldingen, in dit geval ook. Waarschijnlijk heb je inderdaad voordat deze code uitgevoerd wordt ergens een bewerking geannuleerd.
Post je mdb, dan is het makkelijker om de fout te vinden.

Voor de onderhoudbaarheid van je code zou ik overigens die if then else constructie vervangen door ene SELECT CASE constructie. Dat is veel leesbaarder.
 
Ik krijg m niet onder de 100 kb. hoe moet ik m dan posten? ik heb m al gecomprimeerd.
 
Sloop de zaken eruit die niets met het probleem te maken hebben, comprimeer nogmaals.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan