Avatar billede fastpoint Nybegynder
17. oktober 2005 - 21:56 Der 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.

Hvordan løser jeg det?
Avatar billede fastpoint Nybegynder
17. oktober 2005 - 21:59 #1
En simpel udgave af min tabel

id - primary key og autonummer
Kundenavn - tekst
kundekøb - tekst
status - tekst
Avatar billede Søren Bech Morsing Praktikant
17. oktober 2005 - 22:03 #2
kan du i status ikke bare skrive: WHERE NOT status = 'mangler' AND status = 'betalt'
Avatar billede no_doubt Nybegynder
17. oktober 2005 - 22:04 #3
laver en update....hvis han er i databasen updatere du feltet hvor betalt er angivet med den nye data.
Avatar billede softspot Forsker
17. oktober 2005 - 22:11 #4
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?
Avatar billede fastpoint Nybegynder
17. oktober 2005 - 22:14 #5
Jeg ved godt der kommer meget redundans, men det er sådan vi skal lave det af en eller anden årsag.

og ja det er præcis det jeg ønsker! men istedet for id skal det være kundenavn:)
Avatar billede fastpoint Nybegynder
17. oktober 2005 - 22:17 #6
Det gør ikke noget hvis der først skal køres en seperat sql/løkke for, at undersøge det
Avatar billede softspot Forsker
17. oktober 2005 - 22:18 #7
Prøv evt. med denne her:

strSQL = "" & _
"SELECT * " & _
"FROM kunde " & _
"WHERE kundenavn='"&strKundenavn&"' AND " & _
"  (SELECT COUNT(*) " & _
"  FROM kunde " & _
"  WHERE kundenavn='"&strKundenavn&"' " & _
"    AND status <> 'Betalt') = 0"
Avatar billede fastpoint Nybegynder
17. oktober 2005 - 22:22 #8
kræver den ikke, at jeg indtaster et kundenavn?
Avatar billede softspot Forsker
17. oktober 2005 - 22:26 #9
Jo, prøv lige dette i stedet:

strSQL = "" & _
"SELECT k.* " & _
"FROM kunde AS k " & _
"WHERE " & _
"  (SELECT COUNT(k1.*) " & _
"  FROM kunde AS k1 " & _
"  WHERE k1.kundenavn=k.kundenavn " & _
"    AND k1.status <> 'Betalt') = 0"
Avatar billede softspot Forsker
17. oktober 2005 - 22:26 #10
Det er altså helt utestet!
Avatar billede fastpoint Nybegynder
17. oktober 2005 - 22:28 #11
det helt i orden:) spredhagl er velkommen her!

jeg får dog denne fejl

ODBC driver does not support the requested properties.
Avatar billede fastpoint Nybegynder
17. oktober 2005 - 23:03 #12
Jeg går i seng nu, men håber du vil forsøge dig igen i morgen:)
Avatar billede softspot Forsker
17. oktober 2005 - 23:06 #13
Jeg vil ikke love at jeg rent faktisk kan finde et simpel løsning på det, men så kan man jo altid vælge den komplicerede udgave ;-)
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 08:50 #14
Det gør, som sagt ikke noget hvis man først skal køre en seperat løkke eller lignende eller om det skal løses på en besværlig måde:)
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 09:58 #15
kan man ikke køre denne løkke først ud fra denne SQL

strSQL = "SELECT * FROM kunde WHERE status = 'Betalt'"

og bagefter køre en ny løkke hvor man fjerner alle kundenavn'e som har hvis de også er indskrevet igen med en status = 'Mangler'

måske ?

SELECT * FROM kunde WHERE kundenavn = rs("kundenavn") AND status <> 'Mangler'

Jeg ved bare ikke hvordan det skal laves, men håber du kan se ideen med det
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 10:23 #16
hvis man køre bruger denne

strSQL = "SELECT * FROM kunde WHERE status = 'Betalt'"

og gemmer alt der bliver udskrevet i en array hvordan gør jeg så det?

for så kan jeg efterfølgende køre denne

SELECT * FROM kunde WHERE kundenavn = array[x] AND status <> 'Mangler'

Det er jeg sikker på vil virke, men har lavet array[] i ASP
Avatar billede softspot Forsker
18. oktober 2005 - 10:32 #17
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

  rs.movenext
loop
rs.close
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 10:39 #18
Microsoft VBScript runtime error '800a01b6'

Object doesn't support this property or method: 'execute'

ved

Microsoft VBScript runtime error '800a01b6'

set rs = conn.execute(SQL)

koden er identisk med din, men med denne øverst som du skriver

Set conn = Server.CreateObject("ADODB.RecordSet")
Avatar billede softspot Forsker
18. oktober 2005 - 10:42 #19
set conn = server.createobject("ADODB.Connection")
conn.open <din connectionstring som jeg af gode grunde ikke kender!!>
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 10:49 #20
Jeg prøver virkelig:) men samme fejl

<%

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

  rs.movenext
loop
rs.close
%>
Avatar billede softspot Forsker
18. oktober 2005 - 10:53 #21
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

  rs.movenext
loop
rs.close
%>
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 10:56 #22
Jeg tror næsten den er der

Wrong number of arguments or invalid property assignment: 'rs'

det er her

rs("firmanavn")

har ændret den tilbage til

rs("kundenavn")

men samme fejl
Avatar billede softspot Forsker
18. oktober 2005 - 10:58 #23
Ja, du skal vel også gøre noget med den værdi, f.eks. skrive den ud til browseren med response.write rs("kundenavn")...?

Det er den del jeg overlader til dig, for det har noget med layout af din side at gøre, så det ved jeg slet ikke noget om... :)
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 10:59 #24
sorry:) opdagede det først lidt efter, men afprøver lige:)
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 11:02 #25
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:(
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 11:03 #26
Jeg kan sagtens forstå din kode og den ser ellers fornuftig ud!
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 11:05 #27
Jeg har udskrevet AntalMangler og den står godt nok til 0 på den, men der er ellers 6 i databasen med status 'mangler'
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 11:07 #28
virker måske med

  SQL = "SELECT COUNT(*) AS AntalMangler " & _
    "FROM kunde " & _
    "WHERE firmanavn = '" & rs("firmanavn") & "' " & _
    "AND status = 'Mangler'"

tester lige!
Avatar billede softspot Forsker
18. oktober 2005 - 11:09 #29
Kan du ikke prøve at vise dine data?
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 11:12 #30
hmm nej det virkede ikke.
Der kom bare ikke noget ud overhovedet på den måde.

Jeg vil ikke være uhøflig, men bliver lige nød til at gå i en time:(

Vil du se indholdet af databasen? Det paster jeg her ind så snart jeg er tilbage:)
Avatar billede softspot Forsker
18. oktober 2005 - 11:32 #31
Super! :)
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 13:40 #32
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
Avatar billede softspot Forsker
18. oktober 2005 - 13:59 #33
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

  SQL = "SELECT COUNT(*) AS AntalMangler " & _
    "FROM kunde " & _
    "WHERE lcase(trim(kundenavn)) = '" & lcase(trim(rs("kundenavn"))) & "' " & _
    "AND lcase(trim(status)) <> 'betalt'"

  set rs2 = conn.execute(SQL)
  if cint(rs2("AntalMangler")) = 0 then
    Response.Write rs("kundenavn") & "<br>"
  end if
  rs2.Close

  rs.movenext
loop
rs.close
%>
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 14:06 #34
softspot du er for syg:[--------]

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?

Du kan bare ligge et svar:)
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 14:21 #35
løste det med en ekstra variabel.. hvis det er grim kode så sig lige til

if cint(rs2("AntalMangler")) = 0 then
  if tmp = rs("kundenavn") then
  response.write("")
  else
    Response.Write rs("kundenavn") & "<br>"
  end if

tmp =  rs("kundenavn")
  rs.movenext
Avatar billede softspot Forsker
18. oktober 2005 - 14:34 #36
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...
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 14:49 #37
Du ligger bare et svar:)
Det kører fint nu, men kan altid vende tilbage hvis der skulle være problemer med det
Avatar billede softspot Forsker
18. oktober 2005 - 15:21 #38
OK, men jeg ville gerne have afleveret en ordentlig SQL-sætning til dig... :)
Avatar billede fastpoint Nybegynder
18. oktober 2005 - 15:31 #39
Jeg er helt tilfreds:)
Skal heller ikke give dig hovedpine:)
Avatar billede softspot Forsker
18. oktober 2005 - 15:33 #40
Tak for point (og din omsorg for mit hoveds velbefindende) :)
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