How long have you been using Microsoft Dynamics Ax?

Toplam Sayfa Görüntüleme Sayısı

Popular Posts

Translate

Bu Blogda Ara

25 Aralık 2012 Salı

Calling methods on a caller form


Hi All,

When we call object from form and on this object we need a method from caller form use identifierStr and formHasMethod functions.

Code example below describes how to call caller objects methodName named method from called object.

To check caller has the method just call formHasMethod with caller object and name of the method parameters.

If returns true you can assign caller object to Object type variable and simply add the method name.



Object                  formRunObject;

if (args.caller() && formHasMethod(args.caller(), identifierstr(methodName)))
 {
        formRunObject = args.caller();

        formRunObject.methodName();  

}

Happy AXing.
Alper.

21 Kasım 2012 Çarşamba

Group by on lookup

Hi,

When we need to group by the query values on lookup we need to use parmUseLookupValue(false) method.


public void lookup()
{
    SysTableLookup sysTableLookup;
    Query q = new Query();
    ;
    sysTableLookup  = SysTableLookup::newParameters(tablenum(TableName),this);
    q.addDataSource(tablenum(TableName)).orderMode(OrderMode::GroupBy);
    q.dataSourceTable(tablenum(TableName)).addGroupByField(fieldnum(TableName,FieldName));
    sysTableLookup.addLookupfield(fieldnum(TableName,FieldName));
    sysTableLookup.parmUseLookupValue(false);
    sysTableLookup.parmQuery(q);
    sysTableLookup.performFormLookup();
}

Have a nice coding with AX.

8 Ekim 2012 Pazartesi

Anniversary

Happy 8 th year in Axapta for me :)

Axapta'da geçen 8 yılım kutlu olsun :)

3 Eylül 2012 Pazartesi

Microsoft Logo Değiştirdi/ Microsoft has changed logo



Artık yeni logosu ile daha güçlü.
Microsoft is now better with his new logo.
Windows Server 2012 lansmanı ile ilgili bilgilere ekteki linkten ulaşabilirsiniz.

You can reach detailes about Windows Server 2012 from the link below.

http://www.windowsserver2012lansman.com/


31 Ağustos 2012 Cuma

Edit method ile çoklu kayıt seçimi


Merhaba,

Grid üzerinde bulunan kayıtları işlem yapmak için seçmenin çeşitli yolları mevcut. Yollardan biri grid'e bir checkbox ekleyip seçilen kayıtları bir map ile yönetmek.

Form üzerinde değeri değiştirilebilen display alanların arkasında çalışan method tipi edit methoddur edit methodlar 3 adet parametre alırlar bunlardan ilki alanın değerinin değiştirilmek için seçilip seçilmediği set değişkeni, ikincisi gönderilen kayıt bilgisi ve son değer ise kayıt bilgisinin seçilmek üzere mi yoksa seçiminin kaldırılması için mi tıklandığı bilgisi mark değişkeni.

edit NoYes MarkRecords(boolean set,tabloAdi tabloDegiskeni,NoYes _mark)
{

    if (set)
    {
        MarkMap.insert( tabloDegiskeni .RecId , tabloDegiskeni.stringAlan);
        MarkMap.valueSet();
    }
    else
    {
        if (MarkMap.exists(PackingSlip.RecId))
        {
           _mark = MarkMap.lookup(PackingSlip.RecId);
        }
    }

    return _mark;
}

classDecleration da MarkMap değişkenini tanımlıyoruz.

init() methodunda MarkMap değişkeninin Map tipini belirliyoruz

MarkMap = new Map(Types::Int64,Types::string) gibi

sonrasında istenilen yerde mapEnumerator ile MarkMap değişkenindeki değerleri listeliyoruz.

Bol AX lı günler,
Alper.



28 Ağustos 2012 Salı

DATA MIGRATION TOOL

In AX2012 data migration tool is awesome. As if in Ax2009 you can set your own fiels etc. but some specific tables are set by Microsoft. So it is easier to select the tables for the user that know AX less.


27 Temmuz 2012 Cuma

Flush .Net Business Connector Cahce

Hi,

When you edit some method on class in AX and then use it on BC you will notice .Net code uses the old method.

You can restart IIS, AOS or both but this is not the best solution and not always solve our problem.
We just need to flush the AOD on AX side.
We will just write one line code to the .net application 
Microsoft.Dynamics.BusinessConnectorNet.Axapta.CallStaticClassMethod(“SysFlushAOD”, “doFlush”);
You can use this code after Axapta logon and just before calling the static method.
Hope it helps,
Have a nice AXing,
Alper.


26 Temmuz 2012 Perşembe

List all tables on AX / Tüm tabloları listeleme

Hi,

If you need to list all tables on AX you need to call Global::pickTable method it will return tablenum after that you can do whatever you want.

Example :
    info(tableid2name(Global::pickTable()));

Happy AXing,
Alper.

/////////////////////////////////////

Merhaba,

AX üzerinde açılmış tüm tabloları listelemek istediğinizde yapmanız gereken tek şey Global sınıfının altındaki pickTable methodunu çağırmak. Bu method seçilen tablo adının id sini size geri dönüyor. Geri dönüş değerini aldıktan sonra istediğiniz gibi değeri kullanabilirsiniz.

Örnek
    info(tableid2name(Global::pickTable()));

Bol AX lı günler,
Alper.

24 Temmuz 2012 Salı

Coloring grid lines or cells from code / Grid alan veya satırlarını kod ile renklendirme

Hi,

We can color up grid lines by using displayOption. On forms datasource expand methods click right mouse ,select overwirte function and select displayOption.

For code example open tuttorial_Form_displayOptions form


public void displayOption(Common _common, FormRowDisplayOption _options)
{
    // here's the logic which derteminates the color for this row
    // In this case it will random color the lines
    if (_common.recId mod 3 ==0)
    {
        _options.backColor( WinAPI::RGB2int( 255,0,0 ));
    }
    super(_common,_options);
}

With this code example if recId's mod  is equal to 3 it will paint the entire row to red. But if we want to paint only one cell individually we will use

_options.affectedElementsByControl(CustTable_Name.id());

As you can see we used affectedElementsByControl method to paint only sellected control.


Happy Axing.
Alper.


////////////////////////////////////////////////////////////////////


