Ana içeriğe geç

Akış Olayları

Akıştaki her nesne çalışırken belirli anlarda bir olay (event) tetikler. Siz bu olaya bir C# işleyici (handler) yazarsanız, akış o noktaya geldiğinde kodunuz çalışır. Örneğin bir Fonksiyon düğümü çalıştığında _Execute olayı, bir Pozisyon onaylandıktan sonra _OnAfterEvent olayı tetiklenir.

İşleyiciler her zaman void döner ve (object sender, <ArgsTipi> args) imzasını taşır. Olayın türü (args tipi) hem kodunuza hangi bilgilerin geleceğini hem de kodun ne zaman çalışacağını belirler.

Ne zaman tetiklenir?

Olaylar iki gruba ayrılır:

  • Çalıştırma (execution) olayları: Bir adım çalıştığında tetiklenir. En sık kullanılanı, bir Fonksiyon düğümünün kendi kod gövdesini çalıştıran _Execute olayıdır. Bu olaylar onay bağlamı (kim, hangi aksiyon, hangi sebep) taşımaz.
  • Onay (event) olayları: Bir kullanıcı bir onay aksiyonu (onayla, reddet, yönlendir...) yaptığında tetiklenir. _OnBeforeEvent aksiyon işlenmeden önce, _OnAfterEvent aksiyon işlendikten sonra çalışır. Bu olaylar kimin işlem yaptığını, hangi aksiyon kodunu seçtiğini ve girdiği sebep metnini taşır.
Olay tasarımcıda açılmalı

Bir Fonksiyon düğümü _Execute gövdesini her zaman çalıştırır. Ama bir adım/pozisyon/grup yalnızca, o nesne için ilgili kodlama olayını tasarımcıda açtıysanız _OnBefore / _OnAfter işleyicisini tetikler. _OnAfterEvent işleyiciniz hiç çalışmıyorsa, büyük ihtimalle olay o adımda açık değildir.

Olay işleyici imzaları

Tasarımcı, nesne adına göre işleyici metot adını üretir: <NesneAdı>_<OlayEki>. Aşağıdaki imzalar gerçek akış kodlarında doğrulanmıştır.

İşleyici ekiargs tipiNe zaman çalışır
_ExecuteOnExecuteEventArgumentsBir Fonksiyon (FlowScript) düğümü gövdesini çalıştırdığında
_OnBeforeExecutionOnBeforeExecutionArgumentsBir adım çalışmadan önce (args.Cancel ile durdurulabilir)
_OnAfterExecutionOnAfterExecutionArgumentsBir adım çalıştıktan sonra
_OnBeforeEventOnBeforeEventArgumentsBir onay aksiyonu işlenmeden önce (iptal edilebilir)
_OnAfterEventOnAfterEventArgumentsBir onay aksiyonu işlendikten sonra

Olay argümanı tipleri ve üyeleri

Her args tipi şu dört temel üyeyi ortak olarak taşır: StepArguments Step, Int64 ProcessId, Boolean IsSessionStarterObject, Context Context.

OnExecuteEventArguments (Fonksiyon _Execute)

Yalnızca yukarıdaki dört temel üyeyi taşır. Onay bağlamı yoktur: EventCode, ActionerUserId ve EventFormId bulunmaz.

OnBeforeEventArguments (onay aksiyonu işlenmeden önce)

Onay aksiyonunu işlenmeden hemen önce yakalar ve veto edebilirsiniz. Üyeleri:

  • Int32 EventCode — kullanıcının tıkladığı aksiyonun sayısal kimliği.
  • Int32 ResultEventCode — sonuç aksiyon kodu.
  • Int64 ActionerUserId — işlemi yapan kullanıcının kimliği.
  • ApproverType ActionerType — işlemin kim adına yapıldığı (None, Self, Delegated, As).
  • Dictionary<String, String> Reason — kullanıcının girdiği sebep metni (dile göre anahtarlı).
  • Boolean Cancel { get; set }true yaparsanız aksiyon işlenmeden iptal edilir.

OnAfterEventArguments (onay aksiyonu işlendikten sonra)

OnBefore ile aynı onay bağlamını taşır, ama Cancel yoktur (aksiyon zaten gerçekleşti). Buna karşılık tek bu tipte bulunan bir üye vardır:

  • Int32 EventFormId — aksiyon bir açılır (popup) form açtıysa, o belgenin kimliği. Yalnızca OnAfterEventArguments bu üyeyi sunar.
  • Ayrıca EventCode, ResultEventCode, ActionerUserId, ActionerType, Reason.

OnBeforeExecutionArguments / OnAfterExecutionArguments

Bunlar yalnızca dört temel çalıştırma bağlamını taşır (Step, ProcessId, IsSessionStarterObject, Context); EventCode, Reason ya da ActionerUserId taşımaz. OnBeforeExecutionArguments ek olarak ayarlanabilir bir Boolean Cancel üyesine sahiptir.

