if (InventTable::find(salesLine.ItemId).ItemType != ItemType::Service ) { if(!salesLine.InventTransIdReturn) return checkfailed("İade lot kodunu doldurunuz!"); }
8 Aralık 2017 Cuma
ilişkili tablolardan bilgi alma
Örnek;
İade sipariş aynrınlarında, İnventTable'dan kontrolünü yapacağımız madde tipi HİZMET olmayanlar için bir kontrol eklemek istiyoruz.
DataSource'da bulunan SalesLine'ın methods'unda validateWrite'ına aşağıdaki şekilde kod yazarak İnventTable'ı elimize alıp istediğimiz gibi bilgiyi alabiliriz.
ilişkili tablolardan bilgi alma 2
Örnek üzerinden gidecek olursak;
Bir formunuz var ve formda kayıt girerken CustTable'daki bir alanın durumuyla ilgili bilgi vermek istiyorsunuz,
Bunun için bilgi vermek istediğiniz formun Data Sources'ında buluan ilgili alanın(CustAccount) validete'ına aşağıdaki gibi bir kontrol eklerseniz CustTable'daki bütün alanlar için bilgiyi forma çekebilirsiniz.
public boolean validate() // maakbulut 18.10.2017 { boolean ret; CustTable custTable; ETGTradePaymentJour TradePaymentJour; ret = super(); while select CustTable if (ETGTradePaymentJour.CustAccount == CustTable.AccountNum && CustTable.DRT_CzechSignature == DRT_CzechSignature::JointSignature) { info("Cari Müşterek İmzalı!"); } while select CustTable if (ETGTradePaymentJour.CustAccount == CustTable.AccountNum && CustTable.DRTCzechCondition == DRTCzechCondition::Zavala) { info("Cari Avalim!"); } return ret; }
9 Kasım 2017 Perşembe
Sayfanın Sığmaması
Çıktı almaya çalışırken aşağıdaki gibi bir çıktı sorunuyla karşılaşırsanız;
2 Kasım 2017 Perşembe
Kullanıcı verilerini aktarma
SYSPERSONALIZATION sık kullanılanların saklandığı tablo
SYSLASTVALUE kullanıcının özelleştirmelerinin saklandığı tablo (ax rapor filtreleri vs.)
SYSLASTVALUE kullanıcının özelleştirmelerinin saklandığı tablo (ax rapor filtreleri vs.)
UPDATE [dbo].[SYSLASTVALUE] SET [USERID] = 'yeniuserid' WHERE [USERID] = 'eskiuserid' GO UPDATE [dbo].[SYSPERSONALIZATION] SET [USERID] = 'yeniuserid' WHERE [USERID] = 'eskiuserid' GOKaynak : https://daxapta.wordpress.com/2017/11/02/kullanici-verilerini-aktarma/
26 Ekim 2017 Perşembe
Range verme | Daynamics Ax
Farklı tiplere range verme örneklerini aşağıdaki koddan görebilirsiniz.
Formun datasource'una ekliyorsunuz.
Formun datasource'una ekliyorsunuz.
this.query().dataSourceTable(tablenum(PurchLineTotals)).addSortField(fieldnum(PurchLineTotals, PurchId), SortOrder::Descending); // Büyükten küçüğe sıralama yapar. this.query().dataSourceTable(tablenum(PurchLineTotals)).addRange(fieldnum(PurchLineTotals, Dimension3)).value("IHR*"); // IHR ile başlayan kayıtları getirir.this.query().dataSourceTable(tablenum(ExImpExpense_View)).addRange(fieldnum(ExImpExpense_View, MarkupCode)).value(queryvalue("D-Navlun")); // MarkupCode'u D-Navlun olanları getir
this.query().dataSourceTable(tablenum(ETGChequeHistoryByDates)).addRange(fieldnum(ETGChequeHistoryByDates, LastTransACType)).value(enum2str(LedgerJournalACType::Cust));// Enum tipi için range
25 Ekim 2017 Çarşamba
Formdaki alanın genişliği
Ax'ta aşağıdaki gibi formun içinde bir alandaki veri hücreye sığmıyorsa;
Formda sağ tık > kurulum'dan Genişlik(lkarakter olarak) alanını kendinize göre ayarlayabilirsiniz.
Faturalanan Satış Siparişinde Değişiklik İstenirse Bakılacak Tablolar
Dynamics Ax'ta faturalanan sipariş ekstrem durumlarda değiştirilmesi istenir.
Genellikle sıkıntılı durumlardır. Böyle bir talep gelirse güncellenecek tablolar:
- CustInvoiceJour
- CustInvoiceTrans
- CustTrans
- LedgerTrans
- TaxTrans
Satınalma için;
Faturalanan Satınalma Siparişinde Değişiklik İstenirse Bakılacak Tablolar
Dynamics Ax'ta faturalanan sipariş ekstrem durumlarda değiştirilmesi istenir.
Genellikle sıkıntılı durumlardır. Böyle bir talep gelirse güncellenecek tablolar:
- VendInvoiceJour
- VendInvoiceTrans
- VendTrans
- LedgerTrans
- TaxTrans
Satış siparişi için;
23 Ekim 2017 Pazartesi
Farklı tabloyla ilişki kurma
if(inventTable::find(CustPackingSlipTrans.ItemId).WayControl == NoYes::Yes) { info("Var"); }
19 Ekim 2017 Perşembe
Dynamics Ax iş akışındaki saat sorunu
İş akışındaki saat sorunu
Ax'ta iş akışlarında saat sistemin saatiyle uyuşmuyorsa, güncellemeniz gereken alanlardan birisi,
İş akışı konfigürasyonlarında bulunan saat dilimi olacaktır. Burayı GMT+03:00 şeklinde güncellerseniz problem kalkacaktır.
Kullanıcıların saat dilimlerini toplu şekilde güncellemek için;
10 Ekim 2017 Salı
Ax'ta Tablodaki verileri diğer tabloya ekleme
Örneğin; DRT_SuggestionTable tablosunda istediğiniz alanların verilerini DRT_FarmerSuggestionTable tablosuna aktarmak istediğinizde aşağıdaki kod işinize yarayacaktır.
static void MAA_FarmerSuggestionTable(Args _args) { DRT_FarmerSuggestionTable FarmerSuggestionTable; DRT_SuggestionTable SuggestionTable; ttsBegin; while select forUpdate SuggestionTable if(SuggestionTable.RecId) { FarmerSuggestionTable.FarmerID = SuggestionTable.FarmerID; FarmerSuggestionTable.VisitId = SuggestionTable.VisitId; FarmerSuggestionTable.Quantity = SuggestionTable.Quantity; FarmerSuggestionTable.CustAccount = SuggestionTable.CustAccount; FarmerSuggestionTable.CustName = SuggestionTable.CustName; FarmerSuggestionTable.ItemId = SuggestionTable.ItemId; FarmerSuggestionTable.insert(); } info("bitti"); ttsCommit; }
5 Ekim 2017 Perşembe
Formun çalışması
Formun direk açılmasını önlemek için aşağıdaki methodu kullanabilirsiniz.
Formun methodunda initini ezerek çalıştırabilirsiniz.
Formun methodunda initini ezerek çalıştırabilirsiniz.
public void init() { if (!element.args().caller()) { throw error("@SYS22996"); } super(); if (element.args() && element.args().record()) { DRT_LegalEntity = element.args().record(); } }
22 Ağustos 2017 Salı
Tarih metodları (Date methods)
static void date_Functions(Args _args) { Transdate d; ; d = today(); info(strfmt("Date – %1",d)); //Gets the month for the given date… info(strfmt("Month – %1",mthofYr(d))); //Gets the month name from the given date… info(strfmt("Month Name – %1",mthname(mthofYr(d)))); //Gets the day for the given date… info(strfmt("Day – %1",dayOfMth(d))); //Gets the day name from the given date… info(strfmt("Day Name – %1",dayname(dayOfMth(d)))); //Gets the year for the given date… info(strfmt("Year – %1",year(d))); //Gets the current weekday number from the date… info(strfmt("Weekday number – %1",dayOfwk(d))); //Gets the day of the year from the given date… info(strfmt("Day of year – %1",dayOfyr(d))); //Gets the week of the year from the given date… info(strfmt("Week of the year – %1",wkofyr(d))); //Gets the start of the month from the given date… info(strfmt("Start of the month – %1", DateStartMth(d))); //Gets the end of the month from the given date… info(strfmt("Enf of the month – %1", endMth(dateMthFwd(d, 0)))); //Gets the previous month from the given date… info(strfmt("The previous month – %1",prevMth(d))); info(strfmt("The previous month – %1",maxDate())); info(strfmt("current system time %1", DateTimeUtil::utcNow())); info(strfmt("current system time %1", DateTimeUtil::applyTimeZoneOffset(DateTimeUtil::utcNow(), DateTimeUtil::getUserPreferredTimeZone()))); }
17 Ağustos 2017 Perşembe
Display Bir Alanda Form İçinde Arama Yapma
Bir formun içerisinde display olan bir alanda arama yapılması isteniyorsa;
Forma arama ve sıfırlama yapmak için iki buton ve arama alanı için bir adet string tipinde alan ekleyip butonların click'ına aşağıdaki kodları ekleyerek çözebilirsiniz.
Forma eklediğimiz alanlar aşağıdaki gibi görünecek. Burada madde adını aratarak filtre koymak istiyoruz.
Eklemiş olduğum OK butonunun Click methoduna şu kodu yazıyoruz;
void clicked() { TRSShipmentReport ShipmentReport; InventTable inventTable; Query q; QueryBuildDataSource qbdShipmentReport; ; super(); if(name.valueStr()) { q = TRSShipmentReport_ds.query(); qbdShipmentReport = q.dataSourceTable(tablenum(TRSShipmentReport)); qbdShipmentReport.clearRanges(); while select inventTable where inventTable.ItemName like "*" + name.valueStr() + "*" { qbdShipmentReport.addRange(FieldNum(TRSShipmentReport, ItemId)).value(SySQuery::value(InventTable.ItemId)); } TRSShipmentReport_DS.query(Q); TRSShipmentReport_DS.executeQuery(); } } Filtreyi sıfırlamak için de Cancel butonunun Click methoduna aşağıdaki kodu yazıyoruz;void clicked() { Query q; QueryBuildDataSource qbdTRSShipmentReport; ; super(); q = TRSShipmentReport_ds.query(); qbdTRSShipmentReport = q.dataSourceTable(tablenum(TRSShipmentReport)); qbdTRSShipmentReport.clearRanges(); TRSShipmentReport_ds.query(Q); TRSShipmentReport_ds.executeQuery(); name.text(""); }
11 Ağustos 2017 Cuma
Bizi Unutmayın! | Web
Web sitelerini dolaşırken title'lların farklı sekmeye geçip değiştiğini görünce ilgimi çekti.
Ax'la ilgili değil ama web'le de uğraşanlar için paylaşıyorum.
Bulunduğunuz sekmeden farklı bir sekmedeyken web sitenizin title'ının "Bizi Unutmayın!"
şeklinde değişmesini istiyorsanız, ASP.net ile yaptıyanız web sitenizin master page'ine eklemeniz yeterli olacak.
Ax'la ilgili değil ama web'le de uğraşanlar için paylaşıyorum.
Bulunduğunuz sekmeden farklı bir sekmedeyken web sitenizin title'ının "Bizi Unutmayın!"
şeklinde değişmesini istiyorsanız, ASP.net ile yaptıyanız web sitenizin master page'ine eklemeniz yeterli olacak.
script> var newtitle = ‘ Bizi Unutmayın!’; var oldtitle = document.title; window.onblur = function () { document.title =newtitle; } window.onfocus = function () { document.title = oldtitle; } /script>
10 Ağustos 2017 Perşembe
Lookup'a Range Verme
Lookup'ta istenilen kayıtların süzülmesi için Range verebilirsiniz.
Aşağıdaki kod size bu konuda yardımcı olabilir.
Aşağıdaki kod size bu konuda yardımcı olabilir.
void clicked() { TRSShipmentReport ShipmentReport; InventTable inventTable; Query q; QueryBuildDataSource qbdShipmentReport; ; super(); if(name.valueStr()) { q = TRSShipmentReport_ds.query(); qbdShipmentReport = q.dataSourceTable(tablenum(TRSShipmentReport)); qbdShipmentReport.clearRanges(); while select inventTable where inventTable.ItemName like "*" + name.valueStr() + "*" { qbdShipmentReport.addRange(FieldNum(TRSShipmentReport, ItemId)).value(SySQuery::value(InventTable.ItemId)); } TRSShipmentReport_DS.query(Q); TRSShipmentReport_DS.executeQuery(); } }
9 Ağustos 2017 Çarşamba
Kayıt düzeyi güvenliğini ezme (yok sayma)
Bir formda kayıt düzeyi güvenliğinin çalışmasını istemiyorsanız,
Bu kod size yardımcı olur.
query.recordLevelSecurity(false);
https://daxapta.wordpress.com/2015/12/14/kayit-duzeyi-ve-musteri-limiti/
Bu kod size yardımcı olur.
query.recordLevelSecurity(false);
https://daxapta.wordpress.com/2015/12/14/kayit-duzeyi-ve-musteri-limiti/
7 Ağustos 2017 Pazartesi
Grid'deki dizaynı düzenleme
Bir rapor yaptınız. Alanlardan bir tanesinin metin uzunluğu fazla olduğu için,
aşağıdaki gibi bir ekran karşınıza gelecektir.
aşağıdaki gibi bir ekran karşınıza gelecektir.
Sizden hücrelerin bu şekilde büyük olmaması istenirse;
Grid'deki ilgili alanın özelliklerinden, Displayheight = 1 yaparsak normale dönecektir.
Kullanıcı Kimliği güncelleme / Created by Update
Dynamics ax 2009 change created By
Dynamics Ax'ta kullanıcı içe aktarırken, kullanıcı kimliğini otomatik atar. Burdan siz isterseniz değiştirebilirsiniz. İçe aktarırken değiştirmediniz, ileride de bu adın değiştirilmesi istenirse;
Dynamics Ax'ta kullanıcı içe aktarırken, kullanıcı kimliğini otomatik atar. Burdan siz isterseniz değiştirebilirsiniz. İçe aktarırken değiştirmediniz, ileride de bu adın değiştirilmesi istenirse;
Kullanıcılardan gidip değiştirmek istediğim kullanıcıyı Yeniden adlandır yapıp eski kayıtları da AX'ın veri tabanından güncelleyince istenilen kullanıcı kimliği güncelleniyor.
Unutmamanız gereken şey önceki kayıtlarla tutarlı olması için, kullanıcının kayıt girdiği bütün tablolardaki created by alanını da güncellemeniz gerekiyor (Satınalma, satış, talep vs.). (SQL tarafında bunu yapabilirsiniz.)
Nette araştırdığımda SQL tarafına girmeden, aşağıdaki bir kod yardımıyla(Satınalma, satış, talep vs.) ilgili tablolardaki Created by güncellenebilir diyor ama;
static void MAA_CreatedBy(Args _args) { PurchTable PurchTable; while select forUpdate PurchTable where PurchTable.createdBy == "maakb4545" if(PurchTable.RecId) { ttsBegin; New OverwriteSystemfieldsPermission().assert(); PurchTable.overwriteSystemfields(true); PurchTable.(fieldNum(PurchTable, CreatedBy)) = "makbl"; PurchTable.doUpdate(); ttsCommit; } CodeAccessPErmission::revertAssert(); info("bitti"); }Bu kod çalıştığında; aşağıdaki hatayı veriyor.
Bazı blog sitelerde kodu AOS'ta çalıştırın diye tavsiye edilmiş. Fakat burada da aynı hatayı aldım.
Bu yöntemler çözüm olmayınca ancak SQL tarafından çözüm bulabildim.
SQL tarafına yazdığım kod aşağıdaki gibi.
UPDATE PURCHTABLE SET CREATEDBY='makbl' where CREATEDBY='maakb'
Bu kod PurchTable'ı günceller. Siz diğer tabloları(SalesTable, SalesLine, PurchLine vs.) güncellerken tablo adını değiştirip çalıştırabilirsiniz.
21 Temmuz 2017 Cuma
Dynamic Ax | Şartlarını belirlediğiniz satırların rengini değiştirme
Şart yazarak, daha kolay ayırt edebilmemiz için grid'teki satırların renklerini düzenleyebilirsiniz.
Benim yaptığım örnekte iki tarihi kıyaslayıp, biri diğerinden büyük olan satırları kırmızı renkte göster dedim.
Bunun için; renklendirmek istediğimiz formun Data Sources kısmından ilgili tablomuzun Methods'unda displayOption method'unu ezerek yapabiliyoruz.
Bu alana şu kodu ekleyeceğiz:
public void displayOption(Common _common, FormRowDisplayOption _options) { PurchLine purchLineLocal; int backColor = WinAPI::RGB2int(255, 50, 50); int textColor = WinAPI::RGB2int(255, 255, 255); ; purchLineLocal = _common; if(EtgExImpPurchLineTrans::findLastETA(purchLineLocal.InventTransId) > purchLineLocal.DeliveryDate) // buradaki şart sağlandığında o satırlar kırmızı renkte görünecek. { _options.backColor(backColor); _options.textColor(textColor); } else { _options.clearBackColor(); _options.clearTextColor(); } super(_common,_options); }Form aşağıdaki gibi görünür.
15 Haziran 2017 Perşembe
Job ile alan adını bulma
Aşağıdaki job'ı çalıştırdığınızda,
static void MAA_FieldName(Args _args) { SysDictField dict; str label; ; dict = new SysDictField(tablenum(SalesTable), fieldNum(SalesTable, InvoiceAccount)); label = dict.label(); info(strfmt("%1", label)); }
22 Mayıs 2017 Pazartesi
Form Açıldığında Talep Edilen Alanların İstenilen Şekilde Gelmesi
Sizden form açıldığında bazı alanların formda seçili gelmesi istenilirse;
Örneğin aşağıdaki formda Sebep kodunda birçok seçenek var fakat bu alanın DBTS-01 seçeneği form açıldığında gelsin istenildi.(Sebep kodu'nun seçilmesini ilgili yetkisini de kapatırsanız kişinin diğer seçenekleri seçemeyip, formda gelen seçenekle devam eder)
Bunu yapmak için Formun methods kısmında init'ine aşağıdaki kodu ekliyoruz.
Bu şekilde bir sorunla karşılaşırsanız tarih alanını boşaltmanız gerekiyor. Bunun için yine formun init'ine
Örneğin aşağıdaki formda Sebep kodunda birçok seçenek var fakat bu alanın DBTS-01 seçeneği form açıldığında gelsin istenildi.(Sebep kodu'nun seçilmesini ilgili yetkisini de kapatırsanız kişinin diğer seçenekleri seçemeyip, formda gelen seçenekle devam eder)
Bunu yapmak için Formun methods kısmında init'ine aşağıdaki kodu ekliyoruz.
public void init() { super(); SalesLine.ETGReasonCode = "DBTS-01"; }Talep edilen sevk tarihini forma eklediğimde benim karşılaştığım sorun; sabit bir tarih geliyor(31.015.2015) gibi, bu alana yeni tarih girileceği için boş gelmesi gerekiyor.
Bu şekilde bir sorunla karşılaşırsanız tarih alanını boşaltmanız gerekiyor. Bunun için yine formun init'ine
public void init() { super(); SalesLine.ETGReasonCode = "DBTS-01"; SalesLine.ShippingDateRequested = datenull(); // init'e yeni eklediğimiz kısım }
18 Mayıs 2017 Perşembe
Dynamics Ax Dialog ile Formda Güncelleme Yapma (2)
Bir önceki örnekte formun DataSource'u View ise Dialog ile güncellemenin nasıl yapılacağını incelemiştik.
Bu örneğimizde de güncellenecek formun DataSource'u Table olduğunda arasındaki küçük farktan bahsedelim.
Formun Design bölünden buton ekliyoruz ve click methoduna aşağıdaki kodu yazıyoruz;
void clicked() { super(); element.updateGCBNo(); }
Alttaki kodu da formun methods bölümüne yazıyoruz.
void updateGCBNo() { Dialog d = new Dialog(strfmt("%1 için GCB No düzenle", ATMDisTicHead.ATMDisTicID)); // üzerinde bulunan ihracat ref noyu formun başlığında gösterir DialogField dlgETGGCBNo; DialogGroup dlgGroup; ATMDisTicHead DisTicHead; ; dlgGroup = d.addGroup("Düzenle"); dlgGroup.widthMode(FormWidth::ColumnWidth); dlgETGGCBNo = d.addField(typeid(ETGGCBNo), DisTicHead.ETGGCBNo, "GCB No"); dlgETGGCBNo.value(AtmDisTicHead.ETGGCBNo); d.run(); { if (d.closedOk()) { { ttsbegin; if ( AtmDisTicHead ) { AtmDisTicHead.selectForUpdate(true); AtmDisTicHead.ETGGCBNo = dlgETGGCBNo.value(); AtmDisTicHead.doUpdate(); } ttscommit; ATMDisTicHead_ds.research(true); } } } }
12 Mayıs 2017 Cuma
Dynamics Ax Dialog ile Formda Güncelleme Yapma
Dynamics Ax Dialog
Dialog ekranı üzerindeki alanların(DialogField) nasıl ezilebilebileceğini bir örnekle inceleyelim.
İstenilen alanın DataSource'u View ise;
View'in DataSource'undan ilgili Table'ın RecId'sini Fields'lerin içine atıyoruz.
RecId1 olarak gelir ben adını TransRecId olarak değiştirdim.
Sonra Dialog ekleyeceğim forma geliyoruz, bir buton ekleyip clicked metoduna;
void clicked() { super(); element.updateBankNegInstRecipient(); }
updateBankNegInstRecipient metodunu da Formun Methods kısmına yazıyoruz.
void updateBankNegInstRecipient() { Dialog d = new Dialog("Faiz Oranı & Vade Tarihi düzenle"); DialogField dlgBankNegInstRecipientName; DialogField dlgDueDate; DialogGroup dlgGroup; LedgerJournalTrans ledgerJournalTrans; ; dlgGroup = d.addGroup("Düzenle"); dlgGroup.widthMode(FormWidth::ColumnWidth); dlgBankNegInstRecipientName = d.addField(typeid(BankNegInstRecipientName), "Faiz Oranı"); dlgBankNegInstRecipientName.value(DRTLedgerJournalTrans.BankNegInstRecipientName); dlgDueDate = d.addField(typeid(DueDate), "Vade Tarihi"); dlgDueDate.value(DRTLedgerJournalTrans.Due); d.run(); { if (d.closedOk()) { { ttsbegin; ledgerJournalTrans=ledgerJournalTrans::findRecId(DRTLedgerJournalTrans.TransRecId, true); if ( ledgerJournalTrans ) { ledgerJournalTrans.BankNegInstRecipientName = dlgBankNegInstRecipientName.value(); ledgerJournalTrans.Due = dlgDueDate.value(); ledgerJournalTrans.doUpdate(); } ttscommit; DRTLedgerJournalTrans_ds.research(true); } } } }
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...