Merhabalar,

Form üzerindeki gridlerde istenilen koşula göre renklendirme yapmak istediğimizde form veri kaynağı üzerinde bulunan displayOption methodunu ezeceğiz.

Methodu ezmek için form un altında yer alan veri kaynağının methodlarını genişletip yöntemi geçersiz kıl ı seçtikten sonra açılan listeden displayOption ı seçiyoruz.

Örnek kod olarak  tuttorial_Form_displayOptions formunu kullabiliriz.


public void displayOption(Common _common, FormRowDisplayOption _options)
{
    // here's the logic which derteminates the color for this row
    // In this case it will random color the lines
    if (_common.recId mod 3 ==0)
    {
        _options.backColor( WinAPI::RGB2int( 255,0,0 ));
    }
    super(_common,_options);
}

Bu örnekte custtable ın RecId alanının değerinin mod 3 e göre değeri 0 olduğunda kayıdın bulunduğu satırı tümüyle kırmızıya boyuyor.

Eğer tüm satırı değilde sadece tek bir alanı boyamak istersek koda alttaki satırı eklememiz yeterli.

_options.affectedElementsByControl(CustTable_Name.id());

Bu şekilde affectedElementsByControl methodunu çağırarak boyama işleminin sadece parametre olarak gönderdiğimiz  CustTable_Name.id() konrolü için geçerli olduğunu belirtiyoruz.


Mutlu AXlar,


Alper.



1 Haziran 2012 Cuma

Working with Enum values / Enum değerleri arasında gezinmek



Hi,

To work with enum values you need to use DictEnum class. After you get the count you can do whatever you want.

Have a nice AX day,
Alper.

   
    EnumId   enumId   = enumNum(SalesStatus);
    DictEnum dictEnum = new DictEnum(enumId);
    int      count  = dictEnum.values();
    int      counter 

    for(counter = 0; counter < count; counter ++)
    {
        // You can use the number of method exposed by DictEnum class
        // dictEnum.name(counter)
        // dictEnum.index2Value(counter)
        // dictEnum.index2Symbol(counter)             
        // dictEnum.index2Label(counter)
    }



28 Mayıs 2012 Pazartesi

Write methodu ile insert ve update

Merhabalar,

AX geliştirmelerinde kimi zaman eldeki verinin ilgili tabloda olup olmadığı bilgisini bilemediğimiz durumlar oluşabilir, bu tip durumlarda tablonun write() methodu kullanılabilir.

Write() methodu gelen kayıt tabloda var ise kayıdı verilen değerler ile günceller eğer yok ise tabloya kayıdı ekler.

TabloAdi tabloDegiskeni;
;
ttsbegin;
select forupdate tabloDegiskeni where tabloDegiskeni.primaryKeyfield1 == 123;
tabloDegiskeni.primaryKeyfield1 = 123;
tabloDegiskeni.field2                   = "abc";
tabloDegiskeni.write();
ttscommit;

Böylelikle kayıt var mı yok mu diye koşullar yazmaya kodu uzatmaya gerek kalmadı.

Bol AX'lı günler,
Alper.

Working with RecordInsertList / RecordInsertList ile çalışmak


Hi,

When we need to insert multiple records to the database in one trip, for performance or something else we sholud use RecordInsertList class.

In example below we declare a RecordInsertList variable with table number and use add() method to add new record to the array list by using tableVariable.

After we finisheded to add new records to the RecordInsertList we call insertDatabase() method to insert record list to the database with one trip.

Have a nice coding,
Alper.

-------------------------------------

RecordInsertList ril = new RecordInsertList(tablenum(TableName));
TableName tableVariable;
;
tableVariable.field1 = "abc";
tableVariable.field2 = 123;
ril.add(tableVariable);
ril.insertDatabase();

-------------------------------------

Merhabalar,

RecordInsertList sınıfını çoklu kayıt girişlerinde her seferinde veri tabanına gidip gelinmesinin önüne geçmek ve performans kazanmak için bir liste oluşturmak için kullanıyoruz.

Bu liste sayesinde kayıtlarımızı add methodu ile listeye ekliyor ve işlemler bittikten sonra insertDatabase ile tek seferde sunucuya gönderebiliyoruz.

Bol AX' lı günler
Alper.




10 Mayıs 2012 Perşembe

İlk Axapta Deneyimi / First Ax Setup Experience

İlk Axapta kurarken neler hissettiniz? Axapta ile çalışırken başınızdan geçen maceralar nelerdir?

What did you think of the first experience of Axapta setup? Tell us about the adventures during Ax implementations.


Ax 2012 ile ilgili ilk görüş

Bugün güzel bir gün. Çünkü ilk defa Ax 2012'yi detaylı inceleme imkanı buldum.

İncelediğimizde ilk dikkatimi çeken Ax2009'da yer alan yerleşim yapılarının artık tüm ekranlarda uygulanması oldu. Yani artık butonlar formların sağında değil üst tarafında yer alıyor. Aynı zamanda artık formlar üzerinde tablar yer almıyor. Herbiri aynı sayfa üzerinde görüntüleniyor. Yani Microsoft benim takip ettiğim kadarı ile Ax 3.0'dan bu yana gelen geleneğini bozarak tamamen farklı bir görselliğe bürünmüş aslında ki bunun sinyallerini Ax2009'da da vermişti.

Ben eski bir kullanıcı olarak görselliği karmaşık olarak yorumlasam da aslında kendimi yeniliklere biraz kapalı olarak gören biriyim. Uzun vade de bu görüntüye alışacağımı ve daha da rahat kullanacağımı tahmin ediyorum ki ilk kullanacaklar sisteme daha hızlı adapte olacaklardır.

Açılan ekranlar Ax2009'un aksine ortak formlar Ax 4.0 ve 3.0 'da olduğu gibi programın içerisinde açılıyor. Sorgulama,raporlamalar, kurulum v.s. ise yine menüde ayrı pencere olarak açılıyor.

Formlar üzerinde buton ile yapılabilecek işaretleme fonksiyonalitesi gelmiş. Artık sadece işaretlenen kayıtlar da Excel'e gönderilebilmektedir.

Ortak ekranlar üzerinde kayıt girme ve edit etme yerine artık ortak tablo üzerinden çift tıklayarak ya da yeni oluştur diyerek kayıtların üzerine gidilebiliyor.

