ORACLE FORMS ile PROGRAM ÖRNEĞİ


 

ORACLE, RDBMS ( Relational DataBase Management System) özelliğindeki bir veri tabanı programıdır. Temelinde SQL (Structure Query Language) komut düzenlerinden oluşur. Microsoft SQL, Progress, Informix gibi veri tabanları programlarına ciddi bir alternatiftir.

 

ORACLE veri tabanları ; ENTERPRISE ve PERSONEL olmak üzere ikiye ayrılır. Enterprise sistemler, kurumsal çözümlere yönelik olup çok kullanıcılıdır. Başta UNIX olmak üzere,Microsoft  NT, 2000  gibi network işletim sistemlerinde çalışmaktadır. Son olarak LINUX üzerinde geliştirmelerin yapıldığını da bilmekteyiz. Personel sistemler, tek kullanıcılı olup, Windows 95/98 sistemleri üzerinde çalışmaktadır.

 

Bir veri tabanı içersinde birden fazla dosya (table) yaratılabilir. Bu dosyalara erişim ve üzerindeki işlemler, kullanıcı bazında yetkilendirilir.

 

ORACLE üzerinde yaratılan veri tabanı ve dosyalara , ORACLE SQL, FORMS, REPORTS gibi araçlarla erişmek, program yazmak ve rapor almak mümkündür. Ayrıca ODBC yoluyla diğer yazılım geliştirme araçlarından bilgilere erişmek mümkündür. Programlama araçları 4. Kuşak görsel ve yapısal programlamaya yöneliktir. Temelde SQL komutlarını kullanılır.

 

FORMS ile ORACLE veri tabanı üzerinde program geliştirilir. REPORTS ile ORACLE veri tabanı üzerinde raporlar geliştirilir.

 

Programlama dilinin en önemli özelliği, event ve trigger’lardır. Event (durum) özelliğinde, program içindeki mantık yürütülürken yapılması gereken işlemler gerçekleştirilir. Trigger (tetikleme) özelliğinde ise, program içinde kullanıcının seçimleri, hareketlerine göre çalıştırılacak komutlar dizesidir.

 

ORACLE veri tabanı üzerinde yaratılan table (dosya) üzerinde tutulan kayıtlar üzerinde ekleme/silme/değiştirme gibi işlemleri kontrol edebilmek mümkündür.

 

ORACLE DATA TYPE

 

Number (x,y)                           Sayısal veri alanıdır. x : tam sayı (integer), y: ondalık hane (decimal)

Char(x)                                    Alfanumerik veri alanıdır. x : karakter sayısıdır. Bu veri alanı kullanıldığında, veri tabanı üzerinde x kadar boşluğu otomatik olarak bırakır.

Varchar2(x)                             Alfanumerik veri alanıdır. x : karakter sayısıdır. Bu veri alanı kullanıldığında, veri tabanı üzerinde kullanılan karakter sayısı kadar alanı tutar.

Date                                        Tarih veri alanıdır. Değişik tipte tarih bilgisini tutmak mümkündür. Zaman, değişik tarih gösterim biçimleri buna örnektir.

Long                                        Uzun yazı alanları içindir.

 

 

Örnek

 

create table doviz (

    dovkod     varchar2(3),

    dovad      varchar2(20),

    birim      number(3),

    insusr     varchar2(20),

    instar     date,

    updusr     varchar2(20),

    updtar     date,

    constraint pk_doviz primary key (dovkod)

);

 

DOVIZ table üzerinde doviz kodu, doviz adi ve birim alanlari yaratılmıştır.

 

Son dört alan ; insusr, instar alanlari, kayıtın ilk yaratıldığı kullanıcı ve tarihi (içinde zamanda bulunur) bilgilerini içerir.Updusr ve updtar alanları ise kayıdın düzeltme durumunda hangi kullanıcı ve hangi tarihte yapıldığını içerir. Bu işlemler, database üzerinde yaratılan bir trigger dosyası ile (aşağıdaki örnek) otomatik olarak yapılmaktadır.

 

