ADFrc Table single/multi Selection

Aktuell beschäftige ich mit JSF und Oracle ADFrc. Die Aufgabe war die neuen RC-Tabellen für unsere Anwendungen anzupassen bzw. die Neuerungen so zu beschreiben, das die Anwendungsentwickler sie einfach verwenden können.
Nach einigen Recherchen in Netz und in schon vorhandenen Blogs ist hier meine Lösung:

  1. ADFrc Tabellen benötigen keine Checkboxen mehr um einzelne oder mehrere Zeilen für eine Weiterbearbeitung zu markieren
  2. Der Selection-Modus wird am Tabellenelement als RowSelection eingestellt
  3. Die Bearbeitung der Selektion erfolgt über eine Managed Bean (hier TableSelector)
  4. Die Erstellung der Bean kann aus JDev heraus durch drücken des kleinen Dreieck am Ende der Zeile Bindings zusammen mit der Erstellung Property für die Tabelle erfolgen. Dazu muss dann der Button ‘new…’ gedrückt werden. Ist bereits eine Bean vorhanden, kann diese ausgewählt werden.
  5. Soll mit jeder Selektion in der Tabelle eine Änderung in der GUI erfolgen (z.B. Rückmeldung welche Zeile ausgewählt wurde) sollte in der Bean noch ein SelectionListener eingetragen werden
  6. Der Code sorgt dafür, das die ausgewhälte Zeile als aktuelle Zeile des Datenmodell markiert wird
    public void doSelection(SelectionEvent selectionEvent)
    {
        // Add event code here...
        JSFUtils.resloveMethodExpression("#{bindings.UvgoaeZiffernView.collectionModel.makeCurrent}",
        null, new Class[] { SelectionEvent.class },
        new Object[] { selectionEvent });
    }

  7. Für die eigentliche Bearbeitung der Selektion kann dann noch eine Action Methode in der Bean definiert werden:
    public String anzeigenAuswahl()
    {
        // Add event code here...
        RichTable table = getZiffernTable();
        Iterator selection = table.getSelectedRowKeys().iterator();
        DCIteratorBinding rowiter = ADFUtils.findIterator("UvgoaeZiffernViewIterator");
        Object oldKey = table.getRowKey();
        while (selection.hasNext())
        {
            List rowKey = (List)selection.next();
            UvgoaeZiffernViewRow row =
                (UvgoaeZiffernViewRow)rowiter.findRowByKeyString(((Key)rowKey.get(0))
                .toStringFormat(true));
            logger.info("Selected Row = " + rowKey + " Leistung = " + row.getLeistungKurz());
            table.setRowKey(rowKey);
        }
        return "anzeigenZiffer";
    }

  8. Diese muss nun nur noch an einen Button gebunden werden

Die dargestellte Methode gibt nur eine Meldung pro selektierter Zeile aus, zeigt aber den Zugriff auf die Daten des unterliegenden Datenmodell.

4 thoughts on “ADFrc Table single/multi Selection

  1. Hi Timo,
    kann man den Code so umschreiben, dass der iterator bzw. der DCIteratorBinding vom CollectionModel der Table geholt werden kann? Soetwas wie “getCollectionModel().getBinding()”. Der Binding-Name im Code ist natürlich nicht schön, wenn man an Weiterentwicklung und Wartung denkt. Denn dann kann der Name sich schnell ändern und der Code funktioniert nicht mehr.

  2. Hallo Markus,
    Ich habe mal etwas getestet und dabei ist folgende Lösung entstanden:
    Anstatt den Iterator über

    ADFUtils.findIterator("UvgoaeZiffernViewIterator");
    

    zu holen kann auch

            FacesCtrlHierNodeBinding obj = (FacesCtrlHierNodeBinding)table.getSelectedRowData();
            DCIteratorBinding rowiter = obj.getDCIteratorBinding();
    

    verwendet werden.

  3. Hi man,
    Would you be so kind to send me your JSFUtils class? I noticed you have one interesting method – resloveMethodExpression(). I need to code method exactly like your doSelection. Coud it be possible?

  4. Alternativ geht auch:

    import org.apache.myfaces.trinidad.model.CollectionModel;

    CollectionModel model = (CollectionModel)table.getValue();
    FacesCtrlHierBinding bind = (FacesCtrlHierBinding)model.getWrappedData();
    DCIteratorBinding rowiter = bind.getDCIteratorBinding();

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s