30 Eylül 2011 Cuma

AXAPTA Kayıtları Tazeleme

    repairjournal_ds.research();
    repairjournal_ds.refresh();

eğer cursor aynı kayıtta kalsın isteniyorsa:

    repairjournal_ds.research(true);
    repairjournal_ds.refresh();

AXAPTA Boş InventDimID verme

Boş inventdimid verme kodu:

SMAServiceBOMTable.InventDimId  = InventDim::inventDimIdBlank();

29 Eylül 2011 Perşembe

AXAPTA Query: Boş kayıtlar, boş olmayan kayıtlar

Query Addrange methodunda value değerine = yerine farklı işaretler koymak istersek değeri tırnak içinde formatlandırmak gerekiyor. Ama bazı durumlarda bu gereksiz:

Boş olmayanları istiyorsak:
    qbds.addRange(fieldnum(custtable,name)).value(sysquery::valueNotEmptyString()) ;
Boş olanları istiyorsak:
    qbds.addRange(fieldnum(custtable,name)).value(sysquery::valueEmptyString()) ;
10000 olmayanları istiyorsak:
    qbds.addRange(fieldnum(custtable,accountnum)).value(sysquery::valueNot("10000") ) ;
Aralık:
    qbds.addRange(fieldnum(custtable,accountnum)).value(queryrange("1","10000") ) ;
Enum:
            qbds.addRange(fieldnum(B_RMARequestTable, RefType)).value(queryvalue(B_RMAReqRefType::RepairJournal));


AXAPTA Kodla kayıt eklerken numara serisi

Dün eksik bıraktığım bir madde vardı. Kodla kayıt eklerken nasıl numara verilir?

B_RepairJournalPartsChange.ChangeNo               = NumberSeq::newGetNum(SMAParameters:: numRefRMARequestNo()).num();

28 Eylül 2011 Çarşamba

AXAPTA A'dan Z'ye numara serisi oluşturma

İlk önce hangi modül için numara serisi oluşturacaksak onun tablosu ve class'ını öğreniyoruz.
Benimkinin tablosu SMAParameters (Modülün parametreler ekranında kurulumdan öğrenilebilir ). Aşağıdaki methodu tablonun methodlarına ekliyoruz:

public server static NumberSequenceReference numRefRMARequestNo()
{
    return NumberSeqReference::findReference(
            typeid2extendedtypeid(typeid(B_RMARequestNo)));
}

Buradaki "B_RMARequestNo" tablomuzdaki anahtar alanın extended data tipi oluyor.

Ardından classa gidiyoruz. İlgili sınıfının adı parametre tablosunun numberSeqModule metodundan öğrenilebilir. Benimki NumberSeqReference_SMA. loadModule methoduna aşağıdaki kodu ekliyoruz:

    /* RMA Request No */
    numRef.DataTypeId              = typeId2ExtendedTypeId(typeid(B_RMARequestNo));
    numRef.ConfigurationKeyId      = configurationkeynum(SMAManagement);
    numRef.ReferenceHelp           = literalstr("Benim Numaram");
    numRef.WizardContinuous        = false;
    numRef.WizardFetchAheadQty     = 20;
    numRef.WizardManual            = NoYes::No;
    numRef.WizardAllowChangeDown   = NoYes::No;
    numRef.WizardAllowChangeUp     = NoYes::No;
    numRef.SortField               = 11;
    this.create(numRef);

Sortfield alanına bir üstteki tanımlanmış numberseqin bir fazlasını veriyoruz. Hiç yoksa 1.


Sonra Temel->Kurulum->Numara serileri->Numara serileri ne giriyoruz. Burda da sihirbazı çalıştırıyoruz.
Kontrol etmek için ilgili modülünü servis parametrelerinden numara serileri tabına gidip bir göz atıyoruz.

Sıra bu numara serisini formda kullanmakta:

Form classDeclaration a bu satırı ekleyin:

NumberSeqFormHandler numberSeqFormHandler;

Forma bu methodu ekleyin:

NumberSeqFormHandler numberSeqFormHandler()
{
    ;
    if (!numberSeqFormHandler)
    {

        numberSeqFormHandler = NumberSeqFormHandler::newForm(SMAParameters::numRefRMARequestNo().NumberSequence,
                                                             element,
                                                             B_RMARequestTable_DS,
                                                             fieldnum(B_RMARequestTable,RequestNo));
    }
    return numberSeqFormHandler;
}

Güncelleme: Yukarıdaki satır AX 2012 için şöyle olacak:
numRefRMARequestNo().NumberSequence
yerine
numRefRMARequestNo().NumberSequenceId 

B_RMARequestTable_DS sizin tablonuzun Datasourcesi. RequestNo da anahtar field.

Form close method:

public void close()
{
    if (numberSeqFormHandler)
    {
        numberSeqFormHandler.formMethodClose();
    }
    super();
}

Data source methodlarında yapılacaklar:

public void linkActive()
{
    ;
    element.numberSeqFormHandler().formMethodDataSourceLinkActive();
    super();
}

public boolean validateWrite()
{
    boolean ret;

    ret = super();
    ret = element.numberSeqFormHandler().formMethodDataSourceValidateWrite(ret) && ret;

    return ret;
}

public void write()
{
    super();
    element.numberSeqFormHandler().formMethodDataSourceWrite();
}

public void delete()
{
    ttsbegin;
    element.numberSeqFormHandler().formMethodDataSourceDelete();
    super();
    ttscommit;
}

public void create(boolean _append = false,boolean extern = false)
{
    element.numberSeqFormHandler().formMethodDataSourceCreatePre();
    super(_append);
    if (!extern)
    {
        element.numberSeqFormHandler().formMethodDataSourceCreate();
    }
}

Hepsi bu kadar...

20 Eylül 2011 Salı

AXAPTA Bir ürünün birimi

Ürün birimleri direk ürün tablosuna kaydedilmiyor. Ayrı bir tabloda saklanıyor:

MyTable.UnitID  = InventTableModule::find(Sobj.ItemId,ModuleInventPurchSales::Invent).UnitId;


2. parametreden hangi modülün birimini istediğimizi veriyoruz.

14 Eylül 2011 Çarşamba

AXAPTA Numaratör

Axapta'da tablolarda numaratör için "Number Sequence" var. Ancak sadece bir string içindeki değeri numara olarak arttırmak isterseniz? Yani "AB0001"->"AB0002" gibi. Bunun için hazır bir fonksiyon ya da bir kod bulamadım ve şunu yazdım:

Static str AutoNum(str Num)
{
    int i;
    int bas;
    str b;
    ;
    for (i=StrLen(num);i>=1;i--)
    {
        b=SubStr(num,i,1);
        if (b<"0" || b>"9")
        {
            bas=i+1;
            Break;
        }
        if (i==1)
            bas=1;
    }
    num=StrReplace(SubStr(num,1,bas-1)+
    Num2Str(Str2Num( SubStr(num,bas,StrLen(num) - bas + 1) )+1,
        StrLen(num) - bas + 1,0,1,0)," ","0");
    Return num;
}

6 Eylül 2011 Salı

AXAPTA Modified methodu bazen iki kez çalışıyor

Combobox değeri lookup ile seçilirse ve modified methodu içinde data source yenileme yapılırsa modified method'u iki defa çağrılıyor. Aynı durumla bir kişi daha karşılaşmış ve malesef sorusuna bir cevap alamamış.
public void modified()
{
    ;
    super();
    info("111");
    salesLine_DS.research(true);
    salesLine_DS.refresh();
    info("222");
}
Benzer durumla ilgili bir sayfa daha buldum ve oradaki çözümü kendime uyguladım. Class declaration methoduna bir kontrol değişkeni tanımladım ve:

public void modified()
{
    ;
    super();
    if (hasChanged) //çift çağırma bugını gidermek için.
        return;
    hasChanged=true;
    info("111");
    salesLine_DS.research(true);
    salesLine_DS.refresh();
    hasChanged=false;
    info("222");
}