Avatar billede newbie.dk Praktikant
12. marts 2005 - 16:04 Der 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"


Det er en Access database der bruges.
Avatar billede kjulius Novice
12. marts 2005 - 17:12 #1
Prøv med noget lignende dette:

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.
Avatar billede kjulius Novice
12. marts 2005 - 17:13 #2
Ikke UNION ALL, men bare UNION. Ikke at det burde gøre nogen forskel i dette tilfælde...
Avatar billede newbie.dk Praktikant
12. marts 2005 - 17:35 #3
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.
Avatar billede kjulius Novice
12. marts 2005 - 18:22 #4
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).
Avatar billede kjulius Novice
12. marts 2005 - 18:43 #5
Eller...

Nej, jeg bliver vist nødt til at bede om flere oplysninger omkring indholdet af felterne, bl.a. om bynavne kan optræde flere gange. Evt. eksempeldata.
Avatar billede newbie.dk Praktikant
12. marts 2005 - 20:54 #6
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.
Avatar billede kjulius Novice
12. marts 2005 - 21:02 #7
Indeholder formularen 4 felter, som alle skal tjekkes op mod databasen?
Avatar billede newbie.dk Praktikant
12. marts 2005 - 21:18 #8
Nej, det er kun AngivBy der skal tjekkes.

Formularen indeholder følgende felter:
|navn(2felter)| |Adresse(3 felter)| |Mail| |Opsamlingssted|

Database er meget lig formularen.
Avatar billede kjulius Novice
12. marts 2005 - 21:36 #9
Jeg synes jeg bliver mere og mere forvirret. Hvor kommer de 4 byer der skal sammenlignes med fra?
Avatar billede newbie.dk Praktikant
12. marts 2005 - 21:42 #10
De 4 byer er opsamlingssteder. Det er byer brugeren skal vælge når han/hun udfylder formularen.
Avatar billede newbie.dk Praktikant
12. marts 2005 - 21:43 #11
4 byer som jeg har puttet i en dropdown-boks.
Avatar billede kjulius Novice
12. marts 2005 - 22:11 #12
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... :-(
Avatar billede newbie.dk Praktikant
12. marts 2005 - 22:27 #13
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
Avatar billede kjulius Novice
12. marts 2005 - 22:51 #14
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.
Avatar billede newbie.dk Praktikant
12. marts 2005 - 22:56 #15
Ja det er rigtigt.
Avatar billede newbie.dk Praktikant
12. marts 2005 - 22:58 #16
Jeg tror du er intelligent nok til at hjælpe mig. Jeg tror bare det er mig der har haft problemmer med at forklare mig...
Avatar billede kjulius Novice
12. marts 2005 - 23:07 #17
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

Sorry, min hjerne virker sløv pt.
Avatar billede newbie.dk Praktikant
12. marts 2005 - 23:22 #18
Desværre er det ikke nok, da det er to arrangementer der er tale om. Et arrangement for BY1, BY2 og BY3. Og et for BY4.
Avatar billede kjulius Novice
13. marts 2005 - 00:12 #19
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
Avatar billede kjulius Novice
13. marts 2005 - 12:45 #20
Lyder det helt forkert?
Avatar billede newbie.dk Praktikant
13. marts 2005 - 20:33 #21
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)

Response.Write AntalTilmeldte
Avatar billede kjulius Novice
13. marts 2005 - 23:55 #22
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')"

så tror jeg det vil fungere.
Avatar billede newbie.dk Praktikant
14. marts 2005 - 00:13 #23
Den fejler desværre med denne:

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

Response.Write rs5("AntalTilmeldte")
Avatar billede kinderaeg Nybegynder
14. marts 2005 - 14:42 #24
test = "SELECT COUNT(*) AS AntalTilmeldte FROM indtast WHERE ('" & Request.form("postnr") & "' <> '5000' AND postnr <> '5000') OR ('" & Request.form("postnr") & "' = '5000' AND postnr = '5000')"
Avatar billede newbie.dk Praktikant
14. marts 2005 - 15:19 #25
Fedt, det ser ud til at virke... Jeg tester lige og vender tilbage. men det ser lovende ud. Fedt.
Avatar billede newbie.dk Praktikant
15. marts 2005 - 00:16 #26
Perfekt. Super det virker kanon.
Det har du gjort rigtigt godt, mange tak.
Ligger du et svar.
Avatar billede kjulius Novice
15. marts 2005 - 08:24 #27
Tak...
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
Kurser inden for grundlæggende programmering

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