Bir nesneye ait durumunu (parametrelerini, değerlerini vb : saved state) kaydederek daha sonra tekrar kullanmak gerektiğinde Pack – Unpack yapısı kullanılmalıdır. Böylece aynı nesne aynı değerlerle tekrar oluşturulabilir.
Ayrıca nesnenin katmanlararası (istemci – sunucu : client – server) geçişi sözkonusu ise değerlerin transferi için yine Pack – Unpack yapısı gereklidir.
Dynamcis AX’ta debug yaparken değişkenlerin birden sıfırlandığına şahit olduysanız, ya da dialog metodu ile kullanıcıdan aldığınız değerlerin bir türlü işleme dahil olmadığını görüyorsanız sorun pack – unpack yapısının kullanılmamış olmasıdır. Çünkü nesne katmanlar aarası taşınırken değerleri taşınamaz.
Nesnelerin o anki istenen değerlerini kaydetmek için (save state) pack metodu kullanılır. Bu metod belirtilen değerleri bir container’e yazar ve kaydeder. Kaydedilmiş değerleri alıp kullanmak için ise Unpcak metodu kullanılmalıdır.
Pack ve unpack metodları oldukça standart metodlardır ve genel olarak ayn yapıya sahiptir. Pack – Unpack Tasarım Desenini kullanabilmek için alttaki işlemleri yapmak gerekir.
1. Pack metodu tanımlayın
2. Kaydetmek istediğiniz değerleri ClassDeclaration’da belirtin.
3. Unpack metodu tanımlayın
unpack metodu sınıfın kaydedilen durumunu ifade eden container’ı alıp belleğe koyar. Bu işlem için versiyon numarası kullanılır. Bir sınıf için birden farklı numaralarla state tanımlanabilir.
Unpack metodu boolean bir değer döndürür. Böylece değerin okunabildiği kontrol edilir.
Bir sınfın nesnesini olşturmak için kullanılan new metodu, aksi belirtilmediği müddetçe unpack metodunu çalıştırır ve varsa kaydedilmiş değerleri geri getirir. Bu yeni oluşturulan nesne önceki ile aynı değerlere sahip olmakla birlikte aynı nesne değildir; yani farklı bellek bölgelerini işgal eder.
Sık kullanıldığı yerler : RunBaseBatch, Batch, QueryRun, Microsoft Dynamics AX collection sınıfları (foundation classes)
Örnek için AOT\Classes\Tutorial_RunbaseBatch sınıfını izleyebilirsiniz.
Bu sınıfın ClassDeclaration’unu incelerseniz, transDate ve custAccount değerlerinin kaydedilmek istendiğini görebilirsiniz. Ayrıca dialog metodunu incelerseniz, kullanıcıdan alınmak istenen tarih ve müşteri hesabının varsayılan değerlerinin unpack ile getirilen bir önceki değerler olduğunu görebilirsiniz. Böylece kullanıcı aksini belirtmediği taktirde aynı değerlerle tekrar rapor alabilir.
Dynamcis AX’ta debug yaparken değişkenlerin birden sıfırlandığına şahit olduysanız, ya da dialog metodu ile kullanıcıdan aldığınız değerlerin bir türlü işleme dahil olmadığını görüyorsanız sorun pack – unpack yapısının kullanılmamış olmasıdır. Çünkü nesne katmanlar aarası taşınırken değerleri taşınamaz.
Nesnelerin o anki istenen değerlerini kaydetmek için (save state) pack metodu kullanılır. Bu metod belirtilen değerleri bir container’e yazar ve kaydeder. Kaydedilmiş değerleri alıp kullanmak için ise Unpcak metodu kullanılmalıdır.
Pack ve unpack metodları oldukça standart metodlardır ve genel olarak ayn yapıya sahiptir. Pack – Unpack Tasarım Desenini kullanabilmek için alttaki işlemleri yapmak gerekir.
1. Pack metodu tanımlayın
1 | public container pack() |
2 |
3 | container pack() |
4 | { |
5 | return [#CurrentVersion,#CurrentList]; |
6 | } |
01 | public class myClass extends RunBaseBatch |
02 | { |
03 | TransDate transDate; |
04 |
05 | //Kaydetmek istediğiniz değerler |
06 | #DEFINE.CurrentVersion(1) |
07 | #LOCALMACRO.CurrentList |
08 | transDate |
09 | #ENDMACRO |
10 | } |
unpack metodu sınıfın kaydedilen durumunu ifade eden container’ı alıp belleğe koyar. Bu işlem için versiyon numarası kullanılır. Bir sınıf için birden farklı numaralarla state tanımlanabilir.
Unpack metodu boolean bir değer döndürür. Böylece değerin okunabildiği kontrol edilir.
01 | public boolean unpack(container _packedClass) |
02 | { |
03 | int version = conPeek(_packedClass,1); |
04 | ; |
05 | switch (version) |
06 | { |
07 | case #CurrentVersion: |
08 | [version,#CurrentList] = _packedClass; |
09 | break ; |
10 | default : |
11 | return false ; |
12 | } |
13 | return true ; |
14 | } |
Sık kullanıldığı yerler : RunBaseBatch, Batch, QueryRun, Microsoft Dynamics AX collection sınıfları (foundation classes)
Örnek için AOT\Classes\Tutorial_RunbaseBatch sınıfını izleyebilirsiniz.
Bu sınıfın ClassDeclaration’unu incelerseniz, transDate ve custAccount değerlerinin kaydedilmek istendiğini görebilirsiniz. Ayrıca dialog metodunu incelerseniz, kullanıcıdan alınmak istenen tarih ve müşteri hesabının varsayılan değerlerinin unpack ile getirilen bir önceki değerler olduğunu görebilirsiniz. Böylece kullanıcı aksini belirtmediği taktirde aynı değerlerle tekrar rapor alabilir.
01 | class Tutorial_RunbaseBatch extends RunBaseBatch |
02 | { |
03 | // Packed variables |
04 | TransDate transDate; |
05 | CustAccount custAccount; |
06 |
07 | // Dialog fields |
08 | DialogField dlgCustAccount; |
09 | DialogField dlgTransDate; |
10 |
11 | #define.CurrentVersion(1) |
12 | #localmacro.CurrentList |
13 | transDate, |
14 | custAccount |
15 | #endmacro |
16 | } |
01 | public Object dialog() |
02 | { |
03 | DialogRunbase dialog = super(); |
04 | #resAppl |
05 | ; |
06 | dialog.addImage(#ImageEmployee); |
07 | dialog.addInfoImage(); |
08 | dlgTransDate = dialog.addFieldValue(typeid(TransDate),transDate); |
09 | dialog.addTabPage( "@SYS76580" ); |
10 | dlgCustAccount = dialog.addFieldValue(typeid(CustAccount),custAccount); |
11 |
12 | return dialog; |
13 | } |