29 Kasım 2011 Salı

AXAPTA Ana tablo formuna git çalışmayınca?

Bir tabloya bağlı kontrollerde tabloda ayarlanmışsa "Ana tablo formuna git" butonu otomatik olarak çalışır. Ancak kontrol sadece extended data tipine bağlıysa, çalışmaz. Bu durumda kendi Jumpref methodunuzu yazmanız gerekir.

Bu konuda Fatih Demirci'nin aşağıdaki kodundan faydalandım:

public void jumpRef()
{
EmplTable emplTable;
Args args;
MenuFunction menuFunction;
;
emplTable = EmplTable::find(this.text());
if (!emplTable)
{
return;
}
args = new Args();
args.caller(element);
args.record(emplTable);
menuFunction = new MenuFunction( menuitemdisplaystr(EmplTable),
MenuItemType::Display);
menuFunction.run(args);
}

Ancak bu kodun standart "Ana tablo formuna git" butonundan ufak bir farklılığı vardı. Ekrana sadece ilgili kaydı getiriyordu. Standarttaysa ilgili kayıt bulunuyor ve tüm kayıtlar görüntüleniyordu. Ufak bir araştırma sonrası aşağıdaki kodu yazdım. Tam standarttaki gibi çalışıyor:

public void jumpRef()
{
CustTable custTable;
Args args;
MenuFunction menuFunction;
;
args = new Args();
args.caller(element);
args.lookupfield(FieldNum(CustTable,AccountNum));
args.lookupValue(this.text());
menuFunction = new MenuFunction(MenuItemDisplayStr(custTable),MenuItemType::Display);
menuFunction.run(args);
}

24 Kasım 2011 Perşembe

AXAPTA Kullanıcı ilişkileri

Axapta'da kullanıcı ilişkileriyle ilgili üç tablo var:

UserInfo - Bu tabloda Axapta'ya girebilmek için kullandığınız active directory user kodları var:
Id alanında user id ve name alanında ismi ...

EmplTable - Bu personel dosyası.
EmplId alanında personel kodu var.

SysCompanyUserInfo - Bu tablo UserInfo ve EmplTable dosyalarını birbirine bağlamaya yarıyor. Bu tablodaki UserId alanına UserInfo tablosundaki Id ve EmplId alanına da EmplTable'daki EmplId bilgisi atılarak aradaki bağlantı sağlanıyor. Bu bağlantıyı yapmak için Yönetim->Kullanıcı ilişkileri formunu kullanabilirsiniz.

Mevcut ID alanını CurUserId() fonksiyonu ile alabilirsiniz.
Mesela bir tablo oluşturdunuz ve o tabloda sisteme giriş yapılan varsayılan Employee ID değerini atamak istiyorsunuz:
    MyTable.EmplId = SysCompanyUserInfo::find(CurUserId()).EmplId;

3 Kasım 2011 Perşembe

AXAPTA'yı çökertmek: hata 174

Aşağıdaki kod hata vermiyor. Ancak istediğim işi de yapmayacak, yine de hata 174 verip AOS'u göçertmemesi gerekir:

    select firstonly * from ord join rel join obj
        where ord.ServiceOrderId == rel.RelKeyId &&
            rel.RelTableId == ord.TableId &&
            obj.ServiceObjectId == rel.ServiceObjectId &&
            ( L_ItemSerialNum.valueStr()== obj.ItemSerialNum || (!L_ItemSerialNum)) &&
            ( L_SMAServiceObjectId.valueStr()== rel.ServiceObjectId || (!L_SMAServiceObjectId));

Kodu düzeltince hata vermiyor:
    select firstonly * from ord join rel join obj
        where ord.ServiceOrderId == rel.RelKeyId &&
            rel.RelTableId == ord.TableId &&
            obj.ServiceObjectId == rel.ServiceObjectId &&
            ( L_ItemSerialNum.valueStr()== obj.ItemSerialNum || (!L_ItemSerialNum.valueStr())) &&
            ( L_SMAServiceObjectId.valueStr()== rel.ServiceObjectId || (!L_SMAServiceObjectId.valueStr()));

İnternette ufak bir araştırma yaptım ve bu hatanın tamamen düzgün yazılmış kodlarda da verdiğini öğrendim.

27 Ekim 2011 Perşembe

AXAPTA Number Sequence, numara almanın başka bir yolu

    ExtendedTypeId              id  = TypeID2ExtendedTypeId(TypeId(SMAServiceObjectId));
    NumberSeq                   num = NumberSeq::newGetNum(NumberSequenceReference::find(id));
    ;
...
...
    SMAServiceObjectTable.ServiceObjectId     = num.num();

26 Ekim 2011 Çarşamba

AXAPTA Form datasource içinde kullanılan bir tablo alanını kodla kontrol.

Dizayn ekranında bu çok kolay. Kodla yapmak için object dizisini kullanmak gerekiyor:    

SMAObjectGroup_ds.object(fieldnum(SMAServiceObjectGroup,
        Barebone)).enabled(SMAObjectGroup.ServiceItemType == B_ServiceItemType::Item);

20 Ekim 2011 Perşembe

AXAPTA Yeni kaydı başka bir formda yapıp asıl forma geri dönmek

Bazı durumlarda Yeni kaydı başka bir formda yapmak isteyebilirsiniz veya bunu yapmak zorunda kalabilirsiniz. Axapta orjinal formlarında bunun örnekleri var ancak doğrusu bana çok karışık geldi. Ben basitçe şöyle yaptım:
Ana formun Create methodu:

public void create(boolean _append = false)
{
    Args                args;
    FormRun             formCreate;
    ;

        args = new Args();
        args.name(formstr(B_ExpressServiceNew));
        args.caller(element);

        formCreate = classfactory.formRunClass(args);
        formCreate.init();
        formCreate.run();
        formCreate.wait();
}

Buradaki B_ExpressServiceNew, bizim kayıt açan formumuz oluyor.
Kayıt açan formdaki kayıt methodunun bizi ilgilendiren parçası :


    if (element.args() && element.args().caller() && element.args().caller().name() == formstr(B_ExpressService))

    {
     mainForm = element.args().caller();
     mainForm.SetRecord(oTable);
    }


B_ExpressService ana formumuz, oTable da kaydımız.
Bu da yeni oluşturduğumuz kayda konumlanabilmek için ana formda açtığımız setrecord methodu:

void SetRecord(SMAServiceOrderTable _order)
{
    ;
    SMAServiceOrderTable.reread();
    SMAServiceOrderTable.data(_order);
    SMAServiceOrderTable_DS.setCurrent();

} 

AXAPTA Edit method örneği:

Edit method, tabloda bir field'ın değerinin tabloda bulunmayan başka bir bilgiye göre güncellendiği zaman kullanılabiliyor. Mesela burda tablonun ServiceObjectId alanı ItemId'ye göre değişiyor. Editmethod'a tablodaki ServiceObjectId değerine sahip ItemId değerini getiriyoruz, ve ItemId değiştikçe tablodaki ServiceObjectId alanını güncelliyoruz.


edit ItemId EditItemId(boolean set, ItemId _ItemId)
{
    ItemId ret;
    ;

    if (set)
    {
        this.ServiceObjectId =
            SMAServiceObjectTable::findItem(_ItemId).ServiceObjectId;
    }
    else
    {
        ret = SMAServiceObjectTable::find(this.ServiceObjectId).ItemId;
    }
    return ret;
}

Set boolean değeri editmethod'un düzenleme mi yoksa görüntüleme için mi çalışacağını belirliyor. Set true ise ikinci parametre (burada _ItemId) kullanıcı tarafından doldurulmuş demektir. aşağıda bu duruma göre ilgili field dolduruluyor. False olduğu zaman da ilgili field bilgisinden editmethod değeri geliyor.