create or replace trigger trg_doviz_before

   before insert or update or delete on doviz

   for each row

begin

   if inserting then

      :new.insusr := user;

      :new.instar := sysdate;

      if :new.birim is null then

        :new.birim := 1;

      end if;

   elsif updating then

      :new.updusr := user;

      :new.updtar := sysdate;

   end if;

end;

 

trg_doviz_before isimli trigger dosyası, doviz dosyasına ekleme, düzeltme ve silme işlemleri yapmadan önce her satır için çalışacaktır. Ayrıca dosya işlemleri için ayrı ayrı yapılacak işlemlerde içinde ayrılmıştır.

Eğer işlem kayıt ekleme ise (inserting) new.insusr alanına sistemdeki kullanıcı adı (user) ve new.instar alanına sistem tarihi bilgileri eşleştirilir. Ayrica birim alan adina bilgi girilmemişse değeri 1 olarak verilmesi sağlanır.

Table üzerindeki alanların işlem öncesi değerleri önceki ve yenisi olarak bulmak mümkündür. Old.alanadi ile alanadının işlem öncesi değeri alınır. New.alanadi ile işlem sırasında alanadina değer aktarilir.

Eğer işlem kayıt üzerinde değişiklik ise (updating) new.updusr alanına sistemdeki kullanıcı adı (user) ve new.updtar alanına sistem tarihi bilgileri eşleştirilir.

 

Bu sistem trigger dosyaları, table ile doğrudan ilişkilidirler. Table işlemleri öncesinde ve/veya sonrasında otomatik olarak çalışırlar.

 

Constraint komutu ile doviz dosyası üzerinde dovkod alanına göre indexleme yapılmıştır. Böylece dovkod alanına aynı değerin iki defa girilmesi önlenmiştir. Ayrıca dosya, dovkod alanına göre sıralı olacaktır. Bu şekilde , dosyaya dovkod alanına kullanarak hızlı bir biçimde erişmek mümkündür.

 

CONSTRAINT constraintadi PRIMARY KEY alanadi,alanadi,…

CONSTRAINT constraintadi FOREGIN KEY alanadi,alanadi,… REFERENCES tablename (alanadi,alanadi,…)

 

create table dovkur (

    dovkod     varchar2(3),

    tarih      date,

    birim      number(3),

    doval      number(15),

    dovsat     number(15),

    efkal      number(15),

    efksat     number(15),

    insusr     varchar2(20),

    instar     date,

    updusr     varchar2(20),

    updtar     date,

    constraint pk_dovkur primary key (dovkod, tarih),

    constraint rf_dovkur_doviz foreign key (dovkod) references doviz(dovkod)

);

 

DOVKUR table üzerinde doviz kodu, tarihi, birimi, doviz alış, doviz satış, effektif alış, effektif satış alanları ile standart olarak insusr, instar, updusr, updtar alanları bulunmaktadır.

 

Bu tablonun, trigger dosyası ise şu şekildedir.

 

create or replace trigger trg_dovkur_before

   before insert or update or delete on dovkur

   for each row

begin

   if inserting then

      :new.insusr := user;

      :new.instar := sysdate;

   elsif updating then

      :new.updusr := user;

      :new.updtar := sysdate;

   end if;

end;

/

 

DOVKUR tablosunda indexleme, dovkod ve tarih alanlarından oluşmuştur. Böylece aynı döviz ve aynı tarih koduna birden fazla giriş yapma imkanı olmadığı gibi bu dosyaya doviz kodu ve/veya tarih alanlarından hızlı erişmekte mümkündür.

