‘ Yazılım ’ Adlı Kategori

Axaptada Regular Expression ve Sayı Alanları

Şubat 17, 12 Yazan: akın

Axapta içinde veya Enterprise portal’de müşteri bilgileri için almanız gereken verilerden bir tanesi de telefon numarasıdır.

Axapta’nın kendi içinde, telefon numaraları için, sadece sayı girişine izin veren bir kontrol bulunmuyor fakat kullanabileceğiniz birkaç yöntem var.

Bunlardan bir tanesine Axapta’da Classes\TaxVATNumValidate\isNumeric yolundan ulaşabilirsiniz. Methodu inceleyerek oradaki yöntemi kullanabilirsiniz. Diğer bir yöntem ise string değeri isInteger methodu ile kontrol edip, sayı olup olmadığına bakabilirsiniz.

Benim göstermek istediğim yöntem ise Regular Expression kullanarak girişleri validatewrite veya validatefield methodunda kontrol etmek.

Regular expressions, .net’te çalıştığım zaman, sıkça kullandığım yöntemlerden bir tanesi. Axapta’da fazla ihtiyacım olmasa da kullanmam gereken yerler çıkıyor.

Aşağı kodu inceleyip nasıl kullanıldığını anlayabilirsiniz.

TextBuffer txt = new TextBuffer();
str phone = "AkinDeneme55544";
;

txt.setText(phone);
txt.regularExpressions(true);

if (!txt.find("^[0-9]+$"))
{
    error (strfmt("Telefon numarasini kontrol ediniz."));
}

[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] 

Axapta Action Menu Item kullanarak Enterprise Portal’de yönlendirme sağlamak

Şubat 08, 12 Yazan: akın

Enterprise Portal’de bir işlevi geliştirmeye çalışırken Axapta’da yazdığınız class’ları çağırmanız gerekebilir. Bu işlevi gerçekleştirmek için birden fazla yönteminiz var. Direk Bussiness Connector ile çağırabileceğiniz gibi, Proxy kullanarak da çağırabilirsiniz. Bu yazıda ise Action Url Menu Item ile bir işlevi gerçekleştirdikten sonra yönlendirmenin nasıl yapılacağını göstereceğim.

Aşağıdaki kodu kullanarak, Axgridview’den seçmiş olduğunuz satırın ActionMenuItem’a parametre olarak gitmesini sağlayabilirsiniz.

 protected void Button1_Click(object sender, EventArgs e)
    {
        DataSetViewRow dsvr;

        AxActionMenuItem projMenuItem = new AxActionMenuItem("PMProjTimesheetView");
        Proxy.Args args = new Proxy.Args(this.AxSession.AxaptaAdapter);
        
        dsvr =this.AxDataSourceProjListTmp.GetDataSet().DataSetViews["ProjTable"].GetCurrent();
        IAxaptaRecordAdapter projTable = dsvr.GetRecord();

        
        args.record = projTable;
        projMenuItem.Run(args);
    }

ActionMenuItem’a ProjTable’da seçili kaydı gönderdik. Aşağıdaki kodu ise ActionMenuItem’ın ilişkili olduğu class’ta kullanabilirsiniz.

static void main(Args args)
{
    ProjTable           projTable;
    Weblink             link;
      ;
    if (args.dataset() == tablenum(ProjTable))
    {
        projTable = args.record();
        link = new Weblink();
        link.record(projTable);
        link.menufunction(new WebUrlMenuFunction(weburlitemstr(EPProjTableInfo)));
        webSession().redirect(link);
    }
}

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

Enterprise Portal’dan Axapta Datasource’a Veri Göndermek

Şubat 01, 12 Yazan: akın

