16. juli 2008 - 15:01Der er
27 kommentarer og 1 løsning
Erstatning for VLookUp til bestemmelse af priser.
Hej Eksperten..
Jeg har forsøgt at finde en erstatning for en VLookUp funktion som jeg tidligere har benyttet i et Excel regneark, men da denne funktion ikke findes i access må jeg finde en måde at lave de samme beregninger på.
Det drejer sig om en pris der skal bestemmes ud fra hvilken zone en vare skal leveres til. Hvis fx. hvis en vare af type "1" skal leveres til zone 1, så koster det 10 kr, og hvis den skal leveres til zone 2 så 17 kr.. osv.. men lige præcis hvilken funktion jeg skal bruge for at undgå og rode mig ud i en utroligt masse IIF, er jeg ikke helt klar over.
i det excel dokument hvor jeg benytter VLookUp står der i en tabel zone ned af rækkerne og Varetype i kollonerne, og priserne for disse finder jeg så frem ved at bruge et VLookUp som ser ud som følgende:
VLookUp(Pris;$B$4:$N$10;B18+1)
Håber der er nogen der kan forstå mit spørgsmål, ellers skal jeg nok uddybe yderligere.
Sounds to me as though you need a table which contains a list of different prices for the different zones. Then you can use Dlookup to get the price for a specific vare for a specific zone
If we are talking about many vare and maybe many zones then I would strongly suggest a table. This will allo you to add and change vare/priser without having to alter code.
Jeg har allerede en Pris-tabel, hvor priser og zoner hænger sammen, så en Select Case er nok ikke lige det jeg er ude efter. Jeg tænkte nok at det var noget med DLookup, men helt præcist hvordan jeg får lavet et stykke kode med Dlookup er jeg ikke helt sikker på, og hvis i kunne give mig et eksempel ville det hjælpe meget.
Jeg har lavet en tabel, hvor der ud for hver varetype, er lavet en kolonne for hver zone (altså Zone1, Zone2, Zone3 osv), men hvordan får jeg så lavet lavet et stykke kode, som giver mig prisen for en varetype når den skal leveres til en zone?
Min tabel ser ud som følgende:
[PrisID] [PrisNavn] [Zone1] [Zone2] [Zone3] 1 Tekst 10 17 25 2 Tekst 20 25 30 3 Tekst 30 40 50
Og når man så indtaster fx: [PrisID] = 2 og [Zone] = 2, så skal jeg have værdien/prisen = 25
Jeg kan ikke helt se hvordan jeg skal få indsat et kriterie med Zone i, som så skal kunne finde den rigtige af Zone(X) kolonnerne?
i det du skriver, vil den vel altid få ud og kigge under Zone1, men så kan man vel lave en if-sætning som først ser på hvilken værdi af zone der er indtastet, og så efterfølgende bruger dette til at lede i den rigtige kolonne?
Jeg kan godt se hvad du mener terry, at det ikke er særlig anvendeligt hvis der skal tilføjes flere zoner, men synes bare der bliver meget indtastningsarbejde hvis man skal sidde og ordne en kopi af en post for hver zone, og specielt hvis der kommer mange zoner.
Jeg ville overveje at ændre databasens struktur således, at du i pristabellen har alle zoner i samme felt. Derefter ved hjælp af en kombinationsboks henter korrekte data. Der skal være en relation mellem dine tabeller.
Nej, det er godt nok ikke så smart. Hmm.. jeg må lige finde ud af hvordan det skal løses, og om der overhovedet er behov for at der skal kunne oprettes flere zoner.
Jeg har i hvert fald fået en løsning på hvordan jeg får lavet et stykke kode :o) Jeg lukker spørgsmålet, og siger mange tak for hjælpen :)
Nu har jeg så fundet frem til, at det skal laves på den måde som jeg startede med, fordi der ikke kommer til at blive tilføjet mere end 10 Zoner.
Jeg kan nu bare ikke få følgende til at fungere: Select Case Me.zone Case Is = 1 Me.ZonePris = DLookup("[Zone1]", "tblPriser1", "[PrisID]= " & Me.GodsID)
Case Is = 2 Me.ZonePris = DLookup("[Zone2]", "tblPriser1", "[PrisID]=" & Me.GodsID)
Case Is = 3 Me.ZonePris = DLookup("[Zone3]", "tblPriser1", "[PrisID]= " & Me.GodsID)
Case Is = 4 Me.ZonePris = DLookup("[Zone4]", "tblPriser1", "[PrisID]= " & Me.GodsID)
Case Is = 5 Me.ZonePris = DLookup("[Zone5]", "tblPriser1", "[PrisID]= " & Me.GodsID)
Case Is = 6 Me.ZonePris = DLookup("[Zone6]", "tblPriser1", "[PrisID]= " & Me.GodsID)
Case Is = 7 Me.ZonePris = DLookup("[Zone7]", "tblPriser1", "[PrisID]= " & Me.GodsID)
Case Is = 8 Me.ZonePris = DLookup("[Zone8]", "tblPriser1", "[PrisID]= " & Me.GodsID)
Case Is = 9 Me.ZonePris = DLookup("[Zone9]", "tblPriser1", "[PrisID]= " & Me.GodsID)
Case Is = 10 Me.ZonePris = DLookup("[Zone10]", "tblPriser1", "[PrisID]= " & Me.GodsID)
End Select
Jeg får bare en fejl hvor den skriver: Run-time error '3075'
Der er en syntaksfejl, fordi der mangler en operator i forespørgselsudtrykket "[PrisID] = 25A"
hvor 25A er et bestemt PrisID i tblPriser1 PrisID er i en relation med GodsID og GodsID befinder sig i tblSending.
Hvis du nu har en tabel - tblPrices I den har du et felt der hedder fldVare_Type (nummerisk) og x antal felter der hedder fldZone_01,fldZone_02 o.s.v. op til fldZone_99 Så kan du kalde nedenstående funktion fhpFind_Price(2,3) for at finde prisen for varegruppe 2 i zone 3 Den er nem at udvide og nem at vedligeholde. Og så undgår du at anvende DLookup som måske er nem at bruge, men ikke særlig smart rent resourcemæssig (den bruger alt for mange resourcer og frarådes med mindre det er strengt nødvendigt)
Public Function fhpFind_Price(intVare_Type As Integer, intZone As Integer) As Long ' ----------------------------------------------------------------------------------- ' Purpose : ' Parameters : ' Returns : ' Created : 16-07-2008 ' Modified : ' Remarks : ' ----------------------------------------------------------------------------------- On Error GoTo Error_fhpFind_Price Dim lngResult As Long Dim strSQL As String Dim strField_Name As String Dim rst As New ADODB.Recordset
strField_Name = "fldZone_" & Trim(Format(intZone, "00")) strSQL = "SELECT * FROM tblPrices WHERE fldVare_Type = " & intVare_Type
Exit_fhpFind_Price: fhpFind_Price = lngResult Exit Function
Error_fhpFind_Price: lngResult = 0 Select Case Err.Number Case 3021 Case 2501 Case Is < 0 Resume Next Case Else MsgBox Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error in procedure 'fhpFind_Price'" End Select Resume Exit_fhpFind_Price
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.