Posts Tagged ‘ x++

Dynamics 365 Finance and Operations OnClicked Event Handler?

Bu yazıda Dynamics 365 Finance and Operations’da Event Handler nasıl kullanılır bir örnekle anlatmaya çalışacağım.

Şöyle bir örnek olsun. Standart bir forma bir CheckBox eklemek istiyoruz. Bu CheckBox işaretlendiğinde bir filtre çalışacak. Bunun için formdan bir Extension oluşturup CheckBox eklemek gerekiyor. Bu kısımları geçiyorum daha önce anlatmıştım. Burada asıl bu işaretleme olduğunda yazacağımız koda odaklanacağım.

Öncelikle bir Class oluşturmamız gerekiyor. Adının sonuna EventHandler eklemekte fayda var.

class CustInvoiceJournalEventHandler

{

/// <summary>

///

/// </summary>

/// <param></param>

/// <param name=”e”></param>

[FormControlEventHandler(formControlStr(CustInvoiceJournal, DmrShowAllRecord), FormControlEventType::Clicked)]

public static void DmrShowAllRecord_OnClicked(FormControl sender, FormControlEventArgs e)

{

QueryBuildDataSource    custInvoiceJourDS;

QueryBuildDataSource    eInvoicePoolTableDS;

FormRun                 elementForm         = sender.formRun(); // DataSource için gerekecek

FormCheckBoxControl     showAllRecord      ;

FormDataSource          custInvoiceJour_ds  = elementForm.dataSource(formDataSourceStr(CustInvoiceJournal, CustInvoiceJour)) as FormDataSource;

#IsoCountryRegionCodes

if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoTR]))

{

showAllRecord       = elementForm.design().controlName(formControlStr(CustInvoiceJournal, DmrShowAllRecord)); // CheckBox ‘a ulaşıyoruz.

custInvoiceJourDS   = custInvoiceJour_ds.query().dataSourceTable(tableNum(custInvoiceJour));

eInvoicePoolTableDS = custInvoiceJour_ds.query().dataSourceTable(tableNum(FDEInvoicePoolTable));

if(showAllRecord.checked())

{

eInvoicePoolTableDS.enabled(false);

}

else

{

eInvoicePoolTableDS.enabled(true);

}

custInvoiceJour_ds.executeQuery();

}

}

}

Bu yazıda EventHandler nasıl kullanılır anlatmaya çalıştım. Birçok durumda Extension yerine EventHandler kullanmak daha pratik oluyor.

Selamlar.

www.fatihdemirci.net

TAGs: Microsoft Life Cycle Services, LCS, Azure, Azure DevOps, EventHandler,Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, X++

Dynamics 365 Finance and Operations Event Handler Kullanımı?

Bu yazıda Dynamics 365 Finance and Operations içinde standart bir formda Event Handler kullanarak nasıl işlemler yapabilirsiniz göstermeye çalışacağım.

Bir önceki yazımda Form DataSource metotlarına Extension ile ekleme yapmayı anlatmıştım. CustInvoiceJournal formuna E-Fatura filtresi için bir DataSource eklemiştim. Şimdi orada eklenen filtreyi kullanıcının kaldırabilmesi için bir CustInvoiceJournal formuna CheckBox ekledim. Bu CheckBox’ın işaretlenmesi ile tüm kayıtları göstereceğim.

Events kısmından OnClicked’e sağ tıklayıp Copy event handler method diyorum.

Resim-1

Yeni bir class oluşturup kodu yapıştırıyorum.

class CustInvoiceJournal_FD_EventHandler // Class isimlendirmede hala bazen karışıyor ama ekip içinde bir standart oturtmak lazım.

