12. marts 2005 - 16:04Der er
26 kommentarer og 1 løsning
Betingelse med mange betingelser
Jeg har en betingelse der volder mig store problemer. Jeg kan ikke se mig ud af hvordan man skal kombinere alle disse betingelser. Noget af koden driller også, bl.a. det med at tælle alle forekomsterne.
Jeg har prøvet at lave en skitse til betingelsen:
Hvis Request.form("angivBY") = BY1 OR BY2 OR BY3 så tæl(count) alle forekomster i databasen hvor BY1, BY2, BY3 indgår Hvis samlet antal er mindre end 200 så indsæt data fra formular i databasens tabel1 OG send mail "mail tekst 1" Hvis samlet antal er større end 200 så indsæt data fra formular i databasens tabel2 OG send mail "mail tekst 2"
Men Hvis Request.form("angivBY") = BY4 så tæl alle forekomster i databasen hvor BY4 indgår Hvis samlet antal er mindre end 200 så indsæt data fra formular i databasens tabel1 OG send mail "mail tekst 1" Hvis samlet antal er større end 200 så indsæt data fra formular i databasens tabel2 OG send mail "mail tekst 2"
strBY = Request.Form("angivBY") strSQL = "SELECT 'tabel1' FROM bytabel WHERE BY1 LIKE '%" & strBY & %' OR BY2 LIKE '%" & strBY & "%' OR BY3 LIKE '%" & strBY "%' HAVING COUNT(*) < 200" strSQL = strSQL & vbCrLf & "UNION" strSQL = strSQL & vbCrLf & "SELECT 'tabel2' FROM bytabel WHERE BY1 LIKE '%" & strBY & %' OR BY2 LIKE '%" & strBY & "%' OR BY3 LIKE '%" & strBY "%' HAVING COUNT(*) >= 200" strSQL = strSQL & vbCrLf & "UNION" strSQL = strSQL & vbCrLf & "SELECT 'tabel1' FROM bytabel WHERE BY4 LIKE '%" & strBY & "%' HAVING COUNT(*) < 200" strSQL = strSQL & vbCrLf & "UNION" strSQL = strSQL & vbCrLf & "SELECT 'tabel2' FROM bytabel WHERE BY4 LIKE '%" & strBY & "%' HAVING COUNT(*) >= 200"
For nu lige at gennemgå den, så består den af 4 delforespørgsler, som bliver sammensat med en UNION ALL. Der er dog kun én af disse fire forespørgsler som vil returnere data (forudsat, at der ikke er sammenfald mellem byer registreret i hhv. enten BY1, BY2 eller BY3 og BY4).
Hvis et bynavn kan optræde i begge sammenhænge, er det en ny situation, idet man så er nødt til at lave en prioritering. Hvad er vigtigst - er det vigtigere at byen findes i BY4 end hvis den findes i et af de andre felter.
Jeg har ikke tjekket SQL'en for typografiske fejl, men kun opstillet en teoretisk mulighed.
Jeg kan desværre ikke se mig ud af din kode. Og jeg troede at dette kun kunne løses ved hjælp af en betingelse. Bl.a. hvor tæller du alle forekomster af BY1, BY2, BY3 og får en samlet sum.
Jeg har desværre ikke tid lige nu. Skal ind og spise ved svigermor. Men er hjemme igen ved 21 tiden. der vil jeg lige kigge lidt mere på det.
Okay, jeg prøver lige at få sat lidt flere ord på :-)
Som sagt består den af 4 dele, som sammensættes med en UNION.
Første del, som er en selvstændig forespørgsel, returnerer en tekst 'tabel1' hvis COUNT(*), altså antal records (=rows) som opfylder kriteriet er mindre end 200. Det sker i HAVING elementet. Denne første forespørgsel tester på, om Request.Form("angivBY") findes i enten BY1, BY2 eller BY3.
Den anden del er næsten lig den første del, bortset fra, at denne fil returnere teksten 'tabel2' hvis antallet af records er >= 200.
Disse to delelementer kombineres med en UNION. Men da de gensidigt udelukker hinanden (der kan ikke både være under og over 200 record), så vil resultatet altid kun blive en record (eller ingen record, hvis WHERE betingelsen ikke er opfyldt).
De næste to forespørgsler er også skåret over samme læst. Eneste forskel er, at der i WHERE delen kun testes på BY4 feltet, og at selektionskriteriet i HAVING delen vendes om.
---
Det sidste spørgsmål får mig dog til at tænke på, om jeg helt har forstået, hvad det er du ønsker.
Der er selvfølgelig også en anden mulighed:
Hvis du ikke kun vil have antallet af record, hvor bynavnet optræder i selektionsfelterne, men vil have antallet af gange hvor bynavnet optræder i alle fire felter eller hvis et bynavn kan optræde i mere end ét af de tre felter, og du ønsker sådanne byer inkluderet flere gange, ja så er HAVING kriteriet selvfølgelig ikke godt nok. I så fald skal det nok ændres til f.eks.
HAVING (SUM(IIF(BY1=bynavn,1,0))+SUM(IIF(BY2=bynavn,1,0))+SUM(IIF(BY3=bynavn,1,0))+SUM(IIF(BY4=bynavn,1,0))) < 200
Jeg har for nemheds skyld brugt lighedstegn i stedet for LIKE (og LIKE er måske heller ikke nødvendigt).
Måske hjælper det at jeg forklare idéen lidt bedre.
Jeg har en tilmeldingsformular, hvor folk kan tilmelde sig to gratis arrangementer. I formularen har de mulighed for at udvælge 4 opsamlingssteder. Når formularen afsendes skal der tjekkes om der er ledige pladser. Bl.a. skal registreringerne hvor BY1, BY2 OG BY3 indgår, lægges sammen, og hvis tallet er under f.eks 200 er der ledige pladser, og de får tilsendt en mail med diverse oplysninger. Men hvis tallet er højere end 200, er der ikke flere pladser. Og de vil modtage en mail med at ... bla bla at hvis der kommer afbud osv, vil de bliver kontaktet igen. Derfor skal der kun tælles på de 3 byer, for der kan stadig være ledige pladser tilbage ved BY4 - og måske er BY4 optaget, men der er stadig pladser ved BY1, 2 og 3.
Jo, det forstår jeg. Tror jeg nok. Men samtidig siger du, at de kun skal udfylde et felt. Betyder det, at de indtaster et opsamlingssted ad gangen, tjekker om det er ok, og så opdaterer en tabel med dette bynavn i felter med navnet by1, by2, by3 eller by4?
Desværre er jeg vist ikke intelligent nok til at kunne hjælpe dig... :-(
De indtaster kun en gang, hvis de ikke får plads vil de nok ikke prøve en af de andre da afstanden er for stor. Hvis man har valgt byen Køllebølle(BY1), tjekkes der i feltet "opsamlingssted" i databasen, hvor mange gange Køllebølle(som er BY1) og BY2 og BY3 findes i kolonnen "opsamlingssted". Hvis resultatet er under 200... osv osv
Okay, så når du siger By1, By2 osv., så mener du de tre muligheder du giver dem, ikke felter i databasen med navnene by1, by2, by3 og by4? Det var nok der, jeg gik galt i byen.
Jamen, så lige et sidste spørgsmål. Hvorfor skal det sidste mulige valg (By4), så opfattes anderledes end de andre tre?
Det lyder da som om det bare skal tjekkes, at det samlede antal personer der er tilmeldt til alle fire opsamlingssteder skal være <= antallet af billetter til rådighed. Altså:
If antal tilmeldte de fire steder <= 200 congratultions! else sorry, pal! endif
Okay, så er det på plads. Så burde problemet jo ikke være så stort:
SELECT COUNT(*) AS AntalTilmeldte FROM Tilmeldte WHERE (Request.form("angivBY") IN ('By1', 'By2', 'By3') AND opsamlingssted IN ('By1', 'By2', 'By3')) OR (Request.form("angivBY") = 'By4' AND opsamlingssted = 'By4)
Eller endnu mere komprimeret:
SELECT COUNT(*) AS AntalTilmeldte FROM Tilmeldte WHERE (Request.form("angivBY") <> 'By4' AND opsamlingssted <> 'By4) OR (Request.form("angivBY") = 'By4' AND opsamlingssted = 'By4)
If AntalTilmeldte < 200 Then INSERT INTO tabel1... Send msg1 Else INSERT INTO tabel2... Send msg2 End If
Så er jeg tilbage. Det driller lidt med at få sat de rigtige " eller ' ind... Kan du hjælpe?
test = "SELECT COUNT(*) AS AntalTilmeldte FROM TilmTab WHERE (Request.form('angiBy') <> 'koll' AND postnr <> 'koll) OR (Request.form('angiBy') = 'koll' AND postnr = 'koll)"
set rs5 = server.createobject("adodb.connection") rs5.open DSN set rs5 = rs5.execute(test)
Ja, undskyld, jeg skulle selvfølgelig have gjort arbejdet færdigt, og opbygget en SQL streng. Sorry.
Hvis du nu skriver:
test = "SELECT COUNT(*) AS AntalTilmeldte FROM TilmTab WHERE ('" & Request.form("angiBy") & " <> 'koll' AND postnr <> 'koll') OR ('" & Request.form("angiBy") & " = 'koll' AND postnr = 'koll')"
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression '('5320 <> '5000' AND postnr <> '5000') OR ('5320 = '5000' AND postnr = '5000')'.
/send.asp, line 74
Jeg har lige lavet koden om her til test, men den ser nu sådan her ud:
test = "SELECT COUNT(*) AS AntalTilmeldte FROM indtast WHERE ('" & Request.form("postnr") & " <> '5000' AND postnr <> '5000') OR ('" & Request.form("postnr") & " = '5000' AND postnr = '5000')"
set rs5 = server.createobject("adodb.connection") rs5.open DSN set rs5 = rs5.execute(test) <-- linie 74
test = "SELECT COUNT(*) AS AntalTilmeldte FROM indtast WHERE ('" & Request.form("postnr") & "' <> '5000' AND postnr <> '5000') OR ('" & Request.form("postnr") & "' = '5000' AND postnr = '5000')"
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.