Ana içeriğe geç

4.11. Kural Tabloları#

BPMN uygulamasında; belirli girdilerin belirli ön şartları sağlamasına bağlı olarak, belirli çıktıları verdiği kural (karar) tablolarını tanımlama ve girdilere göre kuralları işleterek beklenen çıktıyı verme yeteneği vardır. Bu yetenek, Flowable'in DMN modülü ile sağlanır.

DMN Nedir?#

DMN (Decision Model and Notation), iş kurallarını ve karar tablolarını standart bir formatta tanımlamak için kullanılan bir modeldir. Flowable BPMN motoru, DMN formatındaki karar tablolarını çalıştırarak iş süreçlerinde otomatik kararlar alınmasını sağlar.

Yetenekler#

  • Excel formatında hazırlanan karar tabloları içe aktarılarak, arka planda otomatik olarak Flowable DMN formatına dönüştürülür ve sisteme yüklenir. Böylece; teknik bilgi gerektirmeden karar tabloları oluşturulabilir.

  • Standart DMN formatındaki dosyalar içe aktarılabilir.

  • bpmn-lib library'si ile listeleme ve yükleme işlemleri arayüzden yönetilebilir.

  • Uygulamanın /process/decision/execute rest ucu çağırılarak, tanımlı kural tabloları çalıştırılabilir. Örnek istek body'si aşağıdaki gibidir:

{
    "key": "krediRiskHesaplama",
    "variables": {
        "yas": 30,
        "gelir": 7500,
        "calismaDurumu": "SERBEST"
    }
}

Bu istek sonucunda beklenen çıktı aşağıdaki gibidir:

{
    "body": {
         "key": "krediRiskHesaplama",
         "results": [
         {
            "sonuc": "BAŞARILI"
         }
         ]
    }
}
  • Süreç Yöneticisi yetkisine (bpmn) sahip kullanıcılar, kural tablosu yükleme ve silme işlemlerini yönetir. Süreç Görüntüleyicisi (bpmn:designer:view) yetkisine sahip kullanıcılar, sadece kural tablolarını listeleme işlemi yapabilir. Kural tablosunun çalıştırılıp çıktı alınması işlemi ise herhangi bir yetkiye bağlı değildir.

Uyarı

Bu yeteneklerin Bpmn uygulamasında kullanılabilmesi için "BPMN_DMN_ENABLED" parametresi true olmalıdır.

Formül Kullanımı#

Genel Yapı#

DMN karar tablosunda bazı durumlarda bir kolon, tek bir değişkeni değil; birden fazla değişken üzerinde yapılan bir hesaplamayı temsil etmesi gerekir. Örneğin iki sayının ortalamasını almak, çarpımını başka bir değerle karşılaştırmak veya zincirleme koşullar kurmak gibi durumlar buna örnektir. Flowable DMN motoru bu tür formülleri doğrudan bir kolona yazmanıza izin vermez. Bunun yerine aşağıda açıklanan pattern uygulanır.

Formül Kolonu Nasıl Tanımlanır?#

Tabloya yeni bir girdi kolonu eklendiğinde iki şey tanımlanır: kolonun tipi ve expression alanı. Normal bir kolon için bu alanlar sırasıyla SAYI ve ilgili değişken adı olur (a, b, c gibi). Formül kolonu için ise farklı bir yaklaşım gerekir. Kolon tipi MANTIKSAL seçilir, expression alanına ise true yazılır. Bu, kolonu her zaman aktif tutan bir dummy değerdir. Asıl formül mantığı kural satırındaki koşul alanına taşınır ve == #{formül ifadesi} formatında girilir.

Örnekler#

Örnek 1 — Toplam Kontrolü#

İki müşterinin puanlarının toplamının belirli bir eşiği geçip geçmediğini kontrol etmek istediğinizde:

Kolon Tip Expression Kural Koşulu
puan1 SAYI puan1 == -
puan2 SAYI puan2 == -
a+b MANTIKSAL true == #{(puan1+puan2) == 100}

