OAF Tablo İşlemleri Uygulaması

Share Button

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.

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.

oa-t-1

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.

oa-t-2

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.

oa-t-35. 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

oa_t_4

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

oa-t-5

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.

oa-t-6

 

10. JDeveloper oluşturma işlemini bitirdikten sonra Applications Navigator altında aşağıdaki gibi bir yapı olması gerekir.

oa-t-7

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.

oa-t-812. Sayfaya standartlara uygun bir isim ve dizin belirlerlenir. OK butonu ile sayfa oluşturulur.

Sayfa: XxTableDmlPG

Dizin: xxntc.oracle.apps.per.aniltablo.dml.webui

oa-t-9

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.

oa-t-10

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.

oa-t-11

15. Sayfa üzerinde XML Structure bölümünde PageLayoutRN’a sağ tıklanır ve “Set New Controller” seçilir.

oa-t-12

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

oa-t-13

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.

oa-t-14

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.

oa-t-16

 

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.

oa-t-17

Ş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.

oa-t-18

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.

Application Module java sınıfını (XxTableDmlAMImpl) açıyoruz.

ot-t-19

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.

Ş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;

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.

ot-t-20

 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.

oa-t-21jpg

oa-t-22

 

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

oa-t-23

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.

oa-t-244. Entity Object’in java dosyası (XxOafAnilPersonelEOImpl) açılır. Overwrite edilen create() metodu aşağıdaki gibi değiştirilir.

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.

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.

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.

oa-t-25

9. Application Module java dosyası içine transaction’ı commit eden apply metodu oluşturulur.

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;

11. Sayfa çalıştırılır. Satır Ekle ve Kaydet butonları test edilir.

oa-t-26

oa-t-27

Sonuç:

oa-t-28

 

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.

oa-t-29

3. SelectedRow adında String ve Updatable özelliği Always olan bir transient Attribute oluşturulur.

oa-t-30

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.

oa-t-31

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.

oa-t-32

 

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.

oa-t-33

8. Application Module java dosyası açılır. Aşağıdaki metod eklenir.

 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:

 

11. Son durumda sayfa yapısı

oa-t-34

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.

oa-t-35

oa-t-36

 

OAF içerisindeki birçok temel bilgiyi barındıran bir yazı oldu. Umarım fayda sağlamıştır.