Ağu
24
2011

SAP Business Object de Universe,Loop,Alias ve Context Üzerine -2

Merhaba Arkadaşlar,

SAP BO ilgili 2.yazımız ile devam ediyoruz. Bu yazımızda işimizin kolay olmadığını belirtmiştim.

Geçen yazımızda İş Objelerinin sürekle bırak mantığı ile çalışmasına rağmen bu işlemin aslında veritabanına gönderilecek olan sorgunun hazırlanması olduğundan bahsetmiştik. Ayrıca ilgili sorgunun hazırlanması Evren tasarımında biz geliştiricilerin tanımlamalarına göre şekil aldığını belirtmiştik. Bu noktada şu gerçek ortaya çıkmaktadır o da “İlişkilerin doğru bir şekilde oluşturulması”. Aksi takdirde doğru ilişkiler tanımlanmazsa yanlış sorgular üretilecektir.

Örnekledirirsek; Birbiriyle ilişkili birçok tablonun raporlanacağı Evrenlerde hedef olarak yazılmasını istediğimiz sorgunun yanlış olarak yazılması mevzuu bahis olabilir. Özellikle birbiriyle ilişkili kırılımların süreklenip bırakılması(yani aynı sorgu içerisine) bizim sorgu içerisine girmesini istemediğimiz fazladan bağlamaların(join) işin içine girmesi ve sonuç olarak beklediğimizden daha az sonuç satırı demek olabilir. Biz bunlara Döngü(Loop) adını veriyoruz.

Meselenin daha iyi anlaşılması için senaryomuzu oluşturalım. Senaryomuz yine satış üzerine olsun. Aşağıdaki tabloları oluşturuyoruz.

  • Mağaza
  • Mamul
  • Müşteri
  • Şehir
  • Satış


CREATE TABLE [dbo].[t_dim_magaza](
	[magaza_id] [int] NULL,
	[magaza_adi] [varchar](50) NULL,
	[sehir_id] [int] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[t_dim_mamul](
	[mamul_id] [int] NULL,
	[mamul_adi] [varchar](150) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[t_dim_musteriler](
	[musteri_id] [int] NULL,
	[musteri_adi] [varchar](50) NULL,
	[sehir_id] [int] NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[t_dim_sehir](
	[sehir_id] [int] NULL,
	[sehir] [varchar](50) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[t_fact_satis](
	[magaza_id] [int] NULL,
	[musteri_id] [int] NULL,
	[mamul_id] [int] NULL,
	[adet] [int] NULL

Yukarıdaki scriptleri kullanarak tablolarımızı oluşturalım ve ilişkisel olarak tablolarımıza bir bakalım. Öncelikle t_fact_satis Unsur tablo olarak Adet ölçütünü ve Mağaza,Mamul ve Musteri kırılımlarını içinde bulundurmakta.
Diğer yandan kırılım tablolarımıza baktığımızda bir durum dikkatimizi çekiyor. Şehir kırılımı hem Müşteri hem de Mağaza kırılımlarının detayı olarak veritabanında saklanıyor. BO Evren Tasarımcısını açarak girip oluşan manzaraya bir bakalım.

Tasarımımızı resimdeki gibi oluşturduk. İşaretli kısma bastığımızda Döngü olduğuna dair uyarımızı alıyoruz.

Peki neden aldık bu hatayı ? Olası bir rapor üzerine konuşalım. Kullanıcı tüm kırılımlarını (Şehir,Mağaza,Mamul ve Müşteri) raporu ekleyip Adet ölçütüne elde etmeye çalışsın. Döngü problemi çözülmeden sorgu bazında yazılacak bağlamlar(join) tahmin ettiğiniz gibi aşağıdaki gibi olacaktır.


FROM
dbo.t_dim_satis satis,
dbo.t_dim_mamul mamul,
dbo.t_dim_musteriler musteriler,
dbo.t_dim_magaza magaza,
dbo.t_dim_sehir sehir

WHERE

satis.mamul_id=mamul.mamul_id
AND
satis.musteri_id=musteriler.musteri_id
AND
satis.magaza_id=magaza.magaza_id
AND
magaza.sehir_id=sehir.sehir_id
AND
musteriler.sehir_id= sehir.sehir_id

Bu masum ve doğru gibi görünen sorgu bir mantık hatası içermektedir o da sonuç olarak döndürülen satışların sadece müşterilerin kendi şehirlerindeki mağazalarda yapmış olduğu alışverişleri içermesidir. Ancak müşteri isterse gidip farklı bir şehirdeki mağazadan da alışveriş yapabilir!

Peki bu sorun nasıl çözülmelidir? Bu noktada Yol gösterme(Context) yöntemi ile problemimizi çözüyoruz..

Yol gösterme metodu ile yolumuzu tanımlayarak Tasarımcımızın doğru ifadeyi oluşturmasını sağlıyoruz.

.......
........

FROM
.....
WHERE

satis.mamul_id=mamul.mamul_id
AND
satis.musteri_id=musteriler.musteri_id
AND
satis.magaza_id=magaza.magaza_id
AND
magaza.sehir_id=sehir.sehir_id

şeklinde sorgumuzu düzenlemiş oluyoruz.

Yada problemimizi Eşlenik(Alias) kullanarak çözebilirdik. Bu amaçla Şehir tablomuzun bir kopyasını oluşturup onunla bağlama(join)e girmemesi amacı ile Müşteri tablosu ile ilişkilendirirdik. Bu şekilde Evren üzerinde Şehir tablosunun Müşteri ile de ilişki olduğunu ancak sorgu içerisine dahil edilmeyerek döngünün kırılmasını sağlamış olurduk.

Herkese iyi çalışmalar.

Yorum yapabilirsiniz..

  • Üstad eline sağlık, faydalı bir yazı olmuş.

Yazar : Burak Tunali

ODTÜ Bilgisayar ve Öğretim Teknolojileri mezunu olan yazar Bilgisayar Mühendisliğinde Yüksek Lisans yapmakta olup Veritabanı yönetim ve geliştirme alanında çalışmaktadır. Ayrıca Java SE,EE,ME ve C# ve Asp.Net teknolojilerine vakıfıyeti bulunmaktadır.

En son haber ve ücretsiz eğitimlere ulaşmak için üye olabilirsiniz