Örnek 2 — Ortalama Kontrolü#

İki sınav notunun ortalamasının tam olarak 75 olması gerektiğinde:

Kolon Tip Expression Kural Koşulu
not1 SAYI not1 == -
not2 SAYI not2 == -
(a+b)/2 MANTIKSAL true == #{(not1+not2)/2 == 75}

Örnek 3 — Ortalama c den Büyük Eşit#

Bir ürünün iki farklı depodaki stok ortalamasının minimum eşiğin üzerinde olup olmadığını kontrol etmek için:

Kolon Tip Expression Kural Koşulu
stok1 SAYI stok1 == -
stok2 SAYI stok2 == -
minEsik SAYI minEsik == -
(a+b)/2 >= c MANTIKSAL true == #{(stok1+stok2)/2 >= minEsik}

Örnek 4 — Çarpım Kontrolü#

Birim fiyat ile satış adedinin çarpımının bütçe limitinin altında kalıp kalmadığını kontrol etmek için:

Kolon Tip Expression Kural Koşulu
birimFiyat SAYI birimFiyat == -
adet SAYI adet == -
butce SAYI butce == -
a*b < c MANTIKSAL true == #{(birimFiyat*adet) < butce}

Örnek 5 — Zincirleme Karşılaştırma#

Üç kademe onay limitinin sıralı olup olmadığını doğrulamak için (operasyonel limit < takım limiti < yönetici limiti):

Kolon Tip Expression Kural Koşulu
opLimit SAYI opLimit == -
takimLimit SAYI takimLimit == -
yoneticiLimit SAYI yoneticiLimit == -
zincirleme MANTIKSAL true == #{opLimit < takimLimit and takimLimit < yoneticiLimit}

Önemli Notlar#

&& operatörü Flowable JUEL'inde çalışmaz, bunun yerine and yazılmalıdır. Aynı şekilde || yerine or kullanılır. Formül kolonu label'ına < veya > gibi karakterler yazılırken XML'de bu karakterler < ve > olarak encode edilmelidir; aksi halde kaydetme sırasında XML parse hatası alınır. Arayüzden girildiğinde bu encoding otomatik yapılır, ancak XML üzerinden manuel düzenleme yapılıyorsa dikkat edilmelidir.


İç İçe DMN Kullanımı#

Genel Bakış#

Standart Flowable DMN kullanımında her karar tablosu bağımsız çalışır ve tüm input değişkenleri dışarıdan düz olarak verilir. Ancak bazı senaryolarda bir DMN'in çıktısı başka bir DMN'in girdisi olarak kullanılması gerekir. Bu, iç içe DMN (nested DMN) yaklaşımıyla çözülür.

Bu yaklaşımda execute payload'ındaki bir değişkenin değeri düz bir değer yerine Map (JSON objesi) olarak gönderilir. Sistem bu Map'i görünce ilgili key'i bir DMN key olarak tanır, o DMN'i ayrıca çalıştırır, çıktısını ana değişken havuzuna ekler ve ardından asıl DMN'i çalıştırır.


Çalışma Akışı#

execute("siparis_onay", variables)
resolveNestedDmns()
        ├── "musteriTipi" → String → atla
        └── "kargo_ucreti_hesapla" → Map → iç DMN çalıştır
            executeDecision("kargo_ucreti_hesapla", {mesafe, agirlik})
            kargoUcreti = 75  → ana map'e ekle
executeDecision("siparis_onay", {musteriTipi, kargoUcreti})
            onayDurumu = "MANUEL_ONAY"

Execute Payload Formatı#

Dış DMN key'i üstte belirtilir. İç DMN ise variables içinde, kendi DMN key'i ile aynı isimde bir obje olarak tanımlanır. Bu objenin içindeki alanlar iç DMN'in input değişkenleridir.

{
  "key": "siparis_onay",
  "variables": {
    "musteriTipi": "PREMIUM",
    "kargo_ucreti_hesapla": {
      "mesafe": 350,
      "agirlik": 12
    }
  }
}

