Avatar billede listige_luc Praktikant
04. august 2005 - 20:30 Der er 29 kommentarer og
2 løsninger

SQL SUM function skal trække data ud af Access database til ASP

Hejsa!

Jeg har en Access db, hvor jeg har gemt nogle data i tre forskellige tabeller. Det er et lille ordresystem. Jeg kører det igennem nogle ASP sider, hvor jeg kan arbejde med db'en. Nu vil jeg gerne tilføje den mulighed, at kunne trække totalsalget af de forskellige varetyper for en given periode ud.

Jeg har prøvet mig lidt frem og fået dette til at virke efter min hensigt i Access:

SELECT SUM(antal) AS Total FROM ordrevare WHERE ordreid IN (SELECT id FROM ordre WHERE dg BETWEEN '1' AND '3' AND md BETWEEN '8' AND '8' AND yyyy BETWEEN '2005' AND '2005') GROUP BY vareid ORDER BY vareid

Dette giver mig totalsalget fra og med d. 1.8.2005 til og med d. 3.8.2005. Datoen er delt i tre, og formatet er tekst. Jeg vil ikke ændre i db'en, da alt andet fungerer perfekt. Problemet er når jeg vil overføre det til ASP, så jeg selv kan indtaste datoer i systemet.

Her er koden der volder problemer: (uddrag)

<%


query1=Request("query1")
query2=Request("query2")
query3=Request("query3")
query4=Request("query4")
query5=Request("query5")
query6=Request("query6")

SQL = "SELECT SUM(antal) AS sumtotal FROM ordrevare WHERE ordreid IN (SELECT id FROM ordre WHERE dg BETWEEN '%"&query1&"%' AND '%"&query4&"%' AND md BETWEEN '%"&query2&"%' AND '%"&query5&"%' AND yyyy BETWEEN '%"&query3&"%' AND '%"&query6&"%') GROUP BY vareid ORDER BY vareid"

Set RS = Server.CreateObject("ADODB.Recordset")
RS.CursorLocation = 3
RS.CursorType = 3
RS.ActiveConnection = Conn
RS.Open SQL, Conn
If NOT (RS.BOF AND RS.EOF) Then
do until RS.eof
id=RS("vareid")
antal=RS("sumtotal")

%>
<tr><td><a href="new3.asp?id=<%=id%>"><%=vareid%></a></td>
        <td><a href="new3.asp?id=<%=id%>"><%=antal%></a></td>
</tr>
<%
RS.movenext
loop
else%>
<tr><td colspan="2">Kunden findes ikke i databasen<br><br><a href="../kunde/new.asp">Klik her for at oprette en ny kunde</a></td></tr>
<%
End If
RS.close
Set RS = Nothing
%>

Det er tilpasset fra noget af det andet, derfor er det lidt rodet, men jeg får ingen data frem til næste side. Jeg får oftest fejl eller en tom side. Jeg får oftest datatypefejlen, men jeg kan ikke lige se den. Jeg lurer på mine query's i SQL'en og tror fejlen ligger der.

Jeg er gået helt kold nu, så alle forslag, bortset fra ændringer i db'en er velkomne. :-)
Avatar billede listige_luc Praktikant
04. august 2005 - 20:32 #1
Lige nu er den helt præcise fejlmeddelelse: Datatyperne stemmer ikke overens i kriterieudtrykket.
Avatar billede busschou Praktikant
04. august 2005 - 21:31 #2
det er fordi der i din SQL er nogle datatyper der ikke stemmer overens
Eksempelvis kan det være at du har glemt at sætte ' omkring et tal som i tabellen er en streng, så den sammenligner en streng med et tal
En anden mulighed er at en af dine query er tomme og så går det galt!
--
Prøv at lave en response.write SQL inden du åbner dit recordset
Så kan vi se på hvad den indeholder
Avatar billede busschou Praktikant
04. august 2005 - 21:32 #3
altså eksempelvis med denne her
BETWEEN '%"&query1&"%' AND '%"&query4&"%'
Den giver et problem hvis den ene er tom
BETWEEN '%2%' AND '%%'
det kan nemlig ikke sammenlignes
Avatar billede softspot Forsker
04. august 2005 - 21:33 #4
Hvad sker der hvis du benytter denne SQL:

SQL = "SELECT SUM(antal) AS sumtotal FROM ordrevare WHERE ordreid IN (SELECT id FROM ordre WHERE dg BETWEEN '"&query1&"' AND '"&query4&"' AND md BETWEEN '"&query2&"' AND '"&query5&"' AND yyyy BETWEEN '"&query3&"' AND '"&query6&"') GROUP BY vareid ORDER BY vareid"

Jeg har ikke set "wildcards" brugt på den måde du bruger den, så jeg ville starte med at foreslå de fjernes... er der nogen grund til at du har brugt dem?
Avatar billede busschou Praktikant
04. august 2005 - 21:33 #5
men som sagt prøv at udskrive din SQL og sæt den herind
Hvis det viser sig at det er fordi en af de query1, query2...osv er tomme så må du opbygge din sql afhængigt af dette
Avatar billede busschou Praktikant
04. august 2005 - 21:34 #6
nårh ja softspot siger da noget der :o),
Avatar billede listige_luc Praktikant
04. august 2005 - 22:53 #7
øh wildcards? Hvilke tegn snakker vi der?

