04. august 2005 - 20:30Der 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.
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. :-)
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
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
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?
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
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)...
Det giver samme resultat. Fejltype: Microsoft OLE DB Provider for ODBC Drivers (0x80040E07) [Microsoft][ODBC Microsoft Access-driver] Datatyperne stemmer ikke overens i kriterieudtrykket.
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
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'
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.
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?
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
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.
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
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. ;-)
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? ;-)
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
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
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.