kargo_ucreti_hesapla hem payload'daki Map key'i hem de Flowable'a deploy edilmiş iç DMN'in decisionKey'idir. Bu eşleşme zorunludur.


DMN Tanımları#

İç DMN bağımsız bir karar tablosudur. Kendi input'larını alır, kendi output'unu üretir. Dış DMN'den haberdar değildir.

kargo_ucreti_hesapla
├── input:  mesafe      (number)
├── input:  agirlik     (number)
└── output: kargoUcreti (number)

Dış DMN iç DMN'in çıktısını doğrudan input olarak kullanır. İç DMN çalışıp çıktısını ürettikten sonra bu değer dış DMN'e otomatik olarak inject edilir.

siparis_onay
├── input:  musteriTipi  (string)
├── input:  kargoUcreti  (number)  ← iç DMN çıktısı
└── output: onayDurumu   (string)


Kural: Key Eşleşmesi#

Payload'daki Map key'i ile deploy edilmiş DMN'in decisionKey'i birebir aynı olmalıdır. Eşleşmezse sistem o alanı normal bir değişken olarak değerlendirir, iç DMN çalışmaz.

Payload key DMN decisionKey Sonuç
kargo_ucreti_hesapla kargo_ucreti_hesapla ✅ İç DMN çalışır
kargoHesapla kargo_ucreti_hesapla ❌ İç DMN çalışmaz

Hit Policy ve Çıktı Davranışı#

İç DMN'in hit policy'si çıktının nasıl inject edileceğini belirler.

Hit Policy Çıktı Davranışı
FIRST, UNIQUE, ANY, PRIORITY İlk eşleşen satır çıktıları düz değişken olarak inject edilir
COLLECT, RULE_ORDER, OUTPUT_ORDER Her çıktı değişkeni liste olarak inject edilir

Recursive Çalışma#

İç içe geçme yalnızca bir seviye ile sınırlı değildir. İç DMN'in kendi variables'ı da Map içeriyorsa o da ayrıca resolve edilir.

{
  "key": "sevk_karar",
  "variables": {
    "musteri_skoru_hesapla": {
      "kargo_ucreti_hesapla": {
        "mesafe": 200,
        "agirlik": 8
      },
      "musteriYasi": 3
    },
    "oncelik": "YUKSEK"
  }
}

Bu örnekte önce kargo_ucreti_hesapla çalışır, çıktısı musteri_skoru_hesapla'nın variable'larına eklenir, ardından musteri_skoru_hesapla çalışır, onun çıktısı da sevk_karar'ın variable'larına eklenir.


Özet#

Konu Kural
İç DMN nasıl tanımlanır? Payload'da aynı isimli Map objesi olarak
Key eşleşmesi Payload key = DMN decisionKey (zorunlu)
İç DMN çıktısı nereye gider? Ana variable map'ine otomatik inject edilir
Derinlik limiti Yok, recursive çalışır
Hit policy etkisi FIRST/UNIQUE → düz değer, COLLECT → liste
İç DMN bulunamazsa Normal değişken olarak değerlendirilir, hata vermez

EXCEL DOSYASI YAPISI#

Excel dosyasını içe aktararak kural tablosu üretmek için belirli bir formata uyumlu olmalıdır. Aşağıda bu format tariflenmektedir.

Örnek bir kural tablosu excel formatını buradan indirebilirsiniz.


Excel dosyanız mutlaka iki sheet içermelidir:

📁 dosya_adi.xlsx
├── 📄 CONFIG          → Karar tablosu ayarları
└── 📄 DECISION_TABLE  → Karar kuralları

⚠️ ÖNEMLİ: Sheet isimleri tam olarak CONFIG ve DECISION_TABLE olmalıdır. Büyük/küçük harf duyarlıdır.


CONFIG SHEET#

CONFIG SHEET'i karar tablonuzun temel ayarlarını içerir.

