asphelper.de - ASPKurs - Adressenverwaltung, Teil 5

Link: Wichtiger Hinweis in eigener Sache!


ADO, ODBC und OLESQLDaten aus einer Tabelle auslesenDaten hinzügen, ändern und löschen.
Datenmanipulation per ADOPraxisbeispiel AdressenverwaltungAdressenverwaltung, Teil 2Adressenverwaltung, Teil 3
Adressenverwaltung, Teil 4Adressenverwaltung, Teil 5Adressenverwaltung, Teil 6 




Adressen_Uebersicht.asp

In der Datei Adressen_Uebersicht.asp geht es um die Übersicht aller Adressen. Angezeigt wird hierbei lediglich der Vorname, Nachname, Strasse, PLZ und Ort. Allerdings hat diese Seite einige Funktionen. So kann je nach Wunsch sortiert werden, auf- oder absteigend. Wenn die Datenbank 50 Datensätze beinhaltet, so kann man z.B. nur 10 Datensätze pro Seite anzeigen lassen, auch Paging genannt. Zuerst einmal nur der Tabellenkopf. Dieser beinhaltet die Beschreibung (welches Feld?) und noch ein Pfeil hoch und runter für die Sortierung.

Schreiben Sie diesen Quelltext in die Adressen_Uebersicht.asp:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<% Public Sub Uebersicht() %>
  <table border="1" bordercolor="#606060" cellspacing="0" align=center>
  <tr>
    <th width="180px">
      &nbsp;VorName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Vorname&SortType=ASC&Page=<% = Page %>"
           class="thLink" title="Aufsteigend - A ... Z">
        <img src="images/Hoch.gif" border=0>
      </a>
      &nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Vorname&SortType=DESC&Page=<% = Page %>"
           class="thLink" title="Absteigend - Z ... A">
        <img src="images/Runter.gif" border=0>
      </a>
    </th>
    <th width="180px">
      &nbsp;NachName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Nachname&SortType=ASC&Page=<% = Page %>"
           class="thLink" title="Aufsteigend - A ... Z">
        <img src="images/Hoch.gif" border=0>
      </a>
      &nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Nachname&SortType=DESC&Page=<% = Page %>"
           class="thLink" title="Absteigend - Z ... A">
        <img src="images/Runter.gif" border=0>
      </a>
    </th>
    <th width="180px">
      Strasse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Strasse&SortType=ASC&Page=<% = Page %>"
           class="thLink" title="Aufsteigend - A ... Z">
        <img src="images/Hoch.gif" border=0>
      </a>
      &nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Strasse&SortType=DESC&Page=<% = Page %>"
           class="thLink" title="Absteigend - Z ... A">
        <img src="images/Runter.gif" border=0>
      </a>
    </th>
    <th width="100px">
      Plz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Plz&SortType=ASC&Page=<% = Page %>"
           class="thLink" title="Aufsteigend - A ... Z">
        <img src="images/Hoch.gif" border=0>
      </a>
      &nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Plz&SortType=DESC&Page=<% = Page %>"
           class="thLink" title="Absteigend - Z ... A">
        <img src="images/Runter.gif" border=0>
      </a>
    </th>
    <th width="180px">
      Ort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Ort&SortType=ASC&Page=<% = Page %>"
           class="thLink" title="Aufsteigend - A ... Z">
        <img src="images/Hoch.gif" border=0>
      </a>
      &nbsp;&nbsp;
      <a href="Adressen.asp?Sort=Ort&SortType=DESC&Page=<% = Page %>"
           class="thLink" title="Absteigend - Z ... A">
        <img src="images/Runter.gif" border=0>
      </a>
    </th>
  </tr>


Als nächstes wird die Verbindung zu Datenbank hergestellt. Und da nur eine gewünschte Anzahl von Adressen angezeigt werden soll, muss hierzu dem Recordset noch einiges mitgeteilt werden. Da gibt es 2 Werte, die für das Paging wichtig sind. Die erste Zahl ist PageSize, wieviele Datensätze sollen pro Seite dargestellt werden? Der zweite Wert ist Page. Also welche Seite soll dargestellt werden, die erste Seite, die zweite? Hierfür gibt es die Variable Page. Diese beinhaltet die Seite welche angezeigt werden soll.

Zuerst wird dem Recordset mitgeteilt, wieviele Datensätze pro Seite dargestellt werden. Sie erinnern sich? In der Adressen.asp wurde in eine Variable namens PageSize geschrieben, wieviele Datensätze je Seite dargestellt werden sollen:
'Wieviele Datensätze sollen je Seite angezeigt werden?
PageSize = 10


Nun muss dem Recordset mitgeteilt werden, wieviele Datensätze je Seite dargestellt werden Allerdings muss die Zuweisung unbedingt vor dem Öffnen der Datenbankanbindung erfolgen. Als nächstes wird die SQL-Anweisung für das auslesen aus der Datenbank erstellt. Für das Paging ist eine Angabe der Cursorlocation notwendig, da sonst die Seitenweise Navigation nicht funktioniert. Anschliessend wird die Datenbankverbindung geöffnet.