not
args.Step ile hangi nesnenin tetiklediğini öğrenme

args.Step bir StepArguments nesnesidir ve Id, Key, Name, TypeCode (bir WorkflowItemTypeCode enum'u) üyelerini taşır. args.Step.TypeCode ile olayı hangi tür nesnenin tetiklediğine göre dallanabilirsiniz.

Kod örnekleri

Onay olaylarına yazdığınız sunucu (akış) kodu turuncu çerçevelidir.

Reddetme / sebep metnini okuma

Reason dile göre anahtarlanmış bir Dictionary<String,String> olduğu için ya üzerinde dönerek ya da bilinen bir kültür anahtarıyla okuyabilirsiniz.

public void p_gorus_OnBeforeEvent(object sender, OnBeforeEventArguments args)
{
if (args.Reason.Count > 0) // sebep girilmiş mi?
{
foreach (var sebep in args.Reason)
{
if (!string.IsNullOrEmpty(sebep.Value))
{
v_gorNedeni.SetConstantValue(sebep.Value);
v_gorNedeni.IsHtml = true; // sebep metni HTML olabilir
}
}
}
}

Hangi aksiyonun yapıldığını kontrol etme (EventCode)

EventCode, kullanıcının tıkladığı aksiyonun sayısal kimliğidir. Kodlar akışa özeldir (tasarımcıda o nesnenin olay listesinde tanımlanır), o yüzden tahmin etmek yerine bir kez keşfedin.

public void g_UPM_OnAfterEvent(object sender, OnAfterEventArguments args)
{
if (args.EventCode.ToString() == "21"
&& string.IsNullOrEmpty(Document1.Controls["GORAKTAR"].Value?.ToString()))
{
throw new Exception("Görüşe aktarılacak kullanıcıyı seçiniz.");
}
}
Açılan formu (event form) yakalama

Bir onay aksiyonu açılır form açtığında, o belgenin kimliği yalnızca OnAfterEventArguments.EventFormId üzerinden gelir. OnExecuteEventArguments bu üyeyi taşımadığı için, açılan formu bir Fonksiyon düğümünden doğrudan okuyamazsınız. Yöntem: onaylayan adımın _OnAfterEvent işleyicisinde args.EventFormId değerini bir Değişken nesnesine yazın, sonraki bir Fonksiyon düğümünde o kimlikle formu açıp okuyun.

İpuçları

  • İşleyici adı nesnenin adına bağlıdır: <nesneAdı>_<olayEki>. Nesneyi yeniden adlandırırsanız imza da değişir.
  • Bir aksiyonu engellemek için OnBeforeEvent içinde args.Cancel = true; yapın; aksiyon zaten işlendiyse (OnAfterEvent) iptal mümkün değildir.
  • Kim işlem yaptı (ActionerUserId, ActionerType), hangi aksiyon (EventCode) ve sebep (Reason) bilgisine yalnızca onay olaylarından (OnBefore/OnAfterEventArguments) ulaşabilirsiniz; çalıştırma olayları (OnExecute/OnBeforeExecution) bunları taşımaz.
  • Loglama için args.Context standart bağlam kaynağıdır: LogExtension.Log("...", args.Context);.
Doğrulanmış kod arayüzü (olay argümanları)

Ad alanı: Bimser.Synergy.Entities.Workflow.EventArguments

Temel üyeler (her tipte): StepArguments Step, Int64 ProcessId, Boolean IsSessionStarterObject, Context Context.

OnExecuteEventArguments: yalnızca temel üyeler.

OnBeforeEventArguments: EventCode (Int32), ResultEventCode (Int32), ActionerUserId (Int64), ActionerType (ApproverType), Reason (Dictionary<String,String>), Cancel (Boolean, ayarlanabilir) + temel üyeler.

OnAfterEventArguments: EventFormId (Int32, yalnızca bu tipte), EventCode, ResultEventCode, ActionerUserId, ActionerType, Reason + temel üyeler. Cancel yoktur.

OnBeforeExecutionArguments: Cancel (Boolean, ayarlanabilir) + temel üyeler. OnAfterExecutionArguments: yalnızca temel üyeler.

StepArguments (args.Step): Id (Int64), Key (String), Name (String), TypeCode (WorkflowItemTypeCode).

ApproverType enum: None, Self, Delegated, As.

not

args.Cancel = true ile OnBeforeExecution adımını durdurmak derlenir ancak çalışma zamanı davranışı dump'tan doğrulanmamıştır. TODO: doğrulanacak.

Kaynak: synergy-csp references/events.md ve references/flow-code-basics.md (örnekle doğrulanmış imzalar ve üyeler) + Bimser.Synergy.Entities.api.txt.