Author Archive

How to Replace a Financial Dimension in Default Dimensions [Dynamics AX 2012]

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.

İş ilanı: .net yazılım uzmanı

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:

  • Tercihen Üniversitelerin Bilgisayar Mühendisliği veya ilgili bölümlerinden mezun olan,
  • Yazılım geliştirme konusunda minimum 3 yıl deneyimli,
  • NET platformu ve C# diline hakim, Nesne yönelik programlamaya ve tasarım konusunda bilgili
  • Çok katmanlı ve dağıtık uygulamalar konusunda bilgisi olan,
  • ASP.NET, WF4, WCF, WPF, Windows Form, Windows Service’ler , Web servisleri hakkında bilgili,
  • Entity Framework, XPO ya da benzer ORM deneyimi olan,
  • SQL Server (T-SQL) geliştirme konusunda deneyimli,
  • Teknik döküman okuyabilecek derecede ingilizce bilen,
  • Erkek adaylar için askerliğini tamamlamış,
  • MS-Office programlarını kullanabilen,
  • Takipçi, iş disiplinine sahip ve yeni iş süreçlerini öğrenmek için motive,
  • Kendi sektöründe teknolojik gelişmeleri takip eden ve geliştirici öneriler sunan,
  • Takım çalışmasına yatkın, esnek ve yoğun çalışma ortamına uyum sağlayabilecek,
  • Üst seviyede analitik düşünme ve analiz etme yeteneği olan

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.

Ax 2012′de kodla farklı bir SQL’e bağlanıp veri çekmek

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ı.");
    }
}

Kaynak

Selamlar.

Dynamics ax 2012′de kodla satınalma siparişi oluşturmak

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.

QlikView’de döngü kurmak

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.

Ax 2012′de Fact box ve Preview Pane’leri sistemden kapatmak

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.

Dynamics Ax 2012 Table Inheritance 2

Merhaba

Bu yazımda tablo kalıtımın da verilerin nasıl oluştuğundan ve Insert() , Delete() ve Update() işlemlerinden bahsedeceğim. Bir metotla türettiğimiz 3 tabloya da kayıt ekleyelim.

static void FD_InsertTableInheritance(Args _args)
{
    FDCarTable          carTable;
    FDTruckTable        truckTable;
    FDMotorcycleTable   mtcTable;
    ;

    carTable.clear();
    carTable.carType            = "Taxi";
    carTable.numberOfDoors      = 2;
    carTable.Plaque             = "34 TK 4422";
    carTable.Brand              = "Ford";
    carTable.Model              = "Focus";
    carTable.insert();

    truckTable.clear();
    truckTable.truckType        = "Trayler";
    truckTable.numberOfAxles    = 5;
    truckTable.Plaque           = "34 sdr 54";
    truckTable.Brand            = "Merecedes";
    truckTable.Model            = "Truckes";
    truckTable.insert();

    mtcTable.clear();
    mtcTable.motorcycleType     = "Mobilet";
    mtcTable.hasSidecar         = false ;
    mtcTable.Plaque             = "34 df 22";
    mtcTable.Brand              = "Hundai";
    mtcTable.Model              = "i345";
    mtcTable.insert();

}

FDCarTable

FD TruckTable

FDMotorcycleTable

FDVehicleTable

Gördüğünüz gibi biz alt tablolara kayıt ekledik temel tabloda da otomatik veri oluştu. Oluşan verinin hangi tablodan geldiğini InstanceRelationType alanından görebiliyoruz. Ayrıca isteğe göre eklenebilen DisplayRelationType alanından da görebiliyoruz. Türetilmiş tablo ile temel tablonun RecId’leri aynı oluştu. Tablo tarayıcısından türetilmiş tabloyu açtığınızda temel tablodaki alanları da görebiliyorsunuz. Zaten yukarıda yazdığımız metotta da temel tablonun alanlarını kullandık.

Update işleminde de aynı mantık geçerli , istediğiniz tablo değişkeni üzerinden güncelleme yapabilirsiniz. Basit bir örnek yapalım.

static void FD_UpdateTableInheritance(Args _args)
{
    FDCarTable          carTable;
    FDVehicleTable      vehicleTable;
    ;

    ttsBegin;
    while select forupdate   carTable
    {
        carTable.LicanceCode    = "LisansFromCar";
        carTable.numberOfDoors  = 4;
        carTable.update();
 // Hem temel tablo hemde türetilmiş tablo için güncelleme yapılabilir.
    }

    while select forUpdate  vehicleTable
        where vehicleTable.InstanceRelationType == tableNum(FDCarTable)
    {
        vehicleTable.LicanceCode = "LisansFromVehicle";
        vehicleTable.update();
 // Sadece temel tablo için güncelleme yapılabilir.
    }
    ttsCommit;
}

Delete işlemi de update işlemiyle aynı. Dikkat edilmesi gereken nokta temel tablodan bir satır silindiğinde türetilmiş tablodan da o satırın silineceğidir. Tablonun diğer metotlarında da sınıflarda bildiğimiz kalıtım mantığının aynısı çalışıyor.

Selamlar.

Dynamics Ax 2012 Table Inheritance 1

Merhaba

Bu yazımda ax 2012 ile hayatımıza giren tablolarda kalıtımdan bahsedeceğim. Bir çok eğitimimde ax tablolarının aslında birer sınıf olduğunu söylemiştim. Tabloların sınıf olması sebebiyle ezilebilen metotları vardı Insert() Update() gibi. Yeni metot yazılabiliyordu vs. Ancak biz tabloları birbirinden türetemiyorduk. Böyle bir desteği yoktu. Ax 2012 ile birlikte tablolar kalıtım özelliği gelmiş oldu böylece tablolar birbirinden türetebiliyoruz ve soyut (abstract) tablolar yapabiliyoruz. Türetilmiş tablolardan bahsederken Base Table ve Driven Table kullanılıyor. Bildiğiniz gibi Parent table ve Child table isimlendirmesi Foreign key ilişkilerinde kullanıyor. Tablolarda kalıtımın sistem tarafından desteklenmesi için bir çok temel yapıya eklemeler yapılmış, yeri geldikçe bahsedeceğim.

Klasik bir araç örneği ile tablolarda kalıtımı anlatmaya çalışacağım. Örnek yapımız şöyle olsun. Adım adım ilerleyelim.

  1. 4 tabloyu da öncelikle oluşturalım hiçbirine sütün eklemeyelim. Bütün tabloların SupportInheritance özelliğini Yes yapalım. FDVehicleTable tablosu hariç diğer tabloların Extends özelliğine FDVehicleTable yazalım. Böylece kalıtım yapısını kurmuş olduk.
  2. Tablolarımıza gerekli sutünları açalım. Dikkat etmemiz gereken bu hiyerarşide hiçbir sutün ,Relation veya index aynı isimde olmamalı. Ayrıca alanların idlerinin de farklı olması gerekiyor.Ben resimdeki alanları açtım.
  3. Base tabloya (FDVehicleTable) Int64 tipinde ismi InstanceRelationType olan bir alan açalım.Tablonun özelliklerinden InstanceRelationType‘ ı InstanceRelationType olarak seçelim. Bu alan otomatik olarak sistem tarafından yönetilecektir ve FDVehicleTable‘da oluşan kayıtların hangi türetilmiş tablodan geldiğini göstermek için o tablonun tablo Id’sini tutacaktır.
  4. Son olarak eğer hangi tablodan bu kayıtların oluştuğunu raporda veye formda göstermek isterseniz bir BaseEnum yapmalısınız. Enum da Sıfır Id’li eleman unKnown olacak diğerleri de sizin tablo isimlerinizle aynı olacak.Oluşturduğumuz Enum’ı sürükleyip FDVehicleTable’a bırakalım ve oluşan sutünün ismin DisplayRelationType yapalım.
  5. Insert() metodunu şu şekilde güncelleyelim.
    public void insert()
    {
        dictenum enumtype = new dictenum(enumnum(fdvehicletype));
        int enumvalue;
        ;
        if (this.displayrelationtype != fdvehicletype::unknown)
        {
            return;
        }
        enumvalue = enumtype.symbol2value(this.getinstancerelationtype());
        if (enumvalue == 255) // symbol2value bu fonksiyon eğer çeviremezse 255 döndürür
        {
            throw error(strfmt('no %1 enum element found for enumvalue %2',
            enumstr(fdvehicletype),
            this.getinstancerelationtype()));
        }
        else
        {
            this.displayrelationtype = enumvalue;
        }
        super();
    }
    
  6. Bütün projeyi derleyin. FDVehicleTable tablosuna sağ tıklayıp Add-Ins menüsünden Type hierarchy browser’ ı açın.                             
  7. Bu tanımlardan sonra yapımız hazır oldu. Son olarak tabloların ilişkilerine(Relation) bakalım. Gördüğünüz gibi RecId üzerinden ilişki kurmuş yani iki tablonun recId leri aynı oluşacak. Bunu sistem yönetiyor. Örnek verilerle daha iyi anlaşılacaktır. İlişki isimlendirmede PK_Base Tablo_Derived Tablo yapısını kullanmak tavsiye ediliyor.

Yapıyı kurmuş olduk. Bir sonraki yazımda veri yönetimi ve tablo metotlarını inceleyeceğim.

Selamlar.

How to change grid row color in listpage form in Dynamics Ax 2012

I need to change the grid row’s color in ax 2012 depend on the record status. The usual solution for this is to override the formdatasource method displayoption(). However, the form is listpage type and DataSource method can not be overiden. Customization works only in the interaction class for listpages. I try to do this modification in to the interaction class but i couldn’t . After some search i find a solution. Firts export listpage form to xpo file and change form’s FormTemplate property to the none. Now you can override the displayoption() method with this code.


public void displayOption(Common _record, FormRowDisplayOption _options)
{
    #define.Green(0, 255, 0)
    #define.Orange(255, 128, 64)
    #define.LightGreen(64, 128, 128)
    #define.White(255, 255, 255)

    FRTImportTable importTable;
    ;

    importTable = _record.data();

    if (importTable.Status == FRTImportStatus::PreInvoice)
    {
        _options.backColor(WinAPI::RGB2int(#Green));
        _options.textColor(WinAPI::RGB2int(#White));
    }
    else if (importTable.Status == FRTImportStatus::OpenInvoice)
    {
        _options.backColor(WinAPI::RGB2int(#Orange));
    }
    else
    {
        _options.backColor(WinAPI::RGB2int(#LightGreen));
    }

    super(_record, _options);
}

Export new form to another xpo file. Open each xpo file and find displayoption() method from second xpo file. Copy and paste below code to the first xpo file between METHODS and ENDMETHODS branches.


SOURCE #displayOption
#public void displayOption(Common _record, FormRowDisplayOption _options)
#{
#    #define.DarkGray(80, 80, 80)
#    #define.LightGray(200, 200, 200)
#    #define.LightGray2(20, 20, 20)
#    #define.White(255, 255, 255)
#
#    FRTImportTable importTable;
#    ;
#
#    importTable = _record.data();
#
#    if (importTable.Status == FRTImportStatus::PreInvoice)
#    {
#        _options.backColor(WinAPI::RGB2int(#DarkGray));
#        _options.textColor(WinAPI::RGB2int(#White));
#    }
#    else if (importTable.Status == FRTImportStatus::OpenInvoice)
#    {
#        _options.backColor(WinAPI::RGB2int(#LightGray));
#    }
#    else
#    {
#        _options.backColor(WinAPI::RGB2int(#LightGray2));
#    }
#
#
#    super(_record, _options);
#}
ENDSOURCE

Save the first xpo and import to the ax.

Open your listpage form now you see the colors.

This is not a proper solution but i couldn’t find any other if you do let me know.

Until next time.

How to display only one attribute value from LedgerDimension

In this post, I will explain how to display only one attribute value from LedgerDimension. I will use CostCenter attribute for my example. As you know LedgerDimension table are DimensionAttributeValueCombination , DimensionAttributeValueGroupCombination and DimensionAttributeLevelValue . This tables holds the related data. Instead of this tables I wil use only DimensionAttributeLevelValueAllView view. This view is very simple and useful.
I have a LedgerDimension’s RecId end i want to display only CostCenter value. I will join DimensionAttributeValue to DimensionAttributeLevelValueAllView and give the ranges.

Here is the method displays costCenter values.


// FD: Display CostCenter Value from LedgerDimension
display num dispFinancialDisplayValue()
{
    DimensionAttributeValue             dimAttrValue;
    DimensionAttributeLevelValueAllView dimAttrLevelValueAllView;
    ;

    select firstonly dimAttrLevelValueAllView
    where dimAttrLevelValueAllView.ValueCombinationRecId == this.LedgerDimension
    join dimAttrValue
        where dimAttrValue.RecId == dimAttrLevelValueAllView.AttributeValueRecId
        &&    dimAttrValue.DimensionAttribute   == 5637144851;
        // CostCenter RecId. Must be parametric.

    return dimAttrLevelValueAllView.DisplayValue;
}

I wrote this method to a table that have LedgerDimension field.

Until next time.

Page 22 of 40« First...1020212223243040...Last »