Sistemin arka tablolarına bakıldığında ise tablo isimlerinin çoğunun değiştiğini ve hatta parçalandığını görebiliriz. Örneğin artık LedgerTable ya da LedgerTrans tabloları yok.

Form üzerinde sağ klik yaparak tablo bilgileri incelenmek istendiğinde yeni bir Ax açılıyor. Kodun içerisinde gezinirken labelların üzerine bakıldığında arama metnini sorgulamadan açıklama kursörüm üzerinde görüntülenebiliyor.

Para birimleri ile kurların belirlendiği ekranlar ayırılmış.
TL Iso kodları arasında yer almıyor.

Henüz lokalizasyon oluşmuş değil.

Tahsisat koşulları hesap planı üzerinden kaldırılarak genel muhasebe parametreleri altına taşınmış durumda.

Bütçe yapısı ile tamamen değişmiş ve geliştirilmiş. Bu konuyu başka bir blogda inceleyeceğiz önümüzdeki günlerde.

Hareket nakil açıklamaları diye bir kurulum adımı eklenmiş. Satınalma, bütçe ve banka gibi sekmelerde tanımlanacak hesaplar yer alıyor. İşlevselliğini henüz bilmiyorum ama kullarak öğreneceğiz sanırım.

Hesap planında hesap oluştururken kayıt başlangıç tipini vermek mümkündür.

Muhasebe'de periyodik adımları altında pek bir değişiklik ilk bakışta görünmüyor.

Sekme (Tab) yapısı değiştirilmiş. Genellikle ekranlar üzerinde sekmeler olmadığı gibi kayıt bilgilerinin girişi için webpage tarzında ekran içerisinden ok ile kayıtla raçılarak giriş yapılıyor.

Yetkilendirme tamamen roller üzerinden çalışıyor.

Ana tabloya git adı detayları göster olarak değişmiş.

Sağ klik ile sık kullanılanlarıma (Favorites) ekranların taşınması mümkün.

Kayıtlar üzerinde değişiklik yapıldıktan sonra ortak formların güncellenmesi gerekiyor. İşlemin hemen ardından güncellenmiyor.

İşin güzel yanı artık sipariş üzerinden toplamları görebiliyorsunuz. Ve oluşacak fiş için hangi hesapların çalışacağı görüntüleniyor..

Aot üzerinde tablolarda yaratılmış tüm alanlar A'dan Z'ye sıra ile konulmuş.
Hesap Planı ise hesap adına göre sıralanmış.

Hesap planı ile ilgili kurulum zor gibi görünse de aslında global olarak yapıldığından ve şu andaki kurulum büyük ve konsolide şirketler için bir çözüm de sunduğundan bu tanımlamaların bir seferlik yapılması gerekiyor.

Raporlar Reporting Services üzerinden çalışıyor.

Mizan ise (Trial Balance) Excel'e benzer bir formatta görünüyor. Güzel yanı sadece hesap üzerinden değil seçilen muhasebe boyut seti üzerinden raporlama yapmak mümkün. Yani araçların, personelin, telefonun mizanı çekilebilir.

Hesap planı takma adı diye bir fonksiyonalite gelmiş.
Bu fonksiyonalite doğru kullanılırsa veri girişlerini oldukça hızlandıracaktır.
Bu fonksiyonalite ile hesaplar ilgili boyutlara bağlanabilmektedir. Ve bu bağlantı kullanıcı ve kullanıcı grubu bazında yapılabilmektedir. Örneğin bir kullanıcı sadece araç faturası giriyor ise ve ilgili gider hesapları ilgili araçlara bağlanırsa kullanıcı tek bir hareket ile hem hesabı hem boyutları seçmiş olur. Tek tek boyut girmesine gerek kalmaz. Bununla birlikte yanlış kurulması durumunda seçim ekranında (Lookup) kirliliğe neden olabilir.

Boyutlara gelince; İstenildiği kadar boyut açılabilmekte ve boyutlar birbirine bağlanabilmektedir. Boyut bağlantıları Ax2009'da vardı fakat istenildiği kadar efektif kullanılamıyordu. Bu versiyonda da detaylı incelemek ve bir projede uygulayıp bakmak gerekebilir.

Veri aktarım yapısı ise tamamen değişmiş durumda. Örneğin artık hesap planını sisteme aktarmak için veri aktarım sihirbazı kullanılmayacak. Bir kere tüm tanımlamalar yapıldıktan sonra Excel'i açmak yeterli olacak.
Excel'i açtıktan sonra Dynamics Ax tabında Veri al ve güncelleme yapılması yeterli.



Devam edecek...



30 Nisan 2012 Pazartesi

Satış İpuçları/Clues to Sell

Axapta satışı için ön plana sunulabilecek ana maddeleri aşağıdaki gibi sıralayabiliriz:


  • Esnek geliştirme yapısı ve katman mimarisi
  • Geniş yetkilendirme yapısı. (Tablo, alan ve data bazında)
  • Yasal mevzuatlara uygunluk
  • Microsoft ürünü olması
  • Workflow (İş Akışı)
  • Enterprise portal (Kurumsal Portal) ve lisanslama
  • Mali tabloların esnekliği
  • Boyut kavramı (Doğru ve basit anlatmak gerekir.)
  • Stok Boyutları
  • Konsolidasyon ve şirketler arası işlemler
  • Kullanıcı dostu yapısı (Fiş giriş ekranlarının kolaylığı, outlook görünümü, Excel ile iletişim gibi)
  • Grafiksel Raporlama
  • UFRS
  • Uyarılar
  • Filtreleme
  • Veri Aktarımı
  • Fiyat Listeleri
  • Planlama (Master Planlama)
  • Belge ekleme, kayıt arama
  • Kullanıcı Raporları gibi...

Detayları sonraki bloglarımızda yer alacaktır.

...................................................................................................................................................

To sell AX you can use these powerfull sides of AX below:

  • Development and layer structure
  • Authorization (By table, field and data)
  • Including legal legislations
  • Product of Microsoft
  • Workflow
  • Enterprise Portal and licencing
  • Usage of financial statements
  • Ledger dimensions
  • Inventory dimensions
  • Consolidation and intercompany transactions
  • User Friendly Screens (Voucher entry, outlook sight, Excel functionalities)
  • Reporting with graphs
  • IFRS
  • Warning structure
  • Filtering
  • Data import and export
  • Price lists
  • Master planning
  • Document insert, data search
  • User reporting etc...
