Avatar billede gimle007 Praktikant
27. juli 2007 - 12:24 Der er 15 kommentarer og
1 løsning

Tælle poster med SELECT COUNT

Jeg har lavet en dynamisk sql som henter fra en form. Reguest.Form.

Så sql sætningen er altså variable, men det kan i se i koden.

Mit spørgsmål er så: Hvordan får jeg talt hvormange poster der er i mit rs... Kan ikke helt gennemskue det..

strKundeNr = replace(Request.Form("KundeNr"),"'","''")
strDokuNo = replace(Request.Form("DokuNo"),"'","''")
strDatoFra = replace(Request.Form("DatoFra"),"'","''")
strDatoTil = replace(Request.Form("DatoTil"),"'","''")




strSQL = "SELECT [Document No_], [Line No_], [Sell-to Customer No_], Text, Font, TypeAndColor, Layout, Height, Quantity, Produced, ProducedBy, ProducedDateTime, Width FROM N_S_SYSTEM$PlotterJOb WHERE Produced = '1'"


 
if strDatoFra <> "" then strSQL = strSQL & " AND(ProducedDateTime BETWEEN CONVERT(smalldatetime,'" & strDatoFra & "', 105) AND CONVERT(smalldatetime, '" & strDatoTil &"', 105)) "

if strKundeNr <> "" then strSQL = strSQL & " AND [Sell-to Customer No_] LIKE '" & strKundeNr & "' "

if strDokuNo <> "" then strSQL = strSQL & " AND [Document No_] LIKE '%" & strDokuNo & "%' "

strSQL = strSQL & "ORDER BY ProducedDateTime DESC"
Avatar billede thesurfer Nybegynder
27. juli 2007 - 12:29 #1
1) select count(*) as antal, ....
response.write "Der er " & rs("antal") & " poster i databasen"

2) loop dine poster igennem og tæl 1 op:
antal = 0
do while not rs.eof
antal = antal + 1
' din kode her

rs.movenext
loop
response.write "Der er " & antal & " poster i databasen"
Avatar billede gimle007 Praktikant
27. juli 2007 - 12:35 #2
Hvis jeg bruger nr. 1, vil den så ikke tælle alle de poster som ligger db?

Eller vil den kun tælle dem som strSQL retunere?
Avatar billede The Real Yoda Juniormester
27. juli 2007 - 12:50 #3
den vil kun tælle dem som strsql returnerer..

eller..
hvis du laver select count(*) as antal from tabel where felt=1

vil den fortælle hvormange der er i databasen hvor felt =1

hvis du laver select count(*) as antal from tabel

får du atvide hvor mange records der er i tabellen.
Avatar billede thesurfer Nybegynder
27. juli 2007 - 12:50 #4
Den vil kun tælle dem som strSQL returnerer..
Avatar billede thesurfer Nybegynder
27. juli 2007 - 12:56 #5
Alt efter hvordan du opretter forbindelsen til databasen, kan du bruge rs.recordcount (mener jeg), til at aflæse antallet af poster der returneres..

Det kræver til rs forbindes via:

rs.open conn, 3, 1

Mener jeg..

Det er samme metode man bruger, når man vil lave paging.. i hvert fald med MS Access database..
Avatar billede thesurfer Nybegynder
27. juli 2007 - 13:02 #6
Vist nok sådan:

rs.Open strSQL, strDSN, 1

Jeg kan huske at der er visse begrænsninger, når man bruge denne metode.. jeg kan dog ikke helt huske hvilke..

Jeg plejer bare at bruge den sædvanelige: set rs = conn.execute(sql)
Avatar billede gimle007 Praktikant
27. juli 2007 - 13:19 #7
Jeg har prøvet men den fejler, er dette ellers rigtigt.

Dim strSQL
Dim strKundeNr
Dim strDatoFra
Dim strDokuNo
Dim strDatoTil


' Henter værdien fra kigplotter.asp