Parametre Tablosu:#

Parametre Zorunlu Varsayılan Açıklama
DMN_KEY ✅ Evet - Sistemde bu karar tablosunu tanımlayan benzersiz anahtar. Execute işleminde bu değer kullanılır.
DMN_NAME ✅ Evet - Karar tablosunun kullanıcı dostu adı.
HIT_POLICY ❌ Hayır FIRST Birden fazla kural eşleştiğinde nasıl davranılacağını belirler.
FORCE_DMN11 ❌ Hayır true DMN 1.1 standardına uyumluluk.

DMN_KEY Yazım Kuralları:#

✅ DOĞRU ÖRNEKLER:
   - krediRiskHesaplama
   - otvOranBelirle
   - musteriSegmentasyon
   - risk_hesaplama_v2

❌ YANLIŞ ÖRNEKLER:
   - Kredi Risk Hesaplama  (boşluk var)
   - krediRiskHesaplaması  (Türkçe karakter)
   - 123kredi              (sayı ile başlıyor)

HIT_POLICY Seçenekleri:#

Policy Davranış Kullanım Alanı
FIRST İlk eşleşen kural sonucunu döndürür En yaygın kullanım. Öncelik sırasına göre kurallar
UNIQUE Sadece bir kural eşleşmeli, birden fazla eşleşme hata verir Kuralların çakışmaması gereken durumlar
ANY Birden fazla kural eşleşebilir ama aynı sonucu vermeli Tutarlılık kontrolü gereken durumlar
COLLECT Tüm eşleşen kuralların sonuçlarını liste olarak döndürür Çoklu sonuç gereken durumlar
UNORDERED Tüm eşleşen kuralların sonuçlarını liste olarak döndürür, sonuçların sırası garanti edilmez Çoklu sonuçların bir araya getirilmesi gereken, fakat öğelerin sırasının önemsiz olduğu durumlar
RULE_ORDER Tüm eşleşen kuralların sonuçlarını karar tablosunda yazıldığı sıraya göre döndürür Sonuçların kural sırasına göre anlam taşıdığı durumlar

CONFIG Örneği:#

┌─────────────┬─────────────────────────┐
│ DMN_KEY     │ musteriKrediLimiti      │
├─────────────┼─────────────────────────┤
│ DMN_NAME    │ Müşteri Kredi Limiti    │
├─────────────┼─────────────────────────┤
│ HIT_POLICY  │ FIRST                   │
├─────────────┼─────────────────────────┤
│ FORCE_DMN11 │ true                    │
└─────────────┴─────────────────────────┘

DECISION_TABLE#

Satır Yapısı:#

┌─────────────────────────────────────────────────────────┐
│ Satır 1: Kolon Tipleri (INPUT / OUTPUT)                 │
├─────────────────────────────────────────────────────────┤
│ Satır 2: Etiketler (Görünen İsimler)                    │
├─────────────────────────────────────────────────────────┤
│ Satır 3: Değişken Adları (Kod İsimleri)                 │
├─────────────────────────────────────────────────────────┤
│ Satır 4: Veri Tipleri (string/number/boolean/date)      │
├─────────────────────────────────────────────────────────┤
│ Satır 5: Kural 1                                        │
├─────────────────────────────────────────────────────────┤
│ Satır 6: Kural 2                                        │
├─────────────────────────────────────────────────────────┤
│ ...      ...                                            │
└─────────────────────────────────────────────────────────┘

Kolon Tipleri (Satır 1):#

Tip Açıklama
INPUT Karar vermek için kullanılan giriş değişkenleri
OUTPUT Karar sonucunda döndürülecek çıkış değerleri

💡 İpucu: Önce tüm INPUT kolonlarını, sonra OUTPUT kolonlarını sıralayın.

Değişken Adı Yazım Kuralları (Satır 3):#

✅ DOĞRU ÖRNEKLER:
   - musteriYasi
   - aylikGelir
   - aktifMi
   - krediNotu

❌ YANLIŞ ÖRNEKLER:
   - müşteri yaşı    (Türkçe karakter ve boşluk)
   - Müşteri-Yaşı    (Türkçe karakter ve tire)
   - 1musteriYasi    (sayı ile başlıyor)

Veri Tipleri (Satır 4):#

Veri Tipi Açıklama Örnek Değerler
string Metin değerleri "YUKSEK", "DUSUK", "AKTIF"
number Sayısal değerler (tam sayı veya ondalık) 100, 3.14, -50
boolean Mantıksal değerler true, false
date Tarih değerleri 2024-01-15

OPERATÖR KULLANIM KILAVUZU#

📌 BOŞ DEĞER / HERHANGİ BİR DEĞER#

Hücreyi boş bırakın veya - yazın. Bu, "herhangi bir değer olabilir" anlamına gelir.

┌──────────────┬─────────────┬──────────────┐
│ Yaş (INPUT)  │ Gelir       │ Sonuç        │
├──────────────┼─────────────┼──────────────┤
│ -            │ > 5000      │ "ONAY"       │  ← Yaş ne olursa olsun, gelir > 5000 ise ONAY
│              │ <= 5000     │ "RED"        │  ← Boş hücre de aynı anlama gelir
└──────────────┴─────────────┴──────────────┘

📌 EŞİTLİK OPERATÖRÜ (==)#

Belirli bir değere eşit olup olmadığını kontrol eder.

Yazım Formatı:

== değer        (sayılar için)
== "değer"      (metinler için)
== true/false   (boolean için)

Ek olarak; hücrede herhangi bir operator olmaması durumunda da eşitlik kontrolü uygulanır.

┌──────────────┬─────────────┬──────────────┐
│ Yaş (INPUT)  │ Kredi Notu  │ Sonuç        │
├──────────────┼─────────────┼──────────────┤
│ -            │ Geçerli     │ "ONAY"       │  ← =="Geçerli" demektir
│              │ Geçersiz    │ "RED"        │  ← =="Geçersiz" demektir
└──────────────┴─────────────┴──────────────┘

Örnekler:

Veri Tipi Excel'de Yazım Anlamı
string == "ALTIN" Değer "ALTIN" mı?
number == 100 Değer 100'e eşit mi?
boolean == true Değer true mu?
┌─────────────────┬─────────────┬──────────────┐
│ Segment (INPUT) │ VIP (INPUT) │ İndirim      │
├─────────────────┼─────────────┼──────────────┤
│ == "ALTIN"      │ == true     │ 20           │
│ == "GUMUS"      │ == true     │ 15           │
│ == "BRONZ"      │ -           │ 5            │
└─────────────────┴─────────────┴──────────────┘

📌 EŞİT DEĞİL OPERATÖRÜ (!=)#

Belirli bir değere eşit olmadığını kontrol eder.

Yazım Formatı:

!= değer        (sayılar için)
!= "değer"      (metinler için)

Örnekler:

┌─────────────────┬──────────────┐
│ Durum (INPUT)   │ İşlem        │
├─────────────────┼──────────────┤
│ != "IPTAL"      │ "DEVAM"      │  ← Durum "IPTAL" değilse DEVAM
│ == "IPTAL"      │ "DURDUR"     │  ← Durum "IPTAL" ise DURDUR
└─────────────────┴──────────────┘

📌 KARŞILAŞTIRMA OPERATÖRLERİ (<, <=, >, >=)#

Sayısal değerleri karşılaştırmak için kullanılır.

Yazım Formatı:

< değer     → Küçük
<= değer    → Küçük veya eşit
> değer     → Büyük
>= değer    → Büyük veya eşit

Örnekler:

