17. oktober 2005 - 21:56Der er
39 kommentarer og 1 løsning
SQL spørgsmål
Jeg er i gang med at lave et mindre system. Hver gang jeg sælger noget så registrerer jeg en kunde på ny.
Jeg udfylder nogle oplysninger og her blandt andet om ordren er betalt.
Jeg vil gerne lave en liste over alle kunder som har betalt. Problemet er bare hvordan jeg gør det?
strSQL = "SELECT * FROM kunde WHERE status = 'Betalt'"
den går ikke for en kunde må ikke komme frem på listen hvis han har en status = 'Mangler'.
Eksempel
Jeg registrere en kunde og han betaler med det samme.
Han dukker derfor op på listen over kunder som har betalt.
Jeg registrere samme kunde igen fordi han køber et nyt produkt. Denne gang betaler han ikke med det samme. Derfor må han ikke komme frem på listen, men med min SQL gør han.
Det gør han fordi jeg har en tabel og den hedder kunder hvor alt står i.
Ehm... er det ikke fordi dit databasedesign har et problem med multiplicitet mellem ordrer og kunder... den nuværende lyder til at give noget (læs: en del!) redundans, hvilket jo ikke er særlig hensigtsmæssigt.
Reelt set burde du have en tabel til ordrer og en til kunder. Hvordan den oversigt skal fungere kan jeg ikke helt gennemskue. Det lyder som om du gerne vil have at kunden ikke figurerer på liste, hvis bare der er en linie med kundens id som har status <> "betalt"... er det korrekt?
Hmmm... det iriterer mig at jeg ikke kan finde ud af hvordan den forspørgsel skal skrues sammen, så man ikke behøver at kalde databasen for hver kunde! :|
Nå, men så lad os prøv dit forslag:
' åben din connection her og læg den i variablen conn SQL = "SELECT * FROM kunde WHERE status = 'Betalt'" set rs = conn.execute(SQL) do while not rs.eof SQL = "SELECT COUNT(*) AS AntalMangler FROM kunde WHERE kundenavn = '" & rs("kundenavn") & "' AND status <> 'Betalt'" set rs2 = conn.execute(SQL) if rs2("AntalMangler") = 0 then ' vis denne kundes informationer ' data hentes fra variablen rs... end if rs2.Close
Set conn = Server.CreateObject("ADODB.RecordSet") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("../database.mdb") SQL = "SELECT * FROM kunde WHERE status = 'Betalt'" conn.open SQL,strDSN, 1 set rs = conn.execute(SQL) do while not rs.eof SQL = "SELECT COUNT(*) AS AntalMangler FROM kunde WHERE kundenavn = '" & rs("kundenavn") & "' AND status <> 'Betalt'" set rs2 = conn.execute(SQL) if rs2("AntalMangler") = 0 then rs("firmanavn") end if rs2.Close
Ja, men du ændrer også i essentielle dele af det jeg skriver (og det er ikke meningen ;-)):
<%
Set conn = Server.CreateObject("ADODB.Connection") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("../database.mdb") conn.open strDSN SQL = "SELECT * FROM kunde WHERE status = 'Betalt'" set rs = conn.execute(SQL) do while not rs.eof
SQL = "SELECT COUNT(*) AS AntalMangler " & _ "FROM kunde " & _ "WHERE kundenavn = '" & rs("kundenavn") & "' " & _ "AND status <> 'Betalt'"
set rs2 = conn.execute(SQL) if rs2("AntalMangler") = 0 then rs("firmanavn") end if rs2.Close
Det virker desværre ikke. Jeg har smidt en test kunde ind syv gange. 6 hvor status mangler og en hvor status er betalt, men han kommer stadig frem på listen:(
id - primary key og autonummer Kundenavn - tekst kundekøb - tekst status - tekst ordrenr - nr
ID kundenavn kundekøb status ordrenr 1 Hans Hotel Mangler 10 2 Hans Hotel Betalt 11 3 Hans Hotel Betalt 12 4 Hans Hotel Betalt 13 5 Hans Hotel Betalt 14 6 Hans Hotel Betalt 15 7 Hans Hotel Betalt 16
Jeg har lige prøvet at lægge noget strengbehandling ind i SQL-sætningerne, for med det datagrundlag burde det altså at fungere med de modeller vi efterhånden er kommet frem til. Dog skal vi kun have valgt de forskellige kunder en gang - jeg er ikke helt sikker på at min SELECT DISTINCT fungerer, men prøv det lige:
<% Set conn = Server.CreateObject("ADODB.Connection") strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("../database.mdb") conn.open strDSN SQL = "SELECT DISTINCT kundenavn, id, [kundekøb], status, ordrenr " & _ "FROM kunde WHERE lcase(trim(status)) = 'betalt'" set rs = conn.execute(SQL) do while not rs.eof
Det virker næsten som det skal!! Den udskriver bare Hans 7 gange hvilket ikke er nødvendigt:) en gang er fint.. kan det klares med group by eller lignende?
Hmmm... idéen med at bruge DISTINCT var egentlig at fjerne alle de "overflødige" rækker med samme kundenavn, så det spiller åbenbart ikke helt så godt som jeg gerne ville have... :'(
Det lader til at jeg lige skal have kigget på DISTINCT igen...
Tak for point (og din omsorg for mit hoveds velbefindende) :)
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.