aantal codes vermenigvuldigen met bedrag en bij andere tbl plakken

  • Onderwerp starter Onderwerp starter scw
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

scw

Gebruiker
Lid geworden
5 jun 2009
Berichten
530
Hier nog een vraagje van mij:

Ik zit namelijk met het volgende. Ik heb een tabel met allemaal orders (unieke order ID) en een aparte tabel met bewerkingen (bevat overeenkomende order ID's).

tblBewerkingen bevat zes kolommen: OrderID en Bewerking 1 t/m 5. In de Bewerkingen kolommen staat een code van vier tekens. Wanneer er geen bewerking heeft plaatsgevonden is het veld blanco. Er kunnen achter een record twee codes (bewerkingen) staan, maar ook vijf.

Nu wil ik eigenlijk achter iedere orderregel in tblOrders een totaalbedrag hebben van de bewerkingen, dus een kolom erbij Totaalbedrag. Vooralsnog hebben alle bewerkingen ��n zelfde prijs (maar wie weet, veranderd dit nog).

Hoe kan ik dit het beste aanpakken??

Alvast bedankt voor de hulp,

:thumb: scw
 
De tekst:
tblBewerkingen bevat zes kolommen: OrderID en Bewerking 1 t/m 5.
geeft aan dat je database niet goed is genormaliseerd. Bewerking 1 t/m 5 is namelijk een repeating group.

Je queries worden een stuk eenvoudiger als je goed hebt genormaliseerd.

Kijk op wikipedia. Databasenormalisatie

HTH:D
 
Ik begrijp zo ongeveer wat je bedoeld. Probleem is echter dat ik de tblBewerkingen importeer naar Access vanuit een ander programma. Vervolgens weet ik nu nog niet welke vervolgstappen ik moet nemen om te normaliseren en vervolgens te berekenen natuurlijk... :rolleyes:
 
Kan iemand mij een stukje op weg helpen??? :rolleyes: Bedankt!
 
Waarmee precies? De opmerking van Guus over het normaliseren is op zich uiteraard helemaal correct, maar je moet jezelf ook de vraag stellen of je de db tot het gaatje moet normaliseren. Je kunt een db namelijk ook helemaal dood normaliseren.. Stom voorbeeldje: een postcode tabel bevat (uiteraard) het veld Postcode. Dit bestaat uit 4 cijfers, en twee letters. De lettercombinaties komen geheid meerdere keren voor; elke stad kent wel een postcode ####AA, en #####AB. Je kunt dus zeggen: die lettercombinaties zijn herhalend, dus daar maak ik een aparte tabel voor. Prima genormaliseerd, maar ik durf rustig iedereen uit te nodigen voor een etentje die dat zo oplost... Dus je kunt met normaliseren ook te ver gaan.
Als ik zie dat jij 5 velden hebt die je moet bewerken, dan denk ik dat je dat niet perse hoeft te normaliseren. Het hangt er maar vanaf wat je met die velden/data moet doen.

Vandaar de vraag: wat wil je doen met die tabel?
 
OK ik heb even e.e.a. proberen te verduidelijken in het volgende .doc bestandje. :)
 

Bijlagen

Heb je een vaste regel voor de tarieven? Als je met wisselende bedragen wilt kunnen werken, moet je die prijs kunnen relateren aan iets, bijvoorbeeld een soort bewerking. Voor de formule maakt het niet uit: in bijgaand voorbeeldje ben ik wat aan het stoeien geweest met verschillende bedragen.
 
Stom voorbeeldje: een postcode tabel bevat (uiteraard) het veld Postcode. Dit bestaat uit 4 cijfers, en twee letters. De lettercombinaties komen geheid meerdere keren voor; elke stad kent wel een postcode ####AA, en #####AB. Je kunt dus zeggen: die lettercombinaties zijn herhalend, dus daar maak ik een aparte tabel voor. Prima genormaliseerd,

Laten we het houden op een "stom voorbeeldje", want dit heeft niets te maken met normalisatie
 
@ Octafish: Perfecto! Precies zoals ik het bedoelde!! Wat zou ik moeten veranderen als ik de variabele prijzen in een aparte tabel zou willen plaatsen: dit om het makkelijker te maken voor de gebruikers om zelf prijzen te veranderen... anders heb je natuurlijk kans dat zij deze query verknoeien. Want hoe kan ik dan daarnaar verwijzen in de criteria?