┌─────────────────┬─────────────────┬──────────────┐
│ Yaş (INPUT)     │ Gelir (INPUT)   │ Risk         │
├─────────────────┼─────────────────┼──────────────┤
│ < 25            │ < 5000          │ "YUKSEK"     │  ← Yaş 25'ten küçük VE Gelir 5000'den az
│ >= 25           │ >= 5000         │ "DUSUK"      │  ← Yaş 25 veya üzeri VE Gelir 5000 veya üzeri
│ < 18            │ -               │ "RED"        │  ← Yaş 18'den küçükse (gelir fark etmez)
│ > 65            │ -               │ "OZEL"       │  ← Yaş 65'ten büyükse
└─────────────────┴─────────────────┴──────────────┘

📌 ARALIK OPERATÖRÜ (BETWEEN)#

Bir değerin belirli bir aralıkta olup olmadığını kontrol eder. Sınır değerler dahildir.

Yazım Formatı:

BETWEEN:minimum,maksimum

Örnekler:

┌─────────────────────┬──────────────┐
│ Puan (INPUT)        │ Not          │
├─────────────────────┼──────────────┤
│ BETWEEN:90,100      │ "AA"         │  ← 90 ile 100 arasında (90 ve 100 dahil)
│ BETWEEN:80,89       │ "BA"         │  ← 80 ile 89 arasında
│ BETWEEN:70,79       │ "BB"         │  ← 70 ile 79 arasında
│ BETWEEN:60,69       │ "CB"         │  ← 60 ile 69 arasında
│ BETWEEN:0,59        │ "FF"         │  ← 0 ile 59 arasında
└─────────────────────┴──────────────┘

⚠️ DİKKAT: Virgülden önce ve sonra boşluk bırakmayın: BETWEEN:10,100 ✅ | BETWEEN: 10, 100


📌 LİSTE İÇİNDE OPERATÖRÜ (IS_IN)#

Bir değerin belirli bir liste içinde olup olmadığını kontrol eder.

Yazım Formatı:

IS_IN:değer1,değer2,değer3

Örnekler:

┌────────────────────────────┬─────────────────┬──────────────┐
│ Sehir (INPUT)              │ Bolge (INPUT)   │ Kargo Ucreti │
├────────────────────────────┼─────────────────┼──────────────┤
│ IS_IN:Istanbul,Ankara,Izmir│ -               │ 15           │  ← 3 büyük şehir
│ IS_IN:Bursa,Antalya,Adana  │ -               │ 25           │  ← Diğer büyük şehirler
│ -                          │ == "DOGU"       │ 45           │  ← Doğu bölgesi
│ -                          │ -               │ 35           │  ← Varsayılan
└────────────────────────────┴─────────────────┴──────────────┘

Araç Sınıfı Örneği (OTV Hesaplama gibi):

┌──────────────────────────────────┬──────────────┐
│ AracSinifi (INPUT)               │ OTV Orani    │
├──────────────────────────────────┼──────────────┤
│ IS_IN:M1,M1G                     │ "45"         │  ← Binek araçlar
│ IS_IN:N1,N1G,N2,N3               │ "18"         │  ← Ticari araçlar
│ IS_IN:M2,M2G,M3                  │ "1"          │  ← Otobüsler
│ IS_IN:L1,L2,L3                   │ "22"         │  ← Motosikletler
└──────────────────────────────────┴──────────────┘

📌 LİSTE DIŞINDA OPERATÖRÜ (NOT_IN)#

Bir değerin belirli bir liste içinde olmadığını kontrol eder.

Yazım Formatı:

NOT_IN:değer1,değer2,değer3

Örnekler:

┌────────────────────────────┬──────────────┐
│ Durum (INPUT)              │ İşlem        │
├────────────────────────────┼──────────────┤
│ NOT_IN:IPTAL,ASKIDA,BEKLE  │ "ISLE"       │  ← Bu durumlardan biri değilse işle
│ IS_IN:IPTAL,ASKIDA,BEKLE   │ "BEKLET"     │  ← Bu durumlardan biriyse beklet
└────────────────────────────┴──────────────┘

OUTPUT (ÇIKIŞ) DEĞERLERİ YAZIM KURALLARI#

