Archive for the ‘ Dynamics AX ’ Category

Proje teklif satırından otomatik WBS kaydı oluşturmak (AX 2012)

Merhaba

Ax 2012′de proje tekliflerini girerken teklif satırından otomatik WBS satırlarının oluşturulması için yazdığım metodu sizinle paylaşıyorum.

Bu metot sayesinden wbs ve teklif arasından etkileşimi sağlamış oluyoruz.

void addItemToWBS()
{
    PSAActivityEstimates    estimates;
    Hierarchy               hierarchy;
    HierarchyIdBase         hierarchyId;
    HierarchyTreeTable      hierarchyTreeTable;
    ;
    hierarchyId = HierarchyLinkTable::findRefTableRecId(tablenum(SalesQuotationTable),
                SalesQuotationTable.RecId).HierarchyId;
    hierarchyTreeTable   = HierarchyTreeTable::findbyNameonHierarchy(hierarchyId ,
           "FD_AnaKategori"); // Hangi kategoriye bağlanacak
    smmActivities      = smmActivities::find(hierarchyTreeTable.activityNumber());

    estimates.clear();
    estimates.ActivityNumber     = smmActivities.ActivityNumber;
    estimates.initFromInventTable(InventTable);
    estimates.InventDimId        = SalesQuotationLine.inventDimId;
    estimates.ItemId             = SalesQuotationLine.ItemId;
    estimates.ProjCategoryId     = SalesQuotationLine.ProjCategoryId;
    estimates.Quantity           = SalesQuotationLine.SalesQty;
    estimates.ProjTransType      = SalesQuotationLine.ProjTransType;
    estimates.Worker             = SalesQuotationLine.ProjectWorker;
    estimates.UnitSalesPrice     = SalesQuotationLine.SalesPrice;
    estimates.UnitCostPrice      = SalesQuotationLine.CostPrice;
    estimates.TotalSalesPrice    = SalesQuotationLine.LineAmount;
    estimates.TotalCostPrice     = SalesQuotationLine.SalesQty * SalesQuotationLine.CostPrice;
    estimates.LinePropertyId     = SalesQuotationLine.LinePropertyId;
    estimates.Description        = SalesQuotationLine.ProjDescription;
    estimates.PRGSalesUnit       = SalesQuotationLine.SalesUnit;
    estimates.insert();

    ttsBegin;
    SalesQuotationLine.selectForUpdate(true);
    SalesQuotationLine.PSARefRecId  = estimates.RecId;
    SalesQuotationLine.doUpdate();
    ttsCommit;

}

Update ve Delete kodları SalesQuotationLine içinde psaUpdateActivityEstimates() ve psaDeleteActivityEstimates() adiyla mevcut. Sistem bunları kullanıyor.

Selamlar.

AX2012 R3 kurulum ve yenilikler

Merhaba

Geçtiğimiz günlerde AX2012 R3 kurulum dosyası yayınlandı. Ben hemen indirip kurdum. Kurulumda çok büyük değişiklik yok ancak eklenen yeni seçenekler var.  Yeri geldikçe bu seçeneklerden ayrıntılı bir şekilde bahsedeceğim.

Kurulum bittikten sonra derlemesi ve eşitlemesi R2′ye göre biraz daha uzun sürdü.

Demo veri için Test Data Transfer Tool’lu kullanmanız gerekiyor. InformationSource‘tan indirebilirsiniz. Test Data Transfer Tool’lu SQL olan bir makineye kurmalısınız.  İndirdiğiniz DynamicsAX2012R3DemoData.exe’yi bir klasöre açıp aşağıdaki komutu çalıştırdığınızda kurulum başlıyor. Bu komutu çalıştırmadan önce mutlaka AOS durdurmalısınız. Daha ayrıntılı bilgi için buraya bakabilirsiniz.

DP.exe Import Klasör DB

Ax2012 R3 ile gelen bir çok yenilik var. Buradan ayrıntılarına bakabilirsiniz. Aşağıdaki  AX2012 R3 menusu var. Benim gözüme çarpan Call Center oldu. Bir projemizde ihtiyaç olmuştu.  Ayrıntılarını bilmiyorum ama incelemek lazım.

Her geçen gün yenilenen ve gelişen ax bizi de peşinden sürüklüyor.  Bu yenilenme ve gelişmeler bizi de yeniliyor ve geliştiriyor. Ürünün bir kaç yıl içinde çok daha iyi yerlerde olacağını düşünüyorum. Ancak buna ayak uydurmak için bizimde çok çalışmamız gerekiyor.

Happy DAXing.

Selamlar.

Microsoft Dynamics AX 2012 R3

Merhaba

10 nisan 2014′de Microsoft Dynamics AX 2012 R3 çıktı. Bu sürümde bir çok yenilik var. Özellikle depo yönetimi, bütçe planlama, mobil uygulamalar ve bulut desteği en göze çarpanları. Aşağıdaki makalelerden ayrıntıları okuyabilirsiniz.

Yazı 1

Yazı 2

Ayrıca channel9′a R3 ile ilgili iki tane eğitim videosu eklenmiş. Bunları da izlemekte fayda var.

Microsoft Dynamics AX 2012 R3 Training: (01) Transportation Management

Video 1

Microsoft Dynamics AX 2012 R3 Training: (02) Warehouse Management

Video 2

Selamlar.

Stok hareketine kodla rezervasyon koymak

Merhaba

Uzun zamandır fırsat bulup yeni yazı yazamıyordum. Canlıya geçiş yoğunlu sonra iş değişikliği derken zaman çok hızlı geçti. Yeni işimle birlikte farklı konularda da yazılar yazmayı planlıyorum.

Bu yazımda koddan bir stok hareketine nasıl rezervasyon koyulabileceğini anlatacağım.  Bu örnekte SalesLine’nın stok hareketi var ancak SalesQoutationLine gibi farklı tablolar da olabilir. Rezervasyonu eldeki stoğa veya satın almaya koyabilirsiniz. Formdan rezervasyon koymak için satış formunu açıp satırlardan / Stok/ Rezervasyon menüsünden açılan formda, Rezervasyon sütununa istediğiniz miktarı yazarak yapabilirsiniz.

Eğer bu işlemi koddan yapmak istersek aşağıdaki gibi bir kod işimizi görecektir.

  DMRSalesQuotationControl::inventReservation(Salesline.InventTransId ,
        "", SalesLine.SalesQty , false ,true);

Server Static void inventReservation(   InventTransId   _inventTransId,
                                           InventSerialId  _inventSerialId,
                                           Qty             _qty ,
                                           boolean         _unreserve = false ,
                                           boolean         _allowReserveOrdered = false)
{
    InventUpd_Reservation   inventUpd_Reservation;
    inventMovement          inventMovement;
    InventSerial            invserial;
    inventdim               inventDim,iDimNew;
    SalesLine               salesLine;
    ;
    ttsbegin;
    salesLine = SalesLine::findInventTransId(_inventTransId);
    if (!salesline)
    {
        throw error("Sales order line could not be found !");
    }
    inventDim                = salesLine.inventDim();
    inventdim.inventSerialId = _inventSerialId;
    iDimNew                  = inventDim::findOrCreate(inventDim);

inventMovement =InventTrans::findTransId(salesLine.InventTransId).inventMovement(true);
    if(inventMovement)
    {
        inventUpd_Reservation = InventUpd_Reservation::newInventDim(inventMovement,
               iDimNew, _unreserve ? _qty : -_qty);
        // if there is not enough inventory make rezervation from Purchase order.
        inventUpd_Reservation.parmAllowReserveOrdered(_allowReserveOrdered);
        inventUpd_Reservation.updateNow();
    }
    ttscommit;

}

Ax 2009 ve Ax 2012 aynı kod çalışıyor.

Selamlar.

DMR Danışmanlık

Merhaba

Hayatımda yeni bir aşama başlıyor. Uzun zamandır farklı firmalarda çalıştığım yazılım ve danışmanlık işini artık kendi firmamda yapacağım. Dört ortaklı DMR danışmanlık özellikle ax konusunda çok tecrübeli arkadaşların bir araya gelmesiyle ortaya çıktı. Bu tecrübeyi projelerimize yansıtıp başarılı projeler yapmayı hedefliyoruz. İnşallah başarılı bir girişim olur.

Gönderme panosunda çalışan ismini göstermek.

Merhaba

AX 2012′de Hizmet yönetimi/ Gönderme panosu (SMADispatchBoard) formunda sadece çalışan kodu gösteriliyor. Kod üzerinde bir süre durursanız çalışanın adını da gösteriyor. Buradan iş ataması yapacak kişilerin bütün kodları bilmesi mümkün değil. Altyapı olarak ActiveX kullanıldığı için direk değiştiremiyoruz. Çalışan ismini göstermek için veriyi dolduran sınıfta ufak bir değişiklik yapmak gerekiyor.

GanttVcDataTable sınıfının  createUserDefinedRecord() metoduna  // FD aralığındaki kodu eklemek yeterli olacaktır.

        else
        {
            if(_mapInsertedFields && _mapInsertedFields.exists(ganttVcDataTableField.parmFieldName()))
            {
                strFieldValue = _mapInsertedFields.lookup(ganttVcDataTableField.parmFieldName());
                // FD
                if(HcmWorker::findByPersonnelNumber(strFieldValue))
                {
                    strFieldValue = HcmWorker::findByPersonnelNumber(strFieldValue).name() ;
                }
                // FD
            }
        }

Selamlar.

Dynamics Ax’ta bir metni başlık formatına (Title Case) çevirmek

Merhaba,

Basit bir hata sonucu axa aktarılan büyük bir verinin tamamen büyük harfle oluştuğunu gördüm. İlgili departman bu verinin başlık formatında olmasını istedi. Veriyi tekrar aktarmaktansa güncellemeyi daha doğru buldum . Ax’ta büyük ve küçük harfe çeviren metotlar var ancak başlık formatına (Title Case) çeviren bir metot yok . Bu yüzden .Net’ten yararlanarak bu işlemi yaptım. Örnek kod şu şekilde:

static void FD_ChangeCase(Args _args)
{
    System.String                       myString ;
    System.Globalization.TextInfo       TextInfo ;
    System.Globalization.CultureInfo    CultureInfo ;

    myString    = "PERAkeNDE SATIŞ TEksTİL SEgmENTİ";
    CultureInfo = new System.Globalization.CultureInfo("tr");
    TextInfo    = CultureInfo.get_TextInfo();

    info(  TextInfo.ToTitleCase(TextInfo.ToLower( myString ))) ;
    info(  TextInfo.ToLower( myString )) ;
   // info(strLwr("PERAkeNDE SATIŞ TEksTİL SEgmENTİ"));
    info(  TextInfo.ToUpper( myString )) ;
   // info(strUpr("PERAkeNDE SATIŞ TEksTİL SEgmENTİ"));

}

Selamlar.

Dynamics Ax’ta Regular expression kullanımına örnekler

Merhaba

Birinci örnekte metoda gönderilen metinin nokta(). ve tire(-)  haricinde özel karakter içerip içermediğini kontrol ediyoruz.

static boolean isProductNumberValid(EcoResProductNumber _ecoResProductNumber )
{
    Str MatchPattern ="[^a-zA-Z0-9\-.]";
    System.Text.RegularExpressions.Match myMatch;
    ;

    myMatch = System.Text.RegularExpressions.Regex::Match(_ecoResProductNumber,
                                 MatchPattern);

    return !myMatch.get_Success();

}

İkinci örnekte ise gönderilen metindeki özel karakterleri tire(-) ile değiştiriyoruz. Regex ile köşeli parantez “[ ]” ve ters sılaş “\” karakterlerini değiştiremedim. Bu yüzden ax’ın strReplace() metodunu kullanarak değiştirmek zorunda kaldım.

