Поскольку FrameWork ADF позиционирует себя как декларативный, то для многих операций можно использовать декларативный, программный - через java код и смешанный - java + декларативный подход. Когда начинается использование java, то удобно подключить в проект ADFUtils.java и JSFUtils.java. Они есть в поставке примера от Oracle - "FusionOrderDemo"
Декларативный подход реализуется исключительно перетаскиванием операторов из Data Controls на форму. Так "Commit" перетаскиванием на форму оператора от "AppModuleDataControl".
Как пример трех реализация показана операция добавления записи:
В коде два варианта выглядят так:
Декларативный вариант сделан перетаскивание оператора "CreateInsert" ViewObject - JobsView1:
Варианты поиска и удаления записи:
Фильтрация набора данных без изменения итогового набора данных и создание нового - отфильтрованного :
Если нужно отфильтровать итоговый набор, то лучше использовать ViewCriteria.
Внешний вид примера:
Полезное.
Для инициализации данных при создании новой записи удобно использовать Imp класс Entity
переопределив метод - protected void create(AttributeList attributeList)
Для формирования PK на базе сиквенса удобно использовать Groovy выражение на Entity
Из java тоже самое можно сделать так:
Исходник примера
Декларативный подход реализуется исключительно перетаскиванием операторов из Data Controls на форму. Так "Commit" перетаскиванием на форму оператора от "AppModuleDataControl".
Как пример трех реализация показана операция добавления записи:
/** * Добавить запись (Java) * @param actionEvent */ public void acAdd(ActionEvent actionEvent) { ApplicationModule am = ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl"); ViewObject vo = am.findViewObject("JobsView1"); Row row = vo.createRow(); row.setAttribute("JobTitle", "Job Title"); vo.insertRow(row); } /** * Добавить запись (Java + декларативный) * @param actionEvent */ public void acAdd3(ActionEvent actionEvent) { ADFUtils.findOperation("CreateInsert").execute(); }
Декларативный вариант сделан перетаскивание оператора "CreateInsert" ViewObject - JobsView1:
Варианты поиска и удаления записи:
/** * Удаление записи * @param actionEvent */ public void acDel(ActionEvent actionEvent) { ApplicationModule am = ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl"); ViewObject vo = am.findViewObject("JobsView1"); Row row = vo.getCurrentRow(); row.remove(); } /** * Поиск записи * @param actionEvent */ public void acFind(ActionEvent actionEvent) { ApplicationModule am = ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl"); ViewObject vo = am.findViewObject("JobsView1"); Row[] byKey = vo.findByKey(new Key(new Object[] { getJobId() }), 1); if (byKey != null && byKey.length > 0) { vo.setCurrentRow(byKey[0]); } }
Фильтрация набора данных без изменения итогового набора данных и создание нового - отфильтрованного :
/** * Фильтр данных * @param actionEvent */ public void acFilter(ActionEvent actionEvent) { ApplicationModule am = ADFUtils.getApplicationModuleForDataControl("AppModuleDataControl"); ViewObject vo = am.findViewObject("JobsView1"); ViewCriteria vc = vo.createViewCriteria(); ViewCriteriaRow vcr = vc.createViewCriteriaRow(); vcr.setAttribute("MinSalary", ">=" + getFilterValue()); vc.add(vcr); vc.setCriteriaMode(ViewCriteria.CRITERIA_MODE_CACHE); RowSet rs = (RowSet)vo.findByViewCriteria(vc, -1, ViewObject.QUERY_MODE_SCAN_VIEW_ROWS); if ((rs != null) && (rs.getRowCount() > 0)) { StringBuilder sb = new StringBuilder(); while (rs.hasNext()) { Row row = rs.next(); sb.append(String.format("JobTitle %s, MinSalary %s \n", row.getAttribute("JobTitle"), row.getAttribute("MinSalary"))); } setFilterResult(sb.toString()); } }
Если нужно отфильтровать итоговый набор, то лучше использовать ViewCriteria.
Внешний вид примера:
Полезное.
Для инициализации данных при создании новой записи удобно использовать Imp класс Entity
переопределив метод - protected void create(AttributeList attributeList)
public class JobsImpl extends EntityImpl { protected void create(AttributeList attributeList) { super.create(attributeList); setJobId("XXX"); }
Для формирования PK на базе сиквенса удобно использовать Groovy выражение на Entity
adf.object.seqNextVal("Name_Sequence")
Из java тоже самое можно сделать так:
SequenceImpl seq = new SequenceImpl(seqName, Transaction); return seq.getSequenceNumber();
Исходник примера
Этот комментарий был удален автором.
ОтветитьУдалить