FishBone
Bir problemin nedenlerini balık kılçığına benzer bir diyagramda gösteren nesnedir. Ortadaki çizgide problem, kılçıklarda ise ana nedenler (MainReason) ve onlara bağlı alt nedenler (SubReason) yer alır. Türkçede "kılçık diyagramı" ya da "Ishikawa diyagramı" olarak da bilinir.
Bu nesnenin değeri salt okunurdur. FishBone, bir neden ağacını çizen veri bağlı (data-bound) bir nesnedir. İçeriğini koddan Items (ana ve alt nedenlerin listesi) üzerinden ya da bir veri kaynağından (DataSource + ParentKey / ChildrenKey) alır. Diyagramın anlık durumunu Value ile yalnızca okursunuz; bu değer yazılamaz.
Ne zaman kullanılır?
Bir problemin olası nedenlerini düzenli biçimde sınıflandırmak istediğinizde kullanın. Örneğin bir kalite hatasının nedenlerini "İnsan", "Makine", "Yöntem", "Malzeme" gibi ana başlıklara ayırıp her başlığın altına alt nedenleri eklediğiniz kök neden analizi formlarında idealdir.
Tek bir değer girişi ya da basit liste için uygun değildir; bunun için TextBox veya bir liste nesnesi daha yerindedir.
Veri modeli
FishBone'un içeriği bir neden ağacıdır. Koddan bu ağacı Items özelliğine MainReason listesi olarak verirsiniz; her ana nedenin altında SubReason listesi bulunur.
MainReason (ana neden / kılçık)
| Üye | Tür | Açıklama |
|---|---|---|
Key | String | Ana nedenin benzersiz anahtarı. |
Text | Dictionary<String, String> | Ana nedenin çok dilli metni ("tr-TR", "en-US" gibi kültür anahtarlarıyla). |
SubReasons | List<SubReason> | Bu ana nedene bağlı alt nedenler. |
Icon | IconInfo | Ana nedenin yanında gösterilecek ikon (Id, Name, Size). |
DataSource | DataSource | Alt nedenleri besleyen veri kaynağı (kullanılırsa). |
DataSourceType | Nullable<DataSourceType> | Veri kaynağının türü. |
SelectedIndex | Nullable<Int32> | Seçili alt nedenin sırası. |
SubReason (alt neden)
| Üye | Tür | Açıklama |
|---|---|---|
Key | String | Alt nedenin benzersiz anahtarı. |
Text | Dictionary<String, String> | Alt nedenin çok dilli metni. |
Icon | IconInfo | Alt nedenin ikonu. |
RealReason | Boolean | Bu alt nedenin asıl (gerçek) neden olarak işaretlenip işaretlenmediği. |
SelectedIndex | Nullable<Int32> | Sırası. |
Value / FishBoneValue (salt okunur durum)
Value özelliği get-only'dir; diyagramın anlık durumunu FishBoneValue şeklinde döndürür:
| Üye | Tür | Açıklama |
|---|---|---|
Problem | Dictionary<String, String> | Diyagramın başındaki problem metni (çok dilli). |
Reasons | List<MainReason> | O anki ana neden ağacı. |
Aynı durumu nesne olarak GetValueAsObject(), kayıt için tipli veri biçiminde GetData() ile de alabilirsiniz.
Tasarımcı özellikleri
Bir FishBone seçildiğinde Özellik Görüntüleyici sekmelere ayrılır.
General
| Özellik | Açıklama |
|---|---|
Name | Nesnenin koddaki adı (ör. FishBone1). Koddan bu adla erişirsiniz. |
Field Name | Veritabanındaki alanın adı. |
Data Source
FishBone içeriğini bir veri kaynağından besleyebilir. Nedenler bu kaynaktan ana neden / alt neden olarak çözülür.
| Özellik | Açıklama |
|---|---|
DataSource | Nedenleri sağlayan veri kaynağı. |
DataSourceType | Veri kaynağının türü (ör. statik liste, sorgu). |
Items | Ana nedenlerin (List<MainReason>) listesi. Her ana nedenin altında alt nedenler bulunabilir. |
Behavior
| Özellik | Açıklama |
|---|---|
ParentKey | Veri kaynağında ana nedeni temsil eden anahtar alan. |
ChildrenKey | Veri kaynağında alt nedenleri ana nedene bağlayan anahtar alan. |
HierarchyType | Nedenlerin hiyerarşik olarak nasıl çözüleceğini belirler. |
MaxMainReason | En fazla kaç ana neden (kılçık) eklenebileceğini sınırlar. |
MaxSubReason | Bir ana nedene en fazla kaç alt neden eklenebileceğini sınırlar. |
Problem | Diyagramın ortasında, balığın başında yazan problem metni (Dictionary<String, String>, çok dilli). |
SubReasonText | Alt nedenlerin metin olarak girilip girilemeyeceğini belirler. |
ReadOnly | Diyagramı salt okunur yapar; kullanıcı neden ekleyip silemez. |
Required | En az bir neden girilmesini zorunlu kılar; boşsa form kaydedilmez. |
Appearance
| Özellik | Açıklama |
|---|---|
Visible / Client Visible | Nesnenin görünürlüğü. |
Enabled / Client Enabled | Nesnenin aktif olup olmadığı. |
Title | Nesnenin başlığı (MultiLanguageText, çok dilli). |
Olaylar
FishBone bir neden ağacı tuttuğu için olay yelpazesi dar bir nesnedir. Sunucu tarafında tek gerçek olay, form kaydedilirken çalışan doğrulama olayıdır. Metin ve değer değişim olayları yalnızca istemci (tarayıcı) tarafında çalışır.
Sunucu olayları (Server)
| Olay | Ne zaman çalışır |
|---|---|
OnValidating (ValidatingEvent) | Form kaydedilmeden önce, neden ağacı doğrulanırken. Geçersiz bir durumda e.Cancel = true yapıp e.Messages listesine mesaj ekleyerek kaydı durdurabilirsiniz. |
İstemci olayları (Client)
| Olay | Ne zaman çalışır |
|---|---|
OnClick / OnDoubleClick | Nesneye tıklanınca / çift tıklanınca. |
OnTextChanging / OnTextChanged | Bir nedenin metni değişmeden önce / sonra. |
OnValueChanging / OnValueChanged | Diyagram içeriği değişmeden önce / sonra. |
OnTextChanging / OnTextChanged ve OnValueChanging / OnValueChanged olayları yalnızca tarayıcı (TypeScript) tarafında tetiklenir. Bunları C# sunucu olayı gibi yazamazsınız. Sunucuda neden ağacına müdahale etmek için tek noktanız OnValidating olayıdır.
Kod örnekleri
FishBone'a sunucuda form/akış kodundan, istemcide TypeScript'ten erişebilirsiniz. Sunucu örnekleri turuncu, istemci örnekleri kırmızı çerçevelidir.
Diyagramı koddan doldurma (C#, sunucu)
Neden ağacını Items özelliğine bir MainReason listesi atayarak oluşturursunuz. Ortadaki problem metnini Problem (çok dilli sözlük) ile verirsiniz.
using System.Collections.Generic;
using Bimser.CSP.FormControls.Controls;
// Görünürlük ve aktiflik
FishBone1.Visible = true;
FishBone1.Enabled = true;
// Balığın başındaki problem metni (çok dilli)
FishBone1.Problem = new Dictionary<string, string>
{
["tr-TR"] = "Teslimat Gecikmesi",
["en-US"] = "Delivery Delay"
};
// Neden ağacını kur: ana nedenler ve altlarındaki alt nedenler
FishBone1.Items = new List<MainReason>
{
new MainReason
{
Key = "insan",
Text = new Dictionary<string, string> { ["tr-TR"] = "İnsan" },
SubReasons = new List<SubReason>
{
new SubReason
{
Key = "egitim",
Text = new Dictionary<string, string> { ["tr-TR"] = "Eğitim eksikliği" },
RealReason = true
}
}
},
new MainReason
{
Key = "makine",
Text = new Dictionary<string, string> { ["tr-TR"] = "Makine" },
SubReasons = new List<SubReason>
{
new SubReason
{
Key = "bakim",
Text = new Dictionary<string, string> { ["tr-TR"] = "Bakım yapılmaması" }
}
}
}
};
Akış (Flow) kodu (C#, sunucu)
Akış kodunda nesneye Document1.Controls üzerinden erişirsiniz:
// Görünürlük
Document1.Controls["FishBone1"].Visible = true;
// Salt okunur yap (kullanıcı neden ekleyip silemez)
Document1.Controls["FishBone1"].Enabled = false;
Neden ağacını okuma (C#, sunucu)
Items üzerinde dolaşarak girilmiş ana ve alt nedenleri okuyabilirsiniz. Diyagramın anlık durumunu salt okunur Value / GetValueAsObject() ile de alabilirsiniz.
foreach (MainReason ana in FishBone1.Items)
{
string anaMetin = ana.Text.ContainsKey("tr-TR") ? ana.Text["tr-TR"] : "";
foreach (SubReason alt in ana.SubReasons)
{
string altMetin = alt.Text.ContainsKey("tr-TR") ? alt.Text["tr-TR"] : "";
bool gercekNeden = alt.RealReason;
// TODO: anaMetin / altMetin / gercekNeden ile iş kuralınızı çalıştırın
}
}
İstemci kodu (TypeScript, tarayıcı)
İstemci tarafında nesnelere this. ile erişilir ve özellik adları küçük harfle yazılır:
this.FishBone1.visible = true;
this.FishBone1.enabled = true;
İki yol vardır. Nedenler sabit ya da iş kuralıyla hesaplanıyorsa koddan Items'a bir List<MainReason> atayın. Nedenler bir tablodan / sorgudan geliyorsa DataSource bağlayıp ParentKey ile ana nedeni, ChildrenKey ile alt nedenleri eşleyin; diyagram ağacı otomatik kurar. İki yol da aynı kılçık diyagramını üretir.
İpuçları
- Ana ve alt neden sayısı kontrolden çıkmasın diye
MaxMainReasonveMaxSubReasonile sınır koyun; diyagram okunaklı kalır. - Diyagramın ortasındaki problem metnini
Problem(çok dilliDictionary<String, String>) özelliğinden ayarlayın. Bu nesnedeTextözelliği yoktur. - Bir alt nedeni asıl neden olarak vurgulamak için
SubReason.RealReasonbayrağınıtrueyapın. - En az bir neden girilmesini şart koşmak için
Requiredözelliğini açın; ek olarak sunucudaOnValidatingile daha ayrıntılı kontrol yapabilirsiniz.
Tüm tasarımcı özellikleri (tam liste)
General: Name, Field Name
Data Source: DataSource, DataSourceType, Items
Behavior: ChildrenKey, HierarchyType, MaxMainReason, MaxSubReason, ParentKey, Problem, ReadOnly, Required, SubReasonText
Appearance: ClientEnabled, ClientVisible, Enabled, Title, Visible
Salt okunur: Value (FishBoneValue: Problem + Reasons)
Metotlar: GetValueAsObject(), GetData(), GetProtectedData(bool), GetDifferences(object)
Olaylar (Server): OnValidating (ValidatingEvent)
Olaylar (Client): OnClick, OnDoubleClick, OnTextChanging, OnTextChanged, OnValueChanging, OnValueChanged