SAP HANA, iş zekası ve veri analitiği için güçlü bir platform sağlar. Veri modellenmesi, analitik ve raporlama gereksinimlerini karşılamak için Calculation Views gibi araçlar sunar. Bu yazıda, SAP HANA'da Calculation Views'leri anlamak ve kullanmak için önemli bilgileri sunacağız, özellikle de Graphical ve script tabanlı görünümler arasındaki farkları ele alacağız.

Calculation Views Nedir?

Calculation Views, SAP HANA'da veri modellenmesi için kullanılan yapısal nesnelerdir. Temel olarak, bir veya daha fazla tablo, diğer görünümler veya SQL ifadeleri üzerinde yapılan hesaplamaları ve işlemleri temsil ederler. Bu, karmaşık iş gereksinimlerini karşılamak için veri manipülasyonunu kolaylaştırır.

Calculation Views, Graphical ve script tabanlı olmak üzere iki ana tipe ayrılabilir. Her birinin kendine özgü avantajları ve kullanım senaryoları vardır. 

Graphical Calculation Views

Graphical Calculation Views, SAP HANA Studio veya SAP HANA Web IDE gibi araçlarla görsel bir arayüz kullanılarak oluşturulur. Bu, geliştiricilerin iş gereksinimlerine uygun karmaşık veri modellerini hızla oluşturmasını sağlar. Grafiksel arayüz, veri tabanlı yapıları sürükle-bırak yöntemiyle kolayca tasarlamayı mümkün kılar.

Graphical Calculation Views avantajları şunlardır:

Kullanımı kolaydır ve görsel olarak anlaşılabilir.

Veri modelleme sürecini hızlandırır.

Karmaşık sorguları ve hesaplamaları daha basit bir şekilde ifade etmeyi sağlar.

Ancak, bazı durumlarda grafiksel arayüzün sınırlamaları olabilir. Özellikle, daha karmaşık iş mantığı veya özelleştirilmiş hesaplama gereksinimleri için script tabanlı görünümler daha uygundur.

 

Script Calculation Views

Script Calculation Views, SQL tabanlı bir betik dilini kullanarak oluşturulur. Bu, geliştiricilere daha fazla esneklik ve kontrol sağlar. Script tabanlı görünümler genellikle daha karmaşık iş mantığı gerektiren senaryolar için tercih edilir. Geliştiriciler, SQL ifadeleri ve programlama yapıları aracılığıyla daha fazla işlem yapabilir ve özelleştirme yapabilirler.

Script Calculation Views avantajları şunlardır:

Daha fazla esneklik sağlar ve karmaşık iş mantığı gereksinimlerini karşılar.

SQL tabanlı programlama dili kullanarak geniş bir işlevsellik sunar.

Performans optimizasyonu ve özelleştirme imkanı sağlar.

Ancak, script tabanlı görünümler genellikle daha fazla teknik bilgi gerektirir ve oluşturulması daha uzun sürebilir.

Hangi Görünümü Kullanmalısınız?

Graphical ve script tabanlı Calculation Views, farklı gereksinimlere ve kullanım senaryolarına yöneliktir. Basit veri modelleri ve hızlı prototipler oluşturmak istiyorsanız, Graphical görünümleri tercih edebilirsiniz. Ancak, karmaşık iş mantığı veya özelleştirilmiş hesaplama gereksinimleri söz konusu olduğunda, script tabanlı görünümler daha uygun olabilir.

Kullanılacak görünüm tipini belirlerken, projenin gereksinimlerini, zaman çerçevesini ve mevcut teknik becerileri dikkate almak önemlidir. Genellikle, projenin karmaşıklığı arttıkça, script tabanlı görünümler daha cazip hale gelir.

SAP HANA'da Calculation Views, veri modellenmesi ve analitik işlemler için güçlü bir araç seti sunar. Graphical ve script tabanlı görünümler, farklı gereksinimlere ve kullanım senaryolarına yöneliktir. Graphical views, hızlı prototipler oluşturmak ve basit veri modellerini yönetmek için idealdir, script tabanlı views ise daha karmaşık iş mantığı gereksinimlerini karşılamak ve özelleştirmeler yapmak için uygundur. Her iki türün avantajlarını ve dezavantajlarını dikkate alarak, projenizin gereksinimlerine en uygun olanı seçebilirsiniz.

Örneklerle Script Calculation Views:

-- Satış Başlık Tablosu

CREATE TABLE SalesHeader (

    SalesOrderID VARCHAR(10) PRIMARY KEY,

    CustomerID VARCHAR(10),

    OrderDate DATE,

    Status VARCHAR(20) -- İptal, İade, vs.

);

 

-- Satış Kalemi Tablosu

CREATE TABLE SalesItem (

    SalesOrderID VARCHAR(10),

    ItemID INT,

    ProductID VARCHAR(18),

    Quantity DECIMAL(10, 2),

    PRIMARY KEY (SalesOrderID, ItemID),

    FOREIGN KEY (SalesOrderID) REFERENCES SalesHeader(SalesOrderID)

);

 

-- Teslimat Başlık Tablosu

CREATE TABLE DeliveryHeader (

    DeliveryID VARCHAR(10) PRIMARY KEY,

    SalesOrderID VARCHAR(10),

    DeliveryDate DATE,

    Status VARCHAR(20) -- Teslim Edilmedi, Teslim Edildi, vs.

);

 

-- Teslimat Kalemi Tablosu

CREATE TABLE DeliveryItem (

    DeliveryID VARCHAR(10),

    ItemID INT,

    ProductID VARCHAR(18),

    Quantity DECIMAL(10, 2),

    PRIMARY KEY (DeliveryID, ItemID),

    FOREIGN KEY (DeliveryID) REFERENCES DeliveryHeader(DeliveryID)

);

 

-- Fatura Başlık Tablosu

CREATE TABLE InvoiceHeader (

    InvoiceID VARCHAR(10) PRIMARY KEY,

    SalesOrderID VARCHAR(10),

    InvoiceDate DATE,

    Status VARCHAR(20) -- İptal, İade, vs.

);

 

-- Fatura Kalemi Tablosu

CREATE TABLE InvoiceItem (

    InvoiceID VARCHAR(10),

    ItemID INT,

    ProductID VARCHAR(18),

    Quantity DECIMAL(10, 2),

    PRIMARY KEY (InvoiceID, ItemID),

    FOREIGN KEY (InvoiceID) REFERENCES InvoiceHeader(InvoiceID)

);

 

-- Muhasebe Başlık Tablosu

CREATE TABLE AccountingHeader (

    AccountingDocumentID VARCHAR(10) PRIMARY KEY,

    InvoiceID VARCHAR(10),

    PostingDate DATE,

    Status VARCHAR(20) -- İptal, İade, vs.

);

 

-- Muhasebe Kalemi Tablosu

CREATE TABLE AccountingItem (

    AccountingDocumentID VARCHAR(10),

    ItemID INT,

    AccountID VARCHAR(10),

    Amount DECIMAL(15, 2),

    PRIMARY KEY (AccountingDocumentID, ItemID),

    FOREIGN KEY (AccountingDocumentID) REFERENCES AccountingHeader(AccountingDocumentID)

);

 

-- Örnek veri ekleme

INSERT INTO SalesHeader (SalesOrderID, CustomerID, OrderDate, Status) VALUES

('SO001', 'C001', '2024-01-01', 'Aktif'),

('SO002', 'C002', '2024-01-02', 'İptal'),

('SO003', 'C003', '2024-01-03', 'Aktif'),

('SO004', 'C004', '2024-01-04', 'İade'),

('SO005', 'C005', '2024-01-05', 'Aktif'),

('SO006', 'C001', '2024-01-06', 'İptal'),

('SO007', 'C002', '2024-01-07', 'Aktif'),

('SO008', 'C003', '2024-01-08', 'İptal'),

('SO009', 'C004', '2024-01-09', 'Aktif'),

('SO010', 'C005', '2024-01-10', 'Aktif');

 

INSERT INTO SalesItem (SalesOrderID, ItemID, ProductID, Quantity) VALUES

('SO001', 1, 'P001', 100),

('SO001', 2, 'P002', 200),

('SO002', 1, 'P003', 150),

('SO003', 1, 'P004', 50),

('SO003', 2, 'P005', 75),

('SO004', 1, 'P006', 100),

('SO004', 2, 'P007', 125),

('SO005', 1, 'P008', 150),

('SO005', 2, 'P009', 175),

('SO006', 1, 'P010', 200),

('SO006', 2, 'P011', 225),

('SO007', 1, 'P012', 250),

('SO007', 2, 'P013', 275);

 

INSERT INTO DeliveryHeader (DeliveryID, SalesOrderID, DeliveryDate, Status) VALUES

('D001', 'SO001', '2024-01-05', 'Teslim Edildi'),

('D002', 'SO002', NULL, 'Teslim Edilmedi'),

('D003', 'SO003', '2024-01-08', 'Teslim Edilmedi'),

('D004', 'SO004', '2024-01-09', 'Teslim Edilmedi'),

