Microsoft kendi geliştirdiği WMS-II çözümünü bırakıp başka bir firmadan
satın aldığı WMS çözümünü AX içine koydu. Bu yeni WMS çözümünün web ortamında çalışan kendine ait bir el terminali çözümü de var. El terminali çözümü tamamen web ortamında çalışırken geliştirme yaparken AX içinden çalıştırılması da sağlanmış.
WHSWorkExecute isimli menu item ile AX tarafında bu çözümü çalıştırabiliriz. Microsoft
WMS ve
TM için ayrıntılı birer klavuz yayınlamış. WMS klavuzunda el terminali için kullanıcı tanımlama ve ayarlarını yapma anlatılmış. Ben bunları geçerek direk konuya giriyorum.
Klavuzda geliştirme hakkında bir bilgi yok. Ben bu konuda bulduğum bir
blogdan faydalandım. Kendim uğraşsam bulamayacağımı sandığım püf noktalarını da hiçbir çaba sarfetmeden bu blogdan öğrenmiş oldum. :)
El terminali geliştirme yöntemini anlatırken WMS dökümanında anlatılan konuları bildiğinizi farzedeceğim.
El terminali geliştirmesi tamamen X++
classlar üzerinden çalışıyor. Yaptığınız her yeni
menu item için bir
class oluyor. Tüm
menu item classları WMSWorkExecuteDisplay ile başlıyor.
Kendi
menu itemimizi geliştirdiğimizi farzedelim. Eğer kendi
menu itemimizi geliştirmeyeceksek bu adımı atlayabiliriz:
Yeni bir
work ve/veya
indirect menu item ekleyeceğiniz zaman
WHSWorkCreationProcess enumuna bunu yeni bir eleman olarak eklemelisiniz. Eğer eklediğiniz
menu item bir
work ise ayrıca
WHSWorkExecuteMode enum içine de eklemeniz gerekiyor. Okuduğum blogda yazdığına göre
WHSWorkExecuteMode içine eklediğiniz elemanın adı ve label içeriği
WHSWorkCreationProcess içine eklediğiniz ile birebir aynı olmalıymış, ben bunu hiç test etmedim, aynen söylenene uydum. Bizim elemanın adı
Test olsun.
Bizim sınıfın adının
WMSWorkExecuteDisplayTest olduğunu farzedelim. Sınıfımız
WHSWorkExecuteDisplay sınıfından türeyecek.
Yukarıda anlattığımız enumlara eklenen eleman sayesinde kullanıcıya menu item tanımlama ekranında (Mobile device menu items ->Genel->Work creation process) yeni bir menu item daha görülebilecek. Ancak onun çağrılabilmesini sağlamak için yapılması gereken birşey daha var;
WHSWorkExecuteDisplay sınıfının
construct metodundaki
switch/case bloğuna aşağıdaki kod parçasını eklemek:
case WHSWorkExecuteMode::MyTest : return WHSWorkExecuteDisplayTest::construct();
El terminali geliştirmesindeki tüm menu itemler kendi sınıfları içindeki
displayForm metodu vasıtasıyla çalışıyor. Ben mevcut sınıflardan birini alıp kopyaladım ve onun üzerinde yaptığım değişikliklerle işimi gördüm.
displayForm metodu aşamalar şeklinde çalışıyor. Bunu
step isimli değişkenle takip ediyor. birinci aşama sıfır. Benim kopyaladığım sınıfta son aşama 2 olan kayıt aşamasıydı. Aşamaları orijinal sınıflarda da yapıldığı gibi
displayForm metodunda bir switch/case ile takip edebilirsiniz.
Web formumuza yeni bir kontrol eklemek için buildControl metodunu kullanıyoruz:
ret += [this.buildControl(#RFText, #vendor, "@SYS14048", 1, pass.lookup(#vendor), extendedTypeNum(VendAccount), '', 0,false)];
Yukarıdaki kontroldeki #vendor makrosu WHSRF makrosunda yoksa bizim bunu ayrıca eklememiz gerekiyor. Yine
blogdan öğrendiğim üzere bu metodun parametreleri şöyle (ordan copy/paste yapıp türkçeye çevirdim sadece):
Paremetre |
Data tipi |
Açıklama |
_controlType |
str |
Kontrolün türü. Bu türler WHSRF makrosunda eklenen türlerden biri olmak zorunda:
#define.RFButton('button')
#define.RFLabel('label')
#define.RFText('text')
#define.RFPassword('password')
#define.RFListbox('listbox')
#define.RFCombobox('combobox')
#define.RFError('error')
|
_name |
str |
Kontrolün ismi. Kontrolde saklanan dataya ulaşmak için bu ismi kullanacağız. |
_label |
str |
UI'de gözükecek text içeriği. |
_newLine |
int |
1 ise kontrol yeni bir satırda olacak, 0 ise aynı satırda. |
_data |
str |
Kontrolde gösterilecek data. |
_inputType |
ExtendedTypeId |
Kontrolün data türü. Doğrulama için bu önemli. Doğrulama gerekmiyorsa #WHSRFUndefinedDataType makrosu kullanılabilir. |
_error |
str |
Doğrulama gerçekleşmediğinde çıkacak mesaj. |
_defaultButton |
int |
1 ise buton kontrolü varsayılan kontrol demektir, Genellikle "Tamam" butonu için kullanılır. |
_enabled |
boolean |
true olduğunda kontrol enabled olur, false olduğunda disabled, default enabled. |
_selected |
int |
1 olduğunda aktif kontrol olur. |
_color |
WHSRFColorText |
Kontrolün rengi. WHSRFColorText enumda tanımlı birkaç renk var. |
Kontrolde kullandığımız datanın
map edilip edilmediğini öğrenmek için
exists, edilmişse de değerini öğrenmek için
lookup metodlarını kullanıyoruz. Genelde aşağıdaki şekilde kullanılıyor:
if (pass.exists(#vendor) && pass.lookup(#vendor) != '")
Data değerini eklemek/değiştirmek için
insert metodunu kullanıyoruz:
pass.insert(#vendor,purchTable.OrderAccount);
Bu arada Mobile device menu items formunda diğer menu itemlerinde gözüken ancak sizinkinde gözükmeyen seçenekleri görmek istiyorsanız bunun için (daire içinde işaretlediklerim)
WHSRFMenuItem formunun
togglefields metodunda ufak bir değişiklik gerekiyor:
if (whsrfMenuItemTable.WorkCreationProcess == WHSWorkCreationProcess::PurchaseOrderItemReceiving ||
whsrfMenuItemTable.WorkCreationProcess ==
...
...
//memre 22.12.2015
whsrfMenuItemTable.WorkCreationProcess == WHSWorkCreationProcess::PurchaseOrderLineReceivingWithVendor)
//memre
...
...
Aynı zamanda
WHSRFControlData sınıfının
processControl metodunda ekstra güncellemeler yapmanız gerekebilir. Benim yaptığım bir geliştirmede orijinalinden kopyaladığım sınıfta orijinalinde LP (License Plate) oluşurken benimkinde oluşmuyordu. Sebebiyse enum ile yapılan LP kontrolüydü. Benim için aşağıdaki güncelleme iş gördü:
case #LicensePlateId:
...
...
else if (mode != WHSWorkExecuteMode::AdjustmentIn &&
mode != WHSWorkExecuteMode::ReportAsFinished &&
...
...
...
//memre 22.12.2015
mode != WHSWorkExecuteMode::PurchaseOrderLineReceivingWithVendor &&
//memre
mode != WHSWorkExecuteMode::PurchaseOrderItemReceivingAndLocate &&
...
...
Bildiğim kadarıyla tüm temel noktalar bunlar. Daha fazla ayrıntı için benim de faydalandığım
blog ve
WMS dökümanından faydalanabilirsiniz.