webForumDet fria alternativet

Problem med AND sats. (fundersam)

10 svar · 421 visningar · startad av Brimba

BrimbaMedlem sedan dec. 19995 875 inlägg
#1

Hej!

Låt mig säga att jag har en tabell som ser ut så här:

ID Artikel Artikelserie

Hur gör jag för att lista alla Artiklar som har samma ID och som har en Artikelserie där artiklarna MÅSTE vara i artikelserie 4 & 9.

OBS!

Det går inte att skriva så här:

SQLStmt = "SELECT tabOrderArt.OrderID, tabOrderArt.ArtID FROM tabArt INNER JOIN tabOrderArt ON tabArt.ArtID = tabOrderArt.ArtID WHERE (tabArt.UnderKatID=9) OR (tabArt.UnderKatID=4) GROUP BY tabOrderArt.OrderID, tabOrderArt.ArtID HAVING tabOrderArt.OrderID = " & Session("OrderID") & ""

Det går inte heller att skriva så här:

SQLStmt = "SELECT tabOrderArt.OrderID, tabOrderArt.ArtID FROM tabArt INNER JOIN tabOrderArt ON tabArt.ArtID = tabOrderArt.ArtID WHERE (tabArt.UnderKatID=9) AND (tabArt.UnderKatID=4) GROUP BY tabOrderArt.OrderID, tabOrderArt.ArtID HAVING tabOrderArt.OrderID = " & Session("OrderID") & ""

ID är alltså inte unikt.

Det kan tex se ut så här:

---------------------------
1050 Artikel1 4
1050 Artikel2 4
1050 Artikel3 4
---------------------------
Ovan kommer alltså inte att komma med

---------------------------
1050 Artikel1 4
1050 Artikel2 9
1050 Artikel3 4
---------------------------
Oven innehåller både 9 & 4 och kommer att innehålla information

---------------------------
1050 Artikel1 2
1050 Artikel2 2
1050 Artikel3 2
---------------------------
Ovan kommer inte att innehålla någon information

Hoppas ni förstår hur jag vill lägga upp det, tack!

///Patrik

BrimbaMedlem sedan dec. 19995 875 inlägg
#2

Jag har ju en lösning i huvudet som lyder att man har en räknare.

Först kollar man om ordern innehåller en 4:a

Och om den gör det så skapas en variabel med siffran 1.

Sedan kör man en ny SQL sats och kollar om ordern innehåller en 9:a och isåfall plussar den på ytterligare en 1:a vilket medför att värdet på variabeln blir en 2:a och sedan kollar man om värdet på variabeln är 2 eller mindre för då kan man ju skilja på det.

Men detta tycker jag är en mycket dålig lösning och tänker inte göra det föränn någon vänlig själ har hjälpt mig :e

///Patrik

emissionMedlem sedan dec. 19996 721 inlägg
#3

Jag fattar ingenting, Brimba ;)

Försök att förklara igen..

BrimbaMedlem sedan dec. 19995 875 inlägg
#4

Ok, jag förklarar vad jag skall ha det till och du ger mig en lösning :)

Så här är det.

När folk beställer så vet dem kanske inte om de vill ha datorn byggd eller inte, det finns folk som har kryssat i att de vill vi skall bygga deras beställning när de endast har beställt en cd-skiva och en cd-spelare.

För att undvika detta skall jag ta reda på vad dem har i sin varukorg.
Och om dem då har beställt en låda OCH ett moderkort så får dem möjligheten att välja mellan att få komponenerna lösa annars så kommer vi bara att skicka komponenterna direkt och de kommer inte få någon möjlighet att kryssa i rutan att de vill att vi bygger.

Frågan är nu hur man kontrollerar att ett tabellfält med ett visst antal poster innehåller TVÅ olika värden.

Jag tar mina tidigare exempel igen.

---------------------------
1050 Artikel1 4
1050 Artikel2 4
1050 Artikel3 4
---------------------------

Här ser man att kund 1050 har beställt 3 olika artiklar men ur samma produktkategori, och då uppfyller han ju INTE kravet att han måste ha beställt från Kategori 4 och 9. Därmed skall inga poster visas i RS. Alltså blir RS.EOF

