# Seitenumblätterfunktion bei JSP-DB-Abfrageseite?



## Asimetric (9. Mrz 2006)

Hallo Zusammen,

ich (der totale jsp-neuling) soll eine bestehende ASP-DB-Abfrageseite in JSP umwandeln. Auf dieser Seite wird eine DAtenbank abgefragt, die teilweise bis zu 15.000 Datensätze anzeigen kann. Deshalb gab es in der alten asp-seite eine Seitenumblätterfunktion welche immer nur 15 DS pro Seite angezeigt hat und dazu gab es noch so "Seite vor", "Seite zurück" Links. Dieses "Umblätterscript" hatte ich mir damals irgendwo von einer free-Scripts Seite runtergezogen und eingebaut. Nun soll das auch für diese neue jsp-Seite diese Umblätterfunktion geben. Nur habe ich leider echt keine Plan wie ich das machen könnte. Ich hab schon viel im INternet nach so einem entsprechenden Script gesucht, bisher aber leider gar nix gscheites (für mich) gefunden.
Vielleicht kennt ja von euch einer irgend so ein Script?
Zusätzlich poste ich mal einen Auszug des Codes von meiner JSP-Abfrageseite, damit es dem einen oder anderen noch klarer wird.

Ganz toll wäre es natürlich, wenn mir jemand anhand meines Codes irgendwie weiterhelfen könnte. Ich vermute mal dass es irgendwie mit dem "ResultSet" machbar wäre, hab da auch schon etwas rumgefummelt, komme aber leider zu keinem ergebnis    

Viele Grüsse
Asimetric


```
ResultSet datenmenge3 = befehl.executeQuery(SQLAbfrage);
int aa=0;

  while (datenmenge3.next()) {
    aa=datenmenge3.getRow();
}

// ### Wenn 'aa==0' also nix in der DB gefunden, ansonsten ('else') kommt die ausgabe der Daten in TAbellenform.
// ### Wenn das mal richtig funktioniert soll noch eine 'Seitenblätterfunktion' her mit der 15 Datensätze auf einer 
// ### Seite ausgegeben werden und man Seitenzahlen zur weiteren Auswahl bekommt (oder einen auszug davon, z.b. die nächsten
// ### und vorhergehenden 5 Seiten, ähnlich wie bei google, da sonst z.Teil über 1000 seitenzahlen ausgegeben werden könnten.

if(aa==0) {
out.println("
[b]No results ...[/b]");

%>
</td>
  </tr>
  <tr>
    <td height="69" colspan="3" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="1">
        
        <tr>
          <td height="35" valign="top">
          <table width="100%" border="1" cellpadding="0" cellspacing="1" height="30">
              
              <tr>
                <TH width="45" height="30" BGCOLOR=#FFFFFF style="color: #CC0000" height="13"> </th>
                <TH width="144" BGCOLOR=#FFFFFF style="color: #CC0000" height="13">TimeStamp</th>
                <TH width="72" BGCOLOR=#FFFFFF style="color: #CC0000" height="13">&Task Type</th>
                <TH width="104" BGCOLOR=#FFFFFF style="color: #CC0000" height="13">&Calling Number</th>
                <TH width="102" BGCOLOR=#FFFFFF style="color: #CC0000" height="13">&Called Number</th>
              </tr>
              <tr>
                <td bgcolor="#CCCCCC" align="center" height="11">&Details</td>
                <td bgcolor="#F2F2F2" align="right" height="11">&</td>
                <td bgcolor="#F2F2F2" align="right" height="11">&</td>
                <td bgcolor="#F2F2F2" align="right" height="11">&</td>
                <td bgcolor="#F2F2F2" align="right" height="11">&</td>
              </tr>
</table>
</td>
  </tr></td>
  </tr>
<%
}
else {
// ##### Ab hier erfolgt die Datenausgabe #################
%>
</td>
  </tr>
  <tr>
    <td height="69" colspan="3" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="1">
        
        <tr>
          <td height="35" valign="top">
          <table width="100%" border="1" cellpadding="0" cellspacing="1" height="30">
              
              <tr>
                <TH width="45" height="30" BGCOLOR=#FFFFFF style="color: #CC0000" height="13"> </th>
                <TH width="144" BGCOLOR=#FFFFFF style="color: #CC0000" height="13">TimeStamp</th>
                <TH width="72" BGCOLOR=#FFFFFF style="color: #CC0000" height="13">&Task Type</th>
                <TH width="104" BGCOLOR=#FFFFFF style="color: #CC0000" height="13">&Calling Number</th>
                <TH width="102" BGCOLOR=#FFFFFF style="color: #CC0000" height="13">&Called Number</th>
              </tr>
<%
ResultSet datenmenge2 = befehl.executeQuery(SQLAbfrage);
    while (datenmenge2.next()) {
%>
              <tr>
                <td bgcolor="#CCCCCC" align="center" height="11"><%=datenmenge2.getString("H_TrackId")%>&</td>
                <td bgcolor="#F2F2F2" align="right" height="11"><%=datenmenge2.getString("TA_TimeStamp")%>&</td>
                <td bgcolor="#F2F2F2" align="right" height="11"><%=datenmenge2.getString("TA_TaskType")%>&</td>
                <td bgcolor="#F2F2F2" align="right" height="11"><%=datenmenge2.getString("CCK_CallingNumber")%>&</td>
                <td bgcolor="#F2F2F2" align="right" height="11"><%=datenmenge2.getString("CCK_CalledNumber")%>&</td>
              </tr>
<%
}
verbindung.close();
%>
</table>
</td>
  </tr></td>
  </tr>
<%
}
%>
  <tr>
    <td height="1">[img]images/transparent.gif[/img]

</td>
    <td>[img]images/transparent.gif[/img]</td>
    <td></td>
  </tr>
</table>
</body>
</html>
```