@ Harry46: no offence, maar je komt helemaal nog niet in deze post voor en dan kom je inene binnenvallen met kritiek op iemand z'n inbreng; ik vind het behoorlijk chagrijnig overkomen. Mogelijk is dit specifieke voorbeeldje dan wat ongelukkig, Octafish probeert wel behulpzaam te zijn... wat hem uiteindelijk gelukt is ook. Guus2005 geeft een bepaalde richting aan, maar Octafish komt gewoon met dé oplossing/het resultaat.
 
Laten we zeggen dat Harry een slechte dag heeft gehad ;) Als ik zelf al zeg dat het een stom voorbeeldje is, dan hoeft hij dat wat mij betreft niet te herhalen... Overigens heeft het voorbeeld wel degelijk te maken met normalisatie; maar dan zal het wel in de richting van de 5NF gaan; in ieder geval een niveau waar je niet blij van wordt. Maar genoeg over de postcodes.

Je kunt de prijs uiteraard uit een tabel halen, bijvoorbeeld met een Lookup. Dat heb ik in bijgaand voorbeeldje voor je neergezet.
 
Laten we het houden op een "stom voorbeeldje", want dit heeft niets te maken met normalisatie
Is inderdaad een dom voorbeeldje. Je moet niet verder normaliseren dan de BCNF. Ik ben eens gedetacheerd bij een bedrijf waar ze dat wel hadden gedaan om maar te voorkomen dat er een record was waar in een van de velden de waarde NULL zat. Dan schiet je je doel voorbij.

Je normaliseert een database om te voorkomen dat je onzinnige/langdurige/veel resources gebruikende queries krijgt.
Voorbeeld:

Tabel Hypotheek.
Velden: Id, KlantId, Behandelaar1, Behandelaar2, Behandelaar3, Fiatteur1, Fiatteur2

Als je nu wil weten welke hypotheken Janssen allemaal behandeld heeft dan krijg je de volgende query.
Code:
Select * from Hypotheek where Behandelaar1 = "Janssen" or Behandelaar2 = "Janssen" or Behandelaar3 = "Janssen".
Ziet er nog simpel uit. Wat nu als er een behandelaar bijkomt? Dan moet je je datamodel aanpassen om een behandelaar toe te voegen.

Maak een tabel HypBehFiat met de velden Id, HypId, Persoon, Soort. Hierin is Persoon de naam van de Behandelaar of Fiatteur en in het veld Soort kan je een B(ehandelaar) of een F(iatteur) invullen.

Als ik nu alle hypotheken wil hebben waarin Janssen iets gedaan heeft dan wordt het redelijk eenvoudig:
Code:
Select * from Hypotheek where Id in (Select HypId from HypBehFiat where Persoon = "Janssen")
Je kan nu ook eenvoudig andere soorten toevoegen. En iedere hypotheek kan erg veel behandelaars/fiatteurs hebben.

In bovenstaand voorbeeld heb ik bewust gekozen voor namen in Behandelaar, Fiatteur en Persoon ter illustratie van het probleem. Onder ideale (genormaliseerde) omstandigheden zouden hier PersoonId's moeten staan. Voor het veld Soort in de tabel HypBehFiat zou ik ook een Id gekozen hebben als referentie naar de tabel Soort.

Ter illustratie, ik hoop dat je het nu beter snapt.

HTH:D
 
Laten we zeggen dat Harry een slechte dag heeft gehad ;) Als ik zelf al zeg dat het een stom voorbeeldje is, dan hoeft hij dat wat mij betreft niet te herhalen... Overigens heeft het voorbeeld wel degelijk te maken met normalisatie; maar dan zal het wel in de richting van de 5NF gaan; in ieder geval een niveau waar je niet blij van wordt. Maar genoeg over de postcodes.

Je kunt de prijs uiteraard uit een tabel halen, bijvoorbeeld met een Lookup. Dat heb ik in bijgaand voorbeeldje voor je neergezet.
@Octafish: Je steekt altijd veel tijd in je antwoorden en ik ben ervan overtuigd dat je weet waar je over praat maar je voorbeeldje was wat ongelukkig gekozen.

Bedankt voor je bijdragen!
 
opgelost

Superbedankt Octa! :D Ik begrijp nu ook het toepassen van de Dlookup in de criteria. Nu kan ik het gebruiksvriendelijker maken en minder risico op verknoeien. Ik ga dit topic gauw sluiten voor een heel andere discussie ontstaat over normaliseren. :thumb:
 
