28. november 2007 - 14:28Der er
37 kommentarer og 1 løsning
SQLsætning med dynamisk valg
jeg har en database med felterne dato og uge og vil gerne kunne udtrække en liste ud fra hvad der vælges i en form. Jeg bruger flg: aarstal = request.form("aarstal") maanedsnr = request.form("maanedsnr") uge = request.form("uge")
strText = "SELECT * FROM t_kalender where year(dato) = "& aarstal &" and month(dato) = " & maanedsnr & " and uge= "& uge &" order by dato asc"
problemet er, at man skal kunne vælge f.eks aarstal og uge eller aarstal og maanedsnr, så uge er tom - eller aarstal og uge, så maanedsnr er tom??????
Sagtens. strText er jo en helt normal tekststreng, som først bliver brugt som SQL, når du kører en Execute på den senere.
Du gør det vist sådan her:
strText="SELECT * FROM [t_kalender] WHERE " i=0 If aarstal<>"" Then strText=strText&"year(dato)="&aarstal&" and " i=i+1 Else If maanedsnr<>"" Then strText=strText&"month(dato)="&maanedsnr&" " i=i+1 Else If uge<>"" Then If i>0 Then strText=strText&"and " strText=strText&"uge="&uge&" " End If strText=strText&"order by [dato] asc"
Inde i "If aarstal<>"" Then" slutter du din string på and. Og lægger en til i. Så er der nogle Else's der så derfor ikke bliver kørt hvis man går ind i den første .. og så tilføjer du bare "order by [....." ...
Så kommer der jo til at stå "SELECT ...... = "&aarstal&" and order by [dato] asc"
strText="SELECT * FROM [t_kalender] WHERE " i=0 If aarstal<>"" Then strText=strText&"year(dato)="&aarstal&" and " i=i+1 End If If maanedsnr<>"" Then strText=strText&"month(dato)="&maanedsnr&" " i=i+1 End If If uge<>"" Then If i>0 Then strText=strText&"and " strText=strText&"uge="&uge&" " End If strText=strText&"order by [dato] asc"
w13 - jeg har nu klippet din sætning direkte ind - og det gir jo fejl, da det er på en asp side. jeg har så fjernet linieskift og får stadig fejl lige efter WHERE skal der være expected end of statement?????
Prøv at udskrive den resulterende SQL sætning sådan at man kan se hvordan den kommer til at se ud.
[]-tegnene er ikke normalt nødvenige, men man bruger dem i tilfælde at at man har kommet til at bruge et ellers reserveret til en af tabel- eller kolonne navnene.
nielle - den når slet ikke så langt og melder stadig fejl i sqlsætningen ligefør det første i=0 If aarstal................. expected end of statement??? - der skal jo nok sættes et ", men samme fejl kommer så lidt længere ude af sætningen og bliver bare ved ligemeget hvormange jeg sætter????
strText="SELECT * FROM [t_kalender] WHERE " i=0 If aarstal<>"" Then strText=strText&"year(dato)="&aarstal&" and " i=i+1 End If If maanedsnr<>"" Then strText=strText&"month(dato)="&maanedsnr&" " i=i+1 End If If uge<>"" Then If i>0 Then strText=strText&"and " strText=strText&"uge="&uge&" " End If strText=strText&"order by [dato] asc"
hundevennen>> Ja, det er en ASP-kode. Men du kan stadig ikke skrive det hele på en linje af den grund. Det skal være på flere linjer, som jeg foreslår. Der er så åbenbart en fejl et sted, men nu har jeg jo ikke set fejlmeddelelsen, så jeg ved ikke, hvad det er for en fejl.
Det er som sagt meningen, at det skal være på flere linjer. Der er en grund til, at din SQL-sætning hedder strSQL ("string SQL"). Det er jo en tekststreng. Og tekststrengen åbner og lukker vi, og vi har nogle if-sætninger, der køres, og hvis betingelserne i dem er sande, så tilføjer vi noget til strSQL. Så det må meget gerne være i flere linjer.
Jeg synes, du skal prøve at bruge min oprindelige kode, og skrive her, hvilken fejlmeddelelse, du får. Evt. kan du indsætte Nielle's debugning lige neden under min kode, for at se, hvordan den skriver den.
Det virker næsten - når jeg i formen vælger aarstal og uge virker den ikke fordi sqlsætningen kommer til at sådan ud:jeg har valgt 2007 og uge 10 i formen SELECT * FROM [t-kalender] WHERE year(dato)=2007 and month(dato)= and uge = 10 order by......... den skal jo ikke skrive month(dato)= når der ikke er noget i formen????
så egentlig ´skulle sætningen vel kunne være sådan her: strText = "SELECT * FROM t_kalender where year(dato) = "& aarstal &" and " If maanedsnr<>"" Then strText=strText&"month(dato)="&maanedsnr&" " i=i+1 End If If uge<>"" Then If i>0 Then strText=strText&"and " strText=strText&"uge="&uge&" " End If strText=strText&"order by [dato] asc" ??????????
Kan du risikere, at ingen af dem er valgt, for så går det ikke at have til "and" sidst i: strText = "SELECT * FROM t_kalender where year(dato) = "& aarstal &" and " Fjern "and" derfra og ret månedsnr.-delen til: If maanedsnr<>"" Then strText=strText&" and month(dato)="&maanedsnr&" " i=i+1 End If
w13 har nu testet og den sætter stadig måned ind selvom den ikke bliver valgt HVis jeg i søgeformen vælger år 2007 og uge 25, får jeg stadig en sqlsætning der siger: select * from t-kalender where year(dato) = 2007 and month= and uge = 25 order by dato asc.???
ja: If maanedsnr<>"" Then strText=strText&"month(dato)="&maanedsnr&" " i=i+1 End If If uge= "" Then If i>0 Then strText=strText&"and " strText=strText&"uge="&uge&" " End If strText=strText&"order by [dato] asc"
der kommer stadig fejl i sqlsætningen. Hvis jeg vælger år og måned så kører den, men hvis jeg vælger år og uge fejler den - den skriver hvis der bliver valgt uge stadig måned ind i sqlsætningen
det ligger i denne del: If maanedsnr<>"" Then strText=strText&"month(dato)="&maanedsnr&" " der står jo egentlig at hvis forskellig fra blank, så skal den skrive month(dato)plus månedsnummer og det går den - jeg skal jo ikke ha month(dato)med hvis maanedsnr er blank?????
If maanedsnr<>"" Then strText=strText&"month(dato)="&maanedsnr&" " if maanedsnr="" then strtext=strtext & "and" i=i+1 End If If uge<>"" Then If i>0 Then strText=strText&"and " strText=strText&"uge="&uge&" " End If strText=strText&"order by [dato] asc"
Nej, det hele skal være: strText="SELECT * FROM t_kalender where year(dato)="&aarstal&" " If maanedsnr<>"" Then strText=strText&"and month(dato)="&maanedsnr&" " If uge<>"" Then strText=strText&"and uge="&uge&" " strText=strText&"order by [dato] asc"
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.