Dynamics 365 F&O – Lookup Oluşturma

Bu yazıda Dynamics 365 Finance and Operations da yer alan lookup’lardan bahsedeceğim. Bu yazıyı yeni başlayan arkadaşları düşünerek hazırladım. Fakat D365 F&O’a yeni geçen AX 2012 geliştiricilerine de faydalı olacaktır.

Lookup Nedir ?

Bir alana tıkladığınızda açılan küçük form’a lookup denmekte.

Lookup dediğimiz aslında run-time da generate edilen bir formdur. D365 F&O bir alanın başka bir tablo ile ilişkisini gördüğünde, tablodaki değerlerden seçim yapabilmemiz için otomatik bir lookup gösterir. Bu otomatik çıkardığı lookup’da tablo özelliklerinde TitleField1, TitleField2 olarak belirlediğimiz alanları kullanır.

Bazı durumlarda bu çıkan lookup’ın sorgusunu düzenlemek yada gösterilen alanları değiştirmek isteyebilirsiniz. Bunun için aşağıda anlattığım gibi kendi lookup kodunuzu yazmanız gerekmekte.

Custom Lookup Oluşturma

İlgili formu açın. Lookup’ın gözükmesini istediğiniz alanın üzerine gelin. Events bölümünden OnLookup seçeneğine sağ tık > Copy event handler method‘u seçin. Yeni bir sınıf oluşturup, kopyaladığınız kodu yapıştırın.

String Lookup

Yapıştırdığınız method’un içini aşağıdaki gibi doldurun. Buradaki newParameters ve query kısımlarını kendinize göre düzenlemeniz gerekmekte. Visual Studio’yu build ettiğinizde değişiklikler aktif olacaktır.

Bu örnek kod, FormStringControl tipindeki string alanlar içindir.

/// <summary>
/// Güven Şahin - guvensahin.com
/// </summary>
[FormControlEventHandler(formControlStr(TrvRequisition, TrvRequisitionTable_GvnLocation), FormControlEventType::Lookup)]
public static void TrvRequisitionTable_GvnLocation_OnLookup(FormControl sender, FormControlEventArgs e)
{
	TrvRequisitionTable     trvRequisitionTable = sender.formRun().dataSource(formdatasourcestr(TrvRequisition, TrvRequisitionTable)).cursor();
	Query                   query;
	QueryBuildDataSource    qbds;
	SysTableLookup          sysTableLookup;

	query = new Query();
	qbds = query.addDataSource(tableNum(TrvLocations));
	qbds.addRange(fieldNum(TrvLocations, GvnLocationType)).value(queryValue(trvRequisitionTable.GvnLocationType));


	sysTableLookup = SysTableLookup::newParameters(tableNum(TrvLocations), sender);
	sysTableLookup.addLookupfield(fieldNum(TrvLocations, Location), true);
	sysTableLookup.addLookupfield(fieldNum(TrvLocations, CountryRegionId));
	sysTableLookup.addLookupfield(fieldNum(TrvLocations, StateId));

	sysTableLookup.parmQuery(query);
	sysTableLookup.performFormLookup();


	FormControlCancelableSuperEventArgs event = e;
	event.CancelSuperCall();
}

Int64 Lookup

Int64 tipindeki bir alanınız varsa formda ReferenceGroup şeklinde eklendiğini görmüşsünüzdür. Bu tip alanlar için aşağıdaki kodu kullanmanız gerekmekte.

String olan örnekten farklı olarak, addLookupField method’u ek bir değer almaz. Dönüş tipiniz her durumda RecId’dir.

