CIL Derleme sistematiği

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.

  1. Bütün AOS’ları durdurun.
  2. c:\Program Files\Microsoft Dynamics AX\60\Server\InstanceName\bin\XppIL klasörünü silin. (Silmek uzun sürebiliyor klasörün adını değiştirip yedek almak daha mantıklı)
  3. Model veritabanındaki SysXppAssembly tablosunun bütün kayıtlarını silin.
  4. İşlem yapılacak AOS’u açın.
  5. Paralel derleme ile işlem yapılacak AOS’u derleyin. Paralel derleme için bakınız.
  6. C:\Program Files\Microsoft Dynamics AX\60\Server\DynamicsAX_Live\Log\AxCompalieAll.html dosyasından hataları kontrol edin. Tablo, Class ve güvenlik nesnelerinde hata olmamalı. Form ve job lardaki hatalar CIL için önemli değil.
  7. AOS’u yeniden başlatın.
  8. Ful CIL derleyin.
  9. Diğer AOS’larin XppIL klasörlerini silin.
  10. Diğer AOS ları başlatın.

CIL hatası hala devam ediyorsa Google veya tecrübesinde istifade edeceğiniz birine danışın :)

Selamlar.

Ax2012 Paralel derleme

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.

AutoRefreshData property on buttons AX2012

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.

How to get table field properties from X++

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);
    }
}

Info:

Happy Daxing.

Microsoft Dynamics AX Implementation Guide

Hi,

Yogesh Kasat  and Jilajeet Yadav  have come out with a wonderful book on handling Microsoft Dynamics AX Implementation Projects.The book describes about the basics of implementation, common errors, issues and some real life experiences about AX implementation projects. This book appeals to wide range of audience and is very useful guide for DAX implementations.

This is my second book that i reviewed recently on Dynamics AX. The first was Microsoft Dynamics AX 2012 R3 Cookbook. There are so many differences between reading and reviewing the book. Reviewing is thoroughly investigating the book. All codes should be run and all samples should be tested meticulously. Sometimes, same page should be reread to advise for required optimizations and improvements and to detect errors and bugs.

It has been so pleasant and improving activity to study on this comprehensive book. I am so thankful to Packt Publising, Yogesh Kasat  and Jilajeet Yadav, one by one, to find me appropriate for this review.

I wish them continued success.

Here is the page where the riviewers brief biography exists.

You can read the article on this book here on Posts By Yogesh Kasat on LinkedIn or Dynamics World.

The book is available to be bought on AmazonPackt Publishing, and other major places, both as an e-book or a hard copy.

Happy Daxing.

Ax 2012′de sabit muhasebe boyut değerleri nasıl tanımlanır (Fixed Dimensions)

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.

Proje ücret günlüğü oluşturmak

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.

Microsoft Dynamics AX 2012 R3 Development Cookbook yayımlandı

Merhaba,

2014 yılı sonlarından PACKT Publishing’ten Cookbook’un yeni versiyonu için gözden geçirme (Review) teklifi aldım . İstenen öncelikle teknik bir sorun veya eksiklik olup olmadığının kontrol etmek ve yenilikler konusunda hem teknik hemde içerik açısından katkı sağlamaktı.Yazar her bir bölümü bitirdiğinde bir proje yöneticisi aracılığıyla kodları ve metni bana gönderdi.  Bölüm bölüm ayrıntılı bir şekilde okuyup inceledim, kodları tek tek çalıştırdım. Özellikle Ax 2012 ile alakalı bazı yeniliklerle ilgili tavsiyelerim oldu.

Kitabın ilk sayfalarının birinde gözden geçirenlerin kısa bir öz geçmişi bulunuyor. Ayrıca kitabın bir kopyası ve seçtiğimiz başka bir kitabı hediye ettiler. Ben  Implementing Microsoft Dynamics AX 2012 with Sure Step 2012 kitabını seçtim.

Benim için farklı bir tecrübe oldu ayrıca kitap yazmanın çokta kolay bir iş olmadığını iyice anlamış oldum.

Kitap içerik olarak çok iyi  ve faydalı mutlaka okumalısınız.

Cookbook:  https://www.packtpub.com/application-development/microsoft-dynamics-ax-2012-r3-development-cookbook

Sure Step: https://www.packtpub.com/application-development/implementing-microsoft-dynamics-ax-2012-sure-step-2012

Selamlar.

Dynamics AX’ta BCC (Gizli) mail nasıl gönderilir?

Merhaba

Ax içinden Bcc mail göndermek için SYSMailer sınıfına bazı eklemeler yapmak gerekiyor.

Aşağıdaki metotları SYSMailer sınıfına ekleyelim.

//DMR FD
SysMailerAddressField bccs()
{
    InteropPermission permission = new InteropPermission(InteropKind::ComInterop);

    permission.assert();

    //BP Deviation Documented
    return SysMailerAddressField::create(_com,SysmailerAddressFieldType::Bcc);
}

.

// DMR FD
SysMailerAddressField tosBCC()
{
    ;
    return SysMailerAddressField::create(_com,SysmailerAddressFieldType::Bcc);
}

.

// DMR FD
public void quickSendBcc(str fromAddr, str toAddr, str subject,
 str body, str cc='',str bcc='', str attachments='')
{
    SysMailerAddressField tos;
    SysMailerAddressField ccs;
    SysMailerAddressField bccs;
    SysMailerAttachments mailAttachments;
    SysEmailParameters parameters;

    List emailAddresses;
    ListEnumerator enum;
    ;

    this.fromAddress(fromAddr);

    tos = this.tos();
    emailAddresses = SysEmailDistributor::splitEmail(toAddr);
    enum = emailAddresses.getEnumerator();
    while(enum.moveNext())
    {
        tos.appendAddress(enum.current());
    }

    this.subject(subject);
    this.htmlBody(body);

    if (!prmisdefault(cc))
    {
        ccs = this.ccs();
        ccs.appendAddress(cc);
    }

    if (!prmisdefault(bcc))
    {
        bccs = this.bccs();
        bccs.appendAddress(bcc);
    }

    if (!prmisdefault(attachments))
    {
        mailAttachments = this.attachments();
        mailAttachments.add(attachments);
    }

    this.priority(1);

    parameters = SysEmailParameters::find();

    if (parameters.smtpRelayServerName)
    {
        this.SMTPRelayServer(parameters.smtpRelayServerName,parameters.smtpPortNumber,
              parameters.smtpUserName,SysEmailParameters::password(),parameters.ntlm);
    }

    this.sendMail();

}

Bu eklemelerde sonra şöyle bir örnekle mail gönderimini test edebiliriz.

static void FD_SendMailSampleCcandBcc(Args _args)
{
    SysMailer   mailer;
    str         toEmail     = "fatih.demirci@aaaa.com";
    str         fromEmail   = "iletisim@aaaa.com";
    str         cc          = "aaaaa@aaaa.com";
    str         bcc         = "bbbb@aaaa.com";
    str         subject     = "Email konusu";
    str         body        = "Email içeriği";

    ;
    mailer = new SysMailer();
    mailer.quickSendBcc( fromEmail, toEmail, subject, body, cc , bcc);

}

Selamlar.

Satış Siparişi İadesi AX 2012

Merhaba,

Danışmanlarımızdan Mehmet Yunus ÖZKORKMAZ’nın bir yazısını sizinle paylaşıyorum.

Satış siparişi iadesi girmek için aşağıdaki adımları takip edebilirsiniz.

Satış ve pazarlama-ortak-iade siparişleri-tüm iade siparişleri

Buradan iade siparişine tıklayıp müşterimizi seçiyoruz. Daha sonra elle  giriş yapabiliriz. Ama eğer faturalanmış satış siparişi içerinden maddeyi ya da maddeleri çekmek istersek; yukarıda SATIŞ SİPARİŞLERİNİ BUL butonuna tıklarız.

Tüm siparişi iade edeceksek satış siparişinin başında TÜMÜNÜ SEÇ kutucuğunu işaretleyin eğer birkaç satır alacaksak alacağımız satırları seçeriz.

Satırları tamamladıktan sonra yukarıda GÖNDER tabının altında İADE SİPARİŞİ ne tıklayıp onaylıyoruz.

Daha sonra her bir satır için SATIR GÜNCELLEŞTİR seçeneğinin altındaki KAYIT butonuna tıklıyoruz. Elden çıkarma kodunu seçiyoruz.

Sonra gelen ekrandan OTOMATİK OLUŞTUR u işaretliyoruz. ŞİMDİ KAYDET bölümünün altında DEFTERE NAKLET seçeneğine tıklıyoruz. (Bu adımdan sonra TÜM SATIŞ SİPARİŞLERİNE AÇIK SİPARİŞ olarak düşüyor siparişimiz. İstersek oradan irsaliyelendirip faturalandırabiliriz. İstersek İADE SİPARİŞ ekranından irsaliyelendirip daha sonra TÜM SATIŞ SİPARİŞLERİ’nden faturalandırabiliriz.)

Daha sonra satırların sonunda iade durumunun BEKLENİYOR dan KAYITLI durumuna geçtiğini göreceksiniz.

Son olarak; sevk irsaliyemizi kesiyoruz. Faturalama işlemini de; alacak hesaplarından bu iade satış siparişimizi bulup yapıyoruz.

Mehmet Yunus ÖZKORKMAZ

Selamlar.

Page 1 of 22123451020...Last »