('D005', 'SO005', '2024-01-10', 'Teslim Edildi'),

('D006', 'SO006', '2024-01-11', 'Teslim Edilmedi'),

('D007', 'SO007', '2024-01-12', 'Teslim Edildi'),

('D008', 'SO008', '2024-01-13', 'Teslim Edilmedi'),

('D009', 'SO009', '2024-01-14', 'Teslim Edilmedi'),

('D010', 'SO010', '2024-01-15', 'Teslim Edildi');

 

INSERT INTO DeliveryItem (DeliveryID, ItemID, ProductID, Quantity) VALUES

('D001', 1, 'P001', 100),

('D001', 2, 'P002', 200),

('D003', 1, 'P004', 50),

('D003', 2, 'P005', 75),

('D004', 1, 'P006', 100),

('D004', 2, 'P007', 125),

('D005', 1, 'P008', 150),

('D005', 2, 'P009', 175),

('D006', 1, 'P010', 200),

('D006', 2, 'P011', 225),

('D007', 1, 'P012', 250),

('D007', 2, 'P013', 275);

 

INSERT INTO InvoiceHeader (InvoiceID, SalesOrderID, InvoiceDate, Status) VALUES

('INV001', 'SO001', '2024-01-10', 'Aktif'),

('INV002', 'SO002', NULL, 'İptal'),

('INV003', 'SO003', '2024-01-13', 'Aktif'),

('INV004', 'SO004', '2024-01-14', 'İptal'),

('INV005', 'SO005', '2024-01-15', 'Aktif'),

('INV006', 'SO006', '2024-01-16', 'İade'),

('INV007', 'SO007', '2024-01-17', 'Aktif'),

('INV008', 'SO008', '2024-01-18', 'İptal'),

('INV009', 'SO009', '2024-01-19', 'Aktif'),

('INV010', 'SO010', '2024-01-20', 'Aktif');

 

INSERT INTO InvoiceItem (InvoiceID, ItemID, ProductID, Quantity) VALUES

('INV001', 1, 'P001', 100),

('INV001', 2, 'P002', 200),

('INV003', 1, 'P004', 50),

('INV003', 2, 'P005', 75),

('INV004', 1, 'P006', 100),

('INV004', 2, 'P007', 125),

('INV005', 1, 'P008', 150),

('INV005', 2, 'P009', 175),

('INV006', 1, 'P010', 200),

('INV006', 2, 'P011', 225),

('INV007', 1, 'P012', 250),

('INV007', 2, 'P013', 275);

 

 

INSERT INTO AccountingHeader (AccountingDocumentID, InvoiceID, PostingDate, Status) VALUES

('ACCT001', 'INV001', '2024-01-15', 'Aktif'),

('ACCT002', 'INV002', NULL, 'İptal'),

('ACCT003', 1, 'A001', 50),

('ACCT003', 2, 'A002', 75),

('ACCT004', 1, 'A003', 100),

('ACCT004', 2, 'A004', 125),

('ACCT005', 1, 'A005', 150),

('ACCT005', 2, 'A006', 175),

('ACCT006', 1, 'A007', 200),

('ACCT006', 2, 'A008', 225),

('ACCT007', 1, 'A009', 250);

 

INSERT INTO AccountingItem (AccountingDocumentID, ItemID, AccountID, Amount) VALUES

('ACCT001', 1, 'A001', 1500),

('ACCT001', 2, 'A002', 2000),

('ACCT003', 1, 'A001', 50),

('ACCT003', 2, 'A002', 75),

('ACCT004', 1, 'A003', 100),

('ACCT004', 2, 'A004', 125),

('ACCT005', 1, 'A005', 150),

('ACCT005', 2, 'A006', 175),

('ACCT006', 1, 'A007', 200),

('ACCT006', 2, 'A008', 225),

('ACCT007', 1, 'A009', 250);

 

 

--Her müşterinin en son sipariş tarihi ve toplam satın alma miktarı:

BEGIN

    var_out = SELECT CustomerID,

                      MAX(OrderDate) AS LatestOrderDate,

                      SUM(Quantity) AS TotalQuantity

              FROM SalesHeader sh

              JOIN SalesItem si ON sh.SalesOrderID = si.SalesOrderID

              GROUP BY CustomerID;

END;

 

--Her müşterinin toplam satış miktarı:

BEGIN

    var_out = SELECT sh.CustomerID,

                      SUM(si.Quantity) AS TotalQuantity

              FROM SalesHeader sh

              JOIN SalesItem si ON sh.SalesOrderID = si.SalesOrderID

              GROUP BY sh.CustomerID;