static EcoResProductNumber clearProductNumber(EcoResProductNumber _EcoResProductNumber)
{
    Str                 Pattern =  "[ :;,/+*'@_#!|$½%&(){}^~<> ]";
    EcoResProductNumber ecoResProductNumber;
    ;
ecoResProductNumber =System.Text.RegularExpressions.Regex::Replace(_EcoResProductNumber,
                                                        Pattern, "-");
    ecoResProductNumber = strReplace(ecoResProductNumber ,'[',"-");
    ecoResProductNumber = strReplace(ecoResProductNumber ,']',"-");
    ecoResProductNumber = strReplace(ecoResProductNumber ,'\\',"-");

    return  ecoResProductNumber;
}

Bu metodları Global sınıfına ekledim. Kullanımı çok basit.

static void SEC_FD_RegEx(Args _args)
{
    ;

    if(Global::isProductNumberValid("SEC.s-f.sdf."))
    {
        info("Kod doğru.");
    }

    info(Global::clearProductNumber("SEC D:;,/+*'@_#!|%&(){}^~[] "));
}

Selamlar.

Plan data import, export, and migration [AX 2012]

Merhaba.

Ax 2012′de ana veri, şirket ayarları ve geliştirmelerin ortamlar arasından nasıl aktarılacağı konusunda benim kafam karışıktı. Bir çok alternatif yöntem var. Hangi durumda hangisi kullanmak gerektiğini anlamamıştım. Microsoft’ta bu karışıklığın farkına varmış olmalı ki aşağıdaki yazıyı yazmış. Bu makalede hangi senaryo için hangi yöntemin uygun olduğunu tablo şeklinde gösteriyor ve karşılaştırıyor. Buradan benim anladığım bu işlemin netleşmesi için biraz zaman alacak ancak bir çok alternatifimiz var. Denemeden önce mutlaka sağlam yedek almak lazım. Bu araçları kullandıkça tecrübelerimi yazacağım.

TechNet – Plan data import, export, and migration

Selamlar.

Dynamics Ax 2012′de bir boyut nasıl zorunlu hale getirilir.

Merhaba

Ax 2012 ile değişen mali boyut yapısında herhangi bir boyutun nasıl zorunlu hale getirilebileceğine değineceğim.  Öncelikle General Ledger / Seturp /Configure account structures formunu açtığınızda aşağıda resimde göründüğü gibi alanın boş bırakılmasıyla ilgi parametre mevcut.

Bu parametre sadece deftere nakil işleminde çalışıyor. Örneğin yeni bir müşteri tanımlıyorsunuz ve departman boyutunun zorunlu olmasını istiyorsanız bu tanım bu işlemi yapmıyor.  Standartta böyle bir tanım yapılabiliyor mu diye araştırdım bulamadım. Validasyon yazmaktan başka bir çözüm bulamadım. Alanlarında boyut (DefaultDimension ) olan herhangi bir tablonun ValidateWrite() metodunu aşağıdaki gibi değiştirelim.

public boolean validateWrite()
{
    boolean ret;
    ;
    ret = super();

    if(!this.checkDimValue(5637144850)) // Must be parametric
    {
        ret =  checkFailed("Departman boyutu boş bırakılamaz.") && ret;
    }
    return ret;
}

Tabloya gerekli metodu ekleyelim.

Boolean checkDimValue(RefRecId _refRecId)
{
    DimensionAttributeValue             dimAttrValue;
    DimensionAttributeValueSetItem      dimAttrValueSetItem;

    ;

    select firstonly dimAttrValueSetItem
    where dimAttrValueSetItem.DimensionAttributeValueSet == this.DimensionDefault
    join dimAttrValue
        where dimAttrValue.RecId == dimAttrValueSetItem.DimensionAttributeValue
        &&    dimAttrValue.DimensionAttribute   == _refRecId ;

    if(dimAttrValueSetItem.DisplayValue)
        return true;
    else
        return false;

}

Selamlar.

Page 3 of 20123451020...Last »