Ana içeriğe geç

Alt Süreç Başlatma

Bir süreç üzerinden, farklı bir süreç başlatılabilir. Bu işlev birçok farklı ihtiyacı karşılamaya yardımcı olacaktır. Burada farklı bir süreci tetiklemekten ziyade bir sürecin başka bir sürecin alt süreci olması durumundan bahsedilmektedir.

Bir ana süreç ve birden fazla alt süreç bulunabilir. Alt süreçlere ait proje, ana süreç ile aynı solution(çözüm) altında olmayabilir.

Ana süreç için örnek akış tasarımı

Alt süreç başlatma işlemleri fonksiyon nesnesi üzerinde gerçekleştirilecektir.

Alt süreç işlemleri eBAPI.dll kullanarak gerçekleştirilmektedir.

Alt Akış Oluşturacağımız zaman eBA veri tabanında FlowSubFlow tablosuna kayıt ekliyoruz, Process'i Alt akış Yapan bu insert işlemi. AddSubFlow fonksiyonu ile bu işlemi gerçekleştiriyoruz.

Alt akış başlatırken parametre olarak ana süreçten veri gönderebiliriz, ayrıca başlatılan alt akışın id bilgisini ana süreç üzerinde direkt elde edebiliriz.

Alt akışa parametre ile veri gönderebilmek için, alt sürecin akış formunda variable(değişken) tanımlanmalı ve public (genel) olarak işaretlenmelidir.

// Eklenecek referanslar
%SystemPath%\Common\eBAPI.dll
%SystemPath%\Common\eBADB.dll
// Eklenecek Namespace
using eBAPI;
using eBAPI.Connection;
using eBADB;
using eBAPI.Workflow;
using System.Data.SqlClient;
using System.Data;
public void fn_StartSubFlow_Execute()
{
using (eBAConnection con = CreateServerConnection())
{
con.Open();
eBAForm frm = Document1.ProfileData;
WorkflowProcess mgr = con.WorkflowManager.CreateProcess(process: "SubFlow"); // Başlatılacak Akışın ismini giriyoruz
mgr.Parameters.Add("varFlowStarter", FlowStarter1.User); // Ana akışı başlatan kullanıcı Id bilgisi alt akıştaki public değişkene gönderilmek üzere parametre olarak ekleniyor.
mgr.Parameters.Add("varMainFlowId", id.ToString()); // Ana akış id değeri alt akıştaki public değişkene gönderilmek üzere parametre olarak ekleniyor.
mgr.Parameters.Add("varMainFlowFormId", Document1.ProfileId.ToString()); // Ana süreçteki form id değeri alt akıştaki public değişkene gönderilmek üzere parametre olarak ekleniyor.
mgr.Parameters.Update();
mgr.Start(); // alt akışın başlatılması
frm.Fields["txtSubFlowId"].AsString = mgr.ProcessId.ToString(); // Başlatılan Alt Akışın id'sini ana formda TextBox'a yazdırma
frm.Fields["txtMainFormPath"].AsString = new eBAForm(int.Parse(Document1.ProfileId.ToString())).ProfileOwner;
frm.Update();
//For Insert Database
AddSubFlow(tetiklenenId: mgr.ProcessId, orderNo: GetOrderID(mgr.ProcessId), Aciklama: id.ToString() + " id akış üzerinden " + mgr.ProcessId.ToString() + " id alt akış Başlatıldı");
}
}
private int GetOrderID(int AkisID) //buraya ana akışın idsini parametre geçiyoruz.
{
eBADBProvider SqlCon = CreateDatabaseProvider();
SqlCon.Open();
try
{
string Sql = "Select Max(ORDERNO) AS ORDERNO From FLOWREQUESTS Where ProcessId=" + AkisID;
SqlDataAdapter da = (SqlDataAdapter)SqlCon.CreateDataAdapter(Sql);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
return int.Parse(dt.Rows[0]["ORDERNO"].ToString());
}
else
{
throw new Exception("Sorgu Hiç Satır İçermiyor :\n" + Sql);
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
finally
{
SqlCon.Close();
}
}
private void AddSubFlow(int tetiklenenId, int orderNo, string Aciklama)
{
eBAConnection con = CreateServerConnection();
con.Open();
//SubFlow Tablosuna Kayıt atıyoruz, alt akış oluşturduğumuz zaman bu fonksiyonu çağırmamız gerekir
string sql = string.Format(@"INSERT INTO FLOWSUBFLOWS (PROCESSID,SUBPROCESSID,ORDERNO,DESCRIPTION,RELATIONDATE,RELATIONTYPE) VALUES('" + id.ToString() + "','" + tetiklenenId + "','" + orderNo + "','" + Aciklama + "',getdate(),'1')");
//ORDERNO ana akıstakı en son adımdan bır fazla verebılırsınız hardcoded.
//relation typei 1 veriniz
eBADB.eBADBProvider db = CreateDatabaseProvider();
SqlConnection SqlCon = (SqlConnection)db.Connection;
SqlCon.Open();
try
{
SqlCommand com = new SqlCommand(sql, SqlCon);
com.ExecuteNonQuery();
com.Dispose();
}
finally
{
SqlCon.Close();
con.Close();
}
}

Alt süreç için örnek akış tasarımı

Üst akıştan parametre ile veri alabilmek için, alt sürecin akış formunda variable(değişken) tanımlanmalı ve public (genel) olarak işaretlenmelidir.

Bu örnekte; Alt akış formunda varsayılan olarak eklenmiş olan AkışıBaşlatan nesnesi kaldırılarak, yerine pozisyon nesnesi konulmuştur. Bu yüzden Doküman oluşturma nesnesindeki varsayılan Creator seçimi revize edilmiştir. Pozisyon nesnesinden önce yerleştirilen fonksiyon nesnesi üzerinde üst akıştan verilerin alınması ve işlemlerin gerçekleştirilmesi sağlanmıştır.

public void Fonksiyon1_Execute()
{
eBAForm frm = new eBAForm(Dokuman1.ProfileId);
frm.Fields["txtMainFlowStarter"].AsString = varFlowStarter.Value;
frm.Fields["txtMainFlowId"].AsString = varMainFlowId.Value;
frm.Fields["txtMainFlowFormId"].AsString = varMainFlowFormId.Value;
frm.Update();
}

Ana süreç üzerinden Alt süreç başlatma örnek görünümü