/// <summary>
/// Güven Şahin - guvensahin.com
/// </summary>
[FormControlEventHandler(formControlStr(TrvCashAdvances, General_GvnWorker), FormControlEventType::Lookup)]
public static void General_GvnWorker_OnLookup(FormControl sender, FormControlEventArgs e)
{
	TrvCashAdvance          trvCashAdvance = sender.formRun().dataSource(formdatasourcestr(TrvCashAdvances, TrvCashAdvance)).cursor();
	Query                   query;
	QueryBuildDataSource    qbds;
	SysReferenceTableLookup sysTableLookup;

	query = new Query();
	qbds = query.addDataSource(tableNum(HcmWorker));

	qbds = qbds.addDataSource(tableNum(GvnSubWorkerView));
	qbds.relations(false);
	qbds.addLink(fieldNum(HcmWorker, RecId), fieldNum(GvnSubWorkerView, SubWorker));
	qbds.joinMode(JoinMode::ExistsJoin);
	qbds.addRange(fieldNum(GvnSubWorkerView, Worker)).value(queryValue(trvCashAdvance.RequestingWorker));


	sysTableLookup = SysReferenceTableLookup::newParameters(tableNum(HcmWorker), sender);
	sysTableLookup.addLookupMethod("name");
	sysTableLookup.addLookupfield(fieldNum(HcmWorker, PersonnelNumber));

	sysTableLookup.parmQuery(query);
	sysTableLookup.performFormLookup();


	FormControlCancelableSuperEventArgs event = e;
	event.CancelSuperCall();
}

Sistem Lookupları

D365 F&O kendisinin çeşitli formlarda kullandığı lookupları, genellikle ilgili tablonun üzerine kaydetmiş olur. Örneğin CustTable tablosu üzerinde lookupCustomer isminde bir method mevcut. Aynı şekilde SalesTable üzerinde de lookup ifadesi ile başlayan pek çok method bulunuyor. Bu standart lookuplar ihtiyacınızı karşılıyor ise bunları kullanabilirsiniz.

D365 F&O bazı özel alanlar için önceden lookup form‘lar oluşturmuştur. Örneğin bir formda çalışan seçmek istediğinizde, çalışanın resminin de olduğu özel bir lookup form açılır.

Bu lookup formları, hazırladığı yardımcı sınıf ile çeşitli parametrelere göre çağırır. Örneğin HcmWorkerLookup, InventItemIdLookup sınıfları. Eğer sizde bu tip bir alan için lookup yazmayı hedefliyorsanız, yazmadan önce standart yapı ihtiyacınızı karşılıyormu bakmak isteyebilirsiniz. Aşağıda örnek bir kod mevcut.

HcmWorkerLookup::newOnlyActiveEmployeesWithinCompany().lookupWorker(_callerControl);

Bilinen Kısıtlamalar ve Öneriler

  • AX 2012’de ki tüm kısıtlamalar D365 F&O içinde geçerli.
  • Lookup query’sinde sadece ana tabloyu gösterebilirsiniz. Join ile eklediğiniz diğer tabloların alanları maalesef lookup’da gözükmez. Böyle bir ihtiyacınız varsa addLookupMethod isimli method’u kullanarak display method’ları gösterebilirsiniz.
  • Birden fazla tablodan mutlaka alan göstermeniz gerekiyorsa, bu tabloları view ile birleştirin. View’ı lookup sorgusunda kullanın.
  • Benim sorgum çok karışık, standart query-view yapısı karşılamaz diyorsanız son çare olarak lookup form yapmanız gerekiyor. Burada aslında yeni bir form yapıyorsunuz. Design > Pattern kısmından Lookup ile ilgili olanları seçerseniz görünüş olarak lookup’a benziyor. Daha sonra lookup ile bu custom form’u çağırıyorsunuz. Daha detay bilgiye kısa bir Google araştırmasıyla ulaşabilirsiniz.
  • AX 2012’deki gibi form datasource’u üzerine direkt lookup yazılamıyor. Böyle bir ihtiyacınız varsa datasource’un init method’unda aşağıdaki gibi lookup method’u override etmelisiniz.
sender.object(fieldNum(TrvExpTrans, CostType))
	.registerOverrideMethod(methodStr(FormDataObject, lookup), staticMethodStr(GvnUtil, lookupCostType));

Son Olarak

Lookup ile ilgili bahsedeceklerim bu kadardı. Diğer D365 F&O yazılarıma buradan, Dynamics AX yazılarıma da şuradan bakabilirsiniz. Hoşçakalın.

Yazıyı Paylaş

“Dynamics 365 F&O – Lookup Oluşturma” hakkında 1 yorum

  1. Geri bildirim: Dynamics 365 F&O – Events | Güven Şahin

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir