Dynamics AX 2012 Caching Video 1
Merhaba,
Sonunda YouTube kanalımı açtım videolarımı çekmeye başladım.
Yazdığın ön bellek makalelerini açıklamaya çalıştığım video aşağıda. Umarım daha güzel videolarla devam edebilirim.
İyi seyirler.
Archive for the ‘ AX 2012 ’ Category
Merhaba,
Sonunda YouTube kanalımı açtım videolarımı çekmeye başladım.
Yazdığın ön bellek makalelerini açıklamaya çalıştığım video aşağıda. Umarım daha güzel videolarla devam edebilirim.
İyi seyirler.
Merhaba
Çok beğendiğim bende nostanji yaşatan iki makaleyi sizinle paylaşmak istiyorum.
Technical History of Dynamics AX – From Axapta 3.0 to AX2012
Axapta’yı ilk olarak 2006 yılında Turkmedya firmasında tanıdım. Axapta 3.0 kullanılıyordu. Ben başladığımda proje canlıya geçmişti. Destek ve yeni geliştirmeler ile giriş yaptığım AX dünyasında 12 yılı devirdim. Hayatım üzerinden bu kadar etkisi olacağını tahmin edemezdim.
Selamlar.
Merhaba
Ax ta E-Fatura süreçleriyle uğraşmayan yoktur. Biz SimpleUBL adında bir eklentiyle hem XML hemde UBL oluşturuyoruz. Şöyle bir ihtiyaç oldu bazı durumlarda bir alanın verisinin değiştirilmesi gerekiyor. Örneğin matbu irsaliye numarası. Bunun için gerekli tablolarda veriyi güncelleyip sonra E-Fatura UBL ini oluşturan kodu tekrar çağırınca direk güncelliyor. Ancak bu işlem biraz yavaş çok fazla kontrol ve işlem yapıyor. Bense çok basit sadece bir alanı değiştirmek istiyorum ve çok hızlı olması gerekiyor. Bunu için str fonksiyonlarından faydalanarak bir metot yazdım. Umarım işinize yarar.
Örnek UBL in bir parçası şöyle:
<?xml version="1.0" encoding="utf-8"?> <cbc:UBLVersionID>2.1</cbc:UBLVersionID> <cbc:CustomizationID>TR1.2</cbc:CustomizationID> <cbc:ProfileID>TEMELFATURA</cbc:ProfileID> <cbc:ID>YTD20182222225</cbc:ID> <cbc:CopyIndicator>false</cbc:CopyIndicator> <cbc:UUID>E01C17F9-B13B-4Df5E-BB5A-92F52E17ff3AB0</cbc:UUID> <cbc:IssueDate>2018-09-01</cbc:IssueDate> <cbc:IssueTime>06:43:11.0000000+03:00</cbc:IssueTime> <cbc:InvoiceTypeCode>ISTISNA</cbc:InvoiceTypeCode> <cbc:Note>Yazıyla : TRY TRY</cbc:Note> <cbc:Note>TOPLAMADET: 1 / 22,00 </cbc:Note> <cbc:LineCountNumeric>1</cbc:LineCountNumeric> <cac:OrderReference> <cbc:ID>YKS022222222</cbc:ID> <cbc:IssueDate>2018-08-08</cbc:IssueDate> <cbc:IssueTime>07:25:31.0000000+03:00</cbc:IssueTime> </cac:OrderReference> <cac:DespatchDocumentReference> <cbc:ID>SVK000343433</cbc:ID> <cbc:IssueDate>2018-09-01</cbc:IssueDate> </cac:DespatchDocumentReference> <cac:Signature> <cbc:ID schemeID="VKN_TCKN">11111111</cbc:ID> <cac:SignatoryParty>
Ben ‘cbc:id SVK000343433 cbc:id’ buradaki SVK000343433 bu numarayı değiştirmek istiyorum.
Bir kaç zorluk var. Birincisi bu numaranın uzunluğu sabit değil.
İkincisi Her bir satır yeni satir karakteriyle ayrılmış durumda.
static void FD_UpdateXml(Args _args) { EInvoiceTable eInvoiceTable; str str1; str str2; str str3; int i ,j; num packingSlipId = "FD000002"; ; ttsBegin; select forUpdate eInvoiceTable where eInvoiceTable.RecId == 5637292931; str3 = strFmt("<cbc:ID>%1</cbc:ID>" , DmrPackipackingSlipIdngSlipId ); // Değiştireceğim metin i = strScan( eInvoiceTable.InvoiceXml , // İrsaliye numrasının başladığı yeri tespit ediyorum. "<cac:DespatchDocumentReference>" , 0, strLen(eInvoiceTable.InvoiceXml)); str1 = subStr( eInvoiceTable.InvoiceXml , i +31 , 50); // Karakteri sayip ilerletiyorum ve 50 karakterlik bir parçayı alıyorum //str1 böyle bir string oluyor <cbc:ID>YKS000017102</cbc:ID> <cbc:IssueDa j = strScan( str1 ,"</cbc:ID>" , 0, strLen(str1)); // Numaranın bitişini tespit ediyorum. str2 = subStr( eInvoiceTable.InvoiceXml , i +31 ,j+8); // Değiştirmek istediğim metne ulaşıyorun // str2 <cbc:ID>YKS000017102</cbc:ID> bu oldu eInvoiceTable.InvoiceXml = strReplace(eInvoiceTable.InvoiceXml ,str2 ,str3); // str2 yi str3 ile değiştiriyorum. eInvoiceTable.update(); ttsCommit; }
Selamlar.
Merhaba
İş akışında yeni bir atama oluştuğunda atanan kişinin aynı iş akışında daha önce onayı var mı diye kontrol etmek için aşağıdaki metodu kullanabilirsiniz. Bu metodu WorkflowTrackingTable’ a yazdım ama farklı bir yere de yazılabilir. İş akışı altyapısı biraz karışık standart yapıyı değiştirirken dikkatli olmakta fayda var.
Boolean dmrExistApprove() { boolean ret = false; WorkflowTrackingStatusTable workflowTrackingStatus; WorkflowTrackingStatusTable workflowTrackingStatusExist; WorkflowTrackingTable workflowTrackingTable; ; workflowTrackingStatusExist = WorkflowTrackingStatusTable::findRecId(this.WorkflowTrackingStatusTable); select firstOnly RecId, User from workflowTrackingTable exists join workflowTrackingStatus where workflowTrackingTable.WorkflowTrackingStatusTable == workflowTrackingStatus.RecId && workflowTrackingTable.TrackingType == WorkflowTrackingType::Approval && workflowTrackingTable.User == this.User && workflowTrackingTable.RecId != this.RecId && workflowTrackingStatus.ContextRecId == workflowTrackingStatusExist.ContextRecId && workflowTrackingStatus.InstanceNumber == workflowTrackingStatusExist.InstanceNumber && workflowTrackingStatus.ContextTableId == workflowTrackingStatusExist.ContextTableId && workflowTrackingStatus.TrackingStatus != WorkflowTrackingStatus::Cancelled ; if(workflowTrackingTable.recid) { ret = true; } return ret; }
Selamlar.
Merhaba
Çok sık karşılaştığım bir sorun var. CIL derlenememesi ve buna bağlı olarak SSRS, Küp ve servislerin çalışmaması. CIL sorunu çözmek için aşağıdaki adımları uygularsanız büyük oranda sorununuz çözülecektir.
CIL hatası hala devam ediyorsa Google veya tecrübesinde istifade edeceğiniz birine danışın
Selamlar.
Merhaba
Bazı durumlarda Ax komple derleme ihtiyacı oluyor. Bu durumda AOT’yi açıp tümünü derlemeye kalkarsanız çok uzun sürdüğünü görürsünüz. Bunu yerine Command Prompt’tan paralel derleme yapabilirsiniz. Sunucuya bağlı olarak 30 ile 50 dakika arasında derleme işlemi bitecektir.
Paralel derleme için öncelikle Command Prompt’u açıp aşağıdaki klasöre geçmelisiniz. Bu işlemi ASO’un kurulu olduğu sunucuda yapmalısınız. Kuruluma göre klasör değişebilir.
cd “C:\Program Files\Microsoft Dynamics AX\60\Server\DynamicsAX_Live\bin”
Daha sonra aşağıdaki kodu çalıştırmalısınız.
axbuild.exe xppcompileall /s=01 /altbin=”C:\Program Files (x86)\Microsoft Dynamics AX\60\Client\Bin” /workers=12
S=01 AOS numarasıdır sizde farklı olabilir. Server Configuration Utility’den bakabilirsiniz.
Worker=12 kaç işlemin aynı anda çalışacağını gösterir. Kendi sunucunuzdaki işlemcilere göre göre değiştirebilirsiniz.
Selamlar.
Merhaba,
Ax gerçekten bir çok ayrıntıya sahip. Özellikle nesnelerin özelliklerinde aktif olarak kullanmadığımız bir çok yenilik mevcut. AutoRefreshData özelliği de bunlardan biri.
Yaptığım bir geliştirmede ListePage formunda durum değiştiren bir sınıf yaptım. Bildiğiniz gibi ListPage formlara kod yazamıyoruz. Bu sınıf ListePage’teki satırın durum alanını değiştiriyor. Bu değişikliği yaptıktan sonra formu yenilemem gerekiyordu. Bunu yapmak için args üzerinde DateSource alıp üzerinden Refresh çalıştırmak gerekiyor ama güzel bir yöntem değil. Bunun daha kolay bir çözümü olmalı derken buton üzerindeki AutoRefreshData özelliğini gördüm. Bu özelliği true olarak ayarlağınızda aslında Table_DS.Research(True) metodunun yaptığı işi yapıyor. Bu sayede kod yazmadan griddeki veriyi güncelleniyor.
Selamlar.
Hi,
Sometimes while development process you need to get table field properties. One of my customer i need to setup a structure which i have to get all the LedgerJournalTrans table fields names and properties .
In this example i loop all the fields except some system fields and show names and some properties.
//Dmr Fatih Demirci static void Dmr_FD_GetTableField(Args _args) { SysDictTable dictTable = new SysDictTable(tableNum(LedgerJournalTrans)); SysDictField dictField; TreeNode treeNode; FieldId fieldId = dictTable.fieldNext(0); ; while (fieldId) { dictField = dictTable.fieldObject(fieldId); //Except Sql, System, visible fields if ( dictField.isSql() && !dictField.isSystem() && dictField.allowEdit() && dictField.allowEditOnCreate() && dictField.visible() && !dictField.getCountryRegionCodes( ) ) { treeNode = dictField.treeNode(); info(strFmt("%1-%2-%3-%4", dictField.id(), dictField.name() , dictField.label(), dictField.baseType() )); } fieldId = dictTable.fieldNext(fieldId); } }
Happy Daxing.
Merhaba,
Bu yazımda muhasebe boyut yapısında hesaplar için sabit boyut değerlerinin nasıl tanımlandığından bahsedeceğim. Ax2012′de muhasebe hesapları MainAccount tablosunda şirketler üstü tutuluyor. Birden çok hesap planı tanımlayabiliyorsunuz. Şirketler için bazı özel tanımlar mevcut bunları yapmak istediğinizde aşağıdaki resimde olduğu gibi istediğiniz şirketleri eklemeniz gerekiyor.
Görüntülenecek ana hesap düzeyi seçin kısmından Şirketler’i seçtiğinizde istediğiniz şirketi ekleyebileceğiniz ve daha önce eklediğiniz şirketleri görebileceğiniz kısımlar açılıyor.
Herhangi bir şirketin üzerine geldiğinizde Mali boyutlar (Default Dimension) sekmesi açılır.
Burada görüldüğü gibi mali boyutlar seçilebilir. Ayrıca her bir boyutun karşısında bu boyut değerinin Sabit mi değil mi olduğunu belirleyebildiğimiz kısım açılır. Burada yapılan tanımlamanın ne manaya geldiğini şöyle özetleyebilirim. Örneğin 112120 hesabı için USMF şirketinde GiderGrupları mali boyut her zaman G001 olmak zorundadır. Eğer muhasebeye kayıt oluşurken G001 haricinde bir değer gelirse sistem G001 ile güncelleyip muhasebe kaydını öyle oluşturur. Proje ve ürün tipi boyutlarında ise farklı bir değer bile gelse bir değişiklik yapmaz.
Şimdi bu tanımların veri yapısının nasıl olduğunu inceleyelim.
Kullanılan BaseEnum.
Bu tablo muhasebe hesaplarını şirket bazında farklılaşan verilerini tutar. Yukarıda anlatıldığı gibi şirket eklendiğinde burada kayıt oluşur.
Görüldüğü gibi bir DefaultDimension birde FixedDimension alanı mevcut. DefaultDimension bildiğimiz muhasebe boyutlarıdır. FixedDimension ise bu boyutların Sabit mi değil mi olduğunu tutan yapıdır. DefaultDimension DimensionAttributeValueSet tablosuna bağlıyken FixedDimension ise DimensionAttributeSet bağlıdır.
Sabit boyut değerlerini tutan tablodur.
Sabit boyut değerlerinin satırları tutan tablodur. EnumerationValue alanında yukarıda bahsi geçen DimensionFixed enum değeri tutulur. 1 sabit değer manasına gelmektedir.
Hangi mali boyut olduğunu tutan tablodur.
Bu yapıyı kavradıktan şöyle bir örnek yapalım. Hesap planında Gider grupları diye bir alanımız olsun. Bu alandan bir değer seçilip kaydedildiğinde o muhasebe hesabı için her bir aktif şirket ile ilişkili bir kayıt oluşturup GiderGrupları muhasebe boyutuna bu kodu yazsın ve bu değeri de sabit değer olarak işaretlesin.
Öncelikle MainAccountLegalEntity kayıtlarını oluşturacak metodu yazalım.
public static void dmrCreateMainAccountLegalEntity(MainAccount _mainAccount ) { CompanyInfo companyInfoList; Ledger ledgerList; MainAccountLegalEntity mainAccountLegalEntityList; DimensionAttrValueLedgerOverride dimensionAttrValueLedgerOverride; MainAccountLegalEntity MainAccountLegalEntity; container conDimAtr; container conValue; ; // Todo FD Boyutları parametrik yapmalıyız. conDimAtr = ["GiderGruplari","Project","ÜrünTipi"]; conValue = [1,0,0]; while select DataArea from companyInfoList join RecId from ledgerList where ledgerList.PrimaryForLegalEntity == companyInfoList.RecId && ledgerList.ChartOfAccounts == _mainAccount.LedgerChartOfAccounts notexists join RecId from mainAccountLegalEntityList where mainAccountLegalEntityList.LegalEntity == companyInfoList.RecId && mainAccountLegalEntityList.MainAccount == _mainAccount.RecId { MainAccountLegalEntity.clear(); MainAccountLegalEntity.MainAccount = _mainAccount.RecId; MainAccountLegalEntity.LegalEntity = companyInfoList.RecId; MainAccountLegalEntity.DefaultDimension = AxdDimensionUtil::DmrGetNewDefaultDimension(0 , "GiderGruplari" , _mainAccount.DmrExpsGroupId); MainAccountLegalEntity.FixedDimensions = AxdDimensionUtil::DmrFindOrCreateFixedDimension( conDimAtr, conValue); MainAccountLegalEntity.insert(); } }
DimensionAttributeSet kayıtlarını oluşturmak için sistemde bulunan DimensionAttributeSetStorage sınıfından faydalanıyoruz.
public static DimensionDefault DmrFindOrCreateFixedDimension( container _conAttr ,container _conValue) { DimensionAttributeSetStorage valueSetStorage = new DimensionAttributeSetStorage(); DimensionDefault result; int i; DimensionAttribute dimensionAttribute; boolean dimValue; ; for (i = 1; i <= conLen(_conAttr); i++) { dimensionAttribute = dimensionAttribute::findByName(conPeek(_conAttr,i)); if (dimensionAttribute.RecId == 0) { continue; } dimValue = conPeek(_conValue,i); valueSetStorage.addItem(dimensionAttribute.RecId ,dimensionAttribute.HashKey ,dimValue); } result = valueSetStorage.save(); return result; }
Her farklı kombinasyon için DimensionAttributeSet tablosunda yeni bir kayıt oluşmaktadır. Eğer aynı kombinasyon varsa o kaydı geri döndürür.
Selamlar.
Merhaba
Bu yazımda proje modulunde bulunan ücret günlüğünün kodla nasıl oluşturulacağını anlatacağım. Bu örnekte bir temp tablom var. Tablonun yapısı aşağıdaki gibi.
Bu tablonun içerisine tipi ücret olan proje kategorilerini otomatik oluşturuyorum ve kullanıcının miktar ve fiyat girmesinden sonra bu tabloyu kullanarak bir sınıf yardımıyla proje günlüğünü oluşturuyorum.
Günlüğü oluşturduğum metot;
void fdCreateProjJournal() { ProjJournalTableData JournalTableData; ProjJournalTransData journalTransData; ProjJournalTable journalTable; ProjJournalTrans journalTrans; DmrProjInvoiceTmp tmp; // Parm metotla sınıfa aktarıldı TransDate transDate; // Parm metotla sınıfı aktarıldı ProjTable projTable; // Parm metotla sınıfa aktarıldı ; ttsBegin; journalTableData = JournalTableData::newTable(journalTable); journalTransData = journalTableData.journalStatic().newJournalTransData( journalTrans,journalTableData); journalTable.clear(); journalTable.JournalId = journalTableData.nextJournalId(); journalTable.JournalType = ProjJournalType::Revenue; journalTable.JournalNameId = ProjParameters::find().RevenueJournalNameId; while select tmp where tmp.Amount != 0 { journalTableData.initFromJournalName( journalTableData.journalStatic().findJournalName(journalTable.JournalNameId)); journalTrans.clear(); journalTransData.initFromJournalTable(); journalTrans.TransDate = transDate; journalTrans.ProjTransDate = transDate; journalTrans.ProjId = projTable.ProjId; journalTrans.Qty = tmp.Qty; journalTrans.SalesPrice = tmp.Amount; journalTrans.CostPrice = 1; journalTrans.Txt = projTable.psaRetainageBillingDesc(); journalTrans.CurrencyId = ProjInvoiceTable::find( projTable.ProjInvoiceProjId).CurrencyId; journalTrans.Worker = HcmWorker::userId2Worker(curUserId()); journalTrans.CategoryId = tmp.ProjCategoryId; journalTrans.LinePropertyId = ProjCategory::find( tmp.ProjCategoryId).projLinePropertyId(); journalTrans.DefaultDimension = projTable.DefaultDimension; journalTransData.create(); } journalTable.insert(); info(strFmt("%1 nolu günlük oluşturuldu.", journalTable.JournalId)); this.projJournalPost(); ttsCommit; }
Günlüğü defetere nakletmek için yazdığım metot:
void projJournalPost( ) { ProjJournalCheckPost jourPost; jourPost = ProjJournalCheckPost::newJournalCheckPost(true,true, JournalCheckPostType::Post, tableNum(ProjJournalTable), journalTable.JournalId); jourPost.run(); }
Bu sayede günlüğü oluşturup deftere nakil işlemini de yapmış oluyoruz. Oluşan günlüğü Proje modülü altında günlükler ücret günlüğünden görebilirsiniz.
Selamlar.
Pts | Sal | Çar | Per | Cum | Cts | Paz |
---|---|---|---|---|---|---|
« Eki | ||||||
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |