Foreign Key | Restful Application Programming | RAP

Bu yazımda, İki tane tabloyu Foreign Key (FK) üzerinden bağlamayı ve böylelikle ilişkilendirmeyi anlatıyor olacağım. Bununu için 2 tane tabloya ihtiyacımız var: Check table ve Foreign Key Table.
Check Table: Referans aldığımız tablodur. Bir check table’ın yalnızca “key” alanları kullanılabilir. Ancak bu demek değildir ki, check tablodan alınan her key, foreign key tabloya key alan olarak eklenir. Buna dikkat edilmesi gerekir.
Foreign Key Table: Check table’dan alınan alanları kullanan table’dır. Yani kısacası foreign key’leri kullanacak olan tablodur.

@AbapCatalog.foreignKey.label : ‘Department’ : Foreign key alanı için bir etiket tutmaya yarar.
@AbapCatalog.foreignKey.keyType : #KEY : Eğer Check tablodan alınan tüm foreign key’ler, Foreign Key Table’da key alan olarak kullanılmışsa, #KEY seçilir.
@AbapCatalog.foreignKey.keyType : #NON_KEY : Eğer Check tablodan alınan foreign key’lerden EN AZ BİRİ key alan olarak KULLANILMAMIŞSA, #NON_KEY seçilir.
@AbapCatalog.foreignKey.keyType :#TEXT_KEY : Eğer ilgili Check Table bir text table ise ve translate edilebilir (çevrilebilir) alanları tutuyorsa kullanılır.
@ABAPCatalog.foreignKey.screenCheck : true/false
Bu anotasyon, yabancı anahtar kontrolü sırasında bir hata oluşursa kullanılacak mesaj sınıfını (message class) belirtir.
‘S4D430’: Hata mesajları için ‘S4D430’ mesaj sınıfı kullanılacak.
@AbapCatalog.foreignKey.messageNumber : ‘001’
Foreign Key kontrolü sırasında bir hata oluşursa kullanılacak mesaj numarasını (message number) belirtir.
‘001’: Hata mesajı için ‘001’ numaralı mesaj kullanılacak.
Kontext: 3,4 ve 5. anotasyonlar classical UI’larda value checklerinin çalışmasını sağlar. Modern ABAP programlamada bu anotasyonlara gerek yoktur.

Örnek Senaryo: ZDEPARTMENT ve ZEMPLOYEE adında iki tane tablo yaratalım. ZDEPARTMENT, çalışanın departman bilgilerini tutan Check table olacak. ZEMPLOYEE ise çalışan bilgilerini tutan Foreign Key Table.
CHECK TABLE : ZDEPARTMENT

FOREIGN KEY TABLE: ZEMPLOYEE

ZDEPARTMENT tablosundaki client ve id key alanlarıdır. id alanını ZEMPLOYEE tablosuna FK olarak göndereceğiz. Bunun aşağıdaki kod parçası ile yapabiliriz.
@AbapCatalog.foreignKey.label : 'Department'
@AbapCatalog.foreignKey.keyType : #NON_KEY
@AbapCatalog.foreignKey.screenCheck : false
department_id : sysuuid_x16
with foreign key zdepartment
where client = zemployee.client
and id = zemployee.department_id;
@AbapCatalog.foreignKey.screenCheck : false annotasyonu, tabloyu aktifleştirdiğimizde otomatik olarak eklenir.
Foreign Key Eklendikten Sonra:

department_id Foreign Key’i, ZDEPARTMENT tablosunun id isimli alanından gelmektedir. with foreign key söz grubu kullanılarak bir FK kullanılacağından bahsediliyor. 16.satırdaki zdepartment bizim check tablomuzdur. [0..*,1] ifadesi, tablolar arasındaki ilişkiyi belirten bir cardinality’dir. where sözcüğüyle, tabloların bağlanma koşullarını ifade ederiz, yani bir filtreleme yapmamızı sağlar.
KODLAR
ZEMPLOYEE
@EndUserText.label : 'Employee Table-Foreign Key Table'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #ALLOWED
define table zemployee {
key client : abap.clnt not null;
key employee_id : sysuuid_x16 not null;
name : abap.char(40);
age : abap.int1;
@AbapCatalog.foreignKey.label : 'Department'
@AbapCatalog.foreignKey.keyType : #NON_KEY
@AbapCatalog.foreignKey.screenCheck : false
department_id : sysuuid_x16
with foreign key [0..*,1] zdepartment
where client = zemployee.client
and id = zemployee.department_id;
}
ZDEPARTMENT
@EndUserText.label : 'Department Table-Check Table'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zdepartment {
key client : abap.clnt not null;
key id : sysuuid_x16 not null;
description : abap.char(80);
}
İyi okumalar dilerim.