You can find detailed versing later on in the blog

Auto Logoff güncelleme

Merhaba,

AX oturumlarının işlem yapılmaması durumunda otomatik kapatılmasını istiyorsak Araçlar -> Seçenekler ekranında bulunan Genel tabı altında Otomatik kapatma alanına bir değer girmeliyiz.

Bu ekran kullanıcı bazlı çalıştığından her kullanıcı için tek tek tanım yapmak zor gelebilir, koddan hepsine yapalım desek Admin grubundakiler bunu istemeyebilir.

Bu durumdan kurtulmak için aşağıdaki kodu kullanabiliriz.


UserGroupList   UserGroupList;
UserInfo        UserInfo;
;
    try
    {
        ttsbegin;
        while select forupdate UserInfo
        {
            select * from UserGroupList
            where UserGroupList.groupId == "Admin"
            && UserGroupList.userId == UserInfo.id;
            if(!UserGroupList)
            {
                UserInfo.autoLogOff = 20;
                UserInfo.update();
            }
        }
        ttscommit;
    }
    catch (exception::Error)
    {
        throw error("Hata oluştu.");
    }


Bu sayede Admin grubundakiler hariç tüm kullanıcıların Otomatik kapama seçeneğini 20 dk ile sınırlandırmış oluyoruz. İsterseniz bu kodu switch case ile kullanıcı grubu bazında farklı değerler ile çalışacak hale getirebilirsiniz.

Bol AX lı günler.
Alper.


AX 2012 Setup


Video guide to install lastest version of Microsoft Dynamics AX 2012.



Thanks to GuideToLearn.

Have a nice AX days,
Alper.

Ax2012

Ax2012 ile ilgili detaylı açıklamanın en güzel bulunabileceği yer bence Microsoft'un sitesidir.

You can find detailed information of Ax2012 at Microsoft site for my opinion.

http://www.microsoft.com/en-us/dynamics/products/ax-2012-launch.aspx

İlerleyen günlerde bu blogda benim yorumlarıma da erişebileceksiniz.
Later on you would find my own opinion too on this blog.

26 Nisan 2012 Perşembe

MUHASEBE RAPORLARI

Axapta'da yer alan birçok resmi ve operasyonel rapor bulunmaktadır. Bunlar arasında en çok kullanılanların listesi aşağıda yer almaktadır.

  • Mizan
  • Muhasebe Fişi
  • Müşteri/Satıcı/Genel Muhasebe Hesap Ekstreleri
  • Mali Tablolar (Gelir Tablosu, Bilanço, Gider Raporları, Konsolide, Bütçe karşılaştırmalı...)
  • Muavin Defter
  • BA/BS Raporları
  • İndirilecek KDV Listesi
  • Hesaplanan KDV Listesi
  • Yevmiye Defteri
  • Defteri Kebir
  • Deftere Nakledilen Satış Vergisi (Sorgu)
  • Fiş Hareketleri (Sorgu)
  • Hesap Denetim Klavuzu (Sorgu)(Muhasebeye kim, ne zaman, hangi kaydı oluşturdu?)
  • Boyut Ekstresi
  • Satış Vergisi Ayrıntılar
  • Sabit Kıymet Amortisman Defteri
  • Çek/Senet Bordro Raporları
  • Portföy Dökümü
  • Tarih itibari ile Portföy Dökümü
  • Çek/Senet Akıbet Raporu
  • Madde Grubu Bazında Stok Değeri
  • Eldeki Stok
  • Stok Hareketleri
  • Müşteri/Satıcı Açık Hareketler
  • Müşteri/Satıcı Fatura (Sorgu)
  • Müşteri/Satıcı Yaşlandırma Raporu

ODBC ile dış veri tabanından veri almak

Merhaba,

SQL bağlantısı dış veri kaynaklarından veri almak gerektiğinde kullandığımız yöntemlerden bir tanesi. SQL bağlantısında çeşitli yöntemler mevcut ama bizim tercih ettiğimiz yöntem hem hız hemde işlemi begin commit işlemi içerisinde yapmak olduğundan ODBC olacak.

ODBC kullanmak için öncesinde sunucu üzerinde bir tanımlama yapmamız gerekiyor.

Windows üzerinde Control Panel (Denetim Masası) -> 
                                                  Administrative Tools (Yönetimsel Araçlar) -> 
                                                                                  Data Sources (ODBC) (Veri kaynakları (ODBC)) 

menü adımı ile ilgili ekranı açıyoruz. Kodda geçen "DSN_Name" kısmında kullanacağımız DSN tanımını yapıyoruz.



ODBCCOnnection                      odbccon;
Connection                                  con;
Statement                                    stmt;
LoginProperty                              loginProperty;
SqlStatementExecutePermission   serverSessionQueryPermission;
ResultSet                                     record;
str                                               qryText;
;

qryText="Select Field1 from Table";
serverSessionQueryPermission = new SqlStatementExecutePermission(qryText);
serverSessionQueryPermission.assert();
loginProperty=new loginProperty();
loginProperty.setOther("DSN=DSN_Name;UID=UserId;PWD=password");
odbccon=new ODBCConnection(loginProperty);
odbccon.ttsbegin();
stmt = odbccon.createStatement();
record = stmt.executeQuery(qryText);
odbccon.ttscommit();
CodeAccessPermission::revertAssert();
while (record.next())
{
     info(record.getString(1));
}


Bu örnek ile Table tablosundan Field1 alanını info ile ekrana basıyoruz.



Sık Kullanılanlarım/Favorites

Microsoft yaptığı çalışmalar sonucunda kullanıcıların çalışma hayatındaki profillerini de göz önünde bulundurarak  menüleri global ihtiyaçlar doğrultusunda oluşturmuştur. Bununla birlikte kullanıcıların gerçek hayatta kullandıkları veri giriş ekranları, sorgulamalar ve raporlar bir elin parmaklarını geçmez. Bu durumda kullanıcılar hızlı olarak çalışmalarını yapabilmek için Axapta'nın sol üst köşesinde yer alan sık kullanılanlarıma sürükle bırak yöntemi ile kendi kullandıkları ekranları yerleştirebilir hatta klasör yöntemi ile bu ekranları gruplayarak kendi menüsünü bilgi işleme ihtiyaç duymadan oluşturabilir.

Microsoft designed the menues through the researches of communities according to the needs of global. But employees mostly use utmost 8 or 10 forms, reports or inwuiries. So to use programme favorites on AX can be used by dragging and dropping. And also can create folders to group the screens and make their own menu without the help of IT.

Şirket İsmi Oluşturma/To Create a Company Name

Şirket İsmi verilirken dikkat edilmesi gereken bir husus ismin kodlama alanında kesinlikler türkçe karakter ve I, i, ı ,I harflerinin kullanılmamasıdır. Bu durumda sistemde açılan şirket silinememektedir. Şirketin silinmesi için kod ile müdahale edilmelidir.

While creating company turkish letters and I,ı,i,I letters must not be used. Otherwise company can not be deleted. To delete the company some coding will be needed.


Bir ERP sürecini aşağıdaki şekilde tanımlamak da mümkündür :)

11 Nisan 2012 Çarşamba

Klasör içerisindeki dosyalarda gezinmek / Scan files in specific folder



Merhaba,

Belirli bir klasör içerisindeki dosyaların arasında gezinmek için kullanabileceğiniz kod örneğini aşağıda paylaşıyorum.

Örnekte c: altında yer alan uzantısı txt olan dosyaların isimlerini info ile ekrana basıyoruz.

Bol AX lı günler,
Alper.

    str                 filename;
    int                 handle;

    ;
    [handle, filename]  =   WINAPI::findFirstFile(@"c:\*.txt");

    while (fileName !=  "")
    {

        info(filename);
         filename    =   WinAPI::findNextFile(handle);
    }



Hi,

When you want to scan files for specific file type in a folder you can use the sample code above.

We use WinApi class for both finding first file and find next file

With this example you can list txt extended filed on c:\ folder.

Have a nice AX days,
Alper.

6 Nisan 2012 Cuma

" ClrObject static method invocation error." / "ClrObject statik yöntem çağırma hatası."

Merhaba,

Dosya kopyalama, silme veya taşıma işlemleri esnasında "ClrObject statik yöntem çağırma hatası." şeklinde bir hata alıyorsanız yapmanız gereken AsciiIo veya diğer tipte oluşturduğunuz değişkeni null değere eşitlemek.

Bu işlemi yaptıktan sonra halen hata almaya devam ediyorsanız klasör üzerindeki yetkileri kontrol edebilirsiniz.

Bol AX lı günler,
Alper.





Hi,

If you get the " ClrObject static method invocation error." error when file processing file operation simply assign file IO object to null.

After that if problem still continues check folder permissions.

Have a nice coding,
Alper.

8 Mart 2012 Perşembe

7 Mart 2012 Çarşamba

Grid kontrolünde seçilen kayıtlar arasında geçiş yapmak.

Merhaba,
Form üzerinde çoklu kayıt listelemek için kullandığımız Grid kontrolünde birden fazla kayıdı Ctrl tuşu ile tıklayarak, Shift ile beraber yukarı aşağı ok tuşlarıyla veya başka yollar ile de birden fazla seçim yapabiliriz.

Bu yaptığımız seçimler üzerinden işlem yapmak istersek aşağıdaki kod örneğine benzer bir kod ile veri kaynağı üzerinde seçilen kayıtlar arasında gezinti yapabilir istenilen alana, veriye ulaşmamız mümkün.


TabloAdi tabloDegiskeni;
;
for (tabloDegiskeni = TabloAdi_ds.getFirst(true) ? TabloAdi_ds.getFirst(true) : TabloAdi_ds.cursor();
//Veri kaynağının ilk kayıdına eşitse ilk kayıdı değilse üzerine konumlanmış kayıttan başlar
tabloDegiskeni;
//Değer olduğu sürece devam
 tabloDegiskeni = TabloAdi.getNext()
// Bir sonraki kayıdı değişkene atıyoruz
 )
 {
 info(tabloDegiskeni.alanAdi);
}

For döngüsü içerisinde istediğiniz işlemi yapabilirsiniz.

Bol Ax'lı günler,
Alper.

29 Şubat 2012 Çarşamba

Tablo alanları arasında dinamik gezinmek.

Merhaba, Birbirinden türetilmiş tablolarda veya dinamik olarak oluşturduğunuz ve alan adını bilmediğiniz tablolarda kullanabileceğinizi bir kod örneğini paylaşmak isterim. Öncelikle kodu anlamaya başlamadan önce bazı şeyleri açıklayalım. DictTable parametre olarak gönderdiğiniz tablo numarasının bağlı olduğu tablo objesi ile ilgili bilgilere ulaşmanızı sağlayan bir sınıf. DictField parametre olarak gönderdiğimiz tablo numarası ve alan numarasının bağlı olduğu tablo alanı ile ilgili bilgilere ulaşılmasını sağlayan sınıf. Anytye değişken tipi ile okuma yapacağımız tablonun alanlarının veri türü her ne olursa olsun çevirme işlemine tabi tutmadan saklamamızı sağlıyor. Örnekte müşteriler tablosunun bir kaydı için alanları gezip sistem alanı olmayan alanların önce alan adını sonra = işareti ekleyerek alanın değerini info ile yazdırıyoruz.
 DictTable dictTable = new DictTable(tableNum(CustTable));
DictField dictField;
int counter, fieldId;
CustTable custTable;
anytype value;
select firstonly custTable;
 for (counter = 1; counter <= dictTable.fieldCnt(); counter++)
{
       fieldId = dictTable.fieldCnt2Id(counter);
       dictField = new DictField(tableNum(CustTable), fieldId);
       if (!dictField.isSystem())
      {
          value = custTable.(fieldId);
          if(value)
         {
              info(strFmt('%1 = %2', dictField.label(), any2str(value)));
         }
     }
}

Dinamik tablo yapılarında kullanabileceğiniz bu yapıyı faydalı bulduğunuzu umarım.
Bol AX'lı günler,
Alper.

24 Şubat 2012 Cuma

