OAF Tablo İşlemleri Uygulaması
Merhaba,
Bu yazımda OAF üzerinde tablo işlemleri konusunu işleyeceğim. Bir veritabanı tablosundaki verileri OAF sayfada içinde yer alan bir tabloya getirip, üzerinde ekeleme, çıkarma, toplu ekleme, toplu çıkarma işlemleri yapacağım.
Oracle WHO Sütunları
Oracle EBS üzerinde yer alan standart tablolaların büyük çoğunluğunda da bulunan 5 sütun vardır. Bunlar
- CREATED_BY: İlgili satırın FND_USER’daki hangi USER_ID tarafından oluşturulduğunu gösteren USER_ID’dir.
- CREATION_DATE: İlgili satırın ne zaman oluşturulduğu bilgisini tutan tarih sütunudur.
- LAST_UPDATE_DATE: İlgili satır üzerinde en son ne zaman güncelleme işlemi yapıldığını tutan tarih sütunudur.
- LAST_UPDATED_BY: İlgili satır üzerinde en son hangi USER_ID’nin güncelleme yaptığı bilgisini tutan sütundur.
- LAST_UPDATE_LOGIN: İlgili satır üzerinde en son hangi SESSION_ID’nin güncelleme yaptığı bilgisini tutan sütundur.
Şimdi yukarıdaki bilgiler doğrultusunda her örnekte olduğu gibi öncelikle setup işlemleri için aşağıdaki SQL Script’ini çalıştırıp, OAF uygulamasında kullanmak üzere basit bir tablo ve sequence yaratıyoruz.
Oracle, EBS üzerinde kullanılacak CUSTOM tablolarda yukarıda bahsettiğimiz WHO sütunlarının yaratılmasını tavsiye eder. OAF uygulamalarında Framework bu sütunları otomatik dolduracağı için geliştiricinin bu sütunları doldurmasına gerek yoktur. Eğer tablonuzda bü sütunlar yoksa Entity Object’e ait JAVA dosyası içinde bu sütunları dolduran fonksiyonları overwrite etmeniz gerekmektedir. Aksi takdirde derleme hatası alırsınız.
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 |
create table hr.xx_oaf_anil_personel ( person_id number, first_name varchar2(120), last_name varchar2(120), salary number, date_of_birth date, hire_date date, created_by number, creation_date date, last_update_date date, last_updated_by number, last_update_login number ); alter table hr.xx_oaf_anil_personel add constraint xx_oaf_anil_personel_pk primary key (person_id); create public synonym xx_oaf_anil_personel for hr.xx_oaf_anil_personel; create sequence hr.xx_oaf_anil_personel_s start with 1 increment by 1 minvalue 1 nocache nocycle noorder; |
Not: Bir OAF uygulamasına başlanmadan önce veritabanı dizaynının yapılması işinizi kolaylaştıracaktır. Eğer uygulamada başlık-detay ilişkisi içeren bir yapı var ise, veritabanında birincil ve ikincil anahtarları mutlaka oluşturun. OAF tarafında eşdeğer BC4J (View Object, Entity Object, View Link, Association) objelerini oluştururken JDeveloper’ın “Business Componenets from Tables” özelliği sayesinde View Link ve Association objeleriniz otomatik oluşacaktır.
Daha önce SETUP işlemleirni yaptığımız JDeveloper IDE’sini açıyoruz.
1.Demo projesine sağ tıklayıp New diyoruz.
2. Sol menüden Business Tier altında yer alan ADF Business Components bölümüne geçiş yapıyoruz. Sağ pencereden de Business Componenets from Tables seçip Ok butonuna basılır.
3. Açılan sihirbazın başlangıç adımı Next ile devam edilir.
4. 1. adımda Entity Object oluşturma adımıdır. Şemayı tablonuzu oluşturduğunuz şemaya çevirip Query butonuna basınız. Şema altında bulunan tablolar listelenecektir. Oluşturulan tablo seçilir. Yukarda yer alan Package bölümü de xxntc.oracle.apps.per.aniltablo.schema.server olarak değiştirilir. Entity Name bölümü de isimlendirme standartlarına uygun olarak düzenlenir. Next ile devam edilir.
5. Sihibrazın 2.adımında Entity Object’lerden oluşacak View Object’ler seçilir. İsimlendirme ve paket dizini standartlara uygun olarak değiştirilir ve Next ile devam edilir.
İsim: XxOafAnilPersonelEOVO
Paket: xxntc.oracle.apps.per.aniltablo.dml.server
6. Sihibrazın 3. adımı read-only view object seçilen bölümdür. Burada varsa SQL sorgularınızı veritabanında view olarak yaratıp seçebilirsiniz. Bu adımda değişiklik yapmadan Next ile devam edilir.
7. Sihirbazın 4. adımı varsa seçilen yoksa Application Module oluşturulan adımdır. Yine İsimlendirme ve paket dizini standartlarına dikkat ederek aşağıdaki isim ve paket dizin yolu belirlenir. Next ile devam edilir.
İsim: XxTableDmlAM
Paket: xxntc.oracle.apps.per.aniltablo.dml.server
8. Bu adımda isterseniz Business Componenets Şeması oluşturabilirsiniz. Next ile devam edilir.
9. Son adımda Finish butonu ile sihirbaz kapatılır ve JDeveloper’ın objeleri, paketleri oluşturması beklenir.
10. JDeveloper oluşturma işlemini bitirdikten sonra Applications Navigator altında aşağıdaki gibi bir yapı olması gerekir.
11. Model tarafı kabaca oluştuktan sonra sayfayı oluşturmak için projeye sağ tıklanır New ile devam edilir. Sol menüde Web Tier bölümünde yer alan OA Components bölüne geçiş yapılır. Sağ bölümden Page seçilir. Ok butonu ile devam edilir.
12. Sayfaya standartlara uygun bir isim ve dizin belirlerlenir. OK butonu ile sayfa oluşturulur.
Sayfa: XxTableDmlPG
Dizin: xxntc.oracle.apps.per.aniltablo.dml.webui
13. Oluşturma işlemi bittikten sonra xxntc.oracle.apps.per.aniltablo.dml.webui altından sayfa seçilir. Böylece sayfanın XML yapısı Structure penceresinde listelenir. Bu nokarada sırasıyla aşağıdaki adımlar yapılır.
Sayfanın pageLayout region’ı için düzgün bir ID belirlenir. region1 olan ID PageLayoutRN olarak değiştirilir.
Window Title ve Title Değerleri “Tablo DML İşlemleri” olarak değiştirilir.
AM Definition bölümünden önceki adımlarda oluşturduğumuz XxTableDmlAM seçilir.
14. Sorunsuz devam edildiğini test etmek amacıyla sayfaya sağ tıklanıp Run denilir ve sayfanın sorunsuzca açıldığı görülür.
15. Sayfa üzerinde XML Structure bölümünde PageLayoutRN’a sağ tıklanır ve “Set New Controller” seçilir.
16. Açılan pencerede standartlara uygun java sınıfı adı ve paket adı belirlenir. OK ile pencere kapatılır ve java dosyasının oluşması beklenir.
Java Sınıfı Adı: XxTableDmlPGCO
Paket Adı: xxntc.oracle.apps.per.aniltablo.dml.webui
17. Sayfada PageLayoutRN altına bir adet HeaderRN oluşturulur. Bunun için PageLayoutRN üzerine sağ tıklanır ve New Region Seçilir.
Sağdaki Property Inspector bölümünden Region Tipi “Header” olarak seçilir. ID ise “DmlTableHeaderRN” olarak değiştirilir. Text bölümü ise “Tablo İşlemleri” olarak güncellenir.
18. Header bölümünün altında tablo oluşturmak için PageLayoutRN altında oluşturulan DmlTableHeaderRN’a sağ tıklanır ve New Region seçilir.
Region Style: advancedTable
ID: DmlAdvanceTableRN
View Instance: XxOafAnilPersonelEOVO1
Width: 100%
19. Tablo oluştuktan sonra altına 5 adet sütun eklenir. Sütun ekleme için DmlAdvanceTableRN’a sağ tıklanır ve New -> Column seçilir.
20. Column’lar oluşurken altlarında yer alan colum Components bölümünde başlık bilgileri yer almaktadır. Her bir sütun için columHeader bölümüne sağ tıklanır New->sortableHeader seçilir.
21. Bu aşamada aşağıdaki gibi bir sayfa yapısının oluşmuş olması gerekiyor.
22. Eklenen sütunlar ve başlıkların özellikleri aşağıdaki gibi düzenlenir.
column1
ID: FirstNameCol
sortableHeader1
ID: FirstNameColHdr
Prompt: Ad
column2
ID: LastNameCol
sortableHeader2
ID: LastNameColHdr
Prompt: Soyad
column3
ID: SalaryCol
sortableHeader3
ID: SalaryColHdr
Prompt: Maaş
column4
ID: DateOfBirthCol
sortableHeader4
ID: DateOfBirthColHdr
Prompt: Doğum Tarihi
column5
ID: HireDateCol
sortableHeader5
ID: HireDateColHdr
Prompt: İşe Giriş Tarihi
23. Yukarıdaki adımlar tamamlandıktan sonra aşağıdaki gibi bir görünümün oluşması gerekiyor.
24. Bu adımda her sütun altına MessageTextInput elementleri eklenir. Bunun için sütunlara sağ tıklanır New->Item seçilir.
FirstNameCol->New->Item
ID | ITEM STYLE | DATA TYPE | MAXIMUM LENGTH | VIEW ATTRIBUTE |
---|---|---|---|---|
FirstName | messageTextInput | VARCHAR2 | 120 | FirstName |
LastNameCol->New->Item
ID | ITEM STYLE | DATA TYPE | MAXIMUM LENGTH | VIEW ATTRIBUTE |
---|---|---|---|---|
LastName | messageTextInput | VARCHAR2 | 120 | LastName |
SalaryCol->New->Item
ID | ITEM STYLE | DATA TYPE | MAXIMUM LENGTH | VIEW ATTRIBUTE |
---|---|---|---|---|
Salary | messageTextInput | NUMBER | Salary |
DateOfBirthCol->New->Item
ID | ITEM STYLE | DATA TYPE | MAXIMUM LENGTH | VIEW ATTRIBUTE |
---|---|---|---|---|
DateOfBirth | messageTextInput | DATE | DateOfBirth |
HireDateCol->New->Item
ID | ITEM STYLE | DATA TYPE | MAXIMUM LENGTH | VIEW ATTRIBUTE |
---|---|---|---|---|
HireDate | messageTextInput | DATE | HireDate |
25. Yukarıdaki işlemler bittikten sonra aşağıdaki gibi bir yapının oluşması gerekiyor.
Şu ana kadar sayfayının bir kısmını oluşturduk, BC4J objelerini kabaca belirledik, sayfaya tablo ekleyip view object’e bağladık. Item’lar ekleyip ilgili View Object’in Attribute’larına bağladık.
26. Sayfa açıldığında verilerin gözükmesi için VO içerisindeki SQL sorgusunun çalıştırılması gerekiyor. Bunun için 16. adımda oluşturduğumuz JAVA dosyasını (XxTableDmlPGCO) açıyoruz. Controller sınıflarının içerisinde iki adet metod vardır. Bunlar processRequest ve processFormRequest metodlarıdır.
- processRequest: Sayfa açılmadan önce çalışan metoddur.
- processFormRequest: Sayfa açıldıktan sonra sayfa üzerindeki herhangi bir aksiyon gerçekleştiğinde çalışan metoddur.
Application Module içerisine tabloya bağladığımız View Object’in sorgusunu çalıştıracak bir fonksiyon yazacağız ve bu fonksiyonu Controller Objesinin processRequest metodundan çağıracağız. Ama öncesinde View Object JAVA dosyası içine QUERY’i çalıştıran initQuery() fonksiyonunu ekleyeceğiz.
View Object oluştururken beraberinde gelen XxOafAnilPersonelEOVOImpl java dosyasını açıyoruz.
Aşağıdaki fonksiyonu XxOafAnilPersonelEOVOImpl java sınıfına ekliyoruz. Bu kod view object içerisinde yer alan SQL’i koşulsuz şartsız çalıştırır.
1 2 3 4 5 |
public void initQuery() { executeQuery(); } |
Application Module java sınıfını (XxTableDmlAMImpl) açıyoruz.
Aşağıdaki fonksiyonu XxTableDmlAMImpl java sınıfına ekliyoruz. Az önce View Object içine eklediğimiz metodu çağırmak için önce Impl dosyasından object oluşturuyoruz daha sonra null kontrolü yapıyor ve çağırma işlemini gerçekleştiriyoruz.
1 2 3 4 5 6 7 8 9 |
public void executeOafAnilPersonelVO() { XxOafAnilPersonelEOVOImpl vo = getXxOafAnilPersonelEOVO1(); if (vo == null) { throw new OAException("Error: XxOafAnilPersonelEOVOImpl is null"); } vo.initQuery(); } |
Şimdi tekrar Controller sınıfına dönüyoruz ve aşağıdaki kodu processRequest içine ekliyoruz. Bu sayede az önce VO ve AM içine yazdığımız metodları çağırıyor olacağız.
processRequest aşağıdaki gibi düzenlenir;
1 2 3 4 5 6 7 8 9 10 |
public void processRequest(OAPageContext pageContext, OAWebBean webBean) { super.processRequest(pageContext, webBean); //pageLayout'a bağlanmış olan application module objesi çağrılır. OAApplicationModule am = pageContext.getApplicationModule(webBean); //application module içerisinde yer alan methodları çağırmak için am.invokeMethod yöntemi kullanılır. am.invokeMethod("executeOafAnilPersonelVO"); } |
27. Bu aşamada sayfa çalıştırılır ve tablonun geldiği gözükür. Tablo boştur çünkü henüz veri eklenmemiştir.
Satır Ekleme
Tabloya satır ekleyebilmek için aşağıdaki adımların uygulanması gerekmektedir.
1. DmlAdvanceTableRN tablosuna sağ tıklanır. New-> tableActions seçilir. Tablonun altında “advancedTable Components” ID’li bir bölümün oluştuğu görülür. Bu bölümün altında ise bir adet flowLayout region’ı otomatik oluşmuştur. Tablo ile ilgili butonlar bu flowLayout Region’ının altına eklenirler. Bu nokrada region1 ID’li oluşan flowLayout Region’ının ID’sini “TableActionsRN” olarak değiştirilir.
2. TableActionsRN üzerinde iken sağ tıklanır New->Item seçilir. Item’ın özellikleri aşağıdaki gibi değiştirilir.
ID | ITEM STLE | PROMPT | ACTION TYPE | EVENT |
---|---|---|---|---|
AddNewRow | button | Yeni Satır Ekle | firePartialAction | addNewRow |
3. Entity Object nesnesine çift tıklanır ve sihirbaz açılır. Java bölümüne geçiş yapılır ve “Create Method” tiki işaretlenir. OK ile sihirbaz kapatılır. Bu bize entity object java dosyasının içerisine overwrite edeceğimiz create() metodunu oluşturur. Bu create method’u ekrandan veya programatik olarak entity object’in bağlı olduğu view object içerisinde yeni bir satır yaratıldığı anda çağrılır. Bunu yapmaktaki amacımız her yeni satır yaratıldığında tablodaki primary_key alanımız olan person_id sütununun sequence objesinden değer almasını sağlamaktır.
4. Entity Object’in java dosyası (XxOafAnilPersonelEOImpl) açılır. Overwrite edilen create() metodu aşağıdaki gibi değiştirilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/**Add attribute defaulting logic in this method. */ public void create(AttributeList attributeList) { super.create(attributeList); //entity object veya application module içerisinden transaction nesnesine ulaşmak için OADBTransactionImpl transaction = (OADBTransactionImpl)getOADBTransaction(); //transaction nesnesinden sequence değerini çekmek için Number PersonId = transaction.getSequenceValue("HR.XX_OAF_ANIL_PERSONEL_S"); //getter ve setter metodları yardımı ile person_id set edilir setPersonId(PersonId); } |
5. Application Module Java dosyası (XxTableDmlAMImpl) açılır ve View Object’in içerisine bir satır oluşturan aşağıdaki kod addNewRow metodu adı altında oluşturulur.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public void addNewRow() { //View Object application module üzerinden çağrılır OAViewObject vo = (OAViewObject)getXxOafAnilPersonelEOVO1(); //ilk defa satır eklenecekse ve executeQuery yapılmadıysa maxFetchSize değerinin 0'a set edilmesi gerekir. if (vo.getFetchedRowCount() == 0) { vo.setMaxFetchSize(0); } //view object'e ait bir satır yaratılır varsa satırın attribute değerleri set edilir Row row = vo.createRow(); //satır view object içine insert edilir vo.insertRow(row); //satır statüsü INITIALIZE duruma getirilir. row.setNewRowState(Row.STATUS_INITIALIZED); } |
6. 5.adımda Controller Object processFormRequest metodundan çağıracağımız Application Module metodunu hazırladık. Çağırmak için Controller Object Java dosyası (XxTableDmlPGCO) içindeki processFormRequest metoduna aşağıdaki kod eklenir.
1 2 3 4 5 6 7 8 9 10 11 12 |
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean) { super.processFormRequest(pageContext, webBean); //pageLayout'a bağlanmış olan application module objesi çağrılır. OAApplicationModule am = pageContext.getApplicationModule(webBean); //tableActions bölümüne eklediğimiz AddNewRow ID'li butonun event kısmında yazan olay ile aksiyon yakalanır. if ("addNewRow".equals(pageContext.getParameter(OAWebBeanConstants.EVENT_PARAM))) { am.invokeMethod("addNewRow"); } } |
7. Şu ana kadar ekleme işlemi Transaction üzerinde yapıldı. OAF uygulamalarda Transaction yönetimi Application Module bazında olur. Yani bir Application Module bir Transaction’ı temsil eder. Transaction Commit veya Rollback edildiğinde Application Module içerisindeki entity object’lerden türeyen bütün View Objectler verileri Entity Obectlere gönderirler. Entity Object ise Framework yardımı ile verileri veritabanına insert veya update eder.
Dolayısıyla Commit işlemi için bir adet pageButtonBar Region’ına pageLayout altında ihtiyacımız vardır. pageButtonBar region’ı altına eklenen item’ların sayfanın sağ üst ve sağ alt bölümünde gözükmesini sağlarlar. Bu işlem için;
pageLayoutRN’a sağ tıklarnır New->Region seçilir.
ID: PageButtonBarRN olarak düzenlenir.
Region Style: pageButtonBar olarak seçilir.
8. PageButtonBarRN’a sağ tıklanır New->Item seçilir.
ID: Apply olarak düzenlenir.
Item Style: submitButton
Prompt: Kaydet
Son durumda sayfa yapısı aşağıdaki gibi olmalıdır.
9. Application Module java dosyası içine transaction’ı commit eden apply metodu oluşturulur.
1 2 3 4 5 |
public void apply() { getOADBTransaction().commit(); } |
10. Controller Object processFormRequest içerisine Kaydet butonunun aksiyonunu yakalayıp AM içindeki apply metodunu çağıracak düzenleme yapılır. Son durumda processFormRequest aşağıdaki gibidir;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean) { super.processFormRequest(pageContext, webBean); //pageLayout'a bağlanmış olan application module objesi çağrılır. OAApplicationModule am = pageContext.getApplicationModule(webBean); //pageButtonBar bölümüne eklediğimiz Kaydet butonunun aksiyonu butonun ID'si ile yakalanır. Submit button ve normal button arasındaki fark budur. if (pageContext.getParameter("Apply") != null) { am.invokeMethod("apply"); } //tableActions bölümüne eklediğimiz AddNewRow ID'li NORMAL butonun event kısmında yazan olay ile aksiyon yakalanır. else if ("addNewRow".equals(pageContext.getParameter(OAWebBeanConstants.EVENT_PARAM))) { am.invokeMethod("addNewRow"); } } |
11. Sayfa çalıştırılır. Satır Ekle ve Kaydet butonları test edilir.
1 2 3 |
select * from xx_oaf_anil_personel; |
Sonuç:
Toplu Satır Silme
1. Silinecek satırları işaretlemek için View Object’e Entity Object yani tablo dışında olan bir adet Transient Attribute eklenir. Bunun için XxOafAnilPersonelEOVO objesine çift tıklanarak düzenleme sihirbazı açılır.
2. Sol menüden Attributes alanına geçiş yapılır ve Selected bölümü altında yer alan New butonuna tıklanır.
3. SelectedRow adında String ve Updatable özelliği Always olan bir transient Attribute oluşturulur.
4. Ok denerek pencere kapatılır. Tekrar OK seçilerek sihirbaz kapatılır. Bu aşamada View Object içerisinde Attribute değerinin oluştuğunun görülmesi gerekmektedir.
5. Tekrar sayfaya dönülür. DmlAdvanceTableRN tablosuna sağ tıklanır. New-> multipleSelection değeri seçilir.
6. Tablonun altında oluşan tableSelection->multipleSelection1 bileşeninin View Attribute değeri az önce view object içerisine oluşturduğumuz “SelectedRow” olarak seçilir.
7. XxOafAnilPersonelEOVO View Object nesnesine çift tıklanarak Düzenleme sihirbazı açılır. Sol menüden Java seçilir ve “View Row Class: XxOafAnilPersonelEOVORowImpl” tiki ve altındaki “Generate Java File” tiki “Accessors” ile beraber seçilir ve OK butonu ile devam edilir.
8. Application Module java dosyası açılır. Aşağıdaki metod eklenir.
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 |
public void removeSelectedRows() { //View Object application module üzerinden çağrılır OAViewObject vo = (OAViewObject)getXxOafAnilPersonelEOVO1(); java.util.List<Row> removeList = new ArrayList<Row>(); //VO içerisindeki o ana ait satır sayısı bulunur int rowCount = vo.getFetchedRowCount(); if (rowCount > 0) { //VO'ya ait RowImpl javasından obje null set edilir. XxOafAnilPersonelEOVORowImpl row = null; //VO'dan satırların üzerinde View Object'in pointerını bozmamak için RowSetIterator oluşturularak satırlar üzerinde döngü yapılır. RowSetIterator iter = vo.createRowSetIterator("Iter"); iter.setRangeStart(0); iter.setRangeSize(rowCount); for (int i = 0; i < rowCount; i++) { row = (XxOafAnilPersonelEOVORowImpl)iter.getRowAtRangeIndex(i); if (row != null) { //seçili satırlar silinecek listesine eklenirler. if ("Y".equals(row.getSelectedRow())) { removeList.add(row); } } } //iterator mutalaka kapıtılmalıdır. iter.closeRowSetIterator(); for (Row deleteRow : removeList) { deleteRow.remove(); } } } |
Not: Burada dikkat edilmesi gereken noktalardan biri VO’ya ait satırlar üzerinde vo.next metodu ile değil de bir Iterator yardımı ile dönülmesidir. Bunun amacı VO’nun currentRow düzenini bozmamak yani point edilen satırı değiştirmemektedir. Dolayısıyla yukarıda yapılan yöntem tavsiye edilendir.
9. Tekrar sayfaya dönülür ve TableActionsRN region altına bir adet daha buton eklenir.
ID | ITEM STLE | PROMPT | ACTION TYPE | EVENT |
---|---|---|---|---|
DeleteSelectedRows | button | Seçili Satırları Sil | firePartialAction | deleteSelectedRows |
10. Controller Sınfının java dosyası açılır ve processFormRequest’de deleteSelectedRows event’i yakalanıp, Application Module içerisindeki removeSelectedRows metodu çağrılır. Son durumda processFormRequest:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean) { super.processFormRequest(pageContext, webBean); //pageLayout'a bağlanmış olan application module objesi çağrılır. OAApplicationModule am = pageContext.getApplicationModule(webBean); //pageButtonBar bölümüne eklediğimiz Kaydet butonunun aksiyonu butonun ID'si ile yakalanır. Submit button ve normal button arasındaki fark budur. if (pageContext.getParameter("Apply") != null) { am.invokeMethod("apply"); } //tableActions bölümüne eklediğimiz AddNewRow ID'li NORMAL butonun event kısmında yazan olay ile aksiyon yakalanır. else if ("addNewRow".equals(pageContext.getParameter(OAWebBeanConstants.EVENT_PARAM))) { am.invokeMethod("addNewRow"); } else if ("deleteSelectedRows".equals(pageContext.getParameter(OAWebBeanConstants.EVENT_PARAM))) { am.invokeMethod("removeSelectedRows"); } } |
11. Son durumda sayfa yapısı
12. Sayfa çalıştırılır ve test edilir. Seçilen satırlar tablodan çıkarılmaktadır. Kaydet butonuna basınca da veritabanından da silinmektedir.
OAF içerisindeki birçok temel bilgiyi barındıran bir yazı oldu. Umarım fayda sağlamıştır.