{

/// <summary>

///

/// </summary>

/// <param></param>

/// <param></param>

[FormControlEventHandler(formControlStr(CustInvoiceJournal, DmrShowAllRecord), FormControlEventType::Clicked)] // Kopyalama sonucu bu geliyor zaten.

public static void DmrShowAllRecord_OnClicked(FormControl sender, FormControlEventArgs e)

{

QueryBuildDataSource    custInvoiceJourDS;

QueryBuildDataSource    eInvoicePoolTableDS;

FormRun                 elementForm         = sender.formRun();

FormCheckBoxControl     showAllRecord      ;

FormDataSource          custInvoiceJour_ds  = elementForm.dataSource(formDataSourceStr(CustInvoiceJournal, CustInvoiceJour)) as FormDataSource;

#IsoCountryRegionCodes

if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoTR]))

{

showAllRecord       = elementForm.design().controlName(formControlStr(CustInvoiceJournal, DmrShowAllRecord));

custInvoiceJourDS   = custInvoiceJour_ds.query().dataSourceTable(tableNum(custInvoiceJour));

eInvoicePoolTableDS = custInvoiceJour_ds.query().dataSourceTable(tableNum(FDEInvoicePoolTable));

if(showAllRecord.checked())

{

eInvoicePoolTableDS.enabled(false);

}

else

{

eInvoicePoolTableDS.enabled(true);

}

custInvoiceJour_ds.executeQuery();

}

}

}

Bu yazıda form kontrolleri için EventHandler kullanımını anlatmaya çalıştım.

Selamlar.

www.fatihdemirci.net

TAGs: Dynamics 365 Finance and Operations, MsDyn365FO, OnClicked (), DataSource, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Dynamics 365 ERP, X++

Dynamics 365 Finance and Operations Form DataSource Metotlarında Extension Kullanımı.

Bu yazıda Dynamics 365 Finance and Operations içinde standart bir formun DataSource metotlarına Extension ile nasıl ekleme yapabiliriz anlatmaya çalışacağım. Eski versiyonlarda bu işlem çok kolay ve hızlı yapılabiliyordu. Artık direk müdahale edemediğimiz için Extension mantığıyla ulaşmak zorundayız.

Bir örnek kodla DataSource metotlarına nasıl ulaştığımızı görelim. Bu örnekte CustInvoiceJournal formuna E-Fatura havuzuna gönderilenler ilk açılırken gelmesin diye bir filtre eklemek istiyorum. Bunun için CustInvoiceJour veri kaynağının init() metoduna ulaşıp bir join yapmam gerekiyor.  Yeni bir class oluşturuyorum.

[ExtensionOf(formDataSourceStr(CustInvoiceJournal,CustInvoiceJour))] // Bu satır asıl işi yapan hangi DataSource ise onu seçiyorum.

final class CustInvoiceJournalDS_FD_Extension // final eklemeyi unutmayın.