----------



## DP (9. Mrz 2006)

welche datenbank? 

bei mysql z.b. mit limit arbeiten.

also select * from pommes limit 15,30 zeigt alles von 16 bis 30


----------



## Asimetric (10. Mrz 2006)

Hi, 

das ist eine Sybase Datenbank. 
Hmmm...ich denke mal dass ich erstmal alle DS zählen muss, mit zb. wie ich schon aufgeführt habe "aa=datenmenge3.getRow();" da spuckt er dann zb. die zahl 16357 raus.

evtl. dann die zahl durch 15 teilen, dann gäbe es ja die anzahl der seiten auf der jeweils 15 DS angezeigt werden sollen.

Dann irgendwie einen "nächste Seite" und "vorherige Seite" Link hin und da muss dann von der aktuellen DS Position weitergemacht werden mit seitenzahlübergabe usw.... ojeh, ich merk schon wie kompliziert das irgendwie ist...

Ich kuck mir auch grad in der Java-Doc beim Paket java.sql das Interface "ResultSet" an, da hats eine menge funktionen dazu, mit denen man das vielleicht irgendwie abchecken könnnte....?


Hier ist noch die DB-Connection und der SQL-String(welcher mega lang ist, aber auch nicht von mir stammt):

SQL-String "SQLAbfrage":

select convert(int, CCK_TrackId) as H_TrackId, convert(int, substring(CCK_TrackId,5,4)) as L_TrackId, convert(VARCHAR, TA_TimeStamp, 104) +' ' +convert(VARCHAR, TA_TimeStamp, 108) as TA_TimeStamp, TA_TaskType, CCK_CallingNumber, CCK_CallerName, CCK_CalledNumber, FirstTopicName, ContactConnectionState, DirectACDContact, ExternContact, InboundContact, OutccContact, DialerContact, VoiceMessage, CustomerTasks, ConnectedCustomerTasks, CustomerISDNConnectTime, CustomerAlertingTime, CustomerSpeechTime, CustomerHoldTime, CustomerWaitTime, ConsultTasks, ConnectedConsultTasks, ConsultSpeechTime, ContactACWTime, NetworkOverflows, TA_TimeStamp as SQL_TimeStamp from LevelZeroData where convert(VARCHAR(10), TA_TimeStamp, 102) >= '2006.01.10' and convert(VARCHAR(10), TA_TimeStamp, 102) <= '2006.03.10' and (CCK_CallingNumber) = '3105' Order by SQL_TimeStamp

DB-Connection:


```
String url="jdbc:sybase:Tds:stu2311:5000/tr";
    String benutzername="admin";
    String passwort="admin";

    try {
      Class.forName("com.sybase.jdbc3.jdbc.SybDriver");
    }
    catch (Exception e) {
      out.println("JDBC-Treiber konnte nicht geladen werden!");
      return;
    }

    Connection verbindung=null;
    try {
      verbindung = DriverManager.getConnection(url, benutzername, passwort);
    }
    catch (Exception e) {
      out.println("Verbindung zu " + url + " konnte nicht hergestellt werden! Benutzername und Passwort stimmen? "+e);
      return;
    }

    Statement befehl=null;
    try {
      befehl = verbindung.createStatement();
    }
    catch (Exception e) {
      out.println("Statement-Objekt konnte nicht angelegt werden!");
      return;
    }
```


----------



## Asimetric (16. Mrz 2006)

Hi, also das mit LIMIT funktioniert bei Sybase nicht. Da muss es einen anderen Befehl geben.
Grundsätzlich scheint aber diese LIMIT Funktion der richtige Weg zu sein. Habe inzwischen ein gutes PHP-Tutorial gefunden, bei dem genau diese Seitenblätterfunktion erklärt wird (auch von der Logik her). - dort hat es dann auch diesen LIMIT - Befehl.
Ich versuche gerade dieses Tutorial auf mein JSP-Zeux umzuschreiben und es schaut bisher gar nicht so schlecht aus, wenn ich dann evtl. morgen rausgefunden habe, was ich anstatt LIMIT verwenden kann.


