What makes a good Dynamics AX Project Manager?
Source : http://www.cognitive-group.com
Merhaba
Bu bilgi görseli (infographic) veri depolama aşamalarını gösteriyor. Teknolojinin bu kadar hızla değiştiğini görmek insanı şaşırtıyor. Buluttan sonra bakalım daha neler göreceğiz.
Source : http://blog.systemsadvisers.com
Selamlar.
Merhaba
Vergi kimlik numarasının bir algoritması var. Bu algoritma sayesinde girilen numaranın geçerli olup olmadığını tespit edebilirsiniz. Bu kontrolü yapacak bir fonksiyona ihtiyacım vardı. İnternette farklı dillerde yazılmış bir çok örnek buldum ancak X++ ile yazılmış bulamadım. Global sınıfına vergiKimlikNoValidation_FD adında bir metot yazdım.
// FD : Vergi kimlik no doğrulama private boolean vergiKimlikNoValidation_FD(int64 kno) { int lastDigit; int total = 0; int i ; int j = 1000000000; int dig; int v1 , v11; ; if (strLen(int2str(kno)) != 10) return false; lastDigit = kno mod 10; for (i = 9; i >= 1; i--) { dig = (kno div j) mod 10 ; j = j / 10 ; if (dig < 0) return false; v1 = ((dig + i) mod 10); v11 = (v1 * power(2, i)) mod 9; if (v1 != 0 && v11 == 0) v11 = 9; total += v11; } if (total mod 10 == 0) total = 0; else total = (10 - (total mod 10)); if (total == lastDigit) return true; else return false; }
Selamlar.
Hi,
As you know with Dynamics AX 2012, you have to create a product first and then release to the product to companies. You can release which company do you want. In my company there is a request to release product all companies automaticly. I have some research and found good post and methods about it. I wrote a class named SECReleaseProductForAllCompanies and make it MenuItemButton as you can see below.
Let see methods of class now.
Class decleration;
// FD Relaese products for all companies class SECReleaseProductForAllCompanies { EcoResProductDisplayProductNumber productNumber; EcoResProduct ecoResProduct; }
Main method; Gets all the selected records and calls run.
public static void main(Args args) { SECReleaseProductForAllCompanies releaseProductForAllCompanies; ecoResProduct EcoResProduct; FormDataSource fdsEcoResProduct; ; fdsEcoResProduct = args.record().dataSource(); for (EcoResProduct = fdsEcoResProduct.getFirst(true) ? fdsEcoResProduct.getFirst(true) : fdsEcoResProduct.cursor(); EcoResProduct; EcoResProduct = fdsEcoResProduct.getnext()) { releaseProductForAllCompanies = new SECReleaseProductForAllCompanies(); releaseProductForAllCompanies.parmProductNumber(ecoResProduct.DisplayProductNumber); releaseProductForAllCompanies.run(); info(strfmt("%1 %2 product successfully released to all companies. ", EcoResProduct.productNumber() , EcoResProduct.productName() )); } }
Parm method;
public EcoResProductDisplayProductNumber parmProductNumber( EcoResProductDisplayProductNumber _productNumber = productNumber) { productNumber = _productNumber; return productNumber; }
Run method;
private void run() { ; this.releaseProduct(); }
Release method; You can use EcoResProductReleaseManagerBase::releaseProduct() static method instead of this.
private void releaseProduct() { InventTable inventTable; InventTableModule inventTableModule; NumberSequenceTable numberSequenceTable; ItemId itemId; InventItemSetupSupplyType inventItemSetupSupplyType; CompanyInfo companyInfo; EcoResStorageDimensionGroupProduct ecoResStorageDimensionGroupProduct; EcoResTrackingDimensionGroupProduct ecoResTrackingDimensionGroupProduct; EcoResStorageDimensionGroupItem ecoResStorageDimensionGroupItem; EcoResTrackingDimensionGroupItem ecoResTrackingDimensionGroupItem; ; select firstOnly ecoResProduct where EcoResProduct.DisplayProductNumber == productNumber; while select companyInfo where companyInfo.DataArea != "DAT" { changecompany (companyInfo.DataArea) { ttsBegin; inventTable = null; inventTableModule = null; inventItemSetupSupplyType = null; ecoResStorageDimensionGroupProduct = null; ecoResTrackingDimensionGroupProduct = null; ecoResStorageDimensionGroupItem = null; ecoResTrackingDimensionGroupItem = null; numberSequenceTable = InventParameters::numRefItemId().numberSequenceTable(); if (!numberSequenceTable.RecId || numberSequenceTable.Manual) { itemId = ecoResProduct.productNumber(); } else { itemId = NumberSeq::newGetNumFromId(numberSequenceTable.RecId).num(); } inventTable.initValue(); inventTable.initFromEcoResProduct(ecoResProduct); inventTable.ItemId = ItemId; inventTable.NameAlias = ecoResProduct.SearchName; inventTable.insert(true); inventTableModule.initValue(); inventTableModule.ItemId = inventTable.ItemId; inventTableModule.ModuleType = ModuleInventPurchSales::Invent; inventTableModule.insert(); inventTableModule.initValue(); inventTableModule.ItemId = inventTable.ItemId; inventTableModule.ModuleType = ModuleInventPurchSales::Purch; inventTableModule.insert(); inventTableModule.initValue(); inventTableModule.ItemId = inventTable.ItemId; inventTableModule.ModuleType = ModuleInventPurchSales::Sales; inventTableModule.insert(); InventItemLocation::createDefault(inventTable.ItemId); inventItemSetupSupplyType.initValue(); inventItemSetupSupplyType.ItemId = inventTable.ItemId; inventItemSetupSupplyType.ItemDataAreaId = inventTable.DataAreaId; inventItemSetupSupplyType.insert(); ecoResStorageDimensionGroupProduct = EcoResStorageDimensionGroupProduct::findByProduct(ecoResProduct.RecId); ecoResTrackingDimensionGroupProduct = EcoResTrackingDimensionGroupProduct::findByProduct(ecoResProduct.RecId); if (ecoResStorageDimensionGroupProduct.RecId) { ecoResStorageDimensionGroupItem.ItemDataAreaId = inventTable.DataAreaId; ecoResStorageDimensionGroupItem.ItemId = inventTable.ItemId; ecoResStorageDimensionGroupItem.StorageDimensionGroup = ecoResStorageDimensionGroupProduct.StorageDimensionGroup; ecoResStorageDimensionGroupItem.insert(); } if (ecoResTrackingDimensionGroupProduct.RecId) { ecoResTrackingDimensionGroupItem.ItemDataAreaId = inventTable.DataAreaId; ecoResTrackingDimensionGroupItem.ItemId = inventTable.ItemId; ecoResTrackingDimensionGroupItem.TrackingDimensionGroup = ecoResTrackingDimensionGroupProduct.TrackingDimensionGroup; ecoResTrackingDimensionGroupItem.insert(); } ttsCommit; } } }
You can download class from here.
Thanks Sreenath Reddy G. for methods.
Until next time.
Merhaba
Ax 2012 ile finansal boyut yapısının tamamen değiştiğini daha önce ifade etmiştim. Bu değişiklik bize bazı durumlarda fazladan yazılım yükü oluşturuyor. Bunlardan biride bir boyuttaki belli bir boyutun değerini kod ile değiştirmek. Şöyle örnekleyeyim.
Bir müşteriniz var ve departman boyutunda 0026 yazıyor. Siz bunu 0030 ile değiştirmek istiyorsunuz.
Ax 2009 ‘da
custTable.Dimension[2] = “0030″; gibi basit bir kod ile bunu yapabilirdiniz.
Ax 2012 ‘de ise şöyle bir metoda ihtiyacınız var;
static void FD_ChangeDimValue(Args _args) { CustTable custTable; DimensionAttributeValueSetStorage dimensionStorage; DimensionAttribute deparmentDimensionAttribute; DimensionAttributeValue newDepartmentValue; ; ttsBegin; // Müşteri seçiliyor custTable = CustTable::findRecId(22565423201,true); // Değiştirelecek boyut seçiliyor deparmentDimensionAttribute = DimensionAttribute::findByName("Department"); // Değiştirilecek boyut için değer seçiliyor. newDepartmentValue = DimensionAttributeValue::findByDimensionAttributeAndValue(deparmentDimensionAttribute, "0030"); dimensionStorage = DimensionAttributeValueSetStorage::find(CustTable.DefaultDimension); dimensionStorage.addItem(newDepartmentValue); CustTable.DefaultDimension = dimensionStorage.save(); CustTable.update(); ttscommit; }
Selamlar.
Merhaba arkadaşlar,
Birlikte çalışmak üzere bir yazılım uzmanı arayışımız var. Bütün sorularınız için benimle irtibata geçebilirsiniz. İlan şöyle:
Firma bünyesindeki bulunan tüm sistemler ve müşteri istekleri için yazılımlar geliştirmek,
Varolan yada geliştirilecek olan yazılımların desteğini vermek,
Firma bünyesinde kullanılan Dyanmics Ax ERP sistemine destek vermek,
Proje takımlarında yer alarak, tanımlanan rol ve sorumluluklara uygun çalışmak.
Selamlar.
Merhaba
Yeni projemde yapmakta olduğum bir entegrasyon işi için farklı bir sql server’a bağlanıp veri almam gerekiyordu. Yaptığım çalışmayı sizlerle paylaşıyorum.
İlk iş bir ODBC bağlantısı kurmak. Bağlantıyı ister AOS’a isterseniz Client makineye kurabilirsiniz. Ancak AOS’ta olması daha mantıklı. Administrative Tools / Data Sources (ODBC) ‘a tıklayarak bağlanmak istediğiniz Sql için Data Source Name (DSN) oluşturmalısınız. Oluşturduğumuz DSN’i kodda kullanacağız.
static public void fd_ConnectSQLthrougODBC(Args _args) { LoginProperty loginProperty; OdbcConnection odbcConnection; Statement statement; ResultSet resultSet; str sql; SqlStatementExecutePermission perm; FDTransferCardTable transferCardTable; ; loginProperty = new LoginProperty(); loginProperty.setDSN("CASC"); //Tanımladığımız DSN loginProperty.setDatabase("SWHSystem"); odbcConnection = new OdbcConnection(loginProperty); if (odbcConnection) { sql = "SELECT * FROM Personnel "; perm = new SqlStatementExecutePermission(sql); perm.assert(); statement = odbcConnection.createStatement(); resultSet = statement.executeQuery(sql); while (resultSet.next()) { transferCardTable.clear(); transferCardTable.ObjectID = resultSet.getString(1); transferCardTable.Name = resultSet.getString(2); transferCardTable.Protected = str2num(resultSet.getString(6)); transferCardTable.PartitionID = resultSet.getString(7); transferCardTable.LastName = resultSet.getString(10); transferCardTable.FirstName = resultSet.getString(11); transferCardTable.MiddleName = resultSet.getString(12); transferCardTable.PersonnelTypeID = resultSet.getString(13); transferCardTable.Template = resultSet.getString(14); transferCardTable.Temporary = str2num(resultSet.getString(15)); transferCardTable.Disabled = str2num(resultSet.getString(22)); transferCardTable.Text1 = resultSet.getString(27); transferCardTable.Text12 = resultSet.getString(38); transferCardTable.insert(); } resultSet.close(); statement.close(); } else { error("ODBC ile veritabanına bağlantı kurulamadı."); } }
Selamlar.
Merhaba
Bu yazımda AIF servis sınıfları kullanarak bir satınalma siparişi oluşturacağım. Örneği inceleyelim.
static void FD_CreatePurchaseOrder(Args _args) { PurchTable purchTable; PurchLine purchLine; AxPurchTable axPurchTable; AxPurchLine axPurchLine; // Kullanacağımız sınıflar InventDim inventDim; ; purchTable.initFromVendTable(VendTable::find("2002")); axPurchTable = AxPurchTable::newPurchTable(purchTable); axPurchTable.parmPurchaseType(PurchaseType::Purch); axPurchTable.parmDocumentStatus(DocumentStatus::PurchaseOrder); axPurchTable.parmPurchName("Deneme siparişi"); axPurchTable.parmAccountingDate(08\06\2013); axPurchTable.parmDeliveryDate(08\06\2013); axPurchTable.parmItemBuyerGroupId("20"); axPurchTable.parmPurchPoolId("02"); axPurchTable.parmInventSiteId("2"); axPurchTable.parmPurchStatus(PurchStatus::Backorder); axPurchTable.doSave(); // İstediğimiz bilgileri doldurup kaydediyoruz. PurchTable'ı kendisi oluşturuyor. purchTable = axPurchTable.purchTable(); purchLine.initFromPurchTable(purchTable); inventDim.clear(); inventDim.InventLocationId = "11"; inventDim.InventSiteId = "1"; inventDim = inventDim::findOrCreate(inventDim); axPurchLine = AxPurchLine::newPurchLine(purchLine); axpurchLine.parmItemId("0004"); axPurchLine.parmPurchQty(2); axPurchLine.parmPurchPrice(10); axPurchLine.parmInventDimId(inventDim.inventDimId); axPurchLine.doSave(); // PurchLine oluşturuluyor. info(strfmt("%1 nolu sipariş oluşturuldu.",purchTable.PurchId )); }
Birden çok PurchLine satırını bu yöntemle oluşturamadım. Nasıl yapıldığını bilen varsa bana da bilgi versin, memnun olurum. Biraz araştırdım, yapılıp yapılamadığına dair bir bilgi bulamadım ama gördüğüm bütün örnekler tek satır üzerine yapılmıştı. Tek satır yapabilmek çok kullanışlı değil mutlaka bir yolu olmalı, eğer bir yolu yoksa bu sınıflar eksik olmuş demektir.
Selamlar.
Merhaba
Yeni firmam da QlikView kullanılmakta. Bende yavaş yavaş kullanmaya başladım. Çok güçlü ve esnek bir raporlama aracı. Kullanan herkesten olumlu yorumlar duydum. Henüz ax’a bağlanıp rapor yapmadım. Ancak bir çok raporu qlikView’de yapacağız gibi görünüyor. Yeri geldikçe ax’ta yaptığım raporları paylaşacağım.
Bu yazımda QlikView’de nasıl döngü kurulur bir örnekle anlatmaya çalışacağım. Bir log yapısı düşünün. Her gün için bir dosya oluşturuyor. Bir liste sayfasında da bu dosyaları isimlerine ve tarihlerine göre listeliyor.
Liste dosyasının adresi şöyle “http://192.168.100.111/correlated/”. Dosyaların adresi ise bu listedeki Name alanının bu adrese eklenmesi ile oluşuyor. “http://192.168.100.111/correlated/5651_correlated_2012-09-21″. Resimde olduğu gibi.
Yapmak istediğim şey tek tek değilde listeyi dolanıp bütün alt dosyalardaki veriyi tek bir seferde çekebilmek. Bunun için şöyle bir kod yazdım.
//======================= FD ======================// SET ThousandSep='.'; SET DecimalSep=','; SET MoneyThousandSep='.'; SET MoneyDecimalSep=','; SET MoneyFormat='#.##0,00 TL;-#.##0,00 TL'; SET TimeFormat='hh:mm:ss'; SET DateFormat='DD.MM.YYYY'; SET TimestampFormat='DD.MM.YYYY hh:mm:ss[.fff]'; SET MonthNames='Oca;Şub;Mar;Nis;May;Haz;Tem;Ağu;Eyl;Eki;Kas;Ara'; SET DayNames='Pzt;Sal;Çar;Per;Cum;Cmt;Paz'; // ================================================// Sub LoadTableNames SQLTableList: LOAD F1, Name, [Last modified], Size, Description FROM [http://192.168.100.111/correlated/] (html, codepage is 1254, embedded labels, table is @1); End Sub; // ===============================================// Call LoadTableNames; // ===============================================// Let vTableCount = NoOfRows('SQLTableList'); // ===============================================// Sub LoadTableData For i = 2 To $(vTableCount)-1 LET vMyTableName = Peek('Name', $(i), ‘SQLTableList’); a: LOAD @1, @2, @3, @4, @5, @6, @7, @8, @9, @10 FROM [http://192.168.100.111/correlated/$(vMyTableName)] (txt, codepage is 1254, no labels, delimiter is ' ', msq); Next i End Sub; // ==============================================// Call LoadTableData; // ==============================================//
Selamlar.
Merhaba
Ax 2012 ile ilk karşılaştığımda eski versiyonlara göre yavaş olduğunu düşünmüştüm. Gerçekten de öyle, bir çok karşılaştırma örnekleriyle ispatlanmış. Ancak karşılaştırma yapmak çok doğru olmayabilir. Çünkü Ax 2012 tamamen farklı bir yapı. Arka planından tutun form yapısına, veri yapısına kadar bir çok değişiklik var. Bu yüzden karşılaştırma da doğru bir sonuç elde edemeyebiliriz.
İnternette performans ile ilgili bir çok kaynak mevcut. Özellikle Dynamics Ax Performance Team Blog‘u mutlaka takip etmek lazım.
Gelelim yazının konusuna Fact box ve Preview pane‘lerin formlarda bir yavaşlığa sebep olduğu aşikar. Bu yüzden bunları kapatabileceğiniz bir kurulum sayfası yapılmış ancak canlı sistem için kapatmanız tavsiye edilmiyor. Burayı performans sorunlarının tespiti için kullanmalısınız.
System administation / Setup/ Client performance options menüsünden açtığınız formda açma kapatma zaman ayarı yapma gibi işlemleri yapabilirsiniz.
Selamlar.