String (Metin) Çıkışlar:#

Mutlaka çift tırnak içinde yazın:

✅ DOĞRU:
   "YUKSEK"
   "ONAYLANDI"
   "Risk Seviyesi Yüksek"

❌ YANLIŞ:
   YUKSEK
   'ONAYLANDI'

Sayısal Çıkışlar:#

Tırnak kullanmadan yazın:

✅ DOĞRU:
   100
   3.14
   -50
   0

❌ YANLIŞ:
   "100"
   100,00 (virgül yerine nokta kullanın)

Boolean Çıkışlar:#

✅ DOĞRU:
   true
   false

❌ YANLIŞ:
   "true"
   TRUE
   1/0

KURAL SIRASI VE HIT POLICY#

FIRST Policy ile Kural Sırası:#

HIT_POLICY: FIRST kullandığınızda, kurallar yukarıdan aşağıya değerlendirilir ve ilk eşleşen kural uygulanır. Bu nedenle:

⚠️ ÖNEMLİ: Spesifik kuralları üste, genel kuralları alta yazın!

YANLIŞ Sıralama:

┌─────────────────┬──────────────┐
│ Yaş (INPUT)     │ Kategori     │
├─────────────────┼──────────────┤
│ -               │ "STANDART"   │  ← Her şey buna eşleşir!
│ < 18            │ "COCUK"      │  ← Buraya hiç ulaşılmaz
│ > 65            │ "YASLI"      │  ← Buraya hiç ulaşılmaz
└─────────────────┴──────────────┘

DOĞRU Sıralama:

┌─────────────────┬──────────────┐
│ Yaş (INPUT)     │ Kategori     │
├─────────────────┼──────────────┤
│ < 18            │ "COCUK"      │  ← Önce spesifik kurallar
│ > 65            │ "YASLI"      │  
│ -               │ "STANDART"   │  ← En son varsayılan kural
└─────────────────┴──────────────┘


GERÇEK DÜNYA ÖRNEKLERİ#

Örnek 1: Kredi Risk Değerlendirme#

CONFIG:

A B
DMN_KEY krediRiskDegerlendirme
DMN_NAME Kredi Risk Değerlendirme
HIT_POLICY FIRST
FORCE_DMN11 true

DECISION_TABLE:

A B C D E F
INPUT INPUT INPUT INPUT OUTPUT OUTPUT
Yaş Aylık Gelir Kredi Notu Mevcut Borç Risk Seviyesi Max Kredi
yas aylikGelir krediNotu mevcutBorc riskSeviyesi maxKredi
number number number number string number
< 21 - - - "RED" 0
- < 5000 < 500 - "YUKSEK" 10000
- < 5000 >= 500 - "ORTA" 25000
- >= 5000 < 500 > 50000 "YUKSEK" 15000
- >= 5000 >= 500 <= 50000 "DUSUK" 100000
- >= 10000 >= 700 <= 20000 "COK_DUSUK" 250000
- - - - "ORTA" 50000

Örnek 2: Kargo Ücreti Hesaplama#

CONFIG:

A B
DMN_KEY kargoUcretiHesaplama
DMN_NAME Kargo Ücreti Hesaplama
HIT_POLICY FIRST
FORCE_DMN11 true

DECISION_TABLE:

A B C D E
INPUT INPUT INPUT OUTPUT OUTPUT
Şehir Ağırlık (kg) Üyelik Tipi Kargo Ücreti Tahmini Süre
sehir agirlik uyelikTipi kargoUcreti tahminiSure
string number string number string
IS_IN:Istanbul,Ankara,Izmir <= 5 == "PREMIUM" 0 "1-2 gün"
IS_IN:Istanbul,Ankara,Izmir <= 5 - 15 "2-3 gün"
IS_IN:Istanbul,Ankara,Izmir > 5 == "PREMIUM" 10 "1-2 gün"
IS_IN:Istanbul,Ankara,Izmir > 5 - 25 "2-3 gün"
- <= 5 == "PREMIUM" 15 "3-5 gün"
- <= 5 - 35 "4-6 gün"
- > 5 - 50 "5-7 gün"