----------



## Bleiglanz (17. Mrz 2006)

das heisst doch 

SELECT TOP irgendwas

bei SYBASE (bzw. beim MS-SQL-SERVER)


----------



## Asimetric (17. Mrz 2006)

Hi Bleiglanz,
ich versteh deine Antwort leider nicht ganz.
Also, der aktuelle Stand sieht im Moment so aus: Habe mich an dieses PHP-Tutorial bezüglich dieser Seitenblätterfunktion gehalten. Das hat auch ganz gut funktioniert bis ich zu dem Befehl "LIMIT" gekommen bin. Da hab ich nochmal nachgefragt ob es diesen Befehl bei Sybase gibt, die Aussage war dass es diesen Befehl nicht gibt und etwas ähnliches wohl anscheinend auch nicht. (Da dachte ich mir auch so ein dreck...

1. Mit meinem oben aufgeführten SQL-Statement frag ich ja die DB ab, zähle die Datensätze und sortiere sie auch gleich nach einem Zeitfeld.

2. Dann spuckt er mir z.b. die Zahl 1000 aus, also 1000 DS gefunden.

3. Nun teile ich das ein in Seiten, also 10 DS pro Seite ergibt 100 Seiten.

4. Dann würde ich dem SQL-Statement gerne einen zusätzlichen Befehl übergeben, wenn z.b. der User auf Seite 50 klickt, soll er ab dem Datensatz 500, 10 Datensätze ausgeben.
-> bei MySQL muss man dem SQL-Statement wohl einfach nur "LIMIT 500,10" anhängen, was genau das bewirkt.


Nun bin ich aber total überfragt wie ich das bei Sybase anwenden könnte. Dass ich dem SQL - Statement einfach sagen könnte, zeige mir ab dem Datensatz 500, 10 Stück an. Anscheinend soll das von der Sybase Logic nicht gehen, aber das würde mich schon ziemlich wundern...

Hat vielleicht jemand von Euch eine Ideeeee?


Thanx
Asimetric


----------



## Bleiglanz (17. Mrz 2006)

ja ich weiss was du willst

http://manuals.sybase.com/onlineboo...wfeatures1253_rev/@Generic__BookTextView/1102

die Syntax für Sybase lautet eben

SELECT TOP

leider kann man da wohl keinen "Anfangswert" mitgeben, musst du entweder weitersuchen oder im Resultset hinspringen (scrollable, oder mit vielen next() aufrufen)


----------



## Asimetric (20. Mrz 2006)

Hi nochmal,

hab das ganze jetzt ein bissl anders gemacht und bisher denk ich, dass ich damit einigermaßen auf dem richtigen weg bin (so wie du das geschrieben hast, mit dem ResultSet hinspringen).

Und zwar hab ich bei der Datenbankconnection jetzt statt:

befehl = verbindung.createStatement(); 

das angegeben:
befehl = verbindung.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

Das hat dann den Effekt, dass ich per JSP Code mit dem ResultSet 
(ResultSet datenmenge = befehl.executeQuery("SELECT * FROM irgendwas")) 
rumspringen kann wie ich will und das nicht mehr mit dem SQL-String machen muss

Also z.b. datenmenge.absolute(500) -> zeiger springt auf den DS 500 und von dort aus les ich dann 10 aus mit einer for-Schleife oder so...

Ich glaub das krieg ich so hin. Muss mich da morgen noch dranhocken.

Habe aber trotzdem noch eine klitzekleine Frage:

Ich möchte gerne zwei Int-Zahlen miteinander dividieren und das Ergebnis soll eine aufgerundete Int Zahl sein, weiss jemand wie das geht?

Also wenn ich schreibe:

int a=9;
int b=4;
int c;

c=a/b;

out.print("Ergebnis Division ist: "+c);

==> die Zahl ist wäre eigentlich 2,25 - ausgeben tut er aber 2. Eine Ganzzahl ist ja schon gut, nur hätte ich auch bei dieser Operation die aufgerundete 3 als Ergebnis. Bei 8 / 4 kommt ja 2 raus und das ist ok, nur bei nem Ergebnis von 2,0001 also etwas mehr als 2 hätt ich gerne die 3. 

Hat diesbezüglich jemand ne (einfache) Idee?

Grüsse
Asimetric


----------



## Asimetric (20. Mrz 2006)

Ah, sorry, war vorhin wohl etwas zu schnell, also meine Division mit Rest bekomm ich ja mit dem Modulo-Operator '%' hin.

also:


```
int a=9;
int b=4;
int c;
int rest;

c=a/b;
rest=a%b;
if(rest>0) {
  c=c+1;
}
```


Falls aber doch noch jemand was dran 'auszusetzen' hat, kann er sich gerne noch melden...

Schönen Abend!
Asimetric


----------

