Übersicht Wenn der Benutzer aus einer Tabelle heraus einen Dialog zum Ändern von Daten aufruft und nach der Änderung zur Anzeige der Tabelle zurückkehrt, sollen seine Änderungen sofort in der Tabellenanzeige sichtbar sein. Auch eine zusätzliche Detailanzeige zur aktiven Tabellenzeile soll die neuen Werte zeigen. Beides ist mit dem S10 Framework ohne großen Aufwand realisierbar.
Beispiel Wir starten in einer Liste mit Angeboten, bei denen zu dem Angebot 20000008 die Details eingeblendet sind (Klick auf die Tabellenzeile):
Der Benutzer drückt den "Ändern" Button und gelangt in ein Dialogbild zum Ändern des Angebots. Dort fügen wir eine neue Position hinzu (Material TG12), wählen "Komplettlieferung" aus und setzen als Auftragsgrund "Besuch":
Wir sichern unsere Änderungen und gehen in die Liste zurück. Dort sind nun alle Änderungen sichtbar:
Implementierung Damit die Änderungen in der Tabellenzeile selbst sichtbar werden, genügt es, die neuen Werte auf ABAP-Ebene in das Zeilenobjekt zu setzen. Der Transport in die Anzeige erfolgt dann automatisch durch das S10 Framework.
Meist ist es dabei am einfachsten, die neuen Werte direkt von der Datenbank zu lesen. Der Benutzer kann ja nach Eingabe neuer Werte statt zu speichern den Dialog abbrechen, und in diesem Fall sollen die eingegebenen, aber nicht gespeicherten Werte nicht in die Liste übernommen werden.
In dem Beispiel oben besteht die Tabelle aus Objekten der Klasse "offerinfo", welche die in der Tabellenanzeige benötigten Informationen zum Angebot enthält, also Angebotsnummer, Datum, Gültigkeit, Nettowert, Währung, Status und Kundenreferenz. Die Klasse "offerinfo" enthält nicht die weiteren in dem Detailbereich angezeigten Informationen, insbesondere nicht die Angebotspositionen. Diese werden erst nach Klick auf eine Zeile in ein separates Objekt der Klasse "offerdetails" gelesen und in dem aufgeklappten Bereich angezeigt.
Insgesamt sind hier drei verschiedene Klassen im Spiel:
Klasse "offerinfo"
Sie enthält nur die in der Tabelle angezeigten Informationen zum Angebot. Die Datenbank muss zum Einlesen dann nur wenige Spalten der Tabelle VBAK auswerten, sodass auch sehr viele Angebote schnell eingelesen werden können.
Klasse "offerdetails"
Alle für die Detailanzeige benötigten Informationen. Sie enthält auch eine Tabelle der Positionen des jeweiligen Angebots (Datenbanktabelle VBAP). Der Zugriff darauf erfolgt jeweils für ein einzelnes Angebot.
Klasse "offer"
Das umfassende Dialogobjekt, dem die HTML-Seiten mit der Tabellenanzeige zugeordnet sind. Hier ist die Tabelle "taboffers" angelegt, deren Zeilen "offerinfo"-Objekte sind, sowie ein einzelnes Objekt "myofferdetails" der Klasse "offerdetails".
Es ist auch möglich, mit nur einer einzigen Klasse zu arbeiten, aber damit wird die Performance schlechter und das Coding unübersichtlicher. Zu empfehlen ist, von Anfang an bei tabellenartigen Anzeigen mit zwei Klassen analog "offerinfo" und "offer" zu arbeiten, und bei Implementierung einer Detailsicht (Aufklappen von Zeilen) mit einer separaten Detailklasse "offerdetails".
Nun zur Implementierung des Update der angezeigten Tabellenzeile sowie des aufgeklappten Detailbereichs.
Wir besorgen uns in der "onchange"-Methode als erstes das aktuelle "offerinfo" Objekt. Die Nummer der Zeile, die der Benutzer ausgewählt hat, stellt das S10 Framework in dem Kontext-Objekt s10contextinfo() zur Verfügung:
ABAP
data:
rownumber type i.
rownumber = s10contextinfo( )->rownumber.
* current offerinfo object
data: myofferinfo type ref to offerinfo.
read table taboffers index rownumber into myofferinfo.
Das funktioniert, wenn sich der gedrückte Button entweder in der Tabellenzeile selbst oder in dem aufgeklappten Detailbereich befindet.
Aus "offerinfo" übertragen wir die Angebotsnummer in das Managerobjekt "offer", und rufen den Änderungsdialog auf. Nach dem Änderungsdialog lesen wir die aktuellen Daten aus der Datenbank nochmal in das "offerinfo" Objekt ein:
ABAP
myoffer->vbeln = myofferinfo->vbeln.
myoffer->read( ).
* start the "change" dialog
myoffer->s10dialog( 'change' ).
* read updated values into current offer object
myofferinfo->read( ).
Damit erscheinen die geänderten Werte nach Rückkehr aus dem "change"-dialog in der Tabellenanzeige.
In dem aufgeklappten Detailbereich werden allerdings noch die alten Werte angezeigt. Um auch hier die neuen Werte erscheinen zu lassen, müssen wir etwas mehr tun:
In der Klasse "offerinfo" nehmen wir ein Attribut mit dem vordefinierten Namen "s10detailview" auf:
ABAP
data:
s10detailview type string.
Dieses Attribut wird in HTML als versteckte Spalte der Anzeigetabelle hinzugesetzt:
Durch Setzen des Werts "X" in "s10detailview" in der aufgerufenen Methode überträgt das S10 Framework die neuen Werte in den aufgeklappten Detailbereich.
In der ABAP Methode benötigen wir folgende Schritte:
(1) Die geänderten Detaildaten des Angebots einlesen
(2) Ein Kennzeichen "s10detailview" in der Tabelle auf 'X' setzen.
Im Beispiel sind die Details zum Angebot in Klasse "offerdetails" enthalten, die auch alle Angebotspositionen als Tabelle enthält. Das entsprechende Objekt ist "myorderdetails". Wir fügen daher noch folgendes Coding ein: