‘ All ’ Adlı Kategori

Axapta QueryBuildDataSource’ta String Empty/Null Kontrolü

Şubat 15, 12 Yazan: akın

Microsoft Dynamics Ax’ta en çok uğraşacağınız noktalardan bir tanesi şüphesiz querylerdir. Çoğu zaman da kayıtlardaki null değerleri karşılaştırmanız gerekecektir. Daha önceki şu yazımda tarih alanların null değerlerinin nasıl kontrol edileceğini yazmıştım. Bu yazımda da string değerlerin null olup olmadıklarını nasıl anlayacağınızı gösteriyorum.

SysQuery::valueEmptyString() methodu ile querylerde string değerlerin boş olup olmadığını kontrol edebilirsiniz. Bu methodu joblara yazıp değerine bakmak istediğiniz de ise “” (çift tırnak) değeri geliyor. Aslında bu method yerine “” ile de string değerleri kontrol edebilirsiniz. Aşağıdaki kodlarda ise örnek kullanım mevcut.

QueryBuildDataSource qbds;
;
qbds =this.query().dataSourceTable(tablenum(RBOTransactionTable));
qbds.addRange(fieldnum(RBOTransactionTable,statementId))
.value(SysQuery::valueEmptyString());

Yukarıdaki kod Hareketler tablosunda, ekstrelenmemiş kayıtları getirmektedir.

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

Axapta’da Deadlock ve retry komutu

Şubat 14, 12 Yazan: akın

Axapta’da deadlock olaylarının yakalanması oldukça önemlidir. Geliştirdiğiniz kodlarda deadlockları minimuma indirmek için bazı taktikler olsa da, oldukça yoğun kullanılan sistemlerde deadlock olması muhtemeldir.

Genel olarak deadlock, iki ayrı transaction’ın birbirlerini kitlemesidir.

Örneğin,

1. transaction CustTable’ı kitlemiş ve aynı zamanda VendTable’ı da kitlemek istesin.

2. transaction ise VendTable’ı kitlediği halde CustTable’ı da kitlemek istesin.

Bu durumda transactionlar birbirlerini bekleyip duracaklardır. Database engine, deadlock’u algılayıp kendi kuralları neticesinde bir transaction’ı seçecek ve onu düşürecektir. Bu durumda düğüm çözülmüş olacaktır.

Peki database engine’in düşürdüğü transaction ya sizinki ise? O zaman bu olayı yakalamalı ve tekrar denemelisiniz.

Bu durumda aşağıdaki kod sizin işinizi görecektir.

Try
{
    //transaction komutlari
}
catch (exception::deadlock)
{
    retry;
} 

retry ile ilgili unutmamanız gereken nokta ise siz aksini belirtmedikçe retry komutu hep çalışacaktır. Bu durumda bir kaç denemeden sonra retry komutunu kırmanız gerekebilir.

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

X++, .NET Framework alt yapısını mı kullanacak?

Şubat 13, 12 Yazan: akın

Microsoft’un ERP sektörü için yatırım yaptığı Axapta, bildiğiniz üzere X++ dilini kullanıyor fakat Microsoft, Dynamics Ax 2009 ve 2012′de (giderek artan oranda) bazı işlemleri önce Visual Studio’da geliştirtiyor daha sonra geliştirilen kodları Axapta’ya aldırıyor. Bu durumda akla bazı sorular geliyor. “Acaba Microsoft ileride X++’ı .NET çatısı altına mı alacak?”

Bu sorunun üzerine gidip bazı araştırmalar yaptığımda ise yakın gelecekte Axapta’nın development kısmının Visual Studio’ya gömüleceğini öğrendim fakat bu bilgi şu an için sadece söylentiden ibaret.

Biraz daha araştırdığımda ise aslında bunun bir söylenti olmadığını, muhtemelen bir kaç sene içerisinde X++’ı .NET tabanlı olarak Visual Stuio’da geliştireceğimizi anladım. Nereden bu kanıya vardığımı merak ederseniz, şöyle söyleyeyim, elbette bunlar benim bazı bilgileri yorumlamama dayanıyor.

Yalnız,

Bu bilgiler hakkında birşeyler söylemek istiyorum. Bu yorumuma neden olan bilgiler X++’ın bir sonraki sürümünü geliştiren kişilerin röportajlarına dayanıyor. Örneğin progamın başı Peter Villadsen, X++’ı MSIL’e çevirmek için uğraştıklarını belirtti.

MSIL (Microsoft Intermediate Language) bildiğiniz gibi .NET Framework’ü ile yazılan kodların derlenmesi sonucu çevrildiği dildir. Kısaca .Net Framework ile çevrilen diller makina diline değil de MSIL’e çevrilir. Bu sayede .NET Framework alt yapısı kullanan tüm diller ortak bir platform üzerinde birleşmiş oluyor. Birbirlerine çevrimleri mümkün kılınıyor.

Fazla uzatmadan,

X++’ın MSIL diline çevrilmesi, onun .NET Framework altyapısını kullanacağı anlamına geliyor fakat belirtilene göre bu işlemin gerçekleşmesi sonucu ciddi performans sıkıntıları ortaya çıkıyormuş. Bu durumda x++’ın hemen geçemeyeceğini ama zamanla .NET altyapısı üzerine oturacağını söyleyebiliriz.

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

Table validatewrite() methodu

Şubat 09, 12 Yazan: akın

Axapta’da tablolara birşeyler yazarken, bu kayıtların diğer tablolarla ve iş modelinizle uyumlu olması gerekir. Bu durumda kayıt esnasında girilen kayıtların tutarlı olup olmadığı kontrol edilir. Bu kontrol içinde validewrite() methodu veya validatefield methodu override edilir.
Validatewrite ile validatefield methodları arasında ki fark ise, validatefield alan alan kontrol yaparken, validatewrite tüm alanları kontrol eder. Bu methodlarda kaydedilmek üzere olan alanlara this. ile ulaşabilirsiniz. Aşağıdaki kod bloğunu incelemenizi tavsiye ederim.

public boolean validateWrite()
{
    boolean ret;

    ret = super();

    if(this.Field1>10)
    {
        ret=false;
    }
    
    return ret;
}

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

Enterprise Portal’da AxGroup Lookup’ını Filtreleme

Ocak 28, 12 Yazan: akın

Enterprise Portal’da bildiğiniz gibi formları oluşturmak için sayfaya öncelikle Datasource daha sonra Axform ve o Axform’un içine Axgroup eklersiniz.

Daha sonra Axgroup’ın alanlarını seçerek bu formun güncelleme için mi yoksa yeni kayıt için mi kullanılacağını belirlersiniz.

Belirlediğiniz alanlarda bir Lookup var ise, sayfayı publish ettiğinizde bu lookup değeri dropdownlist olarak gözükecek ve siz değer seçmek için tıkladığınızda ise postback olup ajax ile gerçek değerleri getirecektir.

Bu gelen değerler aslında o EDT’deki tüm satırlardır. Bir noktada bu değerleri filtrelemek ve sayfaya göre getirmek isterseniz aşağıdaki adımları ve kodları kullanabilirsiniz..

Önce, Axform’un OnLookup özelliğine yazacağımız methodun ismini veriyoruz: OnLookup=”MainContact_Lookup”>

Daha sonra codebehind’a ise aşağıdaki kodu eklemeniz yeterli.

    protected void MainContact_Lookup(object sender, AxLookupEventArgs e)
    {

        try
        {
            AxLookup lookup = e.LookupControl;
            int _OBSRBOEPIncomeExpenseRequestTableNum = TableMetadata.TableNum(this.AxSession, "EmplTable");

            using (Proxy.SysDataSetBuilder sysDataSetBuilder = Microsoft.Dynamics.Framework.BusinessConnector.Proxy.SysDataSetBuilder.constructLookupDataSet(this.AxSession.AxaptaAdapter, TableMetadata.TableNum(this.AxSession, "EmplTable")))
            {
                lookup.LookupDataSet = new DataSet(this.AxSession, sysDataSetBuilder.toDataSet());
            }

            lookup.LookupDataSet.Init();

            using (Proxy.Query query = lookup.LookupDataSet.DataSetViews[0].MasterDataSource.query())
            {
                using (Proxy.QueryBuildDataSource datasource = query.dataSourceName("EmplTable"))
                {
                    TableMetadata handHeldMetaData = MetadataCache.GetTableMetadata(this.AxSession, _OBSRBOEPIncomeExpenseRequestTableNum);
                    TableDataFieldMetadata handHeldField = (TableDataFieldMetadata)handHeldMetaData.Fields.GetByName("EmplId");


                    using (Proxy.QueryBuildRange range = datasource.addRange(handHeldField.FieldId))
                    {
                        range.status = (int)Proxy.RangeStatus.Hidden;
                        range.value = "0000"; // filtrelenmek istenen deger
                    }

                }
            }
        }
        catch (Exception ex)
        {
            InfoWrite("Lookup olusturulurken hata olustu: " + ex.Message);
        }

    }

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

Enterprise Portal’da Mevcut Context İle Sayfa Yönlendirmesi

Ocak 27, 12 Yazan: akın

Enterprise Portal’de bazen bir kaç adım içeren işlemler yapmanız gerekebilir. Bu durumda mevcut sayfada kayıt ettiğiniz veya kullandığınız verileri diğer sayfaya da aktarmanız gerekir.

Verileri diğer sayfaya aktarabilmek için öncelikle Axapta tarafında Web Url Menu Item oluşturmanız ve bu menünün hangi sayafaya yönleneceğiniz belirtmeniz gerekir.

Daha sonra Visual Studio’da code behind’da aşağıdaki kodu kullanmanız yeterli.

 AxTableContext context;
        AxUrlMenuItem menuItem;

        // Dataset'te mevcut olan satir alinir.
        row = AxDataSource1.GetDataSet().DataSetViews["smmBusRelTable"].GetCurrent();

        // Mevcut datasource satirindan context nesnesi yaratilir.
        context = AxTableContext.Create(row.GetDefaultTableDataKey(row.DataSetView.Metadata.RootDataSource));

        // Sayfayi acmak icin AxUrlMenuItem olusturulur.
        menuItem = new AxUrlMenuItem("OBSBrAddDeneme");

        // Olusturulan menu item'a context belirtilir.
        menuItem.MenuItemContext = context;

        // ve sayfa yonlendirmesi yapilir.
        Response.Redirect(menuItem.Url.OriginalString);

Geçiş yaptığınız sayfada ise artık bu contexti kullanabilirsniz.

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

Axapta Date Null Kontrolü

Ocak 23, 12 Yazan: akın

Axapta’da tarih alanlarında null değerler için sabit bir değer atanır. Bu alanın null olup olmadığını Global class’taki methodu kullanarak kontrol edebilirsiniz.

if (date == Global::datenull())

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

SEO

Ocak 21, 12 Yazan: akın

Sende mi SEO ile uğraşıyorsun diyenleriniz olabilir fakat SEO’nun tam olarak ne demek olduğunu ve yine bazı çalışmalarımın ışığında değişen dinamikleri paylaşınca sanırım bana hak vereceksiniz. Seo’nun açılımı Search Engine Optimization olup arama motorlarına ait robotik botlara yardımcı olmaktan başka birşey değildir.

Seo’nun ilk yıllarında bunun tamamen arama sonuçlarını manipüle etmek olduğu anlaşılıyordu fakat hiçbir zaman öyle olmadı. Google’ın algoritmalarında amaç yüksek puanlı sayfaları üst sıralarda çıkarmaktı. Yaklaşık 200 kriteri değerlendirerek sizin sayfalarınıza bir not verir ve arama sonuçlarındaki başarınız ortaya çıkardı. Anlayacağınız üzere Google milyarlarca sayfaya not vermiş durumda. Tabii ilk zamanlarda (5-6 yıl önce) bir sayfanın öne çıkmasındaki en büyük etmen popülerlikti. Bu durumda sizin sayfanızdan kaç kişi bahsemişse o kadar yukarıda oluyordunuz.

