21 Kasım 2013 Perşembe

AXAPTA - Bir tablo alanını cross-company çalışacak hale getirmek


Bir forumdan öğrendiğim bu yöntemle tüm yapmanız gereken yukarıdaki gibi bir relation ve extended data tipine dikkat etmek. Bundan sonra formlarda lookup veya validation method yazmadan ilgili alanınız cross-company çalışacak. Bu özellik AX 2009 ile çalışıyor, 2012 ile deneme şansım olmadı.

AXAP - Cross company lookup

public void lookup(FormControl _formControl, str _filterStr)
{

      CustTable   custTable;    
      Query                   Query  = new Query();
      QueryBuildDataSource    qbds;
      SysTableLookup          SysTableLookup  =      
            SysTableLookup::newParameters(TableNum(CustTable), _formControl);
    ;
    super(_formcontrol,_filterstr);

    Query.allowCrossCompany(true);      
    Query.addCompanyRange(myTable.Company);
    qbds           = Query.addDataSource(TableNum(CustTable));
    SysTableLookup.addLookupfield(FieldNum(CustTable, AccountNum), true);      

    SysTableLookup.addLookupfield(FieldNum(CustTable, Name));
    SysTableLookup.parmQuery(Query)

    SysTableLookup.performFormLookup();
}


Kontrolün validate metodunu ezmeyi unutmayın!..

18 Kasım 2013 Pazartesi

AXAPTA - Combobox enum kullanırken bazı elementleri atlamak

Çözümünü bir forumda buldum:

Form kontrolünün Enter metodunun super sonrasına yazılacak:

    this.delete(enum2str(DTSSHOperationLineType::Part));
    this.delete(enum2str(DTSSHOperationLineType::ExternalPart));


Eğer kontrol bir grup altındaysa AutoDataGroup = No yapmayı unutmayın.

14 Kasım 2013 Perşembe

AXAPTA - Gridde hızlı kayıt bulma

Bu işi için sakın find metodunu kullanmayın, büyük tablolarda çok yavaş çalışır. Axapta'nın kendi formlarında kullandığı yöntem bu:

element.args().lookupField(fieldnum(SMAServiceOrderTable, ServiceOrderId));
element.args().lookupValue(_myServiceOrderId);
SMAServiceOrderTable_ds.executeQuery();

5 Kasım 2013 Salı

AXAPTA - Tabloda password field

Bu konuyu yazarken Greg on Dynamics AX blogundan yararlandım.

Öncelikle tablomuzda tipi container olan bir password field açıyor ve extended data tipini CryptoBlob olarak seçiyoruz.

Password alanı için edit metodumuz:

edit Password edtPassword(boolean _set = false, Password _pwd = '')
{
    CryptoBlob cryptoBlob = connull();
    ;
    if (_set)
    {
        this.Password = WinapiServer::cryptProtectData(str2cryptoblob(_pwd));
    }
    return (this.Password == connull()) ? '' : 'xxxxxxxx';
}


Kodla passwordü okumak için metodumuz:
Password getPassword()
{
    CryptoBlob cryptoBlob;
    ;
    cryptoBlob = this.Password;
    return (cryptoBlob == connull()) ? '' :
        cryptoblob2str(WinapiServer::cryptUnProtectData(cryptoBlob));
}


Kodla passwordü yazmak için metodumuz:

void setPassword(Password _pwd = '')
{
    CryptoBlob cryptoBlob = connull();
    ;
    this.Password = WinapiServer::cryptProtectData(str2cryptoblob(_pwd));
}

Ekranda okuturken ilgili kontrolün PasswordStyle değerini Yes yapmayı unutmayın.

10 Ekim 2013 Perşembe

AXAPTA - Join A tablosunu B tablosuna ve yine A tablosunu C tablosuna bağlamak

Bir forumda öğrendiğim yöntemle bunu yapabiliyorum. Püf noktası fetchMode komutu. Eğer fetchMode komudunu kullanmazsanız düzgün bir select oluşmaz. 
Query query = new Query();
QueryBuildDataSource qbds,qbds1,qbds2;
;
qbds = query.addDataSource(tableNum(SMAServiceOrderTable));
qbds1 = qbds.addDataSource(tableNum(B_RepairJournal));
qbds1.fetchMode(QueryFetchMode::One2One);
qbds1.addLink(fieldNum(B_RepairJournal,ServiceOrderId),fieldNum(SMSServiceOrderTable,ServiceOrderId));
qbds2 = qbds.addDataSource(tableNum(InventTable));
qbds2.fetchMode(QueryFetchMode::One2One);
qbds2.addLink(fieldNum(SMAServiceOrderTable,ItemId),fieldNum(InventTable,ItemId));

info(qbds.toString());

1 Ekim 2013 Salı

AXAPTA - Web servisi "CLR nesnesi Microsoft Dynamics anytype için sıralanamıyor." hatası

SenderTel2      = line.get_senderTel2();

 Axapta ile web servisi geliştirirken yukarıdaki gibi bir satırla servisten property okumaya çalışırken null değerler için "CLR nesnesi Microsoft Dynamics anytype için sıralanamıyor." hatası alıyorsanız ve hata veren satırı try/catch içine aldığınız halde hata mesajı yine de ekrana geliyorsa yapmanız gereken:

SenderTel2      = CLRInterop::isNull(line.get_senderTel2()) ? "" : line.get_senderTel2();