Wednesday, February 27, 2008

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)
    {
    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.