Avatar billede ogodt Nybegynder
30. august 2007 - 11:47 Der er 4 kommentarer

indsætte værdi i felt hvis følgende ord indgår i andet felt

hej,

jeg har en DB 2000 hvor jeg på en formular har et udtryk-felt som samler 3 andre felter, der kan så i udtryks-feltet stå f.eks. ben, bord og stol, i et andet felt (værdi) fremkommer der en værdi ud fra udtryks-feltet, hvis f.eks der står ben bord stol skal værdien være 200.

Og nu kommer mit spørgsmål, indtil videre er der ca. 140 forskellige kombinationer i udtyks-feltet, men jeg vil gerne have det sådan at hvis f.eks ordet "hjul" fremkommer skal værdien uanset de andre ord være 50 og hvis ordet "bil" fremkommer skal værdien være 20, der skal gerne laves ca. 6 "hvis ordet fremkommer".

Dette er for at undgå yderliger 100 kombinationer og meget arbejde og for at fremtidssikre det.

Puha, den var lang, jeg håber der er nogen der forstår hvad jeg mener.

vh,
Ole
Avatar billede kjulius Novice
30. august 2007 - 14:08 #1
Tja, jeg er ikke helt sikker på, at jeg forstår dit problem, men måske kan du gøre det med en konstruktion som:

Function AssignValue(Kombistring As String) As Integer

    If InStr(Kombistring, "bil") > 0 Then
        AssignValue = 20
    ElseIf InStr(Kombistring, "hjul") > 0 Then
        AssignValue = 50
    ElseIf InStr(Kombistring, "ben") > 0 And InStr(Kombistring, "bord") > 0 And InStr(Kombistring, "stol") > 0 Then
        AssignValue = 200
    End If
   
End Function
Avatar billede ogodt Nybegynder
30. august 2007 - 14:34 #2
som jeg læser dit forslag tager den kun højde for "ben bord stol" men der kan jo være ca. 150 kombinationer f.eks: "bil, ben"; "sort, rød"; "hus, sten, tag" etc etc

du kan se dette link hvordan jeg indtil nu har lavet det http://www.eksperten.dk/spm/793605

Den forklarer forhåbeligt lidt.
Avatar billede kjulius Novice
30. august 2007 - 16:58 #3
Okay, du vil hellere have det som et opslag i en tabel og foretaget i SQL. Ja, det er sikkert også det mest fornuftige og gennemtænkte set i en vedligeholdelsessammenhæng.

Okay, så vil jeg foreslå, at du opretter en ekstra tabel med kombinationer og tilhørende point (eller hvad det nu er) for de ord som bare skal forekomme.

Nu antager jeg, at du har disse tre tabeller:

dinOrdTabel
Id, Ord1, Ord2, Ord3

dinKombiordPointTabel
Id, Ord1, Ord2, Ord3, Point

dinForekomstOrdPointTabel
Id, Ord, Point

hvor dinOrdTabel er det udgangspunkt du har og de to andre indeholder ordene og deres tilhørende point.


Så burde du kunne gøre sådan her:


SELECT o.Ord1, o.Ord2, o.Ord3, o.Ord1 & o.Ord2 & o.Ord3 AS Kombiord, Nz(p1.Point, Nz(p2.Point, 0)) AS Point
FROM dinOrdTabel o
LEFT JOIN dinForekomstordPointTabel p1 ON (o.Ord1 = p1.Ord Or o.Ord2 = p1.Ord Or o.Ord3 = p1.Ord)
LEFT JOIN dinKombiordPointTabel p2 ON
(Nz(o.Ord1,"")=Nz(p2.Ord1,"") And Nz(o.Ord2,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"")) Or (Nz(o.Ord1,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord2,"")=Nz(p2.Ord3,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord1,"") And Nz(o.Ord1,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord1,"")=Nz(p2.ord3,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord1,"")=Nz(p2.Ord2,"") And Nz(o.Ord2,"")=Nz(p2.Ord3,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord2,"")=Nz(p2.Ord2,"") And Nz(o.Ord1,"")=Nz(p2.Ord3,""))
Or
(Nz(o.Ord1,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"")) Or (Nz(o.Ord1,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord2,"")=Nz(p2.Ord2,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord1,"") And Nz(o.Ord1,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord1,"")=Nz(p2.ord2,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord1,"")=Nz(p2.Ord3,"") And Nz(o.Ord2,"")=Nz(p2.Ord2,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord2,"")=Nz(p2.Ord3,"") And Nz(o.Ord1,"")=Nz(p2.Ord2,""))
Or
(Nz(o.Ord1,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"")) Or (Nz(o.Ord1,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord2,"")=Nz(p2.Ord3,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord2,"") And Nz(o.Ord1,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord1,"")=Nz(p2.ord3,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord1,"")=Nz(p2.Ord1,"") And Nz(o.Ord2,"")=Nz(p2.Ord3,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord2,"")=Nz(p2.Ord1,"") And Nz(o.Ord1,"")=Nz(p2.Ord3,""))
Or
(Nz(o.Ord1,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"")) Or (Nz(o.Ord1,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord2,"")=Nz(p2.Ord1,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord2,"") And Nz(o.Ord1,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord1,"")=Nz(p2.ord1,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord1,"")=Nz(p2.Ord3,"") And Nz(o.Ord2,"")=Nz(p2.Ord1,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord2,"")=Nz(p2.Ord3,"") And Nz(o.Ord1,"")=Nz(p2.Ord1,""))
Or
(Nz(o.Ord1,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"")) Or (Nz(o.Ord1,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord2,"")=Nz(p2.Ord2,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord3,"") And Nz(o.Ord1,"")=Nz(p2.Ord1,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"") And Nz(o.Ord1,"")=Nz(p2.ord2,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord1,"")=Nz(p2.Ord1,"") And Nz(o.Ord2,"")=Nz(p2.Ord2,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord2,"")=Nz(p2.Ord1,"") And Nz(o.Ord1,"")=Nz(p2.Ord2,""))
Or
(Nz(o.Ord1,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"")) Or (Nz(o.Ord1,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord2,"")=Nz(p2.Ord1,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord3,"") And Nz(o.Ord1,"")=Nz(p2.Ord2,"") And Nz(o.Ord3,"")=Nz(p2.Ord1,"")) Or (Nz(o.Ord2,"")=Nz(p2.Ord3,"") And Nz(o.Ord3,"")=Nz(p2.Ord2,"") And Nz(o.Ord1,"")=Nz(p2.ord1,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord1,"")=Nz(p2.Ord2,"") And Nz(o.Ord2,"")=Nz(p2.Ord1,"")) Or (Nz(o.Ord3,"")=Nz(p2.Ord3,"") And Nz(o.Ord2,"")=Nz(p2.Ord2,"") And Nz(o.Ord1,"")=Nz(p2.Ord1,""))


Da der er brugt left outer joins vil der blive returneret null, hvis kriteriet ikke opfyldes. Da Nz funktionen i SELECT delen sørger for, at der bliver prioriteret mellem de forskellige point-værdier der returneres, sikres det, at din "findes i" fra dinForekomstordPointTabel bliver prioriteret over en evt. samtidig returneret værdi fra den hvor alle ord skal forefindes (dinKombiordPointTabel).


På sin vis kunne det sikkert have været lettere at søge med LIKE i det sammensatte ord, men der er nogle faldgruber, som du undgår ved at teste på alle kombinationerne i stedet, selv om det jo giver en meget lang SQL sætning.

Ved at teste på alle kombinationerne i forespørgslen undgår du også at skulle oprette rækker for alle kombinationerne. Testen på disse kombinationer laves i forespørgslen, hvilket er lettere og sikrere.
Avatar billede Slettet bruger
04. september 2007 - 09:29 #4
Det nemmeste vil jo nok være at køre en dlookup når felterne er udfyldt, den skal så udfylde point feltet. Herefter kan man bare lave en elseif sætning e.lign. som overskriver hvis et af felterne er et af dine "specielle" ord.

Man hvad du egentlig sidder og roder med, syntes jeg er temmelig vanskeligt at gennemskue!~)
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