Falls keine Adresse in der Datenbank gefunden wurde, wird "Keine Adressen in der Datenbank" dargestellt. Diesen Quelltext schreiben Sie bitte in die Adressen_Uebersicht.asp:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  <%
  Dim intCounter, intPageCounter
  intCounter = 1

  'Wieviele Datensätze pro Seite?
  rs.PageSize = PageSize


  SQL = "Select tblAdressen.* from tblAdressen"
  
  'Für das Paging ist die Angabe der
  'CursorLocation notwendig.
  rs.CursorLocation = adUseClient

  rs.Open SQL, strPfadDB, 0, 1

  'Wurde überhaupt ein Wert gefunden?
  If rs.EOF Then
    %>
    <tr>
      <td colspan=3 align=center>
        Keine Adressen in der Datenbank
      </td>
    </tr>
    <%
  'Es wurde ein Wert gefunden, darstellen der Adressen.
  Else


Als nächstes wird geprüft, ob die Ausgabe der Adressen z.B. nach dem Nachnamen sortiert werden soll. Auch ob auf- oder absteigend sortiert werden soll. Wenn Sortiert werden soll, steht dies in Sort drin. Nur wenn dort ein Wert steht, wird das Recordset angewiesen, eine Sortierung durchzuführen. Auf- oder Absteigend? Dies steht in der Variable SortType drin. Wenn der Wert anders als ASC ist, wird der Variablen DESC zugewiesen. Weshalb Prüfung auf ASC? Vorsorge, falls irgendetwas anderes als ASC oder DESC angegeben wird.

Page beinhaltet wie bereits erwähnt die Seitennummer. In der If-Abfrage wird geprüft, ob ein Wert übergeben wurde, ob dieser Numerisch ist. Und daß Page nicht grösser ist als die maximale Seite. Die Zuweisung, welche Seite dargestellt werden soll, darf erst nach einer Sortierung erfolgen, da sonst die Seitenweise Navigation nicht korrekt durchgeführt wird und stets die erste Seite dargestellt wird. Den nachfolgenden Code in die Adressen_Uebersicht.asp:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    Dim strSort

    'Soll sortiert werden?
    If len(Sort) > 0 Then

      'Soll auf oder Absteigend sortiert werden?
      If UCase(SortType) <> "ASC" Then
        SortType="DESC"
      End if

      strSort = Sort & " " & SortType
      rs.Sort = strSort
    End if



    'Page = Seite, welche angezeigt werden soll. Geprüft wird, ob ein
    'Wert übergeben wurde, ob Page einen numerischen Wert beinhaltet.
    'ElseIf: Falls max. 10 Seiten anzuzeigen sind, Page jedoch den
    'Wert 15 beinhaltet, wird Page auf 1 gesetzt. Falls Page einen
    'negativen Wert oder die Zahl 0 hat, wird Page auf 1 gesetzt.
    If Page = "" OR NOT isNumeric(Page) Then
      Page = 1
    Elseif CDbl(Page) > CDbl(rs.PageCount) OR CDbl(Page) < 1 Then
      Page = 1
    End if


    'Zuweisung an das Recordset, welche Seite dargestellt werden soll.
    'Muss allerdings erst nach rs.sort erfolgen!
    rs.AbsolutePage = Page


Nun sollen die Datensätze dargestellt werden, dies erfolgt in einer Schleife. Allerdings fällt hier eines auf:
Do while not rs.EOF And intCounter <= PageSize

Wozu intCounter <= PageSize? Schliesslich wurde doch eine PageSize angegeben, weshalb also diese Angabe? Wenn z.B. die 3te Seite dargestellt werden soll, sollen bei einer PageSize = 10 die Datensätze 31-40 dargestellt werden. Mit den Zuweisungen rs.PageSize = PageSize und rs.AbsolutePage = Page wird ADO nur dazu angewiesen, zeige die Datensätze ab dem 31ten Datensatz.

Das nur 10 Datensätze dargestellt werden soll, wird mit den 2 Zuweisungen leider nicht erreicht. Hier muss man eine etwas zu komplizierte Anwendung der Seitenweisen Navigation durch Microsoft kritisieren. Um nun sicherzustellen, daß nicht mehr als 10 Datensätze dargestellt werden, wird eine Variable namens intCounter verwendet. Diese wird bei jedem Durchlauf um den Faktor eins erhöht, solange diese Variable intCounter kleiner bzw. gleich Pagesize ist, wird die Schleife nicht beendet. Natürlich wird die Schleife auch beim Erreichen von EOF beendet.

Ich habe 2 unterschiedliche Arten für das Schreibens eines Wertes verwendet:
<% = rs.Fields("Strasse").Value %>

Und:
<% Response.Write(rs.Fields("Ort").Value) %>

