# Datenstrukturproblem - Wie sinnvoll lösen?



## DennisXX (5. Aug 2011)

Hi Folks !

Ich habe mal eine Frage an euch. Es geht mir hierbei eher weniger um die Programmierung einer konkreten Sache, sondern eher im Allgemeinen darum, ein bestimmtes Problem sinnvoll zu lösen, was mir bisher auch nach einigen Denkperioden immernoch nicht gelungen ist. 

Folgendes Szenario ist gegeben:

Es sollen Daten, die aus einer umfangreichen Datenbanktabelle stammen (mit vielen Spalten, so ca. 22 Spalten und sehr vielen Zeilen, ungefähr zwischen 1500 bis zu 4000 Zeilen), sinnvoll und für den Benutzer übersichtlich auf einer einzigen Benutzeroberfläche dargestellt werden können.

Bitte jetzt nicht denken "Oh Gott soviele Zeilen, wie soll dass denn gehen". Man kann natürlich mittels Filter die Zeilen, die in der Benutzeroberfläche dargestellt werden sollen, auch etwas reduzieren. Klar, aber etwas scrollen muss man trotzdem noch.

Bisher habe ich es so gelöst, dass die Daten aus der Tabelle in Form eines Eins-zu-Eins-Abbilds in Tabellenform bzw. in einem entsprechenden Tabellenobjekt auf der Benutzeroberfläche ausgegeben werden sollen (siehe hierzu den Screenshot in dem Anhang des Posts). ich habe das allerdings in C# programmiert und nciht in Java.

Doch das Eins-Zu-Eins-Abbild der Tabelle in einem Tabellenobjekt (in C# nennt sich das Objekt DatagridView) auf einer Benutzeroberfläche ist für mich eher eine suboptimale Lösung, zumal es auch einfach schwierig und anstrengend zu lesen ist.

Außerdem plane ich bzw. möchte ich über diese Benutzeroberfläche diese Datensätze direkt bearbeiten. Bisher ist es so, dass man dazu jeden einzelnen Datensatz in dem Tabellenobjekt "anfassen" muss, um ihn irgendwie zu bearbeiten. Das ist bei sovielen datensätzen nicht zumutbar.

Hier wäre es schön, wenn man etvl. Datensätze, die man jetzt bearbeiten möchte, per Häkchen auf der Benutzeroberfläche markieren könnte und dann irgendwann alle per Häkchen markierte Datensätze per Mausklick (z.B.  auf einem separaten Button) entsprechend bearbeiten könnte (z.B. löscht, oder ausgelagert oder sonst irgendeinen SQL Befehl dazu im Hintergrund absetzt).

Habt irh irgendeine Idee, wie man solche Datenmengen sinnvoll und absolut Benutzerfreundlich über eine Benutzeroberfläche darstellen und strukturieren könnte?

Noch eine wichtige Info: Diese umfangreiche datenbanktabelle ist fest definiert und ich habe keine Möglichkeit, sie in weitere aufzusplitten.

Danke für die Hilfestellungen !!

Greetz
Dennis


----------



## DennisXX (8. Aug 2011)

Hi Folks !

Kann mir wirklich niemand bei meinem Problem weiterhelfen? Ist das evtl. etwas schwierig nachzuvollziehen?

Greetz
Dennis


----------



## turtle (8. Aug 2011)

Nein, Problem verstanden aber die meisten haben, nebenher, noch einen Job zu bearbeiten 

Ich glaube, dass alle Deine Anforderungen mit einer JTable gelöst werden können. 

Mehrere tausend Zeilen in einer GUI werden unter Pagination behandelt und darüber findest Du recht viele Treffer in der Suchmaschine Deiner Wahl. 

Natürlich können in einer Tabellenzeile beliebige Objekte, also auch JButtons stehen, die dann gewisse Aktionen ausführen. Desweiteren erlaubt JTable sogenanntes In-Place-Editing, also das Verändern der Werte in der Tabelle direkt (so wie in Excel). Letzteres wird aber von Einigen als merkwürdige Benutzer-Experience angesehen, weil irgendwann ja der geänderte Inhalt in die DB geschrieben werden muss un das dem Benutzer vielleicht nicht so ganz bewusst wird. Dem stimme ich teilweise zu und bevorzuge daher ein Layout oben die Tabelle unten ein JPanel mit der Detailansicht einer selektierten Zeile. Da sind dann Buttons für's Editieren/Löschen/Save, whatever.

Ich bin also der Meinung, dass Du mit einer JTable-Lösung ganz gut arbeiten können solltest und über alle Probleme gibts' massig Beispiel-Code im Netz.


----------



## mvitz (8. Aug 2011)

Im Endeffekt bleiben dir da nur die gängigen Mittel:

1) Filter für Spalten um Detailinformationen wegzunehmen.
2) Filter für Reihen um die Anzahl der Datensätze zu reduzieren
3) Paging um eine lange Tabelle in mehrere übersichtliche kleine zu splitten.
4) Batchaktionen, wie du bereits geschrieben hast, irgendwo Selectboxen hin, der Nutzer kann auswählen und anschließend per Button eine Aktion durchführen (der Button kann natürlich vorher noch eine Dialog mit Optionen oder ähnlichem anzeigen).