END;

 

 

--İptal edilen faturaların toplam miktarı:

 

BEGIN

    var_out = SELECT

                      SUM(ii.Quantity) AS TotalCancelledAmount

              FROM InvoiceHeader ih

              JOIN InvoiceItem ii ON ih.InvoiceID = ii.InvoiceID

              WHERE ih.Status = 'İptal';

END;

 

 

--Belirli bir tarih aralığında yapılan muhasebe kayıtlarının toplam miktarı:

BEGIN

    var_out = SELECT  PostingDate,

                      SUM(Amount) AS TotalAmount

              FROM AccountingHeader ah

              JOIN AccountingItem ai ON ah.AccountingDocumentID = ai.AccountingDocumentID

              WHERE ah.PostingDate BETWEEN '2024-01-01' AND '2024-01-18'

              GROUP BY PostingDate;

END;

 

 

--Teslim edilmemiş siparişlerin sipariş numaraları ve sıralama numaraları:

BEGIN

    var_out =                      

       SELECT dh.SalesOrderID, ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber

              FROM SalesHeader sh

              LEFT JOIN DeliveryHeader dh ON sh.SalesOrderID = dh.SalesOrderID

              WHERE dh.DeliveryID IS NULL;

                      END;

 

--İptal edilen faturaların sipariş numaraları ve toplam miktarı:

BEGIN

    var_out = SELECT ih.InvoiceID,

                      SUM(ii.Quantity) AS TotalCancelledAmount

              FROM InvoiceHeader ih

              JOIN InvoiceItem ii ON ih.InvoiceID = ii.InvoiceID

              WHERE ih.Status = 'İptal'

              GROUP BY ih.InvoiceID;

END;

 

--Belirli bir tarih aralığında yapılan muhasebe kayıtlarının belirli bir değer üzerindeki miktarları:

BEGIN

    var_out = SELECT PostingDate,

                      CASE WHEN TotalAmount >= 1000 THEN 'High'

                           WHEN TotalAmount >= 500 THEN 'Medium'

                           ELSE 'Low'

                      END AS AmountLevel

              FROM (

                  SELECT ah.PostingDate,

                        COALESCE(SUM(ai.Amount), 0) AS TotalAmount

                  FROM AccountingHeader ah

                  JOIN AccountingItem ai ON ah.AccountingDocumentID = ai.AccountingDocumentID

                  WHERE ah.PostingDate BETWEEN '2023-01-01' AND '2023-12-31'

                  GROUP BY ah.PostingDate

              ) AS AmountInfo;

END;

 

-- Fatura Başına Ortalama Ürün Miktarı

BEGIN

       var_out = SELECT

                      ih.InvoiceID,

                      AVG(ii.Quantity) AS AverageQuantity

              FROM InvoiceHeader ih  

                      JOIN InvoiceItem ii ON ih.InvoiceID = ii.InvoiceID

              GROUP BY ih.InvoiceID;

                      END;

 

-- Müşterilerin Sipariş Sayıları ve Sıralaması

BEGIN

    var_out =SELECT

                    CustomerID,

                    OrderCount,

                    ROW_NUMBER() OVER (ORDER BY OrderCount DESC) AS Rank

                    FROM (

                                 SELECT

                                 sh.CustomerID,

                                 COUNT(sh.SalesOrderID) AS OrderCount

                                 FROM SalesHeader sh

                                 GROUP BY sh.CustomerID) AS OrderCounts;

END:

-- Fiyata Göre Ürünlerin En Yüksek ve En Düşük Miktarları

BEGIN

    var_out  =  SELECT

                          ProductID,

                          MAX(Quantity) AS MaxQuantity,

                          MIN(Quantity) AS MinQuantity

                          FROM SalesItem

                          GROUP BY  ProductID;

END;

--  En Yüksek Miktarlı Ürünlerin Sipariş ve Teslimat Durumları

BEGIN

                    var_out =SELECT

                                 si.ProductID,

                                 MAX(si.Quantity) AS MaxQuantity,

                                 COALESCE(MAX(sh.Status), 'Aktif') AS SalesStatus,

                                 COALESCE(MAX(dh.Status), 'Teslim Edilmedi') AS DeliveryStatus

                                 FROM SalesItem si

                                 LEFT JOIN SalesHeader sh ON si.SalesOrderID = sh.SalesOrderID

                                 LEFT JOIN DeliveryHeader dh ON sh.SalesOrderID = dh.SalesOrderID

                                 GROUP BY si.ProductID;

END;