Worin besteht der Unterschied? Was ist schneller? Der Unterschied ist geringfügig, auch in der Geschwindigkeit. Ein Test zeigte, daß der Unterschied bei mehreren 100 Durchläufen weniger als 1/100 Sekunde war. Was ist übersichtlicher? Ich würde sagen, dies muss man differenzieren. Wenn in einer Zeile mehr ASP-Code als HTMLCode steht, dann ist sicherlich Response.Write besser.

Den nachfolgenden Quelltext in die Adressen_Uebersicht.asp:
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    Do while not rs.EOF And intCounter <= PageSize
      %>
      <tr>
        <td>
          <a href="Adressen.asp?Seite=Detail&AdressenID=<% = rs.fields("AdressenID").Value %>">
            <% = rs.Fields("Vorname").Value %>
          </a>
        </td>
        <td>
          <a href="Adressen.asp?Seite=Detail&AdressenID=<% = rs.fields("AdressenID").Value %>">
            <% = rs.Fields("Nachname").Value %>
          </a>
        </td>
        <td>
          <% = rs.Fields("Strasse").Value %>&nbsp;
        </td>
        <td>
          <% Response.Write(rs.Fields("Plz").Value) %>&nbsp;
        </td>
        <td>
          <% Response.Write(rs.Fields("Ort").Value) %>&nbsp;
        </td>
      </tr>
      <%
      intCounter = intCounter + 1
      rs.MoveNext
    Loop
  End if
  %>


Das wars schon beinahe von der Adressen_Uebersicht.asp. Was jetzt noch fehlt, ist die Navigationsleiste was ungefähr so aussehen sollte:
<< 1 2 3 >>


Die Navigation soll nur dann angezeigt werden, wenn es mehr als 1 Seite gibt. Denn was nützt eine Navigation, wenn es nur eine Seite gibt? Geprüft wird dies mit rs.Pagecount = 1. rs.Pagecount gibt die Anzahl der Seiten aus, die entstehen würden. Natürlich unter Berücksichtigung von PageSize. Zuerst einmal wird das ganze in eine Tabelle "verpackt". Bei den Pfeilen (<<) muss geprüft, ob es die erste Seite ist. Denn wenn es die erste Seite ist, macht es keinen Sinn, auf die vorherige Seite zu verweisen.

In einer Schleife werden alle Seitennummern dargestellt. Alle Seitennummern werden als Verweis dargestellt, ausser die aktuelle Seitennummer. Dabei wird die Seitennummer in den Verweis als Page übergeben. Und damit die Sortierung auch noch auf der 2ten Seite richtig ist, wird diese auch noch übergeben, inkl. dem Sortiertyp. Das sieht dann so aus:
<a href="Adressen.asp?Page=<% = intPageCounter %>&Sort=<% = Sort %>&SortType=<% = SortType %>">


Zuletzt werden die Pfeile (>>) für die nächste Seite dargestellt. Aber natürlich nur dann, wenn nicht bereits die letzte Seite dargestellt wird. Fügen Sie den nachfolgenden in die Adressen_Uebersicht.asp
1   
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
</table><br><br>
  <table width=200 align=center>
    <tr>
      <td align="center"><%
      'Mehr als eine Seite? Wenn ja, Navigation anzeigen.
      If not rs.PageCount = "1" then
        'Die Pfeile << nur dann anzeigen, wenn
        'nicht die erste Seite dargestellt wird.
        If not Page = 1 Then
          %>
          &nbsp;
          <a href="Adressen.asp?Page=<%=Page-1 %>&Sort=<%=Sort %>&SortType=<%=SortType %>">
            <<&nbsp;
          </a>
          &nbsp;
          <%
        End if

        'Darstellung der Seitenzahlen, hierfür wird die Variable intPageCounter
        'verwendet. Diese wird in einer Schleife von 1 bis zu rs.PageCount
        'hochgezählt
        'Dabei werden alle Zahl als ein Verweis dargestellt, bis auf die Seiten-
        'nummer, welche gerade dargestellt wird.
        For intPageCounter = 1 To rs.PageCount
          If CDbl(intPageCounter) = CDbl(Page) Then
            %>
            &nbsp;
            <font>
              <% = intPageCounter %>
            </font>
            &nbsp;
            <%
          Else
            %>
            &nbsp;
            <a href="Adressen.asp?Page=<%=intPageCounter%>&Sort=<%=Sort%>&SortType=<%=SortType%>">
              <% = intPageCounter %>
            </a>
            &nbsp;
            <%
          End if
        Next
          

        'Die Pfeile >> nur dann anzeigen, wenn die aktuelle Seite nicht
        'die letzte Seite ist.
        If CDbl(rs.PageCount) > CDbl(Page) Then
          %>
          &nbsp;
          <a href="Adressen.asp?Page=<% =Page + 1 %>&Sort=<% =Sort %>&SortType=<% =SortType %>">
            &nbsp;&nbsp;>>
          </a>
          &nbsp;
          <%
        End if
      End if

    %></td>
      </tr>
    </table><%
  rs.Close
End Sub
%>


Zurück  |  Vor

top top
© Copyright By Klaus Keller, 2001-2008 - Alle Rechte vorbehalten.