Avatar billede xzaboo Praktikant
16. juli 2008 - 15:01 Der 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.

Mvh.
Steffen
Avatar billede terry Ekspert
16. juli 2008 - 15:08 #1
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
Avatar billede mugs Novice
16. juli 2008 - 15:09 #2
Du kan i stedet for mange If-sætninger benytte en Select Case struktur. Det er en form for "udvidet If":

Select Case type
Case Is = "1"
me.pris = 10
Case is = "2"
me.pris = 20
end select

Hvor type indeholder varetype og pris er feltet med prisen.
Avatar billede terry Ekspert
16. juli 2008 - 15:18 #3
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.
Avatar billede xzaboo Praktikant
16. juli 2008 - 15:49 #4
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

Mvh.
Steffen
Avatar billede mugs Novice
16. juli 2008 - 15:54 #5
I VBA:

intsearch = Me!ID
Me!PrisID = DLookup("[Zone1]", "Tabelnavn", "[PrisID]=" & intsearch)

Men du skal have 2 kriterier for henholdsvis PrisId og Zone.
Avatar billede terry Ekspert
16. juli 2008 - 15:57 #6
I dont think your table is correct, it means youhave to alter the table to add new zones!

PrisID] [PrisNavn]     [Zone] [Pris]
1    tekst        1    10
1    tekst        2    17
1    tekst        3    25
Avatar billede mugs Novice
16. juli 2008 - 15:58 #7
Noget i stil med dette:

DLookup("[Prisid]", "tabelnavn", "[prisid] = " & Me.prisid  & " And [zone2] = " & Me.zone2)
Avatar billede terry Ekspert
16. juli 2008 - 16:00 #8
Then you would use
= DLookup("[Pris]", "Tabelnavn", "[PrisID]= " Me.PrisID & " AND Zone = " & me.Zone)
Avatar billede xzaboo Praktikant
16. juli 2008 - 16:00 #9
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?
Avatar billede terry Ekspert
16. juli 2008 - 16:02 #10
If you use you original layout you would need a Dlookup for each zone!
Again this would require alterations to code if you needed new zones.
Avatar billede terry Ekspert
16. juli 2008 - 16:03 #11
"...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? .."

This is becuase your table design is wrong.
Avatar billede xzaboo Praktikant
16. juli 2008 - 16:04 #12
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.
Avatar billede terry Ekspert
16. juli 2008 - 16:06 #13
If you dont change your design you would need to use IIF or a SELECT CASE

Select Case Me.Zone
Case = 1
me.pris = DLookup("[zone1]", "Tabelnavn", "[PrisID]= " Me.PrisID )
Case = 2
me.pris = me.pris = DLookup("[zone2]", "Tabelnavn", "[PrisID]= " Me.PrisID )

Case = 3

me.pris = me.pris = DLookup("[zone3]", "Tabelnavn", "[PrisID]= " Me.PrisID )

end select


Not very smart
Avatar billede mugs Novice
16. juli 2008 - 16:07 #14
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.
Avatar billede xzaboo Praktikant
16. juli 2008 - 16:09 #15
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 :)
Avatar billede terry Ekspert
16. juli 2008 - 16:10 #16
"...og specielt hvis der kommer mange zoner."

Which would require alteration to code if you dont change your layout.


Actually I would suggest having a table with vare (prisID?).

VareID, Varetekst

Then another table

VareID, Zone, Pris
Avatar billede terry Ekspert
16. juli 2008 - 16:12 #17
selv tak.

It may give a bit more work entering the data but once it sin then everything else will work better
Avatar billede xzaboo Praktikant
16. juli 2008 - 19:34 #18
Hej igen..

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.
Avatar billede terry Ekspert
16. juli 2008 - 19:41 #19
If a PrisID is text "25A" then you need to alter your Dlookup

Me.ZonePris = DLookup("[Zone10]", "tblPriser1", "[PrisID]= '" & Me.GodsID "'")
Avatar billede terry Ekspert
16. juli 2008 - 19:43 #20
You could try this which could get around having to use SELECT CASE


Me.ZonePris = DLookup("Zone" & Me.zone , "tblPriser1", "[PrisID]= " & Me.GodsID)
Avatar billede terry Ekspert
16. juli 2008 - 19:44 #21
and that would be if Prisid is text

Me.ZonePris = DLookup("Zone" & Me.zone, "tblPriser1", "[PrisID]= '" & Me.GodsID "'")
Avatar billede xzaboo Praktikant
16. juli 2008 - 20:27 #22
Hvis jeg nu kunne tænke mig at bruge DLookUp i i forespørgsel, hvordan ser koden så ud?
Avatar billede mugs Novice
16. juli 2008 - 20:40 #23
Eksempel hentet fra anden db:

Udtryk2: DLookUp("[Gade]";"Tabel2";"[ID]=" & [ID])
Avatar billede xzaboo Praktikant
16. juli 2008 - 21:03 #24
mange tak mugs :)
Avatar billede hugopedersen Nybegynder
16. juli 2008 - 21:42 #25
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
 
  rst.Open strSQL, CurrentProject.Connection, adOpenStatic, adLockOptimistic
 
  lngResult = Nz(rst(strField_Name), 0)

  rst.Close
  Set rst = Nothing

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

End Function
Avatar billede hugopedersen Nybegynder
16. juli 2008 - 21:43 #26
Jeg har eksemplet i en lille db, hvis det er - drop bare en mailadresse
Avatar billede xzaboo Praktikant
17. juli 2008 - 10:43 #27
Hej Hugo.. ser meget spændende ud, så vil jeg da gerne have:
poul@pollo.dk
Avatar billede hugopedersen Nybegynder
17. juli 2008 - 16:49 #28
Eksemplet er sendt til adressen.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester