Archive for Haziran, 2013

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.