Örnek 3: OTV Oranı Belirleme (Karmaşık Örnek)#

CONFIG:

A B
DMN_KEY otvOraniBelirleme
DMN_NAME OTV Oranı Belirleme
HIT_POLICY FIRST
FORCE_DMN11 true

DECISION_TABLE:

A B C D E F G
INPUT INPUT INPUT INPUT INPUT INPUT OUTPUT
Araç Sınıfı Motor Hacmi Elektrikli Mi Koltuk Sayısı Azami Ağırlık 4x4 Mü OTV Oranı
aracSinifi motorHacmi elektrikliMi koltukSayisi azamiAgirlik dortCekenMi otvOrani
string number boolean number number boolean string
IS_IN:M1,M1G <= 1600 == false - - == false "45"
IS_IN:M1,M1G <= 1600 == false - - == true "50"
IS_IN:M1,M1G BETWEEN:1601,2000 == false - - - "50"
IS_IN:M1,M1G > 2000 == false - - - "80"
IS_IN:M1,M1G - == true - - - "10"
IS_IN:N1,N1G - == false - <= 3500 - "15"
IS_IN:N1,N1G - == true - - - "1"
IS_IN:M2,M3 - - >= 26 - - "1"
IS_IN:M2,M3 - - BETWEEN:10,25 - - "4"
- - - - - - "18"

HATA ÇÖZÜMLEME REHBERİ#

Sık Karşılaşılan Hatalar ve Çözümleri:#

Hata Mesajı Olası Sebep Çözüm
CONFIG sheet bulunamadı Sheet adı yanlış Sheet adını tam olarak "CONFIG" yapın
DECISION_TABLE sheet bulunamadı Sheet adı yanlış Sheet adını tam olarak "DECISION_TABLE" yapın
DMN_KEY değeri tanımlanmamış CONFIG'de DMN_KEY yok CONFIG sheet'e DMN_KEY satırı ekleyin
Geçersiz dosya formatı .xls veya başka format Dosyayı .xlsx olarak kaydedin
En az bir INPUT kolonu tanımlanmalı INPUT kolonu yok İlk satırda en az bir INPUT ekleyin
En az bir OUTPUT kolonu tanımlanmalı OUTPUT kolonu yok İlk satırda en az bir OUTPUT ekleyin
Geçersiz HIT_POLICY Yanlış policy adı FIRST, UNIQUE, ANY, UNORDERED, RULE_ORDER veya COLLECT kullanın
Bu DMN_KEY değerine sahip tablo mevcut Aynı key ile kayıt var Farklı DMN_KEY kullanın veya mevcut olanı silin
BETWEEN operatörü için geçersiz format Virgül hatası BETWEEN:10,100 formatında yazın (boşluksuz)

SIK SORULAN SORULAR (SSS)#

Soru: Aynı DMN_KEY ile yeni versiyon yükleyebilir miyim?#

Cevap: Hayır, önce mevcut karar tablosunu silmeniz gerekir. Ardından aynı key ile yeni tablo yükleyebilirsiniz.

Soru: Kaç tane INPUT/OUTPUT kullanabilirim?#

Cevap: Teknik olarak sınır yoktur, ancak performans için 20'den fazla kolon önerilmez.

Soru: Türkçe karakter kullanabilir miyim?#

Cevap: DMN_NAME ve Label (Satır 2) alanlarında kullanabilirsiniz. DMN_KEY ve Değişken Adı (Satır 3) alanlarında kullanamazsınız.

Soru: Excel'de formül kullanabilir miyim?#

Cevap: Hayır, tüm değerler sabit metin/sayı olmalıdır. Formüller çalışmaz.

Soru: Boş satır bırakabilir miyim?#

Cevap: Evet, kurallar arasında boş satır bırakabilirsiniz. Boş satırlar atlanır.