{

public void init()

{

FormDataSource          formDS = this; // DataSource metodunda olduğum için This direk DataSource u veriyor.

QueryBuildDataSource    custInvoiceJourDS;

QueryBuildDataSource    eInvoicePoolTableDS;

#IsoCountryRegionCodes

next init();  // asıl metodu çağıran kısım.

if (SysCountryRegionCode::isLegalEntityInCountryRegion([#isoTR]) //

{

custInvoiceJourDS = formDS.query().dataSourceTable(tableNum(custInvoiceJour));

// FormDS form dataSource olduğu için ona ekleme yapamazsınız. Aslında bize QueryBuildDataSource nesnesi lazım FormDS üzerinden ulaşıyorum.

eInvoicePoolTableDS = custInvoiceJourDS.addDataSource(tableNum(FDEInvoicePoolTable)); // Eklemeyi yapıyorum.

eInvoicePoolTableDS.addLink(fieldNum(custInvoiceJour , recId), fieldNum(FDEInvoicePoolTable ,RefRecId ));

eInvoicePoolTableDS.addLink(fieldNum(custInvoiceJour , TableId), fieldNum(FDEInvoicePoolTable,RefTableId ));

eInvoicePoolTableDS.joinMode(JoinMode::NoExistsJoin);

}

}

}

Bu yazıda standart bir formun herhangi bir DataSource metoduna Extension ile nasıl ekleme yapılır anlatmaya çalıştım.

Selamlar.

www.fatihdemirci.net

TAGs: Dynamics 365 Finance and Operations, MsDyn365FO, init(), DataSource, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365, Dynamics 365 ERP, X++

X++ :23- Extension ile Standart Bir Forma Alan eklemek.

Bu yazıda Visual Studio üzerinden Extension mantığıyla standart bir tabloya eklenen alanların nasıl forma eklenebileceğini anlatmaya çalışacağım.

Bir önceki yazımda smmActivities’e bir alan eklemiştik. Şimdi AOT üzerinden Formları açıyoruz. Sonrasında smmActivities formuna sağ tıklayıp Create extension’a tıklıyoruz.

Resim-1

Projemde Extension oluştu. Adını değiştirebilirim ama benim için şu anada adı uygun. Çift tıklayıp açıyorum.

Resim-2

Açılan Extension formu içinden veri kaynağına baktığımda bir önceki yazımda eklediğim alan otomatik geldi.  Sürükleyip tasarımda uygun bir yere bırakıyorum.

Resim-3

Artık hazırız. Projeyi Build edip çalıştırabiliriz.

Resim-4

Bu yazıda Extension ile standart bir tabloya eklenen yeni bir alanın formda nasıl gösterilebileceğini anlattım. Sonraki yazılarımda Extension ile kod yazmak ile ilgili örnekler yapacağım.

Selamlar.

www.fatihdemirci.net

TAGs: Extension, X++, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365

X++ :22- Extension ile Standart Bir Tabloya Alan eklemek.

Bu yazıda Visual Studio üzerinden Extension mantığıyla standart tablolara alan nasıl eklenir anlatmaya çalışacağım.

Öncelikle bu yazılarda Youtube videolarımda oluşturduğum Activity Managment projesini kullanacağım. Bu projede kullanmak üzere aktivitelerimi smmActivities tablosuna bağlamak için bir alan açıp bunu kullanacağız. smmActivities CaseManagment paketinden eğer yoksa öncelikle kendi paketinize eklemiz gerekiyor. Sonrasında sağ tıkladığınızda Create extension’a tıklıyoruz.

Resim-1

Projemde Extension oluştu. Adını değiştirebilirim ama benim için şu anada adı uygun. Çift tıklayıp açıyorum.

Resim-2

Açılan Extension içinden Fields2a sağ tıklayıp yeni bir alan oluşturuyorum.

Resim-3

Alanın özelliklerini belirleyip kaydediyorum.

Resim-4

Projemi eşitliyorum. Eğer hata yoksa tabloya alanı eklemiş oldu.

Resim-5

Bu yazıda Extension ile standart bir tabloya yeni bir alan nasıl eklenir anlatmaya çalıştım. Burada Extension isimlendirmesine dikkat etmek lazım. Birden çok geliştirme yapan varsa özellikle isimlendirme çok önemli oluyor. Bu şekilde alanı ekledikten sonra kodda tablonun standart bir alanı gibi kullanabilirsiniz. Sonraki yazılarımda Extension ile forma alanı eklemek ve kod düzenlemek ile ilgili örnekler yapacağım.

Selamlar.

www.fatihdemirci.net

TAGs: Extension, X++, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365

Dynamics 365 Finance and Operations için yeni bir Build ortamı nasıl ayağa kaldırılır?

Bu yazıda Dynamics 365 Finance and Operations için yeni Build tipinde bir sanal makine nasıl ayağa kaldırılır adım adım anlatmaya çalışacağım.

Başlamadan önce eğer bir müşteri uyarlama projeniz varsa burada gelen SandBox Develop And Test ortamını Build olarak ayarlamanız öneriliyor. Çünkü bu ortama yakın zamanda admin giriş yetkisi kalkacak ve geliştirme için kullanmak pek mümkün olmayacak. Dolayısıyla Build olarak ayarlamakta fayda var. Ayrıca yine yakın zamanda çıkacak bir Agent sayesinde bütün bir VM ayırmadan Build yapabileceğiz.

Biz bu örnekte Cloud-hosted environment üzerinden yeni bir Build makine oluşturmayı göreceğiz. Sandbox ile aynı adımlara sahip dolayısıyla ikisini de kapsayacak bir yazı olacak. Öncelikle Lifecycle Services’a giriş yapıyoruz. Projemizi seçip hamburger menüden Cloud-hosted environments’ı seçiyoruz.

Resim-1

Read more

X++ :20- CrosCompany Nedir?

Bu yazıda X++ sorgu anahtar kelimelerinden crossCompany inceleyeceğim. Öncelikle uygulamanın şirket yönetimini anlamak gerekiyor.

Uygulamadan istediğiniz kadar şirket tanımlayabiliyorsunuz. Kullanıcılar uygulamaya girdiğinde bir şirkette işlem yapıyorlar. İstedikleri zaman şirket değiştirebiliyorlar. Tablolarda DataAreaId sayesinde verilerin hangi şirkete ait olduğu tutuluyor. Eğer bir tablonun verisi şirket bağımsız olsun diyorsanız ayarlayabiliyorsunuz. Ancak bu tip tabloların dışında yaptığınız bütün işlemler bulunduğunuz şirkette gerçekleşiyor. Bir sorgu yazıp verileri görmek istediğinizde siz Range olarak şirket vermezseniz bile sistem SQL’e giden koda otomatik bulunduğunuz şirketi ekliyor. Bazı durumlarda iki faklı şirketin verisini tek bir sorguda görmek isteyebilirsiniz. Bunun için crossCompany kullanılıyor. Bir örnek yapalım.

static void FDDataAccessCrossCompany1(Args _args)

{

CustTable custTable;

container companies;

;

companies = ["USMF", "USF", “DMR”]; // Kaç şirkette sorgu yapmak istiyorsam buraya ekleyebilirim.

while select crossCompany : companies custTable // crossCompany ile oluşturduğum Container’ı veriyorum

where custTable.AccountNum like “M00032*”

{

info(strFmt(“%1 : %2 : %3″, custTable.AccountNum, custTable.Name(), custTable.dataAreaId));

}

}

Bu sorgunun SQL kodunda or ile şirket kodlarının eklendiğini görürsünüz bu sayede eklenen şirketlerdeki veriler alınabilir.  Sistem şirketler arası birçok işlem yapmak gerekiyor bu yüzden bu yapıları iyi bilemek işiniz kolaylaştırır. crossCompany Query’de de kullanılır. Dolayısıyla birden çok şirket verisi gösteren View ve Form yapabilirsiniz.

Selamlar.

www.fatihdemirci.net

TAGs: X++, crossCompany, Azure, Azure DevOps, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365

Dynamics 365 Finance and Operations için yeni bir X++ geliştirme sanal makinesi nasıl ayağa kaldırılır?

Bu yazıda yeni bir X++ geliştirmeleri için yeni bir sanal makine nasıl ayağa kaldırılır adım adım anlatmaya çalışacağım. Bu örnekte bir müşteri ortamında bunu asıl yapacağınızı anlatacağım. Partner veya eğitim amaçlı sanal makinelerde benzer bir mantığa sahip.

Öncelikle Lifecycle Services’a giriş yapıyoruz. Projemizi seçip hamburger menüden Cloud-hosted environments’ı seçiyoruz.

Resim-1

Read more

X++ :18- Select Nasıl Yazılır?

Bu yazıda X++ ile sorgu nasıl yazılır anlatmaya çalışacağım. X++ sorguları SQL sorgularına çok benzer ama temelde birkaç fark var öncelikle TableBuffer denen bir kavram var. SQL de bir sorgu yazdığınızda direk veriyi görürsünüz ama X++ da bunun görselleştirilebilmesi için bir TableBuffer‘a ihtiyaç vardır. Temel bir sorguda kullanılan anahtar kelimeler bunlardır. Birkaç örnek yaparak açıklamaya çalışacağım.

[while] select [reverse] [firstfast]

[firstonly] [firstOnly10] [firstOnly100] [firstOnly1000]

[forupdate] [nofetch] [crosscompany]

[forcelitterals | forceplaceholders] [forcenestedloop]

[forceselectorder]

[repeatableRead] [validTimeState]

[ * | <fieldlist> from] <tablebuffer>

[ index [hint] <indexname> ]

[ group by {<field>} ]

[ order by {<field> [asc][desc]} ]

[ where <expression> ]

[ outer | exists | notexists ] join [reverse]

[ * | <fieldlist> from] <tablebuffer>

[ index <indexname> ]

[sum] [avg] [minof] [maxof] [count]

[ group by {<field>} ]

[ order by {<field> [asc][desc]} ]

[ where <expression> ]

]

<fieldlist> ::= <field> | <fieldlist> , <field>

<field> ::= fieldname | <function>(<field>)

Bir Job ile temel birkaç sorgu yazalım.

class FDDataAccess1

{

public static void main(Args _args)

{

CustTable custTable;

;

select * from custTable; // Müşteri tablosundaki tüm kayıtları seçer

info(strFmt(“1- %1 %2″, custTable.AccountNum, custTable.Currency));

select custTable; // // Müşteri tablosundaki tüm kayıtları seçer. * From a ihtiyaç duymaz

info(strFmt(“2- %1 %2″, custTable.AccountNum, custTable.Currency));

select Currency from custTable; // Müşteri tablosundaki sadece Currency  alanını seçer

info(strFmt(“3- %1 %2″, custTable.AccountNum, custTable.Currency));

select reverse custTable; //  Müşteri tablosundaki tüm kayıtları ters sırada seçer

info(strFmt(“4- %1 %2″, custTable.AccountNum, custTable.Currency));

select firstonly custTable; // Müşteri tablosundaki tek satır veriyi seçer

info(strFmt(“5- %1 %2″, custTable.AccountNum, custTable.Currency));

select firstonly custTable

where custTable.Currency != “TRY”; // TRY den faklı olan ilk satırı seçer.

info(strFmt(“6- %1 %2″, custTable.AccountNum, custTable.Currency));

select firstonly custTable

where custTable.Currency != “TRY” &&

custTable.CustGroup == “PROJE”;

info(strFmt(“7- %1 %2″, custTable.AccountNum, custTable.Currency));

select firstonly custTable

where custTable.Currency == “TRY” ||

custTable.CustGroup == “PROJE”;

info(strFmt(“8- %1 %2″, custTable.AccountNum, custTable.Currency));    }

}

Çalıştırdığımda bu çıktıyı veriyor.

Resim-1

Farklı bir örnek yapalım. Bu job benim eğitimlerde kullandığım bir örnek.

static void FDDataAccess2(Args _args)

{

InventTable inventTable;

InventTrans inventTrans;

;

//1. sistemimde tanımlı bütün stok kartlar (InventTable)

setprefix(“Sistemimde tanımlı bütün stok kartlar”);

while select inventTable

{

info(strFmt(“%1 %2″, inventTable.ItemId, inventTable.ItemName()));

}

//2. kaç stok kartım var

setPrefix(“kaç stok kartım var”);

select count(recId) from inventTable;

info(strFmt(“%1″, inventTable.recId));

// 3. Hareket gören stok kartlarım hangileri (sadece stok kartlarım)

setPrefix(“Hareket gören stok kartlarım”);

while select inventTable

exists join inventTrans

where inventTable.ItemId == inventTrans.ItemId

{

info(strFmt(“%1 %2 %3″, inventTable.ItemId,

inventTrans.Qty,

inventTrans.DatePhysical));

}

//4. stok kartı hareket bilgisi

setPrefix(“stok kartı hareket bilgisi”);

while select inventTable

join inventTrans

where inventTable.ItemId == inventTrans.ItemId

{

info(strFmt(“%1 %2 %3″, inventTable.ItemId,

inventTrans.Qty,

inventTrans.DatePhysical));

}

//5. Hiç hareket görmeyen stok kartlarım hangileri ve adedi

setPrefix(“Hiç hareket görmeyen stok kartlarım”);

while select inventTable

notexists join inventTrans

where inventTable.ItemId == inventTrans.ItemId

{

info(strFmt(“%1 %2 %3″, inventTable.ItemId,

inventTrans.Qty,

inventTrans.DatePhysical));

}

setPrefix(“Hiç hareket görmeyen stok kartlarımın adedi”);

select count(recId) from inventTable

notexists join inventTrans

where inventTable.ItemId == inventTrans.ItemId;

info(strFmt(“Hiç hareket görmeyen stok kartlarım : %1 adettir.”, inventTable.recId));

//6. Her bir stok kartı için en yüksek stok hareket miktarını içeren bilgi

setPrefix(“Her bir stok kartı için en yüksek stok hareket miktarını içeren bilgi”);

while select maxof(Qty)

from inventTrans

group by inventTrans.ItemId

{

info(strFmt(“%1 %2″, inventTrans.ItemId,

inventTrans.Qty));

}

}

Bu yazıda sorgu nasıl yazılır temel örneklerle anlatmaya çalıştım. Çok geniş bir konu ve çok ayrıntısı mevcut. Bunu iyi bilmek için veri tabanı yapısına ve temel SQL komutlarına hâkim olmak gerekiyor. SQL yazan birisi burada zorlanmaz. İleriki yazılarımda sorgunun diğer ayrıntılarına değinmeye devam edeceğim.

Selamlar.

www.fatihdemirci.net

TAGs: X++,Select, Azure, Azure DevOps, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365

X++ :17- InitValue Metodu Ne İşe Yarar?

Bu yazıda Dynamics 365 Finance and Operations tablo metotlarından InitValue() metodunu anlatacağım. InitValue() kayıt oluşturulurken otomatik bir alana ilk değer atamaya yarayan bir metottur.  Bir örnek yapalım.

FDBookTable tablosunda metotlara sağ tıklayıp InitValue() metodunu Override ettim.

Resim-1

Kitap kapak tipinizi normal olarak atadım. Şimdi tablo tarayıcısını açıp yeni kayıt dediğim anda otomatik kapak tipi normal olarak gelecek.

Resim-2

Şimdi kod çalışma sırasını anlamak için örneğimizi devam ettirelim. Önceki yazılarımda FDBookTable adında bir form yapmıştım. Diyelim ki bu formdan sadece kapak tipi karton olan kitaplar oluşturulabilsin. Bu sefer formun initValue metodunu eziyorum

Resim-3

Bu metoda kapak tipi olarak karton ataması yapıyorum.

Resim-4

Şu anda Tabloda normal formda karton diye iki tane ön değer tanımladım hangisi geçerli olacak tabi ki nesne tabanlı programlamanın temel mantığına uygun olarak ezilen üst seviyedeki kod geçerli olacak yanı formda yazdığımız atamayı yapacak.

Resim-5

Bu yazıda InitValue metodundan bahsettim. İlk değer ataması için kullanılan bir metot. Bu metotla birlikte kod çalışma sırasına da biraz değindik. Tablo en alt seviye ve buraya yazılan kodlar form veya alt seviye tasarım nesnelerinden ezilmediği sürece geçerli olurlar. İkisi birlikte çalışsın da diyebiliriz. Bunların da örneklerini ilerleyen yazılarımda yazacağım.

Selamlar.

www.fatihdemirci.net

TAGs: X++, InitValue, Azure, Azure DevOps, Microsoft Dynamics 365, MsDyn365FO, MsDyn365CE, MsDyn365

Page 1 of 111234510...Last »

Türkiye'nin en doğru, dolu dolu ve hatasız anlatımları ile teknik yazılarına, makalelerine, video'larına, seminerlerine, forum sayfasına ve sektörün önde gelenlerine ulaşabileceğiniz teknik topluluğu, MSHOWTO