DOVKUR tablosunda ilave olarak DOVIZ dosyasıyla bir ilişki kurulmuştur. Her iki dosyada bulunan dovkod alanı ile bağlanmıştır. Bunun anlamı, DOVKUR dosyasına ancak ve ancak DOVIZ dosyasında olan bir döviz koduyla giriş yapılabilir. DOVIZ dosyasında tanımlı olmayan bir kodla DOVKUR dosyasına giriş yapılması, arama yapılması mümkün değildir. İlave olarak DOVIZ dosyasında bulunan bir doviz kodu, eğer DOVKUR dosyasında kullanılmışsa, direkt olarak silinemez, değiştirilemez. Ancak DOVKUR dosyasından silindikten sonra silinebilir, değiştirilebilir. Bu kontrol işlemleri program tarafından otomatik olarak yapılır. Kullanıcının bu kısıtlamaları koyduktan sonra ilave olarak birşeyler yapmasına gerek yoktur.

 

FORMS program açıklaması

 

ORACLE FORMS programı ile veri tabanı üzerinde istenilen işlemlerin yapılması sağlanır. Aşağıda DOVIZ girişine yönelik programın ekran görüntüsü yer almaktadır. Programı oluşturan bölümler :

 

 

 

 

TRIGGERS :

Programın başında yer alan bu bölümde, program (Oracle ortamında forms olarak tanımlanır) ilk çalıştırılmasında, form üzerinde ve formdan çıkarken yapılacak olan işlemler belli şartlar içine yazılır. Burada ki örnekte, KEY-EXIT trigger bölümünde yer alan komutlar, formdan çıkmak istenildiğinde çalışacaktır. WHEN-NEW-FORM-INSTANCE bölümde ise, form ilk defa çalıştığında yapılacak olanlar yer alır.

Bu şekildeki bölümlere komut yazmak için ilk önce seçim yapılmalıdır. Program içinde kullanılabilecek olan Trigger’ların seviyeleri sırasıyla, DATABASE, FORM, BLOCK ve ALAN şeklindedir.

 

DATABASE seviyesindeki trigger’lar yukarıda anlatıldığı üzere, tablolar için çalışacaktır.

FORMS seviyesindeki trigger’lar form bazında çalışacaktır. Forma ilk girişte, formdan çıkışta gibi.

BLOCK seviyesindeki trigger’lar database tabloları veya kullanıcı tarafından yaratılmış blocklar üzerindeki işlemlerde çalışırlar.

ALAN seviyesindeki trigger’lar blocklar içinde tanımlanmış değişkenler (alanlar) seçildiğinde, değer girişi yapıldığında çalışırlar.

 

Trigger seçimi için aşağıdaki pencereden uygun olan seçilmelidir. Daha sonra bu trigger üzerine gelip, mouse çift tıklamasıyla PL/SQL editor penceresi açılmalıdır. Genel SQL ve Oracle komutları buralara yazılacaktır. Bir trigger içinden başka bir trigger’a dallanma mümkün değildir. Bir trigger içinde procedure ve/veya function’lar kullanılabilir. Trigger seçiminde çalışacak seviyeye göre yapılması şarttır.

 

 

 

Aşağıdaki örnekte Form seviyesinde çalışacak olan KEY-EXIT ve WHEN-NEW-FORM-INSTANSE trigger komutları bulunmaktadır.

 

 

:system.block_status

Oracle komutudur. Anlamı, üzerinde işlem yapılan blockta iken formdan çıkış butonuna basıldığında bloğun durumunu verir.

 

ConfirmCancel

Kullanıcı tarafından tanımlanmış bir procedure dur. Bu tip procedurler, fonksiyonlar kulllanıcı tarafından yapılmışlardır ve bir library içinde toplanırlar. İleride detaylı olarak anlatılacaktır.

 

Raise form_trigger_failure

Oracle komutudur. Bu trigger’ın çalışmasını durdurur.

 

Exit_form

Formdan çıkmak içindir. NO_VALIDATE özelliği, herhangi bir kontrolden geçmeksizin çıkmak içindir. Diğer özellikleri ;

ASK_COMMIT          : Değişiklikleri saklamak için kullanıcıya soru sorulması sağlanır

DO_COMMIT           : Değişikliklerin soru sorulmaksızın saklanması içindir.

NO_COMMIT           : Değişikliklerin saklanmadan formdan çıkmak içindir.

NO_VALIDATE         : Formdan hiçbir işlem yapmadan çıkmak içindir.

 

 

Bu trigger, form ilk çalıştığında devreye girecektir. Sistem mesaj seviyesini 10’a eşitler ve tablo üzerinde sorgulama yapacaktır.

 

:system.message_level

Oracle komutudur. Bu komutla, sistemin vereceği mesajların seviyesi 10 olarak tanımlanmıştır. Sistem seviyesi 10’dan büyük olan mesajları kullanıcıya verecek, 10’dan küçük olanları göstermeyecektir.

 

Execute_query

Oracle komutudur. Form içinde yer alan ilk Veritabanı tablosunu sorgular ve sonuçları getirir.

                EXECUTE_QUERY                                    : Blockta tanımlanan kayıt sayısı kadar kayıt üzerinde sorgulama (query) yapar.

                EXECUTE_QUERY (ALL_RECORDS)         : Tablonun tüm kayıtları için sorgulama yapar.

                EXECUTE_QUERY (FOR_UPDATE)          : Tabloda seçilen kayıtlar üzerinde güncelleştirme için kilitleme yapar.

 

 

 

 

 

 

 

 

 

ALERTS :

 

Program içinde kullanıcının karşısına çıkacak olan dialog pencerelerinin tanımlandığı yerdir. Bu alan, programcılar tarafından istenilen amaca yönelik mesajlar ve kullanıcı yönlendirilmesi amacıyla kullanılır.

 

 

 

ALERTS bölümde ve diğer bölümler içinde yer alan değişkenlerin özelliklerini belirlemek için “property palette” penceresi kullanılır. Bu pencerede gösterilen özellikler seçilen değere göre değişmektedir.

 

Burada örnek olarak CNFDLG isimli alerts değişkeninin özellikleri gösterilmektedir. 2 butonlu bu dialog penceresinde birinci buton default olarak seçilmiş ve ekranda EVET gösterilmekte, 2. Butonda ise HAYIR gösterilmektedir. Pencerenin başlığında ise “Karar?” şeklinde bir ifade yer almaktadır.

 

Message bölümde dialog penceresinde gösterilecek olan yazı değeri verilir.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DATA BLOCKS :

 

Program içersinde yer alan tablo ve geçici tabloların tanımlandığı, üzerinde işlemlerin yapıldığı yerdir. ORACLE veritabanında yaratılmış olan tablolara kayıt ekleme, değiştirme ve silme gibi işlemler yapılır. Ayrıca programın kullanılmasına yönelik olarak programcı tarafından database tablosu olmayan geçici tablolarda yaratılarak kullanılır. Bu örnekte, DOVIZ tablosu bir veri tabanı tablosu olup, CONTROL tablosu geçici bir bloktur. DOVIZ tablosu içersinde yer alan değişkenlerin hepsinin kullanılması gerekli değildir.

 

DOVIZ tablosunun “Property Palette” kısmında yer alan özelliklerden bazıları yukarıdaki ekran örneğinde verilmiştir. Database Data Block karşılığında YES olması bunun bir veritabanı tablosu olduğunu ifade eder. Bu tablo üzerinde INSERT, UPDATE ve DELETE işlemlerine izin verilmiştir. (Değerlerin YES olması nedeniyle) Bu değerlerden NO olan varsa bu işlem otomatik olarak yapılamayacaktır.

 

WHERE Clause bölümde ; bu tablo üzerinde arama yapılacak kriterler mantıksal ifade şeklinde yazılır. (A=10, a>10 and a>20 gibi)

ORDER BY Clause bölümünde ; bu tablonun sıralı şeklinde gösterilmesi için kullanılır. Burada tabloda yer alan değişkenlerin kullanılması gereklidir.

 

DOVIZ tablosuna ait iki adet trigger yer almaktadır. Bunlar KEY-DELREC ve WHEN-MOUSE-DOUBLECLICK.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

KEY-DELREC trigger ;

 

begin

   if Confirmed('Kayıt Siliniyor.'||chr(10)||'Devam etmek istiyor musunuz?') then

      delete_record;

   end if;

end;

 

Block üzerinde iken kaydın silinmesi işlemi sırasında çalışacaktır. Kullanıcının karşısına gelecek olan dialog penceresinde işlemi onaylaması istenecektir.

 

Delete_record Tablo üzerindeki kaydı silecektir.

 

NOT : Tablo üzerindeki kayıt ekleme, silme ve değiştirme işlemleri ancak ve ancak COMMIT komutu kullanılarak tablo üzerinde aktif hale getirilmelidir. Aksi takdirde yapılan işlemler geçerli olmayacaktır.

 

WHEN-MOUSE-DOUBLECLICK trigger ;

 

go_item('doviz.dovkod1');

 

go_item komutu forms içindeki bir tablo üzerindeki bir alana gitmek için kullanılır.

 

 

DOVIZ tablosu üzerinde DOVKOD1, DOVAD1, BIRIM1 isimleriyle geçici değişkenler kullanılmıştır. Bunlar tabloya ait olmamakla (Database Item = NO) beraber, tablonun diğer alanlarıyla ilişkilidirler. Şöyleki ; DOVKOD1 değişkenin özelliklerinde “Synchronize with ITEM” karşılığına DOVKOD yazılarak bu alana girilen her türlü değer otomatik olarak DOVKOD değişkenine atanır.

 

Ayrıca DOVKOD1 değişkeninde, değişken seviyesinde trigger kullanılmıştır.

 

 

 

 

WHEN-VALIDATE-ITEM trigger içersinde yer alan bu komutla

 

:doviz.dovkod1 := UPPER(:doviz.dovkod1);

 

girilen değer otomatik olarak büyük harfe dönüştürülür. Bu işlemi daha kolay yapmakta mümkündür. DOVKOD1 değişkeninin özelliklerinden FUNCTIONAL bölümünde “Case Sensitive” alanının değerini UPPER yapılırsa girilen değerler program tarafından otomatik büyük harfe dönüştürür.

 

 

 

 

 

 

 

 

 

 

 

 

Hazırladığımız programın ekran görüntüsü aşağıdaki gibidir. Bu görüntü yanda gözüken araçlar kullanılarak yaratılmıştır. Ekran tasarımı tamamen programcıya bağlıdır. Ancak database bloklarının yerleşiminde FORM veya TABULAR olmak üzere iki ayrı biçim vardır. Bu ekran tasarımları CANVAS bölümünde yer alır.

 

Yukarıdaki bölümde yeni giriş alanları yer almakta, aşağıda 10 satırlık alanda ise daha önce girilen değerler gösterilmektedir. Gösterge ile (cursor) bu alanlarda hareket etmek mümkündür.

 

Ekranda gösterilen 4 adet buton, tabloya ait olmadığından geçici bir tabloda gösterilecektir. Bu da CONTROL adındaki blocktur. Bu block database bloğu değildir. Üzerinde dört adet buton değişkeni bulunmaktadır.

 

Bu blokta örnek olarak BUT_NEW isimli butona (YENİ) bir adet trigger yer almıştır. Bu da alan seviyesindeki trigger örneğidir. İçeriğinde ;

 

begin

  create_record;

  Go_Item('doviz.dovkod1');

end;

 

bu ifadeyle YENİ isimli butona basıldığında create_record komutuyla bir adet kayıt yaratılacak ve doviz bloğunda dovkod1 isimli değişkene gidilir.

 



 

KAYDET butonuna basıldığında ise (BUT_SAVE isimli değişken)

 do_key('commit_form');
komutuyla dosya üzerindeki tüm işlemler saklanır.