Arrgghhhh, zit ik toch nog een middag te tobben... en kom ik er ook nog eens niet uit. Wat er anders is in de werkelijke versie en jou voorbeeld is dat in jou voorbeeld de tarieven letterlijk helemaal in een aparte tabel staan. In m'n database staan de tarieven in een kolom in de tblBewerkingscodes. Deze tabel geeft alle codes weer welke er voor de bewerkingen zijn. tblBewerkingen geeft weer welke bewerkingen er hebben plaatsgevonden. Dat is het verschil.

Code:
IIf([Bewerking1] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","Bewerking1=Bewerkingscode"))

Waar Bewerkingscode dus "AAA" is of bijv. "EEE".

Nu dacht ik dat zo op te lossen, of geprobeerd:

Code:
Bewerkingscode = Bewerking1

of

Code:
Bewerkingscode = Bewerkingscode

Maar ik krijg telkens een Access Exclamation (error) 'Unknown', zonder verdere info... Arrrghhhh :confused:
 
Als je de code in mijn voorbeeldje bekijkt, zie je dat ik daar match op het veld PrijsID. Dit is een Numeriek veld. In jouw voorbeeld lijk je te matchen op een Tekstveld... En dan ziet de code er een tikkie anders uit.
Code:
IIf([Bewerking1] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","Bewerking1='"&[Bewerkingscode]& "'"))
 
Laatst bewerkt:
bijna...

:eek: Jah dat maakt nogal verschil inderdaad tekst vs. numeriek! Had ik nog lang kunnen doorgaan... Nou ik heb het gevoel dat het bijna werkt, maar het werkt zoals je begrijpt nog niet helemaal:
Access geeft gelukkig geen foutmeldingen, hij doet een halve minuut over de query draaien (goed teken!), vervolgens geeft die aan of alles geupdate mag worden: klik op ja. Dan kijk ik in de tblOrders, maar dan zie ik dat de kolom 'Totaalbedrag' nog steeds helemaal leeg is. Access geeft aan 25844 rijen bijgewerkt te hebben, maar tblOrders bestaat er uit ongeveer 400.000 rijen. tblBewerkingen bestaat wel uit 26000 rijen precies. Ik pas de volgende code toe:


Code:
UPDATE tblOrders INNER JOIN tblBewerkingen ON tblOrders.OrderID=tblBewerkingen.Orderno SET tblOrders.Totaalbedrag = IIf([BEWERKING1] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING1] & "'"))+IIf([BEWERKING2] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING2] & "'"))+IIf([BEWERKING3] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING3] & "'"))+IIf([BEWERKING4] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING4] & "'"))+IIf([BEWERKING5] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING5] & "'"));
 
Laatst bewerkt:
:confused: Heeft iemand nog een idee wat hier nog verkeerd gaat??

;)Bedankt, scw!
 
Bij een Update query werk je één tabel bij; volgens mij hoef je dan ook geen koppeling te maken met een andere tabel.
Code:
UPDATE tblOrders SET Totaalbedrag = IIf([BEWERKING1] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING1] & "'"))+IIf([BEWERKING2] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING2] & "'"))+IIf([BEWERKING3] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING3] & "'"))+IIf([BEWERKING4] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING4] & "'"))+IIf([BEWERKING5] Is Null,0,DLookUp("[Tarief]","tblBewerkingscodes","BEWERKINGSCODE='" & [BEWERKING5] & "'"));
Probeer 'm dus eens zo...
 
:d Jah hij werkt nu al beter: hij zegt het echte totaal records bijgewerkt te hebben, vervolgens vult Access overal een nulletje in. Het enige is dat ik 5x een prompt krijg voor het invullen van een waarde van bewerking 1 t/m5. Hij weet dus niet wat Bewerking1 t/m5 is... vreemd, want hij tblBewerkingscodes staat er toch in genoemd?? :confused:
 
De parametervraag krijg je denk ik omdat je bij de uitvoering de juiste velden niet hebt. Je zou de query eens opnieuw kunnen maken met gebruik van de juiste velden en tabellen. Als je de code dan uitvoert, en hij werkt, dan kun je vervolgens de SQL die je hebt gemaakt met die query als basis gebruiken voor je procedure.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan