APEX: Coklu Secim

Evet.. Raporlama, data analizi, monitoring gibi ihtiyaclarimiz icin Oracle ‘in Application Express ‘ini kullaniyorsunuz.

Simdi kullaniciya bolum kodu secebilecegi bir menu verdiginizi ve buna gore sorgunuzun calistigini dusunun.

 

WHERE bolum_kodu = :pv_bolumkodu

 

Peki, kullanicimizin ayni anda birden fazla bolum kodu secebilmesini istersek?
Elbette

 

WHERE bolum_kodu in (:pv_bolumkodu_1, :pv_bolumkodu2, :pv_bolumkodu3)

 

gibi degiskenlerimizi cogaltabiliriz. Ama ortada onlarca ya da daha fazla secenek varsa her olasilik icin bir degisken tanimlayacak degiliz :)

Ekrana bir Shuttle ya da coklu secime izin veren bir Select List koyarak kullanicidan birden fazla input parameter almak istedigimizi ve bu listenin n secenek icerdigini dusunelim.

Ornek.1 ‘deki gibi, Interaktif raporunuza sag tiklayarak Create Page Item secenegi ile bir Shuttle ekledigimizi varsayalim..

Ornek.1

olusturdugumuz Page Item ‘in adini, sorgumuzda kullandigimiz degisken gibi PV_BOLUMKODU olarak verelim.

Ardindan Static ya da Dynamic menu icerigi hazirlamamiz gerekecek.

Bunlari da tamamladiktan sonra yine Ornek.1 ‘de gorulen Create Page Item Button secenegi ile bu kez de sayfamiza bir buton yerlestirelim.

Tum bu temel hazirliklarin ardin, raporumuzu calistirmak icin

butona basildiktan hemen sonra, ama raporun execute edilmesinden de hemen once 

calisacak sekilde bir page process yazmamiz gerekecek.

O halde uygulamamiza Ornek.2 ‘de gorulecegi gibi bir Page Process ekleyelim.

Ornek.2

Temelde ihtiyacimiz olan sey kullanicinin secimlerini not edip, bu bilgiyi query ‘miz her calistiginda kosul olarak sorgumuza “soyleyebilmek”..

Bunu yapmak icin aklimiza bir cok -pratik ya da kompleks- ozgun cozum gelebilir. Fakat Oracle ‘in bu tur istekleri karsilamak uzere sundugu yapiyi da kullanabiliriz..

Bunun icin Page Process ‘imizin PLSQL blogunda string ‘imizi table ‘a donusturmek uzere bir seyler yazmayi deneyelim..

 

DECLARE

pv_secim apex_application_global.vc_arr2;

BEGIN       

pv_secim := apex_util.string_to_table (:pv_bolumkodu);

apex_collection.create_or_truncate_collection (‘pv_shuttle’);

apex_collection.add_members (‘pv_shuttle’, pv_secim );

END;

 

 

Ben bu islemi yalnizca menu secimini “hatirlamak” icin kullanmak istiyorum.. O yuzden secimi gercek bir tabloya yazmak yerine APEX_COLLECTION ile biriktirmeyi tercih ettim.
pv_secim degiskenimiz APEX_COLLECTION sayesinde, ekranda pv_bolumkodu ile gelen bind variable ‘lari row by row saklayacak.
Shuttle menunuzden:
  • a
  • b
  • c
  • d

 

olmak uzere 4 satir secmisseniz, secimleriniz a:b:c:d seklinde siralanacaktir.

Ustte yazdigimiz BEGIN END blogumuzu calistiralim ve PV_BOLUMKODU soruldugunda a:b:c:d girelim.

Statement calistiktan sonra
SELECT *
   FROM apex_collections;
tablosundan sonucu izledigimizde Ornek.3 ‘teki gibi bir goruntu aliyor olmaliyiz.
Ornek.3
Ne yapmaya calistigimizi anlamissinizdir :) Sonrasi oldukca kolay:
WHERE bolum_kodu = :pv_bolumkodu
demek yerine, artik
WHERE bolum_kodu in (SELECT c001 FROM apex_collections WHERE collection_name = ‘PV_SHUTTLE’)

diyebiliriz.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s