Datenübernahme bei Mehrfachselektion

23 views
Skip to first unread message

rbu

unread,
Apr 30, 2008, 5:38:39 AM4/30/08
to BSP-Praxis
Hallo Rüdiger,

ich wieder einmal mit einer Frage.

Das select-Tag liefert ein Attribut multiple. Damit kann ich mehrere
Werte in einer Listbox selektieren.
Wie hole ich mir die Werte wieder zurück, um sie in einer internen
Tabelle im Modell zu Verfügung zu haben, z.B.
in einer Rangetabelle IHTTPNVP?

Dabei habe ich zwei Probleme :
- Wie lautet die Syntax in der view.
- Wie greife ich die Werte im Modell ab.

Ich habe kein Beispiel gefunden, wo das beschrieben wird. Bin für
jeden Tip dankbar.

Gruss Ray

Message has been deleted

Rüdiger

unread,
May 5, 2008, 9:08:25 AM5/5/08
to BSP-Praxis
Hallo Ray,

sorry für die leicht verspätete Antwort, habe den Brückentag für einen
kurzen Urlaub benutzt.

Wie Du mittlerweile Dir mittlerweile sicher auch schon überlegt hast,
muss man einer Mehrfachselectbox bei der Datenübernahme etwas unter
die Arme greifen, denn der normale Datenbindungsmechanismus ist für
tabellenförmige Daten (wie es Mehrfachauswahlen nun mal sind) nicht
ausgelegt.

Du verwendest am besten auf dem View ein Element wie

<z:select multiple="true" binding="//myModel/gt_values"/>

Dann redefinierst Du (oder fügst hinzu, wenn Du Dein Model nicht mit
Vererbung, sondern mit Delegation definiert hast) in der Methode
validate() des betreffenden Models folgenden Code:

data: lt_fields type tihttpnvp.
clear gt_values.
data: lv_value type ... " Datentyp des einzelnen Feldes.
loop at it_fields assigning <ls_field>.
if <ls_field>-name eq 'gt_values'.
lv_value = <ls_field>-value.
append lv_value to gt_values.
else.
insert <ls_field> into table lt_fields.
endif.
endloop.
call method super->zif_model~validate
exporting
it_fields = lt_fields
iv_ref_object = iv_ref_object
changing
ct_error_fields = ct_error_fields.


Mit anderen Worten: Alle Felder ausser für die, die mit dem Namen
'gt_values' angeliefert werden, delegierst Du an den Standard. Die,
die mit dem Namen 'gt_values' kommen, übernimmst Du selbst und baust
mit ihren Werten die Tabelle gt_values auf.


Der Code sollte so funktionieren, auch wenn er leicht vereinfacht ist.
Denn statt der einfachen Zuweisung könnte ein Purist auf der
Validierung mittels validate_field() bestehen.


Ausserdem ist es diskussionswürdig, ob dieser Code in das Model oder
in den Controller gehört. Wer den Code lieber in der Controllermethode
sieht (z.B. in der Redefinition von set_model_attributes() ), könnte
argumentieren, dass es dem Model ja schliesslich egal ist, ob seine
Tabelle gt_values im UI als multiple select box dargestellt wird.

Man kann dagegenhalten, dass das Model mit obigem Code ja auch nicht
die multiple select box verlangt, sondern nur die Konvention
aufstellt, dass das Feld gt_values aus mehreren Zeilen der it_fields
aufgebaut werden kann. Eine Konvention, die für multiple select boxes
halt gut passt, aber an sich völlig unabhängig von irgendeinem
konkreten UI-Element ist.

Gruss,
Rüdiger

P.S.: Wenn Du Freude an JavaScript hast, ist auch folgende Lösung
gangbar. Definiere eine Funktion clientCheck(). Wenn sie existiert,
wird sie beim Druck eines Buttons automatisch aufgerufen. Stelle
sicher, dass sie den Wert "true" zurückgibt, damit das Absenden des
Formulars nicht verhindert wird. Nun schau Dir mittels DOM-Zugriffen
die vom User gewählten Einträge Deiner multiple select box an und
stelle die Datenbindung selbst her, indem Du <input>-Felder erzeugst,
die auf aufeinanderfolgende Zeilen der Tabelle gt_values verweisen.
Wenn der User beispielsweise '1', '3' und '4' gewählt hat, erzeuge die
Inputfelder

myModel__gt_values[1] : '1'
myModel__gt_values[2] : '3'
myModel__gt_values[3] : '4'


Dadurch entsteht ohne ABAP-Änderungen die interne Tabelle gt_values
mit den drei Einträgen 1, 3 und 4.

rbu

unread,
May 5, 2008, 4:31:13 PM5/5/08
to BSP-Praxis
Hallo Rüdiger,

danke für die sehr ausführliche und hilfreiche Antwort.
Ich denke ich kann dadurch eine Mehrfachselektion realisieren.

Auch die vorherigen Antworten waren sehr hilfreich. Es macht Spass
mit deinem Framework zu arbeiten.

Ich entwickle mit ein Paar Kollegen eine Applikation, die
vollständig auf deinem Framework basiert. Wir haben noch ein
Paar nette Gimics eingebaut z.B. jede Modellklassen hält eine
Liste von DAO Objekten, die den Zugriff auf die Datenbank kapseln.
Diese DAO's werden in der config.xml konfiguriert und im Konstruktor
des Basismodells initialisert. Alle DAO-Klassen müssen dabei ein
bestimmtes Interface implementieren.

Bei Interesse deinerseits werde ich alle diese Ideen am Ende des
Projektes zu Verfügung stellen. Vielleicht kannst du die eine oder
andere Idee in deinen Standard übernehmen.

Gruss Ray

Rüdiger

unread,
May 6, 2008, 10:44:57 AM5/6/08
to BSP-Praxis
Hallo Ray,

danke für Dein positives Feedback! Freut mich zu lesen, dass Dir
das Framework für Dein Projekt so nützlich ist.

An Verbesserungen bin ich stets interessiert - und möglicherweise
gibt es für gute Ideen auch andere Nutzniesser.

Gruss,
Rüdiger

Reply all
Reply to author
Forward
0 new messages