23 Temmuz 2013 Salı

AXAPTA - Lookup ve sort

Lookup oluşturduğunuzda sort eklediğiniz halde lookup'ın sizin belirlediğiniz sırada çıkmadığını görürsünüz:

public void lookup()
{
    SysTableLookUp          sysTableLookUp = SysTableLookup::newParameters(tablenum(SMARepairStage),RepairStageId);
    Query                   query = new Query();
    QueryBuildDataSource    qbds = query.addDataSource(tablenum(SMARepairStage));
        qbds.addSortField(fieldnum(SMARepairStage,Name));
        qbds.orderMode(OrderMode::OrderBy);
    sysTableLookup.addLookupfield(fieldnum(SMARepairStage,RepairStageId));
    sysTableLookup.addLookupfield(fieldnum(SMARepairStage,Name));
    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
}


Aşağıdaki değişikliği yaparsanız lookup'ın sizin belirlediğiniz sırada çıktığını göreceksiniz:

public void lookup()
{
    SysTableLookUp          sysTableLookUp = SysTableLookup::newParameters(tablenum(SMARepairStage),RepairStageId);
    Query                   query = new Query();
    QueryBuildDataSource    qbds = query.addDataSource(tablenum(SMARepairStage));
        qbds.addSortField(fieldnum(SMARepairStage,Name));
        qbds.orderMode(OrderMode::OrderBy);
    sysTableLookup.addLookupfield(fieldnum(SMARepairStage,RepairStageId));
    sysTableLookup.addLookupfield(fieldnum(SMARepairStage,Name));
    sysTableLookup.parmQuery(query);
    sysTableLookup.parmUseLookupValue(false);
    sysTableLookup.performFormLookup();
}

22 Temmuz 2013 Pazartesi

AXAPTA - Form açılırken istenen bir kontrole set focus

Formun firstField metoduna ilgili kontrol için bir setfocus yazmak gerekiyor:

public void firstField(int _flags=1)
{
    super(_flags);
    EmplId2.setFocus();
}

12 Temmuz 2013 Cuma

AXAPTA - Server tarih-saat değerini alırken saat dilimi farkı

DateTimeUtil classının utcNow  methodu saati Greenwich olarak verir. Alırken ve verirken çevirmek gerekir:

CallDateTime.value(DateTimeUtil::applyTimeZoneOffset(DateTimeUtil::utcNow(),DateTimeUtil::getCompanyTimeZone()));
...

...
JournalLines.CallDateTime = DateTimeUtil::removeTimeZoneOffset(CallDateTime.value(),DateTimeUtil::getCompanyTimeZone());

11 Temmuz 2013 Perşembe

AXAPTA - Barkod yazdırma

İnternette bulduğum Axapta barkod yazdırma konusundaki blogların çoğunun denenmemiş ve birbirinden kopya olduğunu sanıyorum. Çünkü bazı sıkıntılar var ki bunlardan hiç bahsedilmemiş. Ben aşağıda bunlara da değindim:

Code 128 için:

display BarCodeString ServiceObjectbarCode()
{
    Barcode barcode;
    ;

    barcode = BarcodeCode128::construct();
    barcode = Barcode::construct(BarcodeType::Code128);


    barcode.string(true, ServiceObject.ItemSerialNum);
    barcode.encode();
    return barcode.barcodeStr();
}


Bu display alanı sürükledikten sonra özellikleri:

Font - BC C128 Narrow

Width - Bu değer auto olmamalı. Code 128 ile auto yapıldığında Axapta etiketi olması gerektiğinden erken sonlandırıyor. Deneme ile gerekli alan uzunluğu bulunabilir. Ben kendi örneğimde 10 cm yaptım.
Fontsize - 24 (24'ten düşük bir fontla yazdırmayı başaramadım. Daha büyük fontlar denerken de arada bazı boyutları yazıyor ama okuyucu okumuyor, deneme yanılma yöntemiyle bulmak gerekiyor malesef).

Code 39 için:
display BarCodeString ServiceOrderbarCode()
{
    Barcode barcode;
    ;

    barcode = Barcode::construct(BarcodeType::Code39);
    barcode.string(true, ServiceOrder.ServiceOrderId);
    barcode.encode();

    return barcode.barcodeStr();
}


Font - BC C39 3 to 1 HD Wide
Code39 ile width Auto olduğunda bir sıkıntı yaşamadım.
Aynı şekilde bunda da font 24'ten küçük olduğunda ve arada bazı boyutlarda okuma sorunu yaşadım. Benim yaşadığım okuma sorunları okuyucu kaynaklı da olabilir tabii.

4 Temmuz 2013 Perşembe

AXAPTA - Gridde bir kayda hızlı konumlanmak

Kayda konumlanmak için findrecord ve findvalue methodları çok yavaş. Bunun yerine filter kullanılabiliyor ancak o zaman da ekranda sadece istenen kayıtlar görüntülenebiliyor. Eğer tüm kayıtlar görüntülensin ve cursor de istediğimiz kayıtta konumlansın istiyorsanız  bir blogda rastladığım orijinal lookup formlarında da kullanılan aşağıdaki yöntemi kullanabilirsiniz:

element.args().lookupField(fieldnum(SMAServiceOrderTable, ServiceOrderId));
element.args().lookupValue(_order.ServiceOrderId);
 

SMAServiceOrderTable_ds.executeQuery();

Not: Arama için kullandığınız alanın indeksli olması gerektiğini unutmayın!..

24 Haziran 2013 Pazartesi

AXAPTA - cacheAddMethod ile display methodları hızlandırmak

Axapta normalde bir kayıttaki display methodları dolaşırken defalarca ard arda çağırabilir. Bu display method sayısı fazla olduğunda can sıkıcı hale gelebilir.  cacheAddMethod ile display methodlar serverda bir arabellekte saklanır ve oldukça güzel performans artışı sağlanabilir. Bu method "datasource"un init methodunda super sonrası çağrılabilir. Yanlış yerde çağrıldığında donmalara sebep olabiliyor. Ayrıca bu display methodların "tablo" display methodu olması gerekiyor.
Bu yöntem aynı zamanda edit methodlar için de çalışıyor.

public void init()
{
    super();
    this.cacheAddMethod(tableMethodStr(B_CallTrack, CustomerName));
    this.cacheAddMethod(tableMethodStr(B_CallTrack, EndUserWarrantyStart));
    this.cacheAddMethod(tableMethodStr(B_CallTrack, ExtendedWarrantyDate));
    this.cacheAddMethod(tableMethodStr(B_CallTrack, ModelGroupID));
}


 Ara belleğe alınan display/edit methodlar update methodu çalışmadan güncellenmezler. Update methodundan önce güncellenmeleri gerektiğinde cacheCalculateMethod u kullanabilirsiniz:
B_CallTrack_DS.cacheCalculateMethod(tableMethodStr(B_CallTrack, EndUserWarrantyStart));
 

AX 2012 için güncelleme:

AX 2012'de bu işlem çok daha basit. SysClientCacheDataMethodAttribute kullanarak bu iş basitçe halledilebiliyor. Opsiyonel olarak bir parametre eklenmiş. True gönderildiğinde yukardaki update meselesi de çözülmüş oluyor. Ancak bu şekilde tanımlama yapıldığında display/edit metod tüm formlarda cache içine alınıyor. Eğer her formda ayrı ayrı yapılmak isteniyorsa eski yöntem de halen geçerli.


[SysClientCacheDataMethodAttribute(true)]
display name dispCustName()
{
    return CustTable::find(this.CustAccount).Name;
}
 

AXAPTA - Display method yetki kontrolü

//BP Deviation documented
display CustName customerName()
{
    CustName    custName    = '';
    DictTable   dictTable   = new DictTable(tablenum(CustTable));
    ;

    if (dictTable.rights() >= AccessType::View)
    {
        custName = CustTable::find(this.CustAccount).Name;
    }

    return custName;
}