Enterprise portal’da proje geliştirirken bildiğiniz gibi gerekli datasource ları Axapta tarafında oluşturuyorsunuz. Tabloya kayıt edilirken bazı başka tablolara da kayıt atmanız gerekebilir. Bu durum da datasource’a codebehind’tan context ile ilgisi olmayan bir veri göndermek isteyebilirsiniz. Aşağıdaki kod parçacıkları sizin ihtiyacınızı karşılayacaktır.

 protected void Page_Init(object sender, EventArgs e)
    {
        

        // Event Handler olusturulur.
        this.AxDataSource1.CreatingDataSetRun +=new EventHandler<CreatingDataSetRunEventArgs>(AxDataSource1_CreatingDataSetRun);
    }

    void AxDataSource1_CreatingDataSetRun(object sender, CreatingDataSetRunEventArgs e)
    {
         
        string book = "ISBN-00034454";

        // book degiskeni dataset parametresi olarak gönderilir.
        e.DataSetRunArgs.parm = book;

    }

Yukarıda gönderdiğiniz değişkeni kullanmak için ise Axapta’da ilgili datasource’da aşağıdaki gibi bir kod kullanabilirsiniz.

public void initValue()
{
    super();

    CustomerDetails.ISBN=element.args().parm();
}

Benzer yöntemle enum veya gerekli herhangi bir veriyi de gönderebilirsiniz.

[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] 

Tespitler

Ocak 08, 12 Yazan: akın

Zaman zaman gözüme çarpan şeyler hakkında birşeyler yazdığımı blogumu takip eden kişiler biliyorlardır.

Zaman kısıtından dolayı sohbete girmeden aktarmak istediğim konuya giriyorum. Türk teknoloji kullanıcılarının çok büyük bir kısmı hayatlarını kolaylaştıracak ve düzene sokacak yazılımları kullanmıyorlar varsa yoksa oyun, sosyal medya veya instigram gibi eğlenmeye yönelik yazılımları kullanıyorlar.

Bunları gereksizdir demiyorum fakat ellerindeki cihazların daha etkileşimli kullanılabilmesi için eğlencenin dışında da kullanmalarını öneririm. Mesela bir iki gün önce App World’de dolaşırken finans konusundaki yazılımları inceliyordum.

Finans yazılımlarından kastım kişisel olarak harcamalarınızı kontrol edebileceğiniz, bütçeleme yapabileceğiniz yazılımlardan bahsediyorum. Yurtdışında oldukça yoğun olarak kullanılan bu yazılımlar Türkiye’de malesef kullanılmıyor. Bu yazılımlar günlük harcamalarınızı, faturalarınızı vs girerek gününde ödemenizi sağlıyorlar. Belli sürede para biriktirmeniz için harcamalarınızı düzenliyorlar. Ülkemizdeki bankacılık sisteminin oldukça gelişmiş olmasından dolayı bu yazılımların kullanımı gereksizleşebiliyor  fakat benim anlatmak istediğim konu bu değil tabii.

Finans yazılımlarına ek olarak diyet veya spor gibi sağlık yazılımları da olabilir ya da belli bir alışkanlığınızı sistemik olarak terketmenize yardımcı olacak (sigara gibi) yazılımlar da örnek verilebilir. (Eğitim, Okuma alışkanlığı vs..) Bu örnekler daha da arttırılabilir.

Kısaca bu yazımdan etkilenip telefonunu daha efektif kullanmak isteyenler, öncelikle kendilerini gözlemleyerek değiştirmek/geliştirmek istedikleri yönleri ile alakalı yazılımları App Storeları, Worldleri gezerek keşfedebilir telefonlarını asistanları olarak kullanabilirler.

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

Retail Store Connect Gereksinimleri ve Kurulumu

Kasım 11, 11 Yazan: akın

Retail Pos ve Ax For Retail arasındaki veri alışverişinin bu servisler üzerinden yapıldığını söylemiştim.  Microsoft Dynamics’in sunduğu Retail sürecinde aslında dört modül işlemektedir. RSC ise bu ayaklardan bir tanesini temsil ediyor.

Retail Modüllerinin kurulumu aslında oldukça basittir. Bir kaç NEXT tuşuna basarak bu işi tamamlayabiliyorsunuz. Biraz zahmetli olan kısım ise kurulum sonrası ayarlarda ve sorunsuz bir şekilde veri alışverişlerinin gerçekleşmesinde.

Özellikle perakende sektöründe her akşam Merkez ve Kasalar arasında veri alışverişi yapılır. İşlemler merkeze, personel, ürün stok bilgileri ise kasalara gönderilir. Alış verişi sağlayan ise RSC servisidir.

Tanım kısmını geçip asıl yazının amacı olan noktalara geleyim. RSC kurulumu 1-2 dakika civarı süren çok küçük bir dosyadır fakat bu kurulumu yapmadan önce aşağıda listesini verdiğim kütüphaneleri bilgisayara kurmuş olmanız gerekir.

* Microsoft SQL Server 2005, 2008 Standard, Enterprise veya Express Edition (normal veya R2)

* Windows Installer 4.5

* Microsoft .NET Framework Version 3.5

* Microsoft Visual C++ 2008

* OPOS Comon Control Objects

Bu gereklilikleri bilgisayarınıza kurduktan sonra tek yapmanız gereken RSC kurulumunu başlatmanız.

Bu noktaya kadar yukarıdakileri eksiksiz yapmış olmanız gerekiyor. Şimdiki adımda RSC servisinin jobları takip edebileceği ve loglayabileceği veritabanını kurmamız gerekiyor.

Retatil Store Connect kurulum klasörüne gidip DATA dizininde yer alan AXRETAILMSG scriptini Sql Server da çalıştırmamız gerekiyor.

AXRETAILMSG Dizin

Scripti çalıştırırken bazı hatalarla karşılaşabilirsiniz. Önemli hatalar olmamakla birlikte çabucak düzeltip scriptin düzgün çalışmasını sağlayabilirsiniz.

Şimdiki adımda ise RSC servisini kurmamız. Burada öncelikle Retail veritabanlarına yetkisi olan bir kullanıcıya ihtiyacımız var. Size tavsiyem servislerin çalışmasını sağlayacak Local Admin yetkisine sahip bir kullanıcı tanımlayıp, hepsinde aynı kullanıcıyı kullanmanız.

retail store connect service

Retail Store Connect Settings’i çalıştırıp,  servis ismini yazarak Add diyoruz ve servis kurulumuna başlıyoruz.

retail store connect kurulumu

İlk ekranda Logların tutulacağı database bilgilerini yazıyoruz. Server ismini ve verdiğimiz database ismini yazıyoruz. RSC’nin daha önceki sürümlerinde veritabanı ismi sabitti ama şimdi değiştirebildiğimiz için bu ekran karşımıza çıkıyor.

retail store Connect Account Tanımı

Veritabanı tanımından sonra karşımıza çıkan ekran RSC servisinin hangi kullanıcı ile başlatılacağını belirtiyor. Kuruluma başlamadan önce Local admin yetkisi ile tanımladığımız kullanıcıyı bu ekranda kullanıyoruz. Bu ekranı da geçtikten sonra RSC ayarları tamamlanmış oluyor.

Son adım ise RSC servisini çalıştırmadan Servisler ekranını açıp kullanıcı ayarlarını güncellemek. Servisler ekranı için Start  > Run > services.msc yazabilirsiniz. Açılan ekranda Retail Store Connect servisini bulup sağ tıklayarak özellikler ekranını açıyoruz.

Açılan ekranda LogOn sekmesinde kullanıcı bilgilerini tekrar yazarak APPLY diyoruz. Şimdi servisimizi tekrar çalıştırabiliriz. RSC ayarları için yapılması gerekenleri tamamladık.

Daha önceki şu yazımda veri iletişimi yapılacak her noktaya RSC servisi kurulması gerektiğinden bahsetmiştim. Bu durumda diğer noktalara da bu servisi kurup yukarıda bahsettiğim ayarları gerçekleştirmeniz gerekiyor.

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