Herşeyden önce kurulumun yapıldığını farzediyorum. Kurulum yapmadıysanız
http://akinozer.wordpress.com/2012/08/27/oracle-formsreport-11g-kurulumu-3/
linkinden kurulumun nasıl yapıldığını öğrenebilirsiniz. Kurulumu yaptıktan sonra aşağıdaki gibi devam edebilirsiniz.
Oracle Forms - Yeni form yaratma
Form Builder Ekranı açılır...
Bu ekranda Forms üzerinde iken sol taraftaki create tuşuna basılır...
Yukaridaki gibi bir menu çıkar... Module Butun projemizi temsil etmektedir... En başta DataBlocklar tanımlanır.. Bu blocklar bizim kullanacağımız tüm nesnelerin barındırıldığı yerlerdir.. Bu nesneler tablolar olabilecegi gibi buton ,edit , combobox vs. olabilir..
Data Block üzerinde iken sağ tıklayıp Data Block Wizard ile tablo bağlantıları yapılabilir..
Bu Wizard ın ilk ekranında kullanılacak DataBlock yapısının nereden alınacağına dair bilgiler sorulur. Bu bilgiler bir stored procedure den alınabileceği gibi bir view ya da bir tablodan alınabilir.. Genelde tablo yada view kullanılır... Tablo yada view deyip devam ediyoruz...
Tablo yada view in ismini soruyor...
Örnek olarak FND_USER diyoruz.. Ardından refresh butonuna tikliyoruz...
Database e baglanti yapmadığımız icin baglanti bilgilerini giriyoruz...
Connect diyoruz...
Alanlar listeleniyor.. Bu ekrandan istenilen alanlar sag tarafa aktarılır... Ben tumunu aktarıyorum...
Ardından Next tusuna basilir...
İstenirse Layout editorden devam edilip ekran tasarlanabilir... İstenirse sadece data block olusturulur... Layout Wizard ile devam edelim...
Bu ekranda Mevcut bir canvasa (delphi deki forma denk gelir) mi yoksa yeni oluşturulacak bir canvasa mi yapılacağını soruyor... Bizim canvasimiz olmadığı için baska secenegimiz yok :)..
Canvas tipi olarak content , stacked ya da tab olarak secim yapabiliriz. Diğerleri pek kullanilmiyormus. Ben content secip yola devam ediyorum..
Data Blocktan hangi alanların ekranda gosterileceği secilir... Ben bir kac tane secip digerini manuel olarak sececegim...
Secilen her alan icin teker teker tipi belirlenebilir.. Bunlardan cehckbox , combobox vs. gibi item tipleride secilebilir...Ben default item_type i secip devam ediyorum.
Burada secilen alanların basliklari ve genislik ayarları yapılıyor...
Seklinde duzenldikten sonra next diyoruz...
Formu yoksa tablo seklinde mi olmasini soruyor... Ben form olarak yapiyorum... Sonra detay tabloyu getirecegim...
Bu alanları bir frame in icine koyacagindan Frame basligi ve frame icinde gosterilmesi istenen kayıt sayısını soruyor... İstenirse Scroll barda konulabilir..
Tebrikler :)
Şöyle bir ekran çıktı ortaya... Şimdi bunun detayına girersek... Frame üzerinde iken F4 tusuna basarsak (herhangi bir nesne üzerinde iken F4 tuşu bize o nesnenin özelliklerini verir.)
Yukaridaki ekran çıkar burada update layout Automatically olmasi bize dizayn asamasinda bazı faydalari olur... Mesela
Seklinde bozulan ekran frame i surukledikten sonra
Otomatik olarak yukaridaki sekle donusur... Frame Update loayout : automaticlly . Bunu data blocktaki siraya göre yapıyor. Faydaları oldugu gibi zararlarıda olabilir :) O yuzden bunu kaldirmak istiyorum..
Listeden manually diyorum.. Neler yapmis diye incelersek... Data blockta
Database nesnesinin Data Block property sini Yes olarak secmis.. Data sourcename i fnd_user secmis... ORG_ID = fnd_profile.value(`ORG_ID?) Records Query All Records : Tüm bilgiler serverdan cekilsin mi ayarıdır. No denirse aşağı doğru inildikçe kayıt çağrılır.
Kolonlari tek tek tanımlamıs.. Tiplerini belirlemis..
Manuel yapsaydik tek tek tanımlamak zorunda kalacaktık... İyi mi oldu kotumu zaman gosterecek :)...
İstenirse Where kosulu eklenebilir.. Order by yapılabilir... Goruldugu uzere Data Block herhangi bir canvasa baglanmadi.. Simdi Block un detay alanlarina bakalim... Mesela USER_ID alani ekrana gosterilmedi... Neler olmus gorelim...
Data tabinda tipi ve uzunlugu belirlenmis... Data Required : Zorunlu alan bilgisi yeni kayıt ekleneceği zaman burayi boş birakmasına izin vermiyor. Format Mask : veriyi formatlamak için kullanilmaktadir. Örnek formatlar: 999G999D00 999G999D99 G : grup ayraci : bizde , D : decimal ayracı bizde . 00 : her halukarda 00 yazar 1000->1000.00 , 1000.12 à 1000.12, 1000.1 -> 1000.10 99 : 1000 -> 1000 , 1000.12 à 1000.12 , 1000.1-> 1000.1 Tarih icin : dd-mm-yyyy hh24:mi:ss Items : Database Update only if null : içi boş alanlar bir kereliğine güncellenebilsin. Örneğin primary key alani gibi. Required bilgisi yes denmiş : Bu property alanın mutlaka doldurulması gerektigini gosterir. Bu alanin property degerine kendi karar vermis. Istenirse degistirilebilir...
Database tabinda Column Name belirlenmis.. Database item olup olmadigi bilgisi eklenmis.. Bazen bu blocklarda delphi de oldugu gibi calc field lere ihtiyac duyulabilir.. O tipte alanlara Database item property sine No denir...
Prompt kisminda alanin basligi gosterilir. Ve en önemlisi (neye göre bilmiyorum :) )
Physical tabinda canvas null olarak kalmis dolayisiyla bu alan gosterilmemektedir. Canvasta gosterilen su alan icin ise CANVAS2 degeri secilmis gorunuyor.. Simdi yeni bir alani canvasa ekleyelim...
Data block tan alana tiklanir F4 denir.
Physical tabina gelinir. Ve CANVAS secilir...
Otomatik olarak canvasin en ust sol kosesine atilir...
Frame e yarlestirilir...
Promt alaninda label duzenlenir... oldu bitti :) Detay tablo olusturup baglayalim... Yine Wizard calistirilir...
Next Denir..
Tablo ismini yazdiktan sonra yukaridaki hatayi almamin sebebi şemayı belirtmememdir..
Basina xxysm dedikten sonra refresh diyerek liste geldi. Tüm alanlari secip (sadece ihtiyac duyulan alanlarda secilebilir ama ben secim yapmadim :) ) next dedikten sonra
Bu ekran cikar. Bu ekran bize master detay bir yapi varsa onu baglamamiz icin bize yardimci olacak... Ama foregin key gibi degerler bu tablolar için yaratılmadigi icin simdilik geciyoruz...
Alttakini secip finish diyorum...
Data block tanimlanmis oldu... Simdi baglantisi kaldi... Master tabloda relation kismina gelinir..
Çift tiklandiktan sonra
Select denir ve detay data block secilir...Ardından ok denir... Non-Isolated The default setting. Prevents the deletion of a master record when associated detail records exist in the database. Isolated Allows the master record to be deleted and does not affect associated detail records in the database. Cascading Allows the master record to be deleted and automatically deletes any associated detail records in the detail blocks base table at commit time. In a master-detail-detail relation, where relations are nested, only records in the immediate detail block are deleted (deletions do not cascade to multiple levels of a relation chain automatically). Burada yukaridaki seceneklerden biri secilir. Non-Isolated: Detay kayıtlar var ise ana kaydın silinmesini önler.. Isolated : ana kaydın silinmesine izin verir ve veritabanında ilişkili detay kayıtlarını etkilemez. Cascading : Master tablo silinince detay tabloyuda siler.
Join Condition a baglanti yazıldıktan sonra Ok denir..
Otomatik olarak bazi trigger lar olusmus olur. Bu triggerlar sectigimiz iliski sekline gore sekillenmektedir. Relation tabindan silinince otomatik olarak bu triggerlarda siliniyor... Simdi geldik detayi eklemeye..
Detay block unda istenilen alanlar secilip F4 tusuna basilir...
Pyscical tabinda canvas secilir...
Toplu olarak hepsini en uste atar...
Aşağıda hizalama için
Menuden Arrenge -> Align Objects secilir...
Horizantal olarak Align Left digerine de none dedikten sonra ok denir..
Hizalama gerceklerisir.. Bu sekilde detay gosterilebilecegi gibi tablo yapısında da gosterilebilir...
Prompt tabinda Prompt... Top secilir...
Sonra buna frame yapabiliriz ya da datablock nesnesinden kayıt sayısı belirlenebilir. Önce block tan bakalim...
Records tabinda number of records displayed 5 dedim.
Bu hale geldi... Simdi frame ile yapalim...
Frame i sectim yerlestirdim...
Arka taraftaki beyaz olan ozelligini yukaridaki gibi kaldirdim...
Sonra Frame i secip F4 dedikten sonra
Layout data block kisminda block u sectim...
Secer secmez default degerlerdeki yapıya burundu ve Data blocktaki degeri ezdi.
Simdi frame e gidip bunu degistirecegiz...
Tabular dedim...
Records a 5 dedim... olustu.. Yine otomatik olarak sürüklenince alanlar duzenlenir...
Frame title alaninda duzenleme yaptım.
Run tusuna basip calistirilim bakalim..
Ekranda hicbir sey yoktur... F7- F8 tuslarina basilir...
Kayıtlar listelenir... Yukari asagi tusuna basarak aktif olan block un icerisinde dolanilabilir... Simdi sorgulama ekranı yapalım.. O yuzden once kendimizin kullanacagi bir block yaratalım...
Data Block a gelinir Create tusuna basilir...
Burada manuel olan secilir..
Olusan block un ismi degistirilir.. Ben kontrol dedim.
Simdi bi buton birde edit lazim bana :)
İtem a geldim Create dedim..
Adini degistirdim..
Bi daha create dedim. Onu secip F4 e basip tipini buton sectim.
Simdi bunlari forma yerlestirmek gerekiyor...
İkisini sectim canvas ayarini verdim..
Yerlerini duzenledim.. Butonda labeli yazdim..
Su hale geldi.. Ara tusuna basinca aramak icin butona tiklanir ve F11 tusuna basilir...
Yazılacak kodun hangi trigger da tetiklenecegi secilir..
When button pressed secilir ok denir...
Yukariya istenilen kodlar yazilir...
set_block_property("FND_USER",DEFAULT_WHERE, "USER_NAME="""|| :KONTROL.EDTARA||"""" ); go_block("FND_USER"); execute_query; yazarak süzme işlemi gerçekleştirilir... Burada block un where kismi yeni degeri ile degistirilip sorgu yeniden calistirilir. execute_query satiri aktif block u calistirdigindan go_block("FND_USER") satiri ile aktif block degistirilir... Çalıştırılır..
Arama kismina isim yazilir ara denir...
Arama gerçekleşmiş olur... Ama eski kosula dönemiyoruz L Nasil döneriz? Eski kosulu bir yerde saklarsak ve ici ara kisminin ici bos ise tumunu getirelim.. Hadi yapalim :) ... Bunun önce kontrol block una yeni bir item ekledim. Tipi char boyutu 300...herhangi bir canvasa baglamadim...Adını eskikosul verdim...
if :KONTROL.EDTARA="1" then set_block_property("FND_USER",DEFAULT_WHERE, :KONTROL.ESKIKOSUL); go_block("FND_USER"); execute_query; else :KONTROL.ESKIKOSUL:=get_block_property("FND_USER",DEFAULT_WHERE); set_block_property("FND_USER",DEFAULT_WHERE, "USER_NAME="""|| :KONTROL.EDTARA||"""" ); go_block("FND_USER"); execute_query; end if; ara editine 1 girilene kadar editte ne girilmiş ise onu arayacak. Bunu ayrı bir ekrana (canvas a koyup arayabiliriz.) Hadi yapalim :) ... Canvases tarafına gelinir..
Create denir.İsmini CNV_FIND deriz. Bu arada digerine CNV_MAIN dedim. Sağ tıklayıp layout editor ile ekrana cagrilir... Window1 icin canvasi baglariz.. Once adini WND_MAIN yapacam sonra primary canvasi ni CNV_MAIN yapacam.. CNV_FIND icinde bir window eklenir. Ekleme yontemi aynı..Eklenen Window unda canvasini CNV_FIND diyecegim :). Toplu secilir... Diğer türlü Window lar aynı olacagindan canvasin gorunur alani ile ilgili sıkıntıya düşeriz... Bir item birden fazla canvasta gorunemeyecegi icin aynı itemlari kullanamiyoruz.. Bu yuzden yeni itemlar ekleyip (örnek calisma kalsin diye ;) ) diger canvasa ekleyecegim.. Aynı sekilde 1 edit 1 arama butonu 1 de arama ekranini cikarmak icin 1 buton daha KONTROL blockuna ekliyorum.
Yukaridaki gibi duzenleme yaptım.. Şimdi aramadaki kodu aynı sekilde kopyaliyorum..
Calistirdigimda FIND penceresi ortaya cikar.. Ama bizim istedigimiz ana ekrandi... Sorun ilk block un KONTROL block u olmasidir. Çünkü form calisirken ilk block neredeyse ona odaklanir. Dolayısıyla Main formdaki block ne ise ilk block o olmali. Bizde FND_USER block u ilk block oldugu icin onu en one alip tekrar calistirdim.
Ardından...
Bul butonunun altina go_item(`KONTROL.EDTARA2?) Diyerek odaklanabiliriz. Bu sayede WND_FIND windowunu goster komutunu vermeden otomatik olarak komutlari calistirmis oluruz. Diger turlu soyle yazmamiz gerekirdi... show_window("WND_FIND"); go_item("KONTROL.EDTARA2"); yukaridaki show_window("WND_FIND"); satirina gerek kalmadi. Şimdi birde LOV olayına bakalim... Yine arama ekrani olsun bu sefer arama ekranında listeden bir deger secelim ve aramalarimizi oradan gelen degere gore yapalim... Yine bir edit olsun bir buton ve birde kaynak deponun sorgulandigi bir edit olsun... Yine Window , canvas olusturdum. Canvasi windowa , Window u canvasa bagladim.. Window larin windows style larini Dialog olarak degistirdim... Window larin delphi deki gibi modal olup olmama gibi bir ayari var..
Yukaridaki sekilde ayarladik... Kaynak depo listesi icin bir LOV olusturmamiz lazim. LOV icin ise Record Group tanımlanmalidir... Record group icin ise sorgumuz olmali :)
Record group a gelinir create denir.. Sorgu yapistirilir...
Ok denir...
F4 deyip inceledigimizde alani ve tipini kendi ayarlamis... Birden fazla alan olsaydı onlarida duzenleyecekti... Simdi LOV olusturabiliriz.
Wizarda ok deyip devam ederiz..
Existing record group denip rg secilir...
Modify deriz (ama gerek yok sanki)...
Burada da aynı sekilde olusturabilirdik...
Birden fazla alanimiz olsaydi onlari ekleyebilirdik..
Baslik ve uzunluk bilgileri toparlanir...
Baslik bilgileri girilir...
Bi kerede gosterilecek kayıt sayısı secilir...
Donen degerleri hangi block ile iliskilendirilecegi secilebilir...
Finish denince olusur..detaylari yukarida..
LOV den seçilen degerin hangi blockta nereye atanacağını belirleriz. Alan üzerindeyken Browse deriz, açılan ekrandan blocktan alan ismi secilir... OK denir... Artik LOV den gelen deger block a yazılacaktır. Burada birden fazla alan olsaydı onlari tek tek baglamak gerekiyor...
Arama ekranında Kaynak depo ya gelip F4 yapinca LOV kisminin ayari yapılır...
Kaynak depo bilgisi uzerine gelindikten sonra F9 tusuna basilarak liste çıkar. İstenirse listede arama yapılabilir yada direk secim yapılır... Bul komutuda ona gore sekillenebilir... Ben detayina girmiyorum... Hem ana hemde detaydan olunca biraz karışık olacak çünkü... Neyse mevzu LOV leri öğrenmek ;) Şimdi Data Block nesnesinin bir kaç event ina bakalim... Her satir için bir kontrol ekleyelim ve bu kontrol degerini kendi olsuturdugumuz alana yazalim. Mesela start date den bugune kadar ne kadar yil gectigini yazalım. Onun için FND_USER block una bir database itemi olmayan bir item ekleyelim... Alan ismi SENE olsun. Bunu WHEN-VALIDATE-RECORD trigger inda yapariz. Bu hesaplamayi triggerda yazabileceğimiz gibi bir fonksiyon cagirarakta yapabiliriz. Ben fonksiyon cagirmak olarak kullanayim derim... Bunun için Program Unit tarafına gelinir... New denir...
Procedure ismi yazilir... OK denir...
OK dedikten sonra....
Bu procedure içine..
Yukaridaki sekilde tamamlanir. Ve Post-Query trigger ina yazılır...
Seklinde... Simdide yeni bir kayıt girildiginde eger o isimde biri varsa uyarı versin... Yeni bir alert tanımlanır...
Sonra
Pre-insert ile kayit eklenmeden once kontrol edilebiliyor... WHEN VALIDATE RECORD : ilgili kayıttan çıkış yapıldığı zaman calisir. When new form intance : Form ilk açıldığında çalışan bir tetikleyicidir. Ondan sonra tetiklenmez. OnShow a denk gelir. Post-Query : Sorgu sonrasi tetikleyicisidir. Sorgu çekildikten sonra bu trigger calisir... Her program acildigin F7-F8 demektense WHEN-NEW-FORM-INSTANCE trigger ina
Kodu yazilir... Şimdi de STACKED CANVAS yapalım. Excel deki gibi bazi sutunlarin sabit digerlerinin kayması gibi bir ayardır... Detay tabloda kalan alanlar icin yapalım... Önce canvas create edilir... Canvas tipi Stacked secilir... Windowu secilir.. Burada WND_MAIN...
Sonra itemler dizilir... CNV_MAIN e eklemek icin..
Menusune gelinir ve eklenir...
Simdi bu halde iken duzenlemek sorun L... Çözüm olarak şunu buldum: Projeyi komple kapatiyorum. Sonra tekrar aciyorum..
Ana canvasin cercevesini (view) kuculttukten sonra stacked canvasi istedigim gibi yonetebiliyorum. Yada Menuden Show View i kaldırıp yonetebiliyoruz.
Stacked canvasta Scrooll bar larin gorunmesinin ayarı yapılır...
Son hali yukaridaki gibidir... Şimdi de Item leri renklendirelim... Bunun için önce Visual Attribute lere yeni bir kayıt ekleriz...
7 yorum:
çok faydalı oldu bilgileriniz için teşekkür ederim
Rica ederim... İşinize yararsa sevinirim...
teşekkür ederim. uzun zamandır arıyordum.
teşekkür ederim,bulduğum en açık en faydalı anlatım,emeğinize sağlık
Mutlu projeler :)
Çok Çok teşekkürler Meriç Bey, Bir Oracle Junior olarak çok yararlı bilgiler olmuş :)
Rica ederim, faydası olduysa ne mutlu bana :)
Yorum Gönder