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/executerest 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:
- 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_hesaplahem payload'daki Map key'i hem de Flowable'a deploy edilmiş iç DMN'indecisionKey'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:
⚠️ ÖNEMLİ: Sheet isimleri tam olarak
CONFIGveDECISION_TABLEolmalı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ı:
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ı:
Ö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ı:
Ö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ı:
Ö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ı:
Ö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ı:
Ö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:
Sayısal Çıkışlar:#
Tırnak kullanmadan yazın:
Boolean Çıkışlar:#
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:
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.