Filter data with selected data from previous form / Formda seçilen değer ile açılan formu filtreleme

TR | ENG
Merhaba,

Bir formda çalışırken o form üzerindeki veriler ile ilgili başka bir formu açıp yeni açılan form üzerinde ilgili kayıta göre verinin filtrelenmesi gerekiyor ise yapmamız gereken çok kısa geliştirmeden bahsedeceğim.

Örneğin madde kartı üzerinden başka bir forma gidip yeni açılan form üzerindeki verileri madde kartındaki seçtiğimiz veri ile filtrelemek istiyoruz.

Öncelikle yeni bir tablo, form ve menu item oluşturuyoruz.

Tabloda ilişki kuracağımız alan olarak bizi ItemId ilgilendiriyor diğer alanlar size kalmış

Tabloyu açtıktan sonra formu oluşturuyor ve form üzerine tablonun istediğimiz alanlarını sürükleyip bırakıyoruz.

Formu kullanarak menuitemı display tipte oluşturup oluşturduğumuz menuitemı madde kartı formu üzerine buttonGroup a sürükleyip bırakıyoruz.

Şu ana kadar yaptıklarımız ile madde kartı üzerinde eklediğimiz butona tıklandığında yeni hazırladığımız form açılacak ama tüm değerleri gösterecek.

Şimdi filtreleme kısmına geçelim.

Yeni formumuzun veri kaynağının init methodunda super kısmından sonra aşağıdaki kod bloğunu eklememiz yeterli olacak.


if (element.args().dataset() == tablenum(InventTable))
{
 SysQuery::findOrCreateRange(    
YeniTablo_ds.query().dataSourceTable(
tablenum(YeniTablo)),fieldnum(YeniTablo,ItemId)).value(
element.args().record().(fieldnum(InventTable,ItemId)));
}

Yazdığımız kodun sadece InventTable dan gelen çağırılar için çalışmasını istediğimizden ilk satırda kontrol yapıyoruz.

Sonra SysQuery objesinin findOrCreateRange ile filtreleme için alanı yok ise yaratıyor var ise yaratmadan bulup değer atamamızı sağlıyor.

findOrCreateRange methodu ilk parametre olarak veri kaynağını ikinci parametre olarak alan kodu istiyor.

Formda kullandığımız veri kaynağının adının sonuna _ds ekleyerek veri kaynağına query() ile sorgusuna ve son olarak dataSourceTable ile de tablo idsini verdiğimiz tabloya ulaşabiliriz.

Elde ettiğimiz filtreye değer vermek için value methodunu kullanıyoruz ve paramtere olarak parametre ile gelen kayıdı element.args().record() ile alıyor ve sonrasında .(alankodu) ile kayıt kümesindeki belirttiğimiz alan kodlu alanı filtreye gönderiyoruz.

Kod kısa olsa bile anlatması biraz uzun sürdü, umarım işinize yarar.

Bol AX'lı günler.

Alper.


------------------------------------------------------------------------------------------------------------

Hi there,

If you want to filter data from previous form you would simply do the followings below.

Create new table, form and menu item.

Take menu item drag and drop it to form which will be used to called from.

After you do all this overwrite the init method of datasource on the new form and paste the code below just after your modifications (table names, filed names).


if (element.args().dataset() == tablenum(InventTable))
{
 SysQuery::findOrCreateRange(  
NewTable_ds.query().dataSourceTable(
tablenum(NewTable)),fieldnum( NewTable ,ItemId)).value(
element.args().record().(fieldnum(InventTable,ItemId)));
}


This is it you filtered your data with data which came from previous form.

What we just did is simply check is data coming from table we wanted

Find or create range on forms data source and filed by using  "NewTable_ds.query().dataSourceTable(
tablenum(NewTable))" and "fieldnum( NewTable ,ItemId)" and finally assign filter value  "element.args().record().(fieldnum(InventTable,ItemId))" as you can see we used element.args().record() to get row and .(filed number) to get rows specific column.

Hope you find it useful.
Happy AXing,
Alper.




22 Şubat 2012 Çarşamba

Error 29506 while installing SQL server management studio express 2005

Merhaba,

Windows 7 üzerinde SQL server management studio 2005 versiyonunu yüklemeye çalıştığınızda hata kodu olarak 29506 alıyorsanız aşağıdaki adımları izleyin.

  • Başlat -> Programlar -> Donatılar -> Komut Sistemi ' ne sağ tıklayıp yönetici olarak başlatın.
  • SQL in kurulum dosyasının olduğu klasöre konumlanın.
  • Kurulum dosyasının adını yazarak kurulumu başlatın.

When I try to install SQL server management studio express for 2005, then I got the 29506 error. To pass this error click start menu->accessories, right click on 'Command Prompt' and select run as administrator. on the command window, navigate to the path where you have the installation file. Now just type the file name and hit enter it will start the installer.

Alper.

16 Şubat 2012 Perşembe

The test form is only available for requests from the local machine

Merhabalar,

Web servisleri ile uğraşırken özellikle test aşamasında "The test form is only available for requests from the local machine" uyarısını geçmek istediğimizde yapmamız gereken işlem web.config dosyasını değişiklik için açıp <system.web> tagı altına aşağıdaki gibi ilgili tagları eklemek.

<configuration>
    <system.web>
    <webServices>
        <protocols>
            <add name=”HttpGet”/>
            <add name=”HttpPost”/>
        </protocols>
    </webServices>
    </system.web>
</configuration>

Hem AX entegrasyonları ile uğraşırken hemde AX dışındaki geliştirmelerinizde kullanabileceğiniz bir bilgi.

Bol AX lı günler,
Alper.


15 Şubat 2012 Çarşamba

TreeControl kullanımı


Sınıflandırma yapılması istendiğinde TreeControl kullanılabilir.














Treecontrol kullanırken dikkat edilmesi gereken kontrolü eklerken hangi düğüm (node) ün altında yer alacağı bilgisine hakim olmaktır.


Bu kontrolü sağlamak için TreeItemIdx tipli değişken tanımlıyoruz ve bu değişkeni ağaca yeni kırılım eklerken hangi kontrolün altında yer alacağını belirtmek için kullanıyoruz.


Aşağıdaki kodda madde kartı içerisinde dolaşıp madde grubu bazında maddeleri listeleyen bir ağaç yapısı oluşturuyoruz.


