for i = 1 to 5 if x(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or opr='" & x(i) & "' " else strSQL = "opr='" & x(i) & "' " end if end if next
problemet er, at det bliver sat et or ind i sætningen før den første "operator", et eksempel på en strSQL udskrift: Select * from tabel where (or opr='opr2' or opr='opr4' )
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
for i = 1 to 5 if x(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or opr='" & x(i) & "' " else strSQL = "opr='" & x(i) & "' " end if end if next strSQL=MID(strSQL,3)
Ups. Den må jo heller undersøge om der står "OR" først :-)
for i = 1 to 5 if x(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or opr='" & x(i) & "' " else strSQL = "opr='" & x(i) & "' " end if end if next If Left(strSQL,1,2)="or" then strSQL=MID(strSQL,3) End If
Problemet er, MÅSKE, at du allerede INDEN du går igang med at lave en IF-sætning, HAR tildelt variablen strSQL noget værdi (strSQL = SELECT * FROM...) Hvis det er tilfældet vil din If/Else sætning aldrig komme til at køre igennem andet end den først tilstand hvor strSQL faktisk ER <> ""...
Synes bare lige umiddelbart at det kunne være årsagen til dit problem ;o)
for i = 1 to 5 if x(i) <> "" then if strSQL <> "" then if left(strSQL,len(strSQL)) = "(" Then strSQL = strSQL & "opr='" & x(i) & "' " else strSQL = strSQL & " or opr='" & x(i) & "' " end if end if end if next
Del din sql-sætning op i to. En med "select * from blabla where" så laver to en SQL2, som du bruger i din løkke. Når du kommer ud af løkken sætter du SQL1=SQL1&SQL2 Nemt og smertefrit :-)
for i = 1 to 5 if x(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or opr='" & x(i) & "' " else strSQL = "opr='" & x(i) & "' " end if end if next
strSQL = "Select * from tabel where (" & strSQL & ")"
for i = 1 to 5 if x(i) <> "" then if strSQL <> "" then if mid(right(strSQL,len(strSQL)),len(strSQL)) = "(" Then strSQL = strSQL & "opr='" & x(i) & "' " else strSQL = strSQL & " or opr='" & x(i) & "' " end if end if end if next
the_bma_man ==> Tjoh... Dit svar er jo sådan set cool nok - Det var såmænd heller ikke for at såre nogle at jeg skrev det. Der er bare så mange muligheder inden for programmering/scripting at nogle vælger SYMPTOM-behandling istedet for at løse det egentlige problem.
Dit svar er jo ret kort og ikke underbygget af noget kode - derfor overså jeg nok lige i farten at hvad der gemte sig i din tekst. Men dit svar er ikke nødvendigvis TYDELIGT nok til at hjælpe kkd på rette vej ;o)
Sorry... men jeg er ikke særlig god til at gennemskue ASP, mine resultater har jeg fået ved at spørge og forsøge mig frem, hele scriptet ser sådan ud: <% ' Databaseforbindelse - husk at angive sti til din database Set Conn = Server.CreateObject("ADODB.Connection") DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; " DSN = DSN & "DBQ=" & Server.MapPath("/db/database.mdb") Conn.Open DSN
if request("opr1") <> "" or request("opr2") <> "" or request("opr3") <> "" or request("opr4") <> "" or request("opr5") <> "" then opr = "ok" end if if request("ph1") <> "" or request("ph2") <> "" or request("ph3") <> "" then ph = "ok" end if if request("dh1") <> "" or request("dh2") <> "" or request("dh3") <> "" or request("dh4") <> "" or request("dh5") <> "" then dh = "ok" end if if request("temp1") <> "" or request("temp2") <> "" or request("temp3") <> "" or request("temp4") <> "" then temp = "ok" end if if request("omr1") <> "" or request("omr2") <> "" or request("omr3") <> "" or request("omr4") <> "" or request("omr5") <> "" then omr = "ok" end if if request("str1") <> "" or request("str2") <> "" or request("str3") <> "" or request("str4") <> "" or request("str5") <> "" then str = "ok" end if if request("mastr1") <> "" or request("mastr2") <> "" or request("mastr3") <> "" or request("mastr4") <> "" or request("mastr5") <> "" then mastr = "ok" end if
if opr = "ok" or ph = "ok" or dh = "ok" or temp = "ok" or omr = "ok" or str = "ok" or mastr = "ok" then ' SQL forespørgsel strSQL = "Select * from Cichlider where " else ' SQL forespørgsel strSQL = "Select * from Cichlider" end if
'Oprindelse if opr = "ok" then strSQL = strSQL & "(" elseif opr <> "ok" then strSQL = strSQL & "" end if
for i = 1 to 5 if x(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or opr='" & x(i) & "' " else strSQL = "opr='" & x(i) & "' " end if end if next If Left(strSQL,2)="or" then strSQL=MID(strSQL,3) End If if ph = "ok" and opr = "ok" or dh = "ok" and opr = "ok" or temp = "ok" and opr = "ok" or omr = "ok" and opr = "ok" or str = "ok" and opr = "ok" or mastr = "ok" and opr = "ok" then strSQL = strSQL & ") and " elseif ph <> "ok" and dh <> "ok" and temp <> "ok" and omr <> "ok" and str <> "ok" and mastr <> "ok" and opr = "ok" then strSQL = strSQL & ")" else strSQL = strSQL & "" end if
'pH if ph = "ok" then strSQL = strSQL & "(" elseif ph <> "ok" then strSQL = strSQL & "" end if
for i = 1 to 3 if p(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or ph='" & p(i) & "' " else strSQL = "ph='" & p(i) & "' " end if end if next if dh = "ok" and ph = "ok" or temp = "ok" and ph = "ok" or omr = "ok" and ph = "ok" or str = "ok" and ph = "ok" or mastr = "ok" and ph = "ok" then strSQL = strSQL & ") and " elseif dh <> "ok" and temp <> "ok" and omr <> "ok" and str <> "ok" and mastr <> "ok" and ph = "ok" then strSQL = strSQL & ")" else strSQL = strSQL & "" end if
'dH if dh = "ok" then strSQL = strSQL & "(" elseif dh <> "ok" then strSQL = strSQL & "" end if
for i = 1 to 5 if d(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or dh='" & d(i) & "' " else strSQL = "dh='" & d(i) & "' " end if end if next if temp = "ok" and dh = "ok" or omr = "ok" and dh = "ok" or str = "ok" and dh = "ok" or mastr = "ok" and dh = "ok" then strSQL = strSQL & ") and " elseif temp <> "ok" and omr <> "ok" and str <> "ok" and mastr <> "ok" and dh = "ok" then strSQL = strSQL & ")" else strSQL = strSQL & "" end if
'Temperatur if temp = "ok" then strSQL = strSQL & "(" elseif temp <> "ok" then strSQL = strSQL & "" end if
for i = 1 to 4 if t(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or temp='" & t(i) & "' " else strSQL = "temp='" & t(i) & "' " end if end if next if omr = "ok" and temp = "ok" or str = "ok" and temp = "ok" or mastr = "ok" and temp = "ok" then strSQL = strSQL & ") and " elseif omr <> "ok" and str <> "ok" and mastr <> "ok" and temp = "ok" then strSQL = strSQL & ")" else strSQL = strSQL & "" end if
'Omraade if omr = "ok" then strSQL = strSQL & "(" elseif omr <> "ok" then strSQL = strSQL & "" end if
for i = 1 to 5 if o(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or omr='" & o(i) & "' " else strSQL = "omr='" & o(i) & "' " end if end if next if str = "ok" and omr = "ok" or mastr = "ok" and omr = "ok" then strSQL = strSQL & ") and " elseif str <> "ok" and mastr <> "ok" and omr = "ok" then strSQL = strSQL & ")" else strSQL = strSQL & "" end if
'Størelse if str = "ok" then strSQL = strSQL & "(" elseif str <> "ok" then strSQL = strSQL & "" end if
for i = 1 to 5 if s(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or str='" & s(i) & "' " else strSQL = "str='" & s(i) & "' " end if end if next if mastr = "ok" and str = "ok" then strSQL = strSQL & ") and " elseif mastr <> "ok" and str = "ok" then strSQL = strSQL & ")" else strSQL = strSQL & "" end if
'Minimum akvarie-størrelse if mastr = "ok" then strSQL = strSQL & "(" elseif mastr <> "ok" then strSQL = strSQL & "" end if
for i = 1 to 4 if m(i) <> "" then if strSQL <> "" then strSQL = strSQL & "or mastr='" & m(i) & "' " else strSQL = "mastr='" & m(i) & "' " end if end if next if mastr = "ok" then strSQL = strSQL & ")" end if
'response.write strsql 'response.end
' Udfør forespørgsel (rs indeholder nu resultatet) Set rs = Conn.Execute(strSQL)
if (rs.bof or rs.eof) then Response.Write "Der er ingen fisk med disse krav."
else Do
##En masse response.write ting...
' Gå til næste Record i rs rs.MoveNext
' Fortsæt indtil rs er gennemløbet (EOF = End Of File) Loop While Not rs.EOF end if
' Luk databaseforbindelse Conn.Close Set Conn = Nothing %>
for i = 1 to 5 if x(i) <> "" then if strSQL2 <> "" then strSQL2 = strSQL2 & "or opr='" & x(i) & "' " else strSQL2 = "opr='" & x(i) & "' " end if end if next
for i = 1 to 3 if p(i) <> "" then if strSQL2 <> "" then strSQL2 = strSQL2 & "or ph='" & p(i) & "' " else strSQL2 = "ph='" & p(i) & "' " end if end if next
for i = 1 to 5 if d(i) <> "" then if strSQL2 <> "" then strSQL2 = strSQL2 & "or dh='" & d(i) & "' " else strSQL2 = "dh='" & d(i) & "' " end if end if next
for i = 1 to 4 if t(i) <> "" then if strSQL2 <> "" then strSQL2 = strSQL2 & "or temp='" & t(i) & "' " else strSQL2 = "temp='" & t(i) & "' " end if end if next
for i = 1 to 5 if o(i) <> "" then if strSQL2 <> "" then strSQL2 = strSQL2 & "or omr='" & o(i) & "' " else strSQL2 = "omr='" & o(i) & "' " end if end if next
for i = 1 to 5 if s(i) <> "" then if strSQL2 <> "" then strSQL2 = strSQL2 & "or str='" & s(i) & "' " else strSQL2 = "str='" & s(i) & "' " end if end if next
for i = 1 to 4 if m(i) <> "" then if strSQL2 <> "" then strSQL2 = strSQL2 & "or mastr='" & m(i) & "' " else strSQL2 = "mastr='" & m(i) & "' " end if end if next strSQL = strSQL1 & strSQL2
'response.write strsql 'response.end
' Udfør forespørgsel (rs indeholder nu resultatet) Set rs = Conn.Execute(strSQL)
if (rs.bof or rs.eof) then Response.Write "Der er ingen fisk med disse krav."
else Do
##En masse response.write ting...
' Gå til næste Record i rs rs.MoveNext
' Fortsæt indtil rs er gennemløbet (EOF = End Of File) Loop While Not rs.EOF end if
' Luk databaseforbindelse Conn.Close Set Conn = Nothing %>
kkd> Det kan sagtens laves smartere - mit forslag her er baseret på det, du havde postet idet jeg går ud fra, at du (i hvert fald delvis) forstår hvad der sker.
Jeg har sat en where ind i SQL1, og når jeg så kører scriptet får jeg sql-sætning som f.eks. her: Select * from Cichlider where ph='ph1' or ph='ph2' or dh='dh4' or temp='temp4' or omr='omr1' or omr='omr4' or omr='omr5'
For at det skal virke med databasen, skal det se sådan ud: Select * from Cichlider where (ph='ph1' or ph='ph2') and (dh='dh4') and (temp='temp4') and (omr='omr1' or omr='omr4' or omr='omr5')
Det var bl.a. derfor at jeg havde opsat alle de conditions jeg havde før...
for j = 1 to 5 'op til 5 mulige i hvert kriterie if r(i,j) <> "" then if nystrSQL <> "" then nystrSQL = nystrSQL & "or " & r(i,0) & r(i,j) & "' " else nystrSQL = "(" & r(i,0) & r(i,j) & "' " end if end if next
if nystrSQL <> "" then if strSQL <> "" then strSQL = strSQL & " and " & nystrSQL & ")" else strSQL = nystrSQL & ")" end if end if
next
if strSQL <> "" then strSQL = "Select * from Cichlider where " & strSQL else strSQL = "Select * from Cichlider" end if
'response.write strsql 'response.end
' Udfør forespørgsel (rs indeholder nu resultatet) Set rs = Conn.Execute(strSQL)
if (rs.bof or rs.eof) then Response.Write "Der er ingen fisk med disse krav."
else Do
##En masse response.write ting...
' Gå til næste Record i rs rs.MoveNext
' Fortsæt indtil rs er gennemløbet (EOF = End Of File) Loop While Not rs.EOF end if
' Luk databaseforbindelse Conn.Close Set Conn = Nothing %>
I den endelige konkatenering skal det være: if strSQL <> "" then strSQL = "Select * from Cichlider where (" & strSQL & ")" else strSQL = "Select * from Cichlider" end if
-- og forøvrigt går løkken igennem 4 instanser, som aldrig kan forekomme, men jeg regner ikke med, at det er noget med tusindvis af forespørgsler i minuttet, så ...
Tusind tak, det var lige det der skulle til. Jeg forstår godt nok ikke det hele endnu, men når lortet virker, kan jeg jo forsøge mig frem, for at finde ud af, hvad der gør hvad. Jeg er bare ked af, at jeg kun har udlovet 30 point.... Endnu en gang tak.
Vi laver en matrix i to dimensioner (altså en tabel) med 1 - 7 i den ene retning og 1 - 5 i den anden.
Der er 7 kriterier, der går vi igennem de (op til) 5 muligheder med en mellemvariabel (nystrSQL) efter de principper jeg gav dig i middagens svar, så den bliver til noget eller ikke bliver til noget.
Efter at de 5 muligheder er testet udvides (eller opstartes) den grundlæggende SQL-condition og vi går over til et nyt kriterie med nystrSQL nulstillet.
Til sidst opbygges den grundlæggende struktur i SQL-sætningen med eller uden where alt efter om der er udfyldt kriterier.
Det helt grundlæggende i dette script er, at du kun tester hver enkelt variabel een gang, så det burde også være en hel del billigere i processor-tid/belastning.
the_bma_man>>> Du må sgu undskylde, hvis du syntes du skulle have point, men da jeg prøvede dit forslag, virkede det ikke.... og det gjorde roenving's... That's life!
Synes godt om
Ny brugerNybegynder
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.