static void Enum2Table(Args _args) { DictEnum enum = new DictEnum(enumName2Id("DRTCompany")); int i; DRTEnum2Table Enum2Table; ; delete_from Enum2Table; for (i=0; i < enum.values(); i++) { info(enum.index2Label(i)); Enum2Table.value = i; Enum2Table.label = enum.index2Label(i); Enum2Table.insert(); } }
30 Kasım 2018 Cuma
Enum | Microsoft Dynamics Ax
Aşağıdaki kod Enum'un içerisindeki seçenekleri info'da görmemizi sağlar.
19 Kasım 2018 Pazartesi
Dynamics Ax İş Avansları
Personel iş avansı formu | Dyamics Ax
Personel hesabı üzerinden satınalma siparişinden bağımsız iş avansı girişi yapıp günlük oluşturabilecekleri formu paylaşacağım. Uzun olduğu için ara ara eklemeler yapacağım.Form'un yapılışı ve kodlarını da paylaşacağım, günlük oluştumak için class'ı incelemek isterseniz aşağıdan ulaşabilirsiniz.
İncelemek için class'a buradan ulaşabilirsiniz > Personel iş avansları Class'ı
Diğer Form Tablo Workflow için hazırlanan dökümana buradan ulaşabilirsiniz. > İş avansları projesi
19 Eylül 2018 Çarşamba
Dynamics Ax displayOption Kulanımı
displayOption
displayOption formdaki satırları istenilen sarta göre renklendirir. kodu datasource'unda bulunan tablonun displayOption methodsuna yazarak bu işlemi yapıyorsunuz. Aşağıdaki örnekte tarihle ilgili bir şart yazıldı ve buna göre bir renkendirme tercih edildi.
public void displayOption(Common _common, FormRowDisplayOption _options) { PurchLine purchLineLocal; int backColor = WinAPI::RGB2int(161,161,255); // buradaki renkleri kendinize göre ayarlayabilirsiniz. int textColor = WinAPI::RGB2int(255, 255, 255); int backColorRed = WinAPI::RGB2int(255, 50, 50); int textColorWhite = WinAPI::RGB2int(255, 255, 255); ; purchLineLocal = _common; if(EtgExImpPurchLineTrans::findLastETA(purchLineLocal.InventTransId) > purchLineLocal.DeliveryDate) { _options.backColor(backColorRed); _options.textColor(textColorWhite); } else { _options.clearBackColor(); _options.clearTextColor(); } super(_common,_options); }Renk çeşitlerini aşağıdaki siteden inceleyebilirsiniz. Renk çeşitleri
Farklı bir kullanım örneği;
public void displayOption(Common _common, FormRowDisplayOption _options) { ETGCollateralTable collateralTableLocal; ; collateralTableLocal = _common;
if(collateralTableLocal.DueDate && (collateralTableLocal.DueDate - systemDateGet()) <= 7) { _options.backColor(backColor); _options.textColor(textColor); } else { _options.clearBackColor(); _options.clearTextColor(); } super(_common,_options); }
SQL case when kullanımı
Aslında yapmak istediğimiz aşağıdaki tarihlere göre excelde bir sutun açıp karşısına uygun yazıyı yazdırmak.
CASE WHEN DATEPHYSICAL BETWEEN '1900 - 01 - 01 00:00:00' AND '1900 - 01 - 01 00:00:00' THEN 'BO' WHEN DATEPHYSICAL BETWEEN '1900 - 01 - 01 00:00:00' AND '2018 - 05 - 01 00:00:00' THEN 'DO' WHEN DATEPHYSICAL BETWEEN '2018 - 05 - 01 00:00:00' AND '2054 - 01 - 01 00:00:00' THEN 'OD' END
Lookup'ta tarih filtresi vermek
Lookup QueryBuildRange
TransDate startDate, EndDate; startDate = mkDate(1,9,2017); endtDate = mkDate(1,10,2017); queryBuildRange.value(queryRange(StartDate, EndDate)); (ya da) queryBuildRange.value(queryRange(mkDate(1,9,2017), mkDate(1,10,2017)));
Başka bir örnek;
public void lookup() { Query query = new Query(); QueryBuildDataSource queryBuildDataSource; QueryBuildRange queryBuildRange; QueryBuildRange queryBuildRange2; QueryBuildRange queryBuildRange3; SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(SalesTable), this); if(DateFrom.dateValue() && DateTo.dateValue()) { sysTableLookup.addLookupfield(fieldNum(SalesTable, CustAccount)); queryBuildDataSource = query.addDataSource(tableNum(SalesTable)); queryBuildDataSource.addGroupByField(fieldNum(SalesTable, CustAccount)); queryBuildRange = queryBuildDataSource.addRange(fieldNum(SalesTable, createdDateTime)); queryBuildRange.value(SysQuery::range(this.dboConvertDateToDateTime(DateFrom.DateValue()), dateNull())); queryBuildRange = queryBuildDataSource.addRange(fieldNum(SalesTable, createdDateTime)); queryBuildRange.value(SysQuery::range(dateNull(), this.dboConvertDateToDateTime(DateTo.dateValue()))); queryBuildRange = queryBuildDataSource.addRange(fieldNum(SalesTable, InventSiteId)); queryBuildRange.value(editInventSiteId.text()); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
28 Ağustos 2018 Salı
Validate | Dynamics Ax
Belirlediğimiz tarihi ilişkili farklı tablodan kontrol edilerek kontrol ekleyebilirsiniz.
Örnek olarak ilişkisinin müşteri hesabı olduğu iki farklı tablodan birinin formunda datasource'daki ilgili alanın validate'ine aşağıdaki kodu yazarak işlem yaptırabilirsiniz.
Örnek olarak ilişkisinin müşteri hesabı olduğu iki farklı tablodan birinin formunda datasource'daki ilgili alanın validate'ine aşağıdaki kodu yazarak işlem yaptırabilirsiniz.
public boolean validate() // MAA 27.08.2018 { boolean ret; ETGCustRiskLimitUpdate CustRiskLimitUpdate; utcDateTime dateTime; dateTime = DateTimeUtil::addDays(DateTimeUtil::getSystemDateTime(), -90);// bugünden itibaren geçtiğimiz 90 günün tarihini alır.// DRT_CustExplainTable CustExplainTable = DRT_CustExplainTable::find(CustRiskLimitUpdate.AccountNum); ret = super(); if(DRT_CustExplainTable::find(ETGCustRiskLimitUpdate.AccountNum).modifiedDateTime < dateTime // maa 27.08.2018 && ETGCustomerRisk::find(ETGCustRiskLimitUpdate.AccountNum).CreditLimit < ETGCustRiskLimitUpdate.NewCreditMax && CustClassificationGroup::findGroup(CustTable::find(ETGCustRiskLimitUpdate.AccountNum).CustClassificationId).CustRiskLimit == NoYes::No) // müşteri sınıflandırma grubu { return checkfailed(strfmt("%1 carisinin müşteri detay açıklamaları alanını güncellemeniz gerekmektedir!", ETGCustRiskLimitUpdate.AccountNum)); } return ret; }DRT_CustExplainTable tablosuyla ilişkisini kurabilmek için iki tablodaki tekil olan CustAccount'u kullanarak find yazıyoruz.static DRT_CustExplainTable find(CustAccount _custAccount, boolean _forUpdate = false) // MAA 13.08.2018 { DRT_CustExplainTable DRT_CustExplainTable; ; if (_custAccount) { if (_forUpdate) DRT_CustExplainTable.selectForUpdate(_forUpdate); select firstonly DRT_CustExplainTable where DRT_CustExplainTable.CustAccount == _custAccount; } return DRT_CustExplainTable; }
10 Ağustos 2018 Cuma
Satış siparişleri | Dynamics Ax
Satış siparişinde cariye ait borca uyarı verdirme
Örnek: Bir müşteriye ait vadesi geçmiş borcu
olduğunda
(Müşteri ayrıntıları > İşlevler > Açık hareket düzenleme);
ilgili cariye satış siparişi oluştururken aşağıdaki gibi bir bilgi verilmesi isteniyorsa;
SalesTable'ın methods'una aşağıdaki kodu yazdığınızda satış siparişi girerken bu bilgiyi size verecektir.
boolean checkAccount() { CustTransOpen CustTransOpen; CustTrans CustTrans; ; while select CustTransOpen // MAA 10.08.2018 where CustTransOpen.AccountNum == this.CustAccount && CustTransOpen.AmountCur > 0 while select CustTrans where CustTrans.RecId == CustTransOpen.RefRecId if (CustTransOpen.DueDate < systemdateget()) { info(strfmt("%1 carisinin vadesi geçmiş bakiyesi var!", CustTransOpen.AccountNum)); } return true; }
8 Ağustos 2018 Çarşamba
Varsayılan sipariş ayarları tesis düzenlemesi
Varsayılan sipariş ayarları
Maddenin üzerindeki Kurulum > varsayılan sipariş ayarları alanında aşağıdaki formda Satınalma, Stok ve Satış tesisi düzenlemesine izin vermiyorsa sistem bunun sebebi;Formun datasource'unda bulnan InventItemPurchSetup, InventItemInventSetup, InventItemSalesSetup'taki tablolarda ilgili kaydın olmamasıdır (AllBlank'li olacak),
Aşağıdaki gibi kayıt oluşturduğunuzda problem gidecektir.( InventDimId, InventDimIdDefault'ları AllBlank seçin)
3 Ağustos 2018 Cuma
Ücretsiz toplu mail gönderme
Ücretsiz toplu mail
Toplu mail gönderiminde belirli bir sınırı aşınca toplu olarak mail gönderilemiyor.
Mailchimp bunun için ideal çözümlerden bir tanesi. Sizin adınızla toplu şekilde mail gönderebiliyorsunuz.
https://mailchimp.com/ adresine girip hesap oluşturun sonrasında kullanmaya başlayabilirsiniz.
Youtube'ta kullanımı sade bir şekilde anlatılmış izleyip işlemlerinizi yapabilirsiniz.
30 Temmuz 2018 Pazartesi
Stok Yönetimi > Hareketler'e referansına göre oluşturma tarihi getirme
Stok yönetimindeki Hareketler'e referansına göre ilgili tablolardan oluşturma tarihi ve saatini almak için aşağıdaki şekilde bir display method yazabilirsiniz.
//MAA 30.07.2018 display utcDatetime dispCreateDate() { InventTrans InventTrans; if (InventTrans::findTransId(this.InventTransId).TransType == InventTransType::Sales) { return salestable::find(SalesLine::findInventTransId(this.InventTransId).SalesId).createdDateTime; } else if (InventTrans::findTransId(this.InventTransId).TransType == InventTransType::ProdLine) { return ProdTable::find(this.TransRefId).createdDateTime; } else if (InventTrans::findTransId(this.InventTransId).TransType == InventTransType::Production) { return ProdTable::find(this.TransRefId).createdDateTime; } else if (InventTrans::findTransId(this.InventTransId).TransType == InventTransType::Purch) { return PurchTable::find(PurchLine::findInventTransId(this.InventTransId).PurchId).createdDateTime; } else { return InventTrans.createdDateTime; } }
Deftere nakil problemi | Dynamics Ax
Deftere nakil problemi
Satınalma siparişlerinde, bir cariye ait birden fazla siparişi faturalarken, aşağıdaki alanda kaç sipariş birleşecekse o kadar satır oluşuyor. Eğer siz düzenle demeden tamam butonuna basarsanız Ax siparişini bekleyeni de aşıyor direk faturalıyor ve bu çok riskli bir durum.Muhasebenin fatura kontrolü olmuyor bu durumda. Düzenle denildiğinde ise burada bulunan satırları birleştirip tek fatura olarak işlemlerinizi yapabiliyorsunuz.
Bunun önüne geçmek için şöyle bir çözüm düşündüm, birden fazla satır varsa, kullanıcı Tamam butonuna dalgınlıkla da olsa basamasın, ancak düzenle deyip tek satırda birleştirince Tamam diyebilsin şeklinde düzenlersek bunu engellemiş oluruz.
Bu kayıtlar Ax'ta PurchParmTable'da tutuluyor, burada ilgili siparişin satır sayısını elime alırsam buna göre bir kural yazıp istediğimi yapmış olurum.
int numberOfLinesPurchParm() // MAA 26.07.2018 { return any2int((select count(RecId) from PurchParmTable where PurchParmTable.OrderAccount == this.OrderAccount && PurchParmTable.ParmId == this.ParmId).RecId); }
Daha sonra formun datasource'unda bulunan PurchParmTable'ın active'ıne aşağıdaki şekilde şartları yazdığımda istediğimizi yapmış oluruz.
if (PurchParmTable.numberOfLinesPurchParm() == 1) //MAA 26.07.2018 { OkButton.enabled(true); } else if (PurchParmTable.numberOfLinesPurchParm() > 1) { OkButton.enabled(false); }
Daha önce yazdığım yazıyı da inceleyebilirsiniz.
24 Temmuz 2018 Salı
Forma field'ı getirme
Tablodaki alanlardan hangi satır üzerindeyseniz ilgili field'ın değerini aşağıdaki şekilde getirebilirsiniz. Sadece TittleField1'i seçebilirsiniz. Ya da her ikisi de (TittleField1, TittleField2) seçip formun üst tarafınfa görebilirsiniz.
Aşağıdaki gibi karşınıza çıkacaktır.
Aşağıdaki gibi karşınıza çıkacaktır.
23 Temmuz 2018 Pazartesi
View'e kodsuz range verme
View Range
Oluşturduğunuz bir view'e kod eklemeden range verebilirsiniz.Örneğin satış siparişlerinde durumu iptal edil olanları listelemek için aşağıdaki yöntem sizin işinizi çözecektir.
16 Temmuz 2018 Pazartesi
Satış siparişlerinde örnek rapor | Dynamics Ax
Sizden ekrandaki gibi satış siparişiyle, müşteri hesabıyla vs. filtreleme yapabilecekleri bir rapor istenirse şu adımları izleyerek yapabilirsiniz;
Raporda kullacağımız tabloları oluşturacağımız formun datasource'una ekliyoruz.
Sonrasında form oluşturuyoruz, formun classDecleration'una kullanacağımız fieldların tanımlamalarını yapıyoruz, filtrelemeleri de eklediğimiz formun methodsuna aşağıdaki şekilde kodlarımızı ekliyoruz;
satış siparişi için:
müşteri hesabı için:
Filtreleri sıfırlamak için :
Filtrelerde ilgili işlemleri bu şekilde yapıyoruz. Siparişin toplam miktarı için SalesTable'ın methods'una şu kodu ekliyoruz :
Raporumuz bu şekilde tamamlanmış oluyor. Yararlı olması dileğiyle :)
Raporda kullacağımız tabloları oluşturacağımız formun datasource'una ekliyoruz.
Sonrasında form oluşturuyoruz, formun classDecleration'una kullanacağımız fieldların tanımlamalarını yapıyoruz, filtrelemeleri de eklediğimiz formun methodsuna aşağıdaki şekilde kodlarımızı ekliyoruz;
public class FormRun extends ObjectRun { SalesId Salesid; ItemId itemid; CustAccount custAccount; }
satış siparişi için:
edit CustAccount custAccount(boolean set, CustAccount _custAccount = custAccount) { if (set) { custAccount = _custAccount; SalesTable_ds.executeQuery(); } return salesid; }
müşteri hesabı için:
edit SalesId Salesid(boolean set, SalesId _salesid = salesid) { if (set) { salesid = _salesid; SalesTable_ds.executeQuery(); } return salesid; }
Filtreleri sıfırlamak için :
void clearRange() { QueryBuildDataSource qbds; ; if(SalesCustTxt.text() != '' || SalesIdtxt.text() != '' ) { qbds = SalesLine_ds.query().dataSourceTable(tablenum(SalesLine)); qbds.clearRanges(); this.Salesid(true, ''); this.custAccount(true, ''); SalesLine_ds.executeQuery(); } }
Filtrelerde ilgili işlemleri bu şekilde yapıyoruz. Siparişin toplam miktarı için SalesTable'ın methods'una şu kodu ekliyoruz :
display real TotalSales()//MAA 19.03.2018 { return (select sum(SalesQty) from SalesLine where SalesLine.SalesId == this.SalesId).SalesQty; }Satış siparişlerinde filtreleme yaparken eklediğimiz field'e bütün siparişler geliyor olacaktır. Bütün siparişlerin raporda gelmesi istenmeyebilir. Örneğin iptal edilenler ya da ihracat siparişlerinin görünmesini engellemek için eklediğimiz fieldlerin lookup'ını eziyoruz.
public void lookup() { Query query = new Query(); QueryBuildDataSource queryBuildDataSource; QueryBuildRange queryBuildRange; SysTableLookup sysTableLookup; ; sysTableLookup = SysTableLookup::newParameters(tablenum(SalesTable), this); sysTableLookup.addLookupfield(fieldnum(SalesTable, SalesId)); sysTableLookup.addLookupfield(fieldnum(SalesTable, SalesName)); sysTableLookup.addLookupfield(fieldnum(SalesTable, CustAccount)); queryBuildDataSource = query.addDataSource(tablenum(SalesTable)); if(SalesIdtxt.text()) queryBuildDataSource.addRange(fieldnum(SalesTable, SalesId)).value(SalesIdtxt.text()); queryBuildRange = queryBuildDataSource.addRange(fieldnum(SalesTable, SalesPoolId)); queryBuildRange.value('!IHRACAT'); queryBuildRange = queryBuildDataSource.addRange(fieldnum(SalesTable, TaxGroup)); queryBuildRange.value('!YURTDISI'); queryBuildRange = queryBuildDataSource.addRange(fieldnum(SalesTable, SalesStatus)); queryBuildRange.value('!İptal edildi'); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); }
Raporumuz bu şekilde tamamlanmış oluyor. Yararlı olması dileğiyle :)
28 Haziran 2018 Perşembe
İlişkili tablodan verileri otomatik çekme | Dynamics Ax
Sizden tablonuzda sicil numarasını seçip persoenelin adı ve departmanı otomatik olarak gelmesi istenirse, aşağıdaki şekilde tablonuzun methodsunda modifiedField'ına yazabilirsiniz.
public void modifiedField(fieldId _fieldId) { super(_fieldId); switch (_fieldId) { case (fieldnum(DRT_EnvanterTransTable,EmplID)) : this.EmplName = EmplTable::find(this.EmplID).Name; this.Dimension[1] = EmplTable::find(this.EmplID).Dimension[1]; break; } }
27 Haziran 2018 Çarşamba
Bir tablodaki alanın adını kodla bulma | Dynamics Ax
26 Haziran 2018 Salı
Display bir alana ilişkili bir tablodan alan getirme | Dynamics Ax
Bir tabloya, viewe vs. display olarak bir alan eklediniz ve bu alanla ilişkili bir alanı çekmek istiyorsanız aşağıdaki gibi yapabilirsiniz.
Eklediğiniz display alan;
İlişkili tablodan çekmek istediğiniz farklı bir alan;
Eklediğiniz display alan;
display VendAccount ETGExImpVendAccount() {;
return PurchTable::find(this.PurchId).OrderAccount;
}
İlişkili tablodan çekmek istediğiniz farklı bir alan;
display VendName ETGExImpVendName() {;
return VendTable::find(this.ETGExImpVendAccount()).Name;
}
25 Haziran 2018 Pazartesi
Tümünü seç, kaldır | Dynamics Ax
Formda kayıtların tümünü seçmek ya kaldırmak istiyorsanız, öncelikle iki adet buton ekleyip ve click methoduna aşağıdaki gibi kodları yazarak yapabilirsiniz.
Tümünü seç yapmak için;
void clicked() { AtmSalesPickingListJournalTable atmtable; AtmSalesPickingListJournalLine atmDetail; ; super(); ttsbegin; while select AtmTable where atmtable.PickingListId == AtmSalesPickingListJournalTable.PickingListId { while select forupdate atmDetail where atmdetail.PickingListDate == atmTable.PickingListDate && atmdetail.PickingListId == atmTable.PickingListId { atmdetail.DIIB = Noyes::Yes ; atmDetail.update(); } } ttscommit; AtmSalesPickingListJournalLine_ds.executeQuery(); }
Tümünü kaldır için;
void clicked() { AtmSalesPickingListJournalTable atmtable; AtmSalesPickingListJournalLine atmDetail; ; super(); ttsbegin; while select AtmTable where atmtable.PickingListId == AtmSalesPickingListJournalTable.PickingListId { while select forupdate atmDetail where atmdetail.PickingListDate == atmTable.PickingListDate && atmdetail.PickingListId == atmTable.PickingListId { atmdetail.DIIB = Noyes::No ; atmDetail.update(); } } ttscommit; AtmSalesPickingListJournalLine_ds.executeQuery(); }
Kaydol:
Kayıtlar (Atom)
Total ciro
static void MAA_SalesTableTotal(Args _args) { SalesTable SalesTable; utcDateTime dateTime; dateTime ...
-
Dynamics Ax Microsoft’un orta ve büyük ölçekli işletmelerin ihtiyaçlarını karşılamak için tasarladığı temel iş çözümüdür. Veritabanı yöne...
-
Veri Filtreleme CTRL+F Geçerli alanı filtrelemek için kullanılır. Ekran açılır. Hangi alan üzerine tıklandı ise o alan için filtreleme k...