---------------------------
1050 Artikel1 4
1050 Artikel2 9
1050 Artikel3 4
---------------------------
Här har kund 1050 beställt 3 olika artiklar. Två från produktkategori 4 och en från produktkategori 9. Det innebär att han uppfyller alla kriterier och det medför att RS inte kommer att vara tomt utan innehåller ett par poster.

---------------------------
1050 Artikel1 2
1050 Artikel2 2
1050 Artikel3 2
---------------------------
Här har kund 1050 beställt 3 olika artiklar ur artikelkategori 2. Alltså varken i 4 eller 9 det medför att RS skall bli tomt. Och det blir RS.EOF. Ingen information kommer att visas.

Hoppas du förstår bättre ;)

Annars får jag försöka förklara på annat sätt nästa gång.

///Patrik

emissionMedlem sedan dec. 19996 721 inlägg
#5

Jag fattar och tror jag har en lösning, men måste kila.....återkommer.

BrimbaMedlem sedan dec. 19995 875 inlägg
#6

Så säger alla ;)

...Väntar ivrigt på en lösning. Skulle komma väl till pass!

Tack!

///Patrik

fredrikMedlem sedan dec. 19991 072 inlägg
#7

Eftersom produkterna ligger på flera rader borde det inte funka att fixa allt genom bara en sql-sträng.

Ett sätt är ju som du själv nämde att loopa igenom sql:en, leta efter en 4:a i en if-sats, leta efter en 9:a i en och sedan sätta en variabel till true om dessa hittas.

du använder access va?
för om du använder sql-server skulle du nog kunna göra en stored procedure med if-satser i som letade efter värderna och sedan returnerade antingen eof eller inte.

------------------
Fredrik Klarqvist
fredrik.klarqvist@swipnet.se
www.streetwise.se/fredrik/

emissionMedlem sedan dec. 19996 721 inlägg
#8

Lösningen är en rekursiv join, dvs. att man joinar tabellen med sig själv. Det kräver att man skapar flera alias av tabellen, så att "joinen" utförs som om de vore flera unika tabeller. Jag har lagt till en primärnyckel till tabOrderArt (ID) för att kunna göra en distinct.

Först bestämmer vi vilka kolumner och tabellalias som ska vara med...

SELECT DISTINCT T1.ID, T1.OrderID, T1.ArtID
FROM tabOrderArt AS T1, tabOrderArt AS T2, tabOrderArt AS T3, tabArt AS A1, tabArt AS A2

Vi joinar tabellerna mot varandra, rekursivt.

WHERE T1.OrderID=T2.OrderID And T1.OrderID=T3.OrderID

Sedan kopplas tabOrderArt och tabArt ihop (ger samma resultat som en INNER JOIN)

And T2.ArtID=A1.ArtID And T3.ArtID=A2.ArtID

Underkategorierna måste stämma, och eftersom det är två kategorier som ska matcha måste vi ha två alias av tabArt.

And A1.UnderKatID=4 And A2.UnderKatID=9

Slutligen kräver vi att OrderID har ett visst värde. Utan detta listas alla ordrar som uppfyller kraven.

And T1.OrderID=1050;

Slutresultat:

SELECT DISTINCT T1.ID, T1.OrderID, T1.ArtID
FROM tabOrderArt AS T1, tabOrderArt AS T2, tabOrderArt AS T3, tabArt AS A1, tabArt AS A2
WHERE T1.OrderID=T2.OrderID And T1.OrderID=T3.OrderID
And T2.ArtID=A1.ArtID And T3.ArtID=A2.ArtID
And A1.UnderKatID=4 And A2.UnderKatID=9
And T1.OrderID=1050;

[Redigerat av emission den 09 jun 2000]

BrimbaMedlem sedan dec. 19995 875 inlägg
#9

Hej!

JÄTTE TACK!

Det råkar inte finnas något sätt så jag slipper lägga till en primärnyckel till tabellen?

Tack!

Skall genast prova att lägga till primärnyckeln och testa koden!

Tack igen!

Mvh
Patrik
aka Brimba

BrimbaMedlem sedan dec. 19995 875 inlägg
#10

Hej!

Det fungerar perfekt!

Du är ju helt underbar på kodning!

Tack för hjälpen!!

///Patrik

emissionMedlem sedan dec. 19996 721 inlägg
#11

Trevligt! ;)

:r

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)