OAF Dinamik Arayüz Formu ve Tablosu (PPR)
Merhaba,
Bu yazıda OAF sayfalarında dinamik arayüz ve tablo içerisinde dinamik özellik değişim konularıyla ilgili örnekler yapacağım.
1. Aşağıdaki SQL çalıştırılarak veritabanı objeleri oluşturulur ve gerekli veriler tabloya doldurulur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
create table xxntc.xx_ppr_single ( id number primary key, attr1 varchar2(100), attr2 varchar2(100), creation_date date, created_by number, last_update_date date, last_updated_by number, last_update_login number ); create public synonym xx_ppr_single for xxntc.xx_ppr_single; create sequence xxntc.xx_ppr_single_s start with 1; create table xxntc.xx_ppr_table ( id number primary key, attr1 varchar2(100), attr2 varchar2(100), creation_date date, created_by number, last_update_date date, last_updated_by number, last_update_login number ); create public synonym xx_ppr_table for xxntc.xx_ppr_table; create sequence xxntc.xx_ppr_table_s start with 1; begin for i in 1..5 loop insert into xxntc.xx_ppr_table values (xxntc.xx_ppr_table_s.nextval, dbms_random.string('A', 5), dbms_random.string('A', 5), sysdate, -1, sysdate, -1, -1); end loop; commit; end; |
2. Önceden ayarlanmış bir JDeveloper OAF projesi açılır ve projeye sağ tıklanıp ADF Business Componenets -> Business Components from Tables seçilir.
3. Aşağıdaki adımlar sırayla uygulanarak projenin model objeleri üretilir.
4. Son durumda proje veri modeli aşağıdaki gibi olmalıdır.
5. XxPprSingleEO ve XxPprTableEO Entity Objeleri için create fonksiyonları oluşturulur.
Formlar İçin Dinamik Arayüz
Bu bölümde giriş formları için dinamik arayüz yapımından bahsedeceğim. Formlar için dinamik özellikler Partial View Object nesneleri üzerinden sağlanmaktadır. OAF içerisinde bulunan Item Bean’lerinin dinamik olarak değiştirilebileceği 4 adet özellikleri mevcuttur.
Bu özellikler aşağıdaki gibidir:
- Rendered (true veya false): Görünürlüğün dinamik şekilde değişmesine olanak sağlar.
- Disabled (true veya false): Herhangi bir item’ın tipini değiştirmeden değiştirilebilir veya değiştirilemez olmasına olanak sağlar.
- Read-Only (true veya false): Herhangi bir item’ın tipini değiştirerek değiştirilebilir veya değiştirilemez olmasına olanak sağlar.
- Required (yes, no, uiOnly, validaterOnly): Herhangi bir item’ın zorunluluk özelliğinin dinamik olarak değişmesini sağlar.
Aşağıdaki adımlarla devam edilir.
1. Server paketi altına yeni bir View Object nesnesi oluşturulur. Bu nesne PVO (Partial View Object) olarak kullanılacak nesnedir. Partial View Object herhangi bir SQL sorgusundan oluşmaz veya Entity Object nesnesinden türetilmez. İçerisinde DECLARETIVE veya PROGRAMMATIC olarak oluşturulmuş olan iki adet Attribute yer alır.
- Anahtar alan: Number
- Özellik Alanı: Özelliğie bağlı olarak Required ise String, diğer özellikler ise Boolean olmalıdır.
Partial View Object nesnesi sayfa açılırken sadece bir satır ve başlangıç değeri içermelidir. Sayfada istenilen aksiyon olduğunda özellik değeri bağlı olarak değiştirilir. Partial View Object nesnesi içinde yer alan özellik değeri SPEL diliyle değişmesi istenen alanın özellik bölümüne yazılır.
2. Partial View Object oluşturulduktan sonra Application Module nesnesine eklenmelidir.
3. Yeni bir OAF sayfası ve sayfaya ait bir Controller nesnesi oluşturulur.
4. pageLayout Region özellikleri aşağıdaki gibi düzenlenir.
ıd | window title | title | AM Definition |
---|---|---|---|
PageLayoutRN | PPR Example | PPR Example | xxntc.oracle.apps.per.ppr.server.XxPprAM |
5. Tablomuzda bulunan alanlardan biri diğerini tetikleyecektir. Dolayısıyla tetikleyici olan alanın bir değer listesi olması çok daha mantıklıdır. Değer listesi işlemi için yeni bir View Object nesnesi oluşturulur ve Application Module nesnesine eklenir.
SQL Sorgusu:
1 2 3 4 5 |
select 'DISABLED' as value from dual union select 'NOT DISABLED' as value from dual |
6. Sayfaya yeni bir Form Region aşağıdaki adımlarla oluşturulur.
7. Attr1 ve Attr2 özellikleri aşağıdaki gibi güncellenir.
Item Style | Picklist View Definition | Picklist Display Attribute | Picklist Value Attribute | Action Type | Event |
---|---|---|---|---|---|
messageChoice | xxntc.oracle.apps.per.ppr.poplist.server.XxPprAttr1LovVO | Value | Value | firePartialAction | onAttr1Change |
Disabled |
---|
${oa.XxPprSingleAttr2PVO1.Attr2Disabled} |
8. Aşağıdaki kod düzenlemeleri yapılır.
XxPprSingleEOImpl.java
1 2 3 4 5 6 7 8 |
public void create(AttributeList attributeList) { super.create(attributeList); OADBTransactionImpl transaction = (OADBTransactionImpl)getOADBTransaction(); Number Id = transaction.getSequenceValue("XXNTC.XX_PPR_SINGLE_S"); setId(Id); } |
XxPprPGCO.java
1 2 3 4 5 6 7 8 9 10 11 |
public void processRequest(OAPageContext pageContext, OAWebBean webBean) { super.processRequest(pageContext, webBean); OAApplicationModule am = pageContext.getApplicationModule(webBean); if (!pageContext.isFormSubmission()) { am.invokeMethod("createSingleRow"); } am.invokeMethod("initPvo"); } |
1 2 3 4 5 6 7 8 9 10 |
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean) { super.processFormRequest(pageContext, webBean); OAApplicationModule am = pageContext.getApplicationModule(webBean); if ("onAttr1Change".equals(pageContext.getParameter(OAWebBeanConstants.EVENT_PARAM))) { am.invokeMethod("handeAttr1ChangeEvent"); } } |
XxPprAMImpl.java
1 2 3 4 5 6 7 8 9 10 11 |
public void createSingleRow() { XxPprSingleEOVOImpl vo = getXxPprSingleEOVO1(); if (!vo.isPreparedForExecution()) { vo.executeQuery(); } Row row = vo.createRow(); vo.insertRow(row); row.setNewRowState(Row.STATUS_INITIALIZED); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public void initPvo() { OAViewObject pvo = (OAViewObject)findViewObject("XxPprSingleAttr2PVO1"); if (pvo != null) { if (pvo.getFetchedRowCount() == 0) { pvo.setMaxFetchSize(0); pvo.executeQuery(); Row row = pvo.createRow(); pvo.insertRow(row); row = (OARow)pvo.first(); row.setAttribute("RowKey", new Number(1)); } handeAttr1ChangeEvent(); } else { throw new OAException("Error"); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public void handeAttr1ChangeEvent() { OAViewObject vo = (OAViewObject)findViewObject("XxPprSingleAttr2PVO1"); OARow row = (OARow)vo.first(); OAViewObject singleVo = (OAViewObject)findViewObject("XxPprSingleEOVO1"); OARow singleRow = (OARow)singleVo.getCurrentRow(); if (singleRow.getAttribute("Attr1") != null) { String value = (String)singleRow.getAttribute("Attr1"); if ("DISABLED".equals(value)) { row.setAttribute("Attr2Disabled", Boolean.TRUE); } else if ("NOT DISABLED".equals(value)) { row.setAttribute("Attr2Disabled", Boolean.FALSE); } else { row.setAttribute("Attr2Disabled", Boolean.TRUE); } } else { row.setAttribute("Attr2Disabled", Boolean.TRUE); } } |
9. Sayfa çalıştırılır ve test edilir.
Tablolar İçin Dinamik Arayüz
1. Yeni bir sayfa ve Controller nesnesi yaratılır.
2. Page Layout Region özellikleri aşağıdaki gibi güncellenir.
ıd | wındow tıtle | tıtle | AM Defınıtıon |
---|---|---|---|
PageLayoutRN | Table PPR | Table PPR | xxntc.oracle.apps.per.ppr.server.XxPprAM |
3. XxPprTableEOVO Edit ile açılır ve SQL Statement bölümünde “Expert Mode” seçilerek SQL düzenlenebilir duruma getirilir. İki adet null alan (SELECTED, ATTR1_DISABLED) SQL içerisine eklenir. Attribute bölümünden Attr1Disabled alanı Boolean olarak değiştirilir. İki alan için de Updatable Always seçilmelidir.
SQL Sorgusu:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SELECT XxPprTableEO.ID, XxPprTableEO.ATTR1, XxPprTableEO.ATTR2, XxPprTableEO.CREATION_DATE, XxPprTableEO.CREATED_BY, XxPprTableEO.LAST_UPDATE_DATE, XxPprTableEO.LAST_UPDATED_BY, XxPprTableEO.LAST_UPDATE_LOGIN, null SELECTED, null ATTR1_DISABLED FROM XXNTC.XX_PPR_TABLE XxPprTableEO |
4. Sayfaya bir adet Tablo region’ı aşağıdaki adımlarla eklenir.
5. Seleced Check Box Item’ı için aşağıdaki düzenlemeler yapılır.
Inıtıal Value | Checked Value | Unchecked Value | Actıon Type | Event |
---|---|---|---|---|
N | Y | N | firePartialAction | onCheckBoxChange |
6. Aşağıdaki kod düzenlemeleri yapılır.
XxPprTableEOImpl.java
1 2 3 4 5 6 7 8 |
public void create(AttributeList attributeList) { super.create(attributeList); OADBTransactionImpl transaction = (OADBTransactionImpl)getOADBTransaction(); Number Id = transaction.getSequenceValue("XXNTC.XX_PPR_TABLE_S"); setId(Id); } |
XxPprTablePGCO.java
1 2 3 4 5 6 7 8 9 10 |
public void processRequest(OAPageContext pageContext, OAWebBean webBean) { super.processRequest(pageContext, webBean); OAApplicationModule am = pageContext.getApplicationModule(webBean); am.invokeMethod("executeTableVO"); OAMessageTextInputBean Attr1Bean = (OAMessageTextInputBean)webBean.findChildRecursive("Attr1"); Attr1Bean.setAttributeValue(OAWebBeanConstants.DISABLED_ATTR, new OADataBoundValueViewObject(Attr1Bean, "Attr1Disabled", "XxPprTableEOVO1", false)); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean) { super.processFormRequest(pageContext, webBean); OAApplicationModule am = pageContext.getApplicationModule(webBean); if ("onCheckBoxChange".equals(pageContext.getParameter(OAWebBeanConstants.EVENT_PARAM))) { String rowReference = pageContext.getParameter(OAWebBeanConstants.EVENT_SOURCE_ROW_REFERENCE); Row currentRow = am.findRowByRef(rowReference); String selected = (String)currentRow.getAttribute("Selected"); if ("Y".equals(selected)) { currentRow.setAttribute("Attr1Disabled", Boolean.TRUE); } else { currentRow.setAttribute("Attr1Disabled", Boolean.FALSE); } } } |
XxPprAMImpl.java
1 2 3 4 5 6 7 8 9 |
public void executeTableVO() { XxPprTableEOVOImpl vo = getXxPprTableEOVO1(); if (vo == null) { throw new OAException("Error!"); } vo.executeQuery(); } |
7. Sayfa çalıştırılır ve test edilir.
Umarım faydalı bir yazı olmuştur. 🙂