Kırılımların daha iyi anlaşılabilmesi için kırılımlara birer resim atıyoruz.


Resimler için ImageListAllp_Help sınıfındaki açık klasörü kök öğe için, kapalı kitabı madde grubu için, açık kitabıda bu maddeler için kullanıyoruz.





    #resAppl


    InventTable         inventTable;
    TreeItemIdx         item,itemGroup,root;
    ItemGroupId         oldItemGroup;
    ImageRes            imageResItem,imageResGroup,imageResRoot;
    ImageListAppl_Help  imageList = new ImageListAppl_Help();
    ;


    imageResRoot    = imageList.image(#ImageFolderOpen);


    imageResGroup   = imageList.image(#ImageHelpTOCBookClosed);
   
    imageResItem    = imageList.image(#ImageHelpTOCBookOpen);


    formTreeControl.setImagelist(imageList.imageList());


    root = SysFormTreeControl::addTreeItem(formTreeControl,"Maddeler",FormTreeAdd::Root,"Maddeler",imageResRoot);


    while select inventTable order by ItemGroupId
    {
        if (!oldItemGroup)
        {
            oldItemGroup    = inventTable.ItemGroupId;
           
            itemGroup       = SysFormTreeControl::addTreeItem(formTreeControl,inventTable.ItemGroupId,root,inventTable.ItemGroupId,imageResGroup);
        }


        if (oldItemGroup != inventTable.ItemGroupId)
        {
            SysFormTreeControl::expandTree(formTreeControl,itemGroup);


            oldItemGroup    = inventTable.ItemGroupId;


            itemGroup       = SysFormTreeControl::addTreeItem(formTreeControl,inventTable.ItemGroupId,root,inventTable.ItemGroupId,imageResGroup);


        }


        item = SysFormTreeControl::addTreeItem(formTreeControl,inventTable.ItemId,itemGroup,inventTable.ItemId,imageResItem);


    }


    SysFormTreeControl::expandTree(formTreeControl,formTreeControl.getRoot(),1);


Hepsi bu bol AX lı günler.
Alper.

14 Şubat 2012 Salı

Sevgililer Gününüz Kutlu Olsun - Happy Valantines Day

Sevdiklerinizle birlikte sağlıklı sıhhatli bol Axapta'lı günler.

---

Happy Valantines day with your family,friends and AX

Billur, Alper

11 Şubat 2012 Cumartesi

Axapta Tahsisat İşlemleri

TAHSİSAT


Tahsisat yapılacak hesap üzerinde (Hesap planı) temel tabında tahsisat alanı seçilir. Tahsisat alanı seçilen hesap üzerinde kuruluş-tahsisat şartları adımları ile ulaşılan tabloda tahsisat şartları tanımlanır. Bu tabloda yeni kayıt denilerek hesabın işleyişinde virman yapılacak hesap bitiş hesabı alanında seçilir. Seçimin ardından bu hesabın işleyişinde kullanılacak boyutlar alıcı departman/mm/amaç alanlarında seçilir. Boyut tabında başlangıç departman/mm/amaç boyutlarında ise tahsisatı yapılacak hesabın boyutu seçilir. Tahsisat Yüzdesi ise tahsisat da kullanılan orandır.


Örn................................................................................................................................................
 Tahsisat Yapılacak Hesap: 730.10.000

Tahsisat Şartları:
Bitiş Hesabı: 730.10.000
Alıcı Departman :02
Alıcı MM:Mal2
Başlangıç Departman :01
Başlangıç MM:Mal1
Tahsisat Oranı:40

Bitiş Hesabı: 760.10.000
Alıcı Departman :03
Alıcı MM:Mal3
Başlangıç Departman :01
Başlangıç MM:Mal1
Tahsisat Oranı:60


Girilen günlük kaydı:

730.10.000     .1000                        Dept: 01 MM:Mal1
        320.10.000           .1000          Dept: 01 MM:Mal1

Oluşan Muhasebe Kaydı:


730.10.000     .1000                        Dept: 01 MM:Mal1
        320.10.000           .1000          Dept: 01 MM:Mal1
730.10.000     .400                          Dept: 02 MM:Mal2
760.10.000     .600                          Dept: 03 MM:Mal3
        730.10.000           .1000          Dept: 01 MM:Mal1

....................................................................................................................................................
Oluşturulan muhasebe kaydında tahsisatdan kaynaklanan işlemler için bordro numarası tutulmamaktadır. Alınan raporlarda bordro numarası kriteri konulamamalıdır. Dikkat edilmesi gereken bir diğer husus ise gider üzerinde vergi seçilmiş ise vergi raporlarında ilk hesap üzerinden raporlanmaktadır. Örneğin 770 hesap üzerinden tanımlanan bir tahsisat söz konusu ise ve 770 ve 760 hesaba tahsiste yapılacak ise raporlamalarda 770 hesap raporlanmaktadır




Sabit Kıymetlerin Devri için gerekli bilgiler

Sabit Kıymet ile ilgili tüm tanımlamaların tamamlanabilmesi için gerekli bilgiler tek bir Excel verilerek kullanıcılardan istenebilir. Sabit kıymet kurulumu için aslından birden fazla tabloya data girilmesi gerekmektedir. Örneğin sabit kıymet grubu, değer modeli, sabit kıymetler, sabit kıymet hareketleri, muhasebe entegrasyonu gibi. bununla birlikte kullanıcılara birden fazla doldurulacak Excel'i vermek geri dönüş zamanının artmasına neden olmaktadır. Genelde sabit kıymetler ya Excel'de takip edilmekte ya da takip edilen program üzerinde tek bir rapor üzerinde bir çok bilgi içermektedir. Dolayısı ile tek bir Excel'in doldurulmasını istemek kullanıcının geri dönüşünü rahatlatacak ve geçiş için gerekli datanın verilebilmesini sağlayacaktır.

Danışmanın bu aşamada yeteneğini ve bilgisini kullanarak gerekli bilgileri Excellere bölmesi ve aktarımı bu şekilde yapması her ne kadar zaman alıcı olarak gözükse de projenin devamlılığı açısından kolaylaştırıcı etkiye neden olacaktır.

Exceller aktarılmadan önce yapılması gereken kontrollerden bazıları şunlardır.


  • Negatif ekonomik ömürler var mı?
  • Amortisman tutarı ya da gerçek tutarı negatif olan değerler var mı?
Aktarım sonrasında bir aylık amortisman hesaplattırılarak mutlaka kullanıcılara kontrol ettirilmelidir.

Aktarım için aşağıdaki bilgiler yeterli olmakla birlikte eğer sabit kıymet ile ilgili takip edilecek başka bilgiler varsa örneğin sigorta tarihi, açıklamalara, yerleşim, teknik bilgiler gibi mutlaka Excel'e eklenmelidir.

Sabit
Kıymet
Grubu 
Sabit
Kıymet
Kodu
Sabit Kıymet
 Adı
Değer Kodu Giriş Bedeli Endekslenmiş
Değer
Alım
Tarihi
Amortisman
Yeniden
 Değerleme
Tutarı
X  tarihine
kadar olan
Birikmiş
Amortisman
X tarihine
kadar  yıl başından itibaren
cari yıl
amortismanı
31.12.2004
tarihine
kadar olan
enflasyon
düzeltmesi tutarı
31.12.2004
tarihine kadar
 olan amortisman
enflasyon düzeltmesi tutarı
Ekonomik
 Ömür
Aylık)
Kalan Ömür
(Aylık)
Amortisman
Uygulanacak mı?
 (Evet/Hayır)
Beklenen
Hurda Değer
Departman Maliyet Merkezi Amaç Kıst
Amortismana
Tabi
Alım Hesabı Amortisman
Hesabı(257 Grup)
Amortisman Gider
Hesabı(7* Grup)

Sabit Kıymet Satışı için kullanılan hesaplar

Nakledilecek değer Satış değeri tipi Genel Muhasebe hesabı Mahsup hesabı
Önceki yılların amortismanı Hepsi 257.000 252.000
Bu yılın amortismanı Hepsi 257.000 252.000
Net Defter Değeri Kar 252.000 679.000
Net Defter Değeri Zarar 252.000 689.000

10 Şubat 2012 Cuma

Example of a module list for service industry

Usually these modules are used in service industry. Sure there are more forms, reports and inquiries but the most used ones are listed below:


GENERAL LEDGER
COMMON FORMS
Chart of Account Details
Ledger Budget
Fixed Asset Details
Dimensions
JOURNALS
Journal Entry
Cash Journal Entry
Fixed Assets
INQUIRIES
Voucher Transactions
Audit Trail
Posted Sales Tax
Fixed Asset Transactions
Fixed Asset Budget Transactions
REPORTS
Audit Trail
Fixed Asset Listing
Journal Ledger- Regular
Account Journal Entry
Journal Ledger – Draft
General Ledger – Date Interval
General Ledger
Balance List With Sum Account
Ledger Transaction List
Dimension Statement
Sales Tax Transactions
Financial Statement
Trial Balance
Divided Trial Balance
Balance List
Balance List Detailed
Sales Tax List
Fixed Asset Balances
Sales Tax Payment  by Code
Transaction List by Date
Sales Tax Transactions – Details
Sales Tax Specification by Ledger Transaction
Fixed Asset Transactions
Ledger Budget
Annual Budget
Future Value of Fixed asset
PERIODIC
Exchange Adjustment
Exchange Adjustment with Exchange Rate
Recalculate Period Balances
Calculation of Mirror Accounts – Summary
Calculate Cash Flow Forecasts
Currency Requirement
Closing Revenue and Cost Accounts – Automatic
Opening Transactions
SETUP
Exchange Rates
Ledger Reasons
Parameters
Dimension Focuses
Financial Statement
Row Definition
Dimension Sets
Dimension Set Rules
Sales Tax Codes
Sales Tax Groups
Item Sales Tax Groups
Ledger Posting Groups
Sales Tax Authorities
Value Models
Fixed Asset Groups
Posting Profiles
Depreciation Profiles
Locations
Periods
Journal Names
System Accounts
Liquidity
Budget Model
Mirror Accounts
EXCHANGE NOTES
COMMON FORMS
Exchange Note Journal
REPORTS
Check Batch Report
Promissory Note Batch Report
Exchange Journal Ledger
Exchange Note Transaction History
Portfolio List
Portfolio List(KC/KS)
The Portfolio List as-of Date
Check Order by Customer
Daily Cash Receipt
Batch Report
Pending Customer Checks
Pending Company Checks
Customer Documents – Periodic
Customer Documents – Periodically
Customer Check Aging Report
Company Check Aging Report
PERIODIC
Calculation of Rediscount
SETUP
Parameters
Create Voucher Types
BANK
COMMON FORMS
Bank Account Details
Checks
INQUIRIES
Bank Transactions
Balance Control
REPORTS
Bank Account Statement
Bank Cash Flow Report
SETUP
Bank Transaction Type
Bank Groups
Parameters
ACCOUNTS RECEIVABLE
COMMON FORMS
Customer Details
INQUIRIES
Interest Journal
Invoice
REPORTS
Customer
Customer Base Data
Customer Phone List
Internal Account Statement
Customer Aging Report
Customer Balance List
Customer Account Statement
Interest Note
PERIODIC
Exchange Adjustment
Interest Calculation
Interest Note
SETUP
Customer Groups
Posting Profiles
Parameters
Interest
Payment Schedules
ACCOUNTS PAYABLE
COMMON FORMS
Vendor Details
Purchase Order Details
JOURNALS
Payment Journal
INQUIRIES
Packing Slip
Invoice
REPORTS
Vendors
Vendor Base Data
Vendor Phone List
Account Statement
Vendor Aging Report
Vendor Balance List
Vendor/Item Statistics
Item/Vendor Statistics
PERIODIC
Exchange Adjustment
SETUP
Vendor Groups
Posting Profiles
Parameters
Payment Schedules
Methods of Payment
INVENTORY MANAGEMENT
COMMON FORMS
Item Details
JOURNALS
Movement
REPORTS
Inventory Value per Item Group
Inventory Value by Inventory Dimension
PERIODIC
Closing and Adjustment
SETUP
Item Groups
Parameters
Dimension Groups
Inventory Model Groups
Counting Groups
Sites
Warehouses
Journal Names, Inventory
Posting
Forecast Models