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.

13 Ekim 2011 Perşembe

AXAPTA Splitter Kontrol

Axapta gerçek bir splitter kontrole sahip değil. Grup paneliyle bir class yapılmış ve bu birleştirilmiş. Axapta içinde bunu kullanan bazı formlar var. İsteyen oradan da bakabilir.
ClassDeclaration'a aşağıdaki kodlar yazılıyor:

    SysFormSplitter_X               _VerticalSplitter;
    SysFormSplitter_Y               _HorizontalSplitter;



Birincisi dikey splitter için, ikincisi ise yatay. Aşağıdaki kodu da formun init'ine yazıyoruz:

   _VerticalSplitter = new SysFormSplitter_X(VerticalSplitter,groupLeft,element);
   _HorizontalSplitter = new SysFormSplitter_Y(HorizontalSplitter,groupTop,element);

Dikey Splitter İçin Ayarlar:
Yukarıdaki VerticalSplitter, dikey splitter kontrol için kullandığımız Group kontrolü. Group kontrolün değerlerini aşağıdaki gibi ayarlıyoruz:
AlignChild = No
AlignControl = Yes
AutoDeclaration = Yes
BackgroundColor = Window background
FrameType = Raised 3D
HideifEmpty = No
Height = Column height
Width = 5
Dikey splitter'in sağına ve soluna birer group kontrol koyuyoruz ve parent kontrolünü de 3 column olarak ayarlıyoruz. Eğer buraya dikkat etmezsek ekran tuhaf birşey olur çıkar. Soldaki grubu Autodeclaration = Yes yapıyoruz. Soldaki grubun adı yukarıdaki groupLeft oluyor. Height değerini Column Height yapıyoruz, Width değerini de 100-200 gibi birşey ayarlıyoruz, bu değer zaten biz kaydırdıkça değişecek ve saklanacak. Sağdaki grubun height değerini column height ve width değerini de column width olarak ayarlıyoruz, başka bir ayar gerekmiyor burası için.
Dikey splitter'in methodlarını da aşağıdaki gibi ayarlıyoruz:

int mouseUp(int x, int y, int button, boolean ctrl, boolean shift)
{
    int ret;

    ret = super(x, y, button, ctrl, shift);

    Return _VerticalSplitter.mouseUp(x, y, button, ctrl, shift);
}

int mouseMove(int x, int y, int button, boolean ctrl, boolean shift)
{
    int ret;

    ret = super(x, y, button, ctrl, shift);

    Return _VerticalSplitter.mouseMove(x,y,button,ctrl,shift);
}

int mouseDown(int x, int y, int button, boolean ctrl, boolean shift)
{
    int ret;

    ret = super(x, y, button, ctrl, shift);

    Return _VerticalSplitter.mouseDown(x, y, button, ctrl, shift);
}

Yatay Splitter İçin Ayarlar:
Burada sadece dikeyden farklı olanları anlatacağım. Yatay'ın farklı ayarları:
Parent kontrolde columns = 1 olacak.
Height = 5
Width =Column Width
Örneğimizdeki üstündeki grubun adı groupTOP. Farklı olarak Height değeri 100-200 gibi birşey ve Width değeri Column width. Methodlarına da yukarıdakinden farklı olarak _VerticalSplitter yerine _HorizontalSplitter yazılacak. Altta kalan grubun Width değeri Column Width ve Height değeri de Column Height olacak.


Hepsi bu. Bana ilk incelediğimde çok karışık gelmişti, ancak formdan ayıklayınca ve biraz kurcalayınca aslında basit birşey olduğunu gördüm.
 

12 Ekim 2011 Çarşamba

AXAPTA Forma sürüklenen tablo field grubunu edit edebilmek?

Yeni alan ekleyebilmek için grubun AutoDataGroup özelliğini No yapmak ve gerekiyor.
Değişiklik veya silmek yapabilmek için de DataGroup alanını boşaltmak gerekiyor.

6 Ekim 2011 Perşembe

AXAPTA Adres tablosuyla çalışmak

Daha doğrusu adres tablolarıyla demek lazım. Birkaç tabloyu join ile birleştirmek gerekiyor. Benim örneğimde VendTable daki bir satıcının adres bilgilerini almaya çalışacağız:

    DirPartyAddressRelationShip         dirPartyAddressRelationShip;
    DirPartyAddressRelationShipMapping  dirPartyAddressRelationShipMapping;
    Address                             address;
    ;
                    select firstonly * from DirPartyAddressRelationShip join
                        dirPartyAddressRelationShipMapping join address
                        order by
                            DirPartyAddressRelationShip.Shared desc,
                            DirPartyAddressRelationShip.IsPrimary desc
                        where DirPartyAddressRelationShip.PartyId == VendTable::find(vendPAckingSlipJour.OrderAccount).PartyId &&
                              dirPartyAddressRelationShipMapping.PartyAddressRelationshipRecId == dirPartyAddressRelationShip.RecId &&
                              address.RecId == dirPartyAddressRelationShipMapping.AddressRecId &&
                              address.type == AddressType::Service;

DirPartyAddressRelationShip tablosu adreslerle kaynak tablo (buradaki örnekte VendTable) arasındaki bağlantıları sağlayan tablo. Örnekteki VendTable tablosundaki PartyId alanıyla DirPartyAddressRelationShip tablosu bağlanıyor.
Adreslerse Address tablosunda. DirPartyAddressRelationShip ve Address tablosunu birbirine bağlayan tabloysa DirPartyAddressRelationShipMapping tablosu. DirPartyAddressRelationShipMapping tablosunun PartyAddressRelationshipRecId alanıyla DirPartyAddressRelationShip tablosunun RecId alanı birbirine bağlanıyor. 
DirPartyAddressRelationShipMapping tablosunun AddressRecId alanıyla da Address tablosunun RecId alanı birbirine bağlanıyor ve bağlantı tamamlanmış oluyor. 

DirPartyAddressRelationShip tablosundaki Shared alanı Satıcılar formundaki Adres tabındaki Genel alanına, IsPrimary alanı da Birincil alanına denk geliyor. Type alanı da adres türlerine denk geliyor. Ben burada servis adresini almak istediğim için bu alanı AddressType::Service enum değerine eşitledim.

5 Ekim 2011 Çarşamba

AXAPTA icase karşılığı ve bugünün tarihi

b = a > SystemDateGet() ? "büyük" : "küçük"

AXAPTA TC Kimlikno extended data tipi var mı?

Evet bu alan hazır var, açmaya gerek yok. Adı IdentityNum_TR . Ancak bu alanı biraz hatalı açmışlar. Bu alanın boyu 11 karakter olmalıydı. 12 karakter açılmış.