Ansonsten viele mir noch ein (aber das hast du afaik ausgeschlossen), dass du in der Tabelle anstatt der 22 Spalten nur 5 anzeigst (die, die wirklich wichtig sind) und man hat dann eine Art Detailansicht, die man durch Doppelklick oder so öffnet.


----------



## DennisXX (8. Aug 2011)

Hi Folks !



mvitz hat gesagt.:


> 1) Filter für Spalten um Detailinformationen wegzunehmen.



Ok das ist verständlich, was genau Du meinst und ich habe auch eine konkrete Vorstellung davon wie ich das Codetechnisch umsetzen könnte.




mvitz hat gesagt.:


> 2) Filter für Reihen um die Anzahl der Datensätze zu reduzieren



das würde auf jeden Fall Sinn machen, aber ich frage mich, wie man dass codetechnisch umsetzen kann. Evtl. durch Variablen, die in einem SQL Statement innerhalb der Whereklausel als Filterbedingung eingetragen werden?




mvitz hat gesagt.:


> 3) Paging um eine lange Tabelle in mehrere übersichtliche kleine zu splitten.



Damit meinst Du doch bestimmt so etwas wie Zahlen von 1 bis 15 oder so, also ich könnte auf die Drei klicken und würde dann an die entsprechenden datensätze kommen rihctig. Also wie eine Art Inhaltsverzeichnis oder?




mvitz hat gesagt.:


> 4) Batchaktionen, wie du bereits geschrieben hast, irgendwo Selectboxen hin, der Nutzer kann auswählen und anschließend per Button eine Aktion durchführen (der Button kann natürlich vorher noch eine Dialog mit Optionen oder ähnlichem anzeigen).



Ja das macht wirklich Sinn, evtl. könnte man doch auch mit speziellen Kontextmenüs arbeiten, die sich durch einen rechten Mausklick öffnen oder?




mvitz hat gesagt.:


> Ansonsten viele mir noch ein (aber das hast du afaik ausgeschlossen), dass du in der Tabelle anstatt der 22 Spalten nur 5 anzeigst (die, die wirklich wichtig sind) und man hat dann eine Art Detailansicht, die man durch Doppelklick oder so öffnet.



Das habe ich ehrlich gesagt noch nicht so ganz verstanden. Könntest Du das evtl. noch einmal etwas ausführlicher erklären, sofern Du Dir dafür die Zeit nehmen magst?!


Greetz
Dennis


----------



## mvitz (8. Aug 2011)

2) Kommt darauf an, wie du initial deine Daten lädst. Wenn du alles direkt beim Start aus der Datenbank lädst, dann reicht es ja, wenn dein Filter für alle Datensätze die nicht mehr zutreffen die Tabellenzeilen ausblendet. Du kannst aber natürlich auch ein erneutes Query auf die Datenbank absetzen, welche mit WHERE filtert, das kommt auf deine Architektur und auf die gewünschte Antwortzeit an (SQL Abfrage + Netzwerkübertragung sollte langsamer sein, als wenn man "nur" Tabellenzeilen ausblenden muss).

3) Im Endeffekt schon, du zeigst halt in der Tabelle fix X Zeilen an und darunter hast du einen Button um zu den vorherigen X Zeilen bzw. den nächsten X Zeilen zu kommen (man kann sich auch Vorstellen, du hast "Anzahl der Datensätze"/X Tabs mit jeweils einer Tabelle, die genau X Einträge enthält)

4) Ja klar kann man, dann würde ich aber auf Checkboxen verzichten und ein markieren der Zeile durch drauf klicken zulassen.

5) Das hängt eben ganz von den Daten ab. Angenommen eine Zeile stellt einen Kunden dar. Dieser hat eine Kundennummer, Name, Adresse, Ort, PLZ, Telefonnummer, Jahresumsatz, etc.. Dann könnte in einer ersten Übersicht ja Kundennr, Name und Ort reichen, du reduzierst die Tabelle also auf 3 Spalten. Möchte man anschließend die weiteren Spalten sehen, so kann man die Zeile anklicken und irgendwo (z.B. Dialog oder du hast unter der Tabelle Platz für diese Detailansicht) werden dann alle Daten für diesen Kunden angezeigt.


----------



## Landei (8. Aug 2011)

Wenn es irgendeine Form von Hierarchie innerhalb der Daten gibt (soll ja schon vorgekommen sein, dass jemand noch nichts von Normalformen gehört hat), ist ein JTree oder eine JTreeTable eventuell besser geeignet als eine JTable.


----------