Kan det allerede være her, at det går galt:

<form name="form1" action="new2.asp" method="post">
D/M/ÅÅÅÅ&nbsp;<br><br>
Fra&nbsp;
<input type="text" name="query1" value="3" size="1">&nbsp;
<input type="text" name="query2" value="8" size="1">&nbsp;
<input type="text" name="query3" value="2005" size="1"><br><br>

Til&nbsp;&nbsp;&nbsp;
<input type="text" name="query4" value="3" size="1">&nbsp;
<input type="text" name="query5" value="8" size="1">&nbsp;
<input type="text" name="query6" value="2005" size="1"><br><br>

<input name="" type="submit" value="Find data">
</form><br>
Avatar billede softspot Forsker
04. august 2005 - 23:03 #8
Det er tegnet % som kan fungere som wildcard...
Avatar billede softspot Forsker
04. august 2005 - 23:04 #9
Hvis du ikke allerede har gjort det, så prøv lige at tage den SQL jeg postede og kør den med den form du lige selv har vist (uden at ændre på default-værdierne)...

Fungerer det?
Avatar billede softspot Forsker
04. august 2005 - 23:07 #10
Hvis ikke så prøv evt. at udskifte ORDER BY med HAVING (mener der var problemer med kombinationen af GROUP BY og ORDER BY).
Avatar billede listige_luc Praktikant
04. august 2005 - 23:11 #11
Det giver samme resultat. Fejltype:
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC Microsoft Access-driver] Datatyperne stemmer ikke overens i kriterieudtrykket.
Avatar billede listige_luc Praktikant
04. august 2005 - 23:14 #12
HAVING er den også ligeglad med.
Avatar billede softspot Forsker
04. august 2005 - 23:21 #13
og dg, md og yyyy har hvilke typer i databasen?
Avatar billede listige_luc Praktikant
04. august 2005 - 23:23 #14
De er tekst.
Avatar billede listige_luc Praktikant
04. august 2005 - 23:28 #15
Jeg er nødt til at gå til køjs nu, og så må jeg se på det imorgen igen, så jeg får ikke testet mere idag.
Avatar billede busschou Praktikant
05. august 2005 - 07:38 #16
Godmorgen er vi friske ? ;o)
Nu har jeg sovet på det og jeg vil i princippet mene at softspots forslag 21:33:23
er mere korrekt end dit oprindelige
Men men men , nu har jeg lige testet på access for der er altså forskel på streng sammenligning og tal sammenligning - og det er der alle steder ikke kun i sql!
---
Hvis du har dage fra 1-31 som strenge i din database og vælger
Select * From tabel Where fra Between '1' And '2'
Så forventer du at få 1 og 2 men du får fordi det er strenge:
1,2,10,11,12,13,14,15,16,17,18,19
---
Hvis du har dage fra 1-31 som tal i din datababse og vælger
Select * From tabel Where fra Between 1 And 2
Så forventer du at få 1 og 2, og du får 1 og 2
---
Så er der problemet med om en af værdierne er tomme når der søges
Hvis du har strenge i databasen og vælger
Select * From tabel Where fra Between '1' And ''
Så giver den dig 1 som forventet
Men hvis du har tal og vælger
Select * From tabel Where fra Between 1 And
Så giver den dig selvfølgelig en fejl
---

Hvad kan vi så lære ved det?
1) Det dur ikke at gemme datoerne som strenge bestående af dage, måneder og år når du vil hive dem ud med Between
2) Du kan løse det ved enten at gemme dem som tal, eller rent faktisk gemme dem som rigtige datoer hvorved bewteen fint kan vælge mellem 01-02-2005 og 03-02-2005 uden problemer
3) Hvis du patout ikke vil lave om på din database, så må du være opmærksom på problemet og lave en hulens masse kode for at undgå det. Fx kunne du typecaste de valgte dage til tal i asp, finde intevallet i tal, og så derefter lave en lang sql streng med alle de tal
Avatar billede busschou Praktikant
05. august 2005 - 07:42 #17
Du har været heldig i dit eksempel at søge på noget mellem 01-08-2005 og 03-08-2005 hvor du ikke har noget ud over det interval
Prøv indsætte noget i din database med datoen 16-08-2005 og 23-08-2005
og så vælg din første sql igen
SELECT SUM(antal) AS Total FROM ordrevare WHERE ordreid IN (SELECT id FROM ordre WHERE dg BETWEEN '1' AND '3' AND md BETWEEN '8' AND '8' AND yyyy BETWEEN '2005' AND '2005') GROUP BY vareid ORDER BY vareid
Så bør du se at de to nyindsatte datoer også tæller med fordi du har streng sammenligning og fordi '16' og '23' er mindre end '3'
Avatar billede listige_luc Praktikant
05. august 2005 - 09:04 #18
Jamen så vil jeg da ændre det til tal og se om det vil virke for mig, så må jeg lige finde ud af de andre steder, hvor det evt. kan ændre noget, men det bliver først næste ledige lejlighed.
Avatar billede busschou Praktikant
05. august 2005 - 09:13 #19
ok, du skal så bare igen huske at hvis du benytter Bewteen på tal så kræver det to tal
Så du skal i din form tage højde for at man rent faktisk indtaster noget for at der ikke kommer en database fejl

Ved ikke om du ønsker et svar?
Jeg kan godt se at det er surt at skulle lave sit database design om,for der er som regel mange sider som skal rettes jo :o( men jeg tror det er for det bedste
Er der nogen speciel gund til du ikke gemmer dem som hele datoer ellers?
Avatar billede softspot Forsker
05. august 2005 - 10:07 #20
Det kunne også være at man kan konvertere felterne i selve SQL-sætningen:

SELECT SUM(antal) AS Total FROM ordrevare WHERE ordreid IN (SELECT id FROM ordre WHERE CInt(dg) BETWEEN 1 AND 3 AND CInt(md) BETWEEN 8 AND 8 AND CInt(yyyy) BETWEEN 2005 AND 2005) GROUP BY vareid ORDER BY vareid
Avatar billede softspot Forsker
05. august 2005 - 10:08 #21
Så behøver du ikke ændre dit databasedesign :)
Avatar billede busschou Praktikant
05. august 2005 - 10:09 #22
når ja der , smart tænkt
Avatar billede listige_luc Praktikant
05. august 2005 - 14:38 #23
Uha ja det lyder godt. Jeg mindes ikke hvorfor det i sin tid er blevet lavet sådan. Enten er det en tanketorsk eller også er der en god grund. Jeg håber på det sidste. :-) Jeg melder lige tilbage, når jeg har fået afprøvet de nye forslag. Jeg tror dog ikke, at jeg når det idag.
Avatar billede busschou Praktikant
05. august 2005 - 14:43 #24
Der er ingen tvivl om at softspots sidste forslag vil være det nemmeste at rette for dig
Men på sigt, til en anden gang, så tror jeg generelt det nemmeste er at arbejde med fulde datoer, det er min erfaring i al fald
Avatar billede listige_luc Praktikant
07. august 2005 - 11:25 #25
Et par overvejelser...

Ex. fra 25.7.2005 til 3.8.2005. Vil det kunne lade sig gøre at køre BETWEEN 25 and 3? Kan den finde ud af det efter min hensigt, dvs. 25,26,27...1,2,3. Eller tager den det "forkerte" interval altså 3,4,5,6...22,23,24,25.

Og hvad med måned? 1.7.2005 til 1.8.2005. Så har jeg BETWEEN 1 AND 1 og BETWEEN 7 AND 8. Vil det ikke kun give mig de to datoer og intet imellem? Ligeledes hvis det var årstal, der blev ændret?

Jeg er bange for at min idé er god nok, men det virker ikke til at være den rette løsning. Det kunne se ud til at jeg skal ændre dato formaterne fra 3 tekstfelter til 1 datofelt. Jeg kan ikke se hvad jeg ellers skulle gøre. Nu må jeg så finde ud af hvorfor datoen er delt i 3 tekstfelter. ;-)
Avatar billede listige_luc Praktikant
07. august 2005 - 11:30 #26
Smider I et svar begge to, så jeg kan dele pointene mellem jer, eftersom I begge har været yderst behjælpelige med at finde en løsning på noget, som umiddelbart ikke kan lade sig gøre på den måde jeg gerne vil have det? ;-)

Nå...tilbage til tegnebordet. :-)
Avatar billede busschou Praktikant
07. august 2005 - 11:30 #27
hvis du ændrer det til tal så vil de hver især være gode nok
Men den fanger dig som du siger når du sætter dem sammen
Select * From tabel where dag between 1 And 1 And maaned between 7 And 8
Det vil kun give to dage ja
Så skal du lave en og anden kæmpe underlig løsning
Det nemmeste vil være at få det til hele datoer
Avatar billede busschou Praktikant
07. august 2005 - 11:32 #28
her er et fra mig :o)
--
Jeg har selv siddet med sådan noget "hø" engang og blev selv enig om at lave hele møget om til datoer, og nu er det så tusind gange nemmere når først det er gjort
Du skal blot huske på at altid indsætte og sammenligne datoer i access i yyyy-mm-dd formatet, ellers kan du risikere at access bytter om på måneder og dage
Avatar billede busschou Praktikant
07. august 2005 - 11:32 #29
blob :o)
Avatar billede softspot Forsker
07. august 2005 - 13:31 #30
Jamen, jeg vil da ikke sinke pointgivningen yderligere... :)
Avatar billede softspot Forsker
08. august 2005 - 01:14 #31
Tak for point :)
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