11 Eylül 2015 Cuma

Delete Action kullanımı

Merhaba arkadaşlar,

Bugün sizlere AX'ın bizlere sunduğu DeleteAction özelliğinin kullanımını anlatacağım.

Delete Action nerelerde kullanılır, ne için kullanılır, nasıl kullanılır :


Bir biri ile ilişkili kayıtlar olduğunu düşünelim, örneğin bir başlık tablosu(Xtable) ve onun satırları(XLine) olduğunu varsayalım. Kullanıcı gelip, başlıkta ki(Xtable) herhangi bir kaydı silmek istediğinde, buna bağlı bir satır(XLine) varsa o satırlarında silinmesini ya da silinmemesini veya sadece başlığın silinmesini isteyebilir ya da böyle bir yapı yapmak zorunda kalabilirsiniz.
Bu tür durumlarda imdadımıza DELETEACTİON koşuyor.

Delete Action tanımlamak için yapmanız gerekenler sırasıyla;

  1. Tablo üzerinde Field, FieldsGroup, Index olan kısımlarda yer alan DeleteActions'a sağ tıklıyoruz > New Delete Actions diyoruz.
  2. İlişkili olduğu tabloyu seçiyoruz (Xtableda delete action tanımlıyorsak, Xline ile ilişkilidir o halde xLineı seçeriz). İlişkisi varsa otomatik olarak relation alanını dolduracak (Yoksa relation tanımlamanız gerekir).
  3. Delete action alanına geçiyoruz, nasıl bir işlem yaptırmak istiyorsak onu seçiyoruz.(Burada karşımıza 3 seçenek çıkar bu seçenkeleri aşağıda açıklıyorum).
Restirected Kayda bağlı belirtilen tabloda kayıt varsa önce bunun silinmesini ister.
Cascade Direkt 2 kayıdıda siler.
Cascade + Restirected Birbirine bağlı kayıtlı olduğunu söyler, bu kayıtların hepsini silmek istiyor musunuz şeklinde soru yöneltir. Kabul edersek tüm kayıtları siler.



İyi çalışmalar...

8 Eylül 2015 Salı

Clear Dynalinks

Merhaba,

Bugün sizlere bir formu açarken, belirli alanların, nasıl filtresiz,ilişkisiz açılacağını anlatmaya çalışacağım.

Yapacağımız işlem form'un init methodunda kullanılabilir.

Başlıktan da anlaşılacağı üzere bu işlemi ClearDynalinks methodunu kullanarak yapacağız.

Aşağıda ki kodu kullanarak formumuzu ilişkisiz çağırabiliriz.

TabloAdi_ds.query().dataSourceTable(tableNum(TabloAdi)).clearDynalinks();

30 Temmuz 2015 Perşembe

Günlük satırı oluştururken parmOffsetLedgerDimension methodunda meydana gelen bug

Günlük satırlarını oluştururken, OffsetLedgerDimension alanını doldurmak için aşağıdaki methodları kullanırız;


1- jounalTrans.parmOffsetAccountType();


2-journalTrans.parmOffsetLedgerDimension(AxDimensionUtil::getLedgerAccountId(offSetAcctPattern));


2. satırda bazen boş değer döner. Bu satır herhangi bir offset değeri döndürmeği zaman yapmamız gereken 1. satırı commentleyip kodu bir daha çalıştırmak olmalıdır.


Agit CAN,

İyi çalışmalar.

29 Temmuz 2015 Çarşamba

Tablo alanlarının özelliklerinden Save Contents özelliği

Merhaba,

Öncelikle Save Contents özelliğini şu yolla bir görelim : " Ax' ta var olan bir tabloyu açın > herhangi bir fieldın özelliklerini açın. " Burada SaveContents özelliğini görmüş olmalısınız, Yes ya da No olarak belirlenebilir.

Bu alanın özelliği ise şudur;

Eğer bir alanın Save Contents özelliği Yes ise bu alan sanal olarak çalışır, yani temp tablo gibi çalışır diyebiliriz. O an için veriyi kaydeder işlem bittiğinde burada kayıt saklamaz.

Yani en dışarıdan baktığımızda, tablomuz temp tablo değil ama alanımız geçici olarak bilgi tutar.

Bir sonra ki yazımda görüşmek üzere...

İyi çalışmalar,

Semih Çelikol




1 Mayıs 2015 Cuma

AX 2012 - Container

Merhaba arkadaşlar, bu yazımızda bazı dillerde ki"liste" yapısına denk gelen contaier yapısını inceleyeceğiz.

Container, aynı veya birbirinden farklı verileri tutma özelliğine sahiptir. Örnek olarak basit veri tipleri( int, str..), EDT ve TableBuffer'ları container içinde saklayabiliriz. Container içinde saklayamayacağız veriler ise objelerdir(örn class).

Bir container'ın deklerasyonu ise oldukça basittir ve aşağıdaki gibidir;

container  myContainer;

Container'ların sahip oldukları çeşitli fonksiyonlar(methods) vardır. Şimdi bu fonksiyonları ele alalım.

İlk olarak container'ımıza ilk verimizi ekleyelim -->

myContainer = conIns(myContainer,1,"DATA");

Burada 1 container'ın indeksini, DATA ise container'ın içine atacacağımız veriyi temsil ediyor.

myContainer = conIns( mycontainer,2, "IST"); burada container'ımızın 2. elemanına IST verisini atamış olduk.

container'ı doldururken aslında container'ın ikinci elemanının IST değil WOK olacağını fark edersek ne yapacağız.

Bunun için myContainer = conIns(myContainer,2,"WOK") yazarsak artık ikinci elemanımız WOK olmuştur. IST ise 3. elemanımız olmuştur. Yani otomatik olorak IST verisini bir geri kaydırmıştır.

Şimdi silme işlemine bakalım. Eklediğimiz IST verisini container'den silmeye çalışalım.

myContainer = conDel( myContainer,3,1); burada 3, kaçıncı elemandan itibaren silme işlemine başlayacağını, 1 ise kaç tane elemanın silineceğiniz gösteriyor bize

Sırada container'ın içinden bir değeri bulmak var. myContainer içinden WOK verisinin olup olmadığını öğrenmek istersek;

int myValue;

myValue = conFind(myContainer, "WOK"); 

myValue değişkenine WOK'un indeksini atamış olduk.

Peki herhangi bir indekste hangi veriyi sakladığımızı nasıl öğrenebiliriz? Örneğin myContainer'ın 2. elemanı nedir?

Bunun için conPeek() fonksiyonu mevcuttur.

Kullanışı ise conPeek(myContainer, 2); //2, indeks değerini  temsil ediyor.

conPeek(myContainer, 2); 
bunu info ile ekrana basarsak bize WOK değerini gösterecektir. Böylece conFind() fonksiyonunun da sağlamasını yapmış olduk.

Sıradaki fonksiyonumuz ise conPoke();

Bu fonksiyon bize container'ın içindeki değerleri update etme yani güncelleştirmemize olanak sağlar.

myContainer içindeki WOK değişkenini WORK yapmak istersek şöyle yapabiliriz.

myContainer = conPoke( myContainer, 2, "WORK");

böylece 2. değişkenimiz WORK olmuş oldu.

Son olarak container'ın içini boşaltmak istersek, myContainer = null; işlemini yapmamız yeterlidir.

İyi Çalışmalar,
Agit Can








16 Mart 2015 Pazartesi

Ax 2012'de bir label dosyasını silmek

Merhaba,

Bu yazımızda Dynamics AX 2012'de bir label dosyasını nasıl silebileceğimizi öğreneceğiz.
Labelllar artık 2009'da gibi bir dosya sistemine sahip değiller. Artık 2012  versiyonu ile AOT'de  bir "Label Files" noduna sahibiz.

Eğer uygulama dosyasında arama yaparsak, bir label dosyası bulamayacağız. Uygulama dosyasına şuradan ulaşabiliriz.

"C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\bin\ Application\ Appl\Standard".

Dynamics AX 2012'de label dosyamız üzerinde çalıştığımız modele import edilmiş durumdadır.
Şimdi AOS'u restart edip neler olduğuna bakalım. AOS'u restart ettikten sonra, uygulama dosyasına
geri gidip tekrardan label dosyasını bulmaya çalışalım. Bu sefer label dosyasını bulabileceğiz.
AOS'u her restart ettiğimizde, tüm label dosyaları model storedan uygulama dosyasına
(application file) kopyalanacaktır. Yani Label dosyalarımız modellerimizin içinde yer alır ama uygulama dosyamızda saklanır.

Şimdi bir label dosyasını nasıl silebiliriz ona bakalım. Label dosyasının üzerinde sağ tıklayalım.
Sil/kaldır seçeneğini gördünüz mü?
Cevabınız hayır olacaktır. O zaman sırasıyla aşağıdaki işlemleri yaparsak kolayca bir label dosyasını silmiş olacağız.

    1. Geçici bir model oluşturun
    2. Label dosyasını oluşturduğunuz modele taşıyın
    3. AOS'u durdurun
    4. Oluşturduğunuz modeli silin.
    5. AOS'u başlatın.

Adım adım devam edersek;

Sırasıyla Tools -> Model management -> Create model tıklayalım.

Model ismini TmpModel verip ok butonuna basalım. Şöyle bir bilgilendirme mesajı alacaksınız, "TmpModel başarılı bir şekilde katmanınızda oluşturuldu."

Label dosyasının üzerine sağ tıklayıp "Modeli Taşı" seçeneğini tıklayalım.
CheckBoxtan TmpModel'i seçip ok butonuna basalım.

AOS'u durdurun.

Komut istemini açalım(Microsoft Dynamics AX 2012 Management Shell). Modeli silmek için
AXUTIL kullanacağız.
Komut istemine aşağıdaki satırı girelim.

AXUTIL delete /model:TmpModel

Modeli silmek isteyip istemediğimizi soracaktır. Bunun için Y'ye basalım.

AOS'u başlatalım.

Ax'ı açtığımızda şöyle bir dialog ekranın çıkacak karşımıza "Modeliniz üzerinde eğişiklikler yapıldı." Bu normal bir şey çünkü model üzerinde bir değişiklik yaptığımızda böyle bir dialog karşımıza çıkacaktır.

Son olarak AOT'yi açıp baktığımızda label dosyasının silindiğini görmüş olacağız.

İyi çalışmalar,
Agit Can















18 Kasım 2014 Salı

SysQueryRangeUtil Class

Merhaba,

Günlük, haftalık ya da aylık çalıştırılan bazı Dynamics AX raporları vardır. Bu raporları çalıştırmadan önce sürekli tarih parametresini değiştirmemiz gerekir. Örnek olarak haftanın her günü çalıştırdığınız bir raporunuz olsun.Tarih ise 17.11.2014 olsun. Bir sonraki gün raporu çalıştırmak istediğinizde tarihi 18.11.2012 olarak degiştirmek zorunda kalacaksınız.

SysQueryRangeUtil class'i sayesinde sürekli tarihi değiştirmemize gerek kalmıyor. Bu classın bazı fonksiyonlarına bakacak olursak;

day(-1)          --  fonksiyonu bize hep dünün(17.11.2014) tarihini döndürecek
day(0)           --  fonksiyonu bize hep günün(16.11.2014) tarihini döndürecek
day(1)           --  fonksiyonu bize hep yarının(18.11.2014) tarihini döndürecek
dayRange(-30,0)  --  fonksiyonu bize hep son 30 günü döndürecek "18-11-2014".."17-11-20"

bu ve buna benzer SysQueryRangeUtil class'ının statik fonksiyonlarını aşağıdaki gibi kullanabiliriz.

Date dateRange;

dateRange = sysQueryRangeUtil::dayRange(-30,0);
info(strfmt(dateRange));

Kullanılan başlıca fonksiyonlar:
::currentBusinessRelationsAccount
::currentContactPersonId
::currentCustomerAccount
::currentEmployeeId
::currentSessionDate
::currentSessionDateTime
::currentStaticMasterPlan
::currentUserId
::currentVendorAccount
::greaterThanDate
::lessThanDate
::monthRange
::yearRange