Ana içeriğe geç

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)

ÜyeTürAçıklama
KeyStringAna nedenin benzersiz anahtarı.
TextDictionary<String, String>Ana nedenin çok dilli metni ("tr-TR", "en-US" gibi kültür anahtarlarıyla).
SubReasonsList<SubReason>Bu ana nedene bağlı alt nedenler.
IconIconInfoAna nedenin yanında gösterilecek ikon (Id, Name, Size).
DataSourceDataSourceAlt nedenleri besleyen veri kaynağı (kullanılırsa).
DataSourceTypeNullable<DataSourceType>Veri kaynağının türü.
SelectedIndexNullable<Int32>Seçili alt nedenin sırası.

SubReason (alt neden)

ÜyeTürAçıklama
KeyStringAlt nedenin benzersiz anahtarı.
TextDictionary<String, String>Alt nedenin çok dilli metni.
IconIconInfoAlt nedenin ikonu.
RealReasonBooleanBu alt nedenin asıl (gerçek) neden olarak işaretlenip işaretlenmediği.
SelectedIndexNullable<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:

ÜyeTürAçıklama
ProblemDictionary<String, String>Diyagramın başındaki problem metni (çok dilli).
ReasonsList<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

ÖzellikAçıklama
NameNesnenin koddaki adı (ör. FishBone1). Koddan bu adla erişirsiniz.
Field NameVeritabanı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.

ÖzellikAçıklama
DataSourceNedenleri sağlayan veri kaynağı.
DataSourceTypeVeri kaynağının türü (ör. statik liste, sorgu).
ItemsAna nedenlerin (List<MainReason>) listesi. Her ana nedenin altında alt nedenler bulunabilir.

Behavior

ÖzellikAçıklama
ParentKeyVeri kaynağında ana nedeni temsil eden anahtar alan.
ChildrenKeyVeri kaynağında alt nedenleri ana nedene bağlayan anahtar alan.
HierarchyTypeNedenlerin hiyerarşik olarak nasıl çözüleceğini belirler.
MaxMainReasonEn fazla kaç ana neden (kılçık) eklenebileceğini sınırlar.
MaxSubReasonBir ana nedene en fazla kaç alt neden eklenebileceğini sınırlar.
ProblemDiyagramın ortasında, balığın başında yazan problem metni (Dictionary<String, String>, çok dilli).
SubReasonTextAlt nedenlerin metin olarak girilip girilemeyeceğini belirler.
ReadOnlyDiyagramı salt okunur yapar; kullanıcı neden ekleyip silemez.
RequiredEn az bir neden girilmesini zorunlu kılar; boşsa form kaydedilmez.

Appearance

ÖzellikAçıklama
Visible / Client VisibleNesnenin görünürlüğü.
Enabled / Client EnabledNesnenin aktif olup olmadığı.
TitleNesnenin 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)

OlayNe 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)

OlayNe zaman çalışır
OnClick / OnDoubleClickNesneye tıklanınca / çift tıklanınca.
OnTextChanging / OnTextChangedBir nedenin metni değişmeden önce / sonra.
OnValueChanging / OnValueChangedDiyagram içeriği değişmeden önce / sonra.
Sunucu ve istemci olaylarını karıştırmayın

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;
Veriyi koddan mı veri kaynağından mı doldurmalı?

İ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 MaxMainReason ve MaxSubReason ile sınır koyun; diyagram okunaklı kalır.
  • Diyagramın ortasındaki problem metnini Problem (çok dilli Dictionary<String, String>) özelliğinden ayarlayın. Bu nesnede Text özelliği yoktur.
  • Bir alt nedeni asıl neden olarak vurgulamak için SubReason.RealReason bayrağını true yapın.
  • En az bir neden girilmesini şart koşmak için Required özelliğini açın; ek olarak sunucuda OnValidating ile 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