Uyanık kullanıcılar para karşılığı bu işi yapınca Google’da önlem almak zorunda kaldı. Neyseki son PANDA algoritması sayesinde oldukça başarılı oldu. Artık popülerlik değil; özgünlük, güncellik, sosyal medya başarısı gibi kriterler ortaya çıktı. Ayrıca Link Bait gibi bir kavram ortaya atıldı.

Google kısaca kullanıcıya ne kadar iyi bilgi verirsen o kadar öne çıkarsın diyor. Link Bait ise yazılarınızda video, resim.. vs gibi görsel marteryallerin yanında yeterli ölçüde yazı yazmanız gerektiğini anlatan bir terim.

SEO kavramı ikiye ayrılmış durumda. On-Page Seo ve Off-Page seo. On-Page Seo tamamen site üzerinde yapmanız gereken önemli değişiklilerdir. Mesela artık xhtml değilde html5 kullanmanız, W3C standartlarını tutturmanız, User friendly url kullanmanız gibi. Off-Page Seo ise tamamen arama sonuçlarını manipule etmenize yönelik çalışmalardır. Kesinlikle kaçınmalısınız. Bir kere bulaşırsanız sürekli devam etmelisiniz. Bir süre bırakmanız sitenizin hemen spam olarak algılanmasına sebep olacaktır.

Size tavsiyem iyi bir seo uzmanı ile sadece On-Page seo çalışması yapıp geriye kalan tüm enerjinizi kullanıcının daha çok yararlanmasına harcamalısınız.

Google sürekli algoritma değiştirdiği için son değişikliği de kendi tespitlerime dayanarak söylemek istiyorum. Son 2-3 senedir Google’ın en çok sevdiği sistem şüphesiz WordPress’ti fakat özellikle yabancı sitelerdeki gözlemlerim bunun değiştiğini söylüyor eğer Amerika’da başladıysa Türkiye’ye gelmesi yakındır.

WordPress sitelerin index sayıları ve başarılı tartışmasız çok iyiydi. Bunu bilen akıllı! site sahipleri hemen spam sitelerini WordPress olarak açmaya başladılar ve şu anda spam sitelerin neredeyse tamamı WordPress kullandığı için projelerinize wordpress ile başlamak akıl karı değil.

Eskisi kadar sevilmiyor. Custom code ve tasarımla yola başlamanız sizin için daha hayırlı olacaktır. Son olarak bu işi profesyonel olarak yapmayı düşünenlere şunu belirtmek istiyorum. Geçen sene Seo alanındaki ilk firmalardan bir tanesinin yıllık cirosu 100 mio $ olarak açıklandı.

Ülkemizde oldukça bakir olan bu sektöre girerseniz bir kaç sene içerisinde doğru iş yaptığınızı anlarsınız. Bu arada size hemen bir başlangıç noktası vereyim. Google her yeniliği önce Amerika’da yapıyor tutarsa diğer ülkelere uyguluyor. Bu durumda gözünüz sürekli Google Amerika’daki değişikliklerde olmalı.

Sen neden girmiyorsun diye aklınıza bir soru gelirse, şunu belirteyim kariyer hedefim çok farklı bir noktada..

 

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

Kar 2: Çalışmak Güzeldir :)

Ocak 20, 12 Yazan: akın

 

müzik

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email] 

Kar 1 :)

Ocak 18, 12 Yazan: akın

[del.icio.us] [Facebook] [Fark] [Faves] [Furl] [Google] [MySpace] [MyWeb] [Newsvine] [Reddit] [Slashdot] [StumbleUpon] [Windows Live] [Yahoo!] [Email]