strKundeNr = replace(Request.Form("KundeNr"),"'","''")
strDokuNo = replace(Request.Form("DokuNo"),"'","''")
strDatoFra = replace(Request.Form("DatoFra"),"'","''")
strDatoTil = replace(Request.Form("DatoTil"),"'","''")




strSQL = "SELECT count(*) as antal, [Document No_], [Line No_], [Sell-to Customer No_], Text, Font, TypeAndColor, Layout, Height, Quantity, Produced, ProducedBy, ProducedDateTime, Width FROM N_S_SYSTEM$PlotterJOb WHERE Produced = '1'"


 
if strDatoFra <> "" then strSQL = strSQL & " AND(ProducedDateTime BETWEEN CONVERT(smalldatetime,'" & strDatoFra & "', 105) AND CONVERT(smalldatetime, '" & strDatoTil &"', 105)) "

if strKundeNr <> "" then strSQL = strSQL & " AND [Sell-to Customer No_] LIKE '" & strKundeNr & "' "

if strDokuNo <> "" then strSQL = strSQL & " AND [Document No_] LIKE '%" & strDokuNo & "%' "

strSQL = strSQL & "ORDER BY ProducedDateTime DESC"

if Request.querystring("mode") = "search" then
'create an instance of the ADO connection and recordset objects
Set Connection = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")

'open the connection to the database
Connection.Open "constring"

'Open the recordset object executing the SQL statement and return records
'response.write "SQL: "& strSQL 
rs.Open strSQL,Connection
response.write "Der er " & rs("antal") & " poster i databasen"
Avatar billede thesurfer Nybegynder
27. juli 2007 - 14:04 #8
Hvis du bruger "count(*) as antal", skal du bare gøre som du plejer..

Altså med:

set rs = conn.execute(strSQL)

if rs.bof or rs.eof then
    ' der blev ikke fundet nogen poster
else
    ' vis de poster der er fundet
end if

response.write "Der er " & rs("antal") & " poster i databasen"
Avatar billede thesurfer Nybegynder
27. juli 2007 - 14:05 #9
Eller hvordan du nu normalt plejer at gøre.. :-)

Det ville nok være en god ide, at smide antallet over i en variabel, hvis du nu skulle bruge antallet senere.. også efter at du har lukket forbindelsen til databasen..
Avatar billede gimle007 Praktikant
30. juli 2007 - 06:57 #10
Kan stadig ikke få det til at virker...

Denne fejl:

Microsoft OLE DB Provider for SQL Server error '80040e14'

Column 'N_S_SYSTEM$PlotterJOb.Document No_' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.

/sider/search_plotter.asp, line 129


Her er min kode:

<%

'if Request.querystring("mode") = "search" then
  ' Set conn = Server.CreateObject("ADODB.Connection")
    'conn.Open "Provider=sqloledb;Data Source=nssrv13;Initial Catalog=NAVNS;User Id=NSloginnews;Password=iqminus;"



Dim strSQL
Dim strKundeNr
Dim strDatoFra
Dim strDokuNo
Dim strDatoTil


' Henter værdien fra kigplotter.asp

strKundeNr = replace(Request.Form("KundeNr"),"'","''")
strDokuNo = replace(Request.Form("DokuNo"),"'","''")
strDatoFra = replace(Request.Form("DatoFra"),"'","''")
strDatoTil = replace(Request.Form("DatoTil"),"'","''")




strSQL = "SELECT count(*) as antal, [Document No_], [Line No_], [Sell-to Customer No_], Text, Font, TypeAndColor, Layout, Height, Quantity, Produced, ProducedBy, ProducedDateTime, Width FROM N_S_SYSTEM$PlotterJOb WHERE Produced = '1'"


 
if strDatoFra <> "" then strSQL = strSQL & " AND(ProducedDateTime BETWEEN CONVERT(smalldatetime,'" & strDatoFra & "', 105) AND CONVERT(smalldatetime, '" & strDatoTil &"', 105)) "

if strKundeNr <> "" then strSQL = strSQL & " AND [Sell-to Customer No_] LIKE '" & strKundeNr & "' "

if strDokuNo <> "" then strSQL = strSQL & " AND [Document No_] LIKE '%" & strDokuNo & "%' "

strSQL = strSQL & "ORDER BY ProducedDateTime DESC"

if Request.querystring("mode") = "search" then
'create an instance of the ADO connection and recordset objects
Set Connection = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")



'Open the recordset object executing the SQL statement and return records
'response.write "SQL: "& strSQL 
rs.Open strSQL,Connection


%>
<% 

color = "#FFFFFF"

If rs.EOF Then
Response.Write "<br>"
Response.Write "<br>"
Response.Write "<br>"
Response.Write "<strong>"
Response.Write("Ingen resultater af søgning.")
Response.Write "</strong>"
Else %>

<p>&nbsp;</p>
<table width="696" align="center">
<tr bgcolor="#99CCFF">
  <td width="100" height="42">Dokument no</td>
  <td width="50">Kunde</td>
  <td width="102">Skrifttype</td>
  <td width="195">Produceret</td>
  <td width="32">Antal</td>
  <td width="102">Udseende</td>
  <td width="94">&nbsp;</td>
</tr>

<%

Line=rs("Line No_")
 
while not rs.eof %>
<tr bgcolor="<%= color %>">
  <td><%= rs("Document No_") %></td>
  <td><%= rs("Sell-to Customer No_") %></td>
  <td><%= rs("Font") %></td>
  <td><%= rs("ProducedDateTime") %></td>
  <td><%= rs("Quantity") %></td>
  <td><%= rs("Layout") %></td>
  <td><a href="kig_plotter.asp?LineNo=<%=(rs.Fields.Item("Line No_").Value)%>&document=<%=(rs.Fields.Item("Document No_").Value)%>">Mere</a></td>
</tr>


<%        if color = "#FFFFFF" then color = "#DDDDDD" else color = "#FFFFFF"
      rs.MoveNext
    wend %>
</table>
<% response.write "Der er " & rs("antal") & " poster i databasen" %>
<%


rs.Close
Set rs = Nothing
Connection.Close
Set Connection=nothing

end if
end if



%>
Avatar billede gimle007 Praktikant
30. juli 2007 - 12:03 #11
Jeg har prøvet mig frem med forslag nr.2 og det virkede skam første gang. Men så er mit problem at man først kan få antallet når alle posterne er loopet igennem, jeg vil gerne kunne udskrive antallet i toppen af siden, så man ikke behøver at scrolle i bunden for at se hvormange resultater ens søgning gav... Kan det gøres hvis jeg bruger forslag nr. 2????
Avatar billede The Real Yoda Juniormester
30. juli 2007 - 14:39 #12
2) loop dine poster igennem og tæl 1 op:
antal = 0
do while not rs.eof
antal = antal + 1
poster=poster&"<br>"&rs("document no_")

rs.movenext
loop
response.write "Der er " & antal & " poster i databasen"
response.write poster
Avatar billede thesurfer Nybegynder
30. juli 2007 - 14:41 #13
Ja, du kan gode bruge nr 2, og udskrive i toppen af side.. det gøres f.eks. sådan her:


2A)
lav din loop
antal = antal + 1
...
lav samme loop igen


2B)
lav loop
html = html & dine-data-fradatabasen
antan = antal + 1

udskrivning:
html = antal & html

response.write html
Avatar billede The Real Yoda Juniormester
30. juli 2007 - 20:56 #14
hah.. jeg var hurtigst :)
Avatar billede gimle007 Praktikant
31. juli 2007 - 07:56 #15
Takker begge to!!! Smid et svar thesurfer, så skal du få point.
Avatar billede thesurfer Nybegynder
31. juli 2007 - 17:34 #16
Svar smidt :-)
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

IT-JOB