Ü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:

    data:
      
rownumber type i.

    
rownumber s10contextinfo( )->rownumber.

current offerinfo object
    
datamyofferinfo 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:


    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:

     data:
      s10detailview     
type string.

Dieses Attribut wird in HTML als versteckte Spalte der Anzeigetabelle hinzugesetzt:

<input type="hidden" class="inputcell" name="s10detailview" />

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:


*  (1) read offer details
    
myofferdetails->vbeln =  myofferinfo->vbeln.
    
myofferdetails->read( ).


(2) indicate: table detail area needs an update
    
myofferinfo->s10detailview 'X'.
 
In Schritt (2) beachten, dass das Kennzeichen sich in "myofferinfo" befindet (Tabellenobjekt, nicht Detailobjekt).

Hier nun die gesamte Methode, wobei der Vollständigkeit halber auch das SAP-seitige Sperren des Angebots implementiert ist:

method on_change.
    data:
     rownumber type i.
     rownumber = s10contextinfo( )->rownumber.

* offerinfo object (table object)
    data: myofferinfo type ref to offerinfo.
    read table taboffers index rownumber into myofferinfo.

* enqueue offer
    call function 'ENQUEUE_EVVBAKE'
      exporting
        vbeln  = myofferinfo->vbeln
      exceptions
        others = 1.

* offer currently in work? then error message
    if sy-subrc > 0.
      data: msgline type string.

      call function 'MESSAGE_TEXT_BUILD'
        exporting
          msgid               = sy-msgid
          msgnr               = sy-msgno
          msgv1               = sy-msgv1
          msgv2               = sy-msgv2
          msgv3               = sy-msgv2
          msgv4               = sy-msgv2
        importing
          message_text_output = msgline.

      s10errormessage( msgline ).
    endif.


* after enqueue, read the offer from the database
    myoffer->vbeln = myofferinfo->vbeln.
    myoffer->read(  ).

* start the "change" dialog
    myoffer->s10dialog( 'change' ).

* dequeue offer after the change dialog
    call function 'DEQUEUE_EVVBAKE'
      exporting
        vbeln = myoffer->vbeln.


* read updated values into current offerinfo object
    myofferinfo->read( ).

* read offer details
    myofferdetails->vbeln = myofferinfo->vbeln.
    myofferdetails->read(  ).

* indicate: table detail area needs an update
    myofferinfo->s10detailview = 'X'.

  endmethod.  

 

Komponente: S10 Framework