Axaptada hiyerarşık bir tabloyu ağaç yapısıyla yönetmek

Merhaba
Bazı durumlarda hiyerarşık yapılar kurmak zorunda kalabilirsiniz. Bunu yönetmenin en iyi yolu ağaç(Tree) yapısını kullanmaktır. Axapta standardında bir çok yerde ağaç yapısını görebilirsiniz. Örneğin: LedgerRowDefDesigner formunda sürükle bırakla çalışan bir ağaç yapısı mevcut. Ayrıca  tutorial_Form_TreeControl örnek formu da size fikir verebilir.
Ben örneğimde bir hiyerarşi tablosunun form açıldığında ağaç yapısıyla görüntülenmesini ve  ağaç elemanlarının (Node)  bu form vasıtasıyla düzenlenmesinin (güncelleme , silme ve ekleme) nasıl yapılacağını anlatacağım.
Örnek olarak şöyle bir tablomuz  olsun :
ETGItemGroupTable :    ItemGroupId    ,    ItemGroupName    ,    ItemGroupLevel   ,    ItemGroupIdParent
ItemGroupId  ,   ItemGroupIdParent   =  EDT – DTItemGroupId
ItemGroupId  ,   ItemGroupIdParent   aynı EDT den oluşturuyoruz. Hiyerarşik yapıyı ItemGroupIdParent sayesinde kuracağız.
ItemGroupLevel   Burada  hiyerarşiyle pek ilgisi olmayan benim kurgumla alakalı olan bir seviye kodu var. Ben bu hiyerarşideki bütün elamanların birer seviye kodu olsun istiyorum ve bu kod 1-8 arasında olabilir. Formda gerekli kontrolleri buna göre yazıyorum.
Ulaşmak istediğim form görünümü şu şekilde

Yeni bir form oluşturup veri kaynağını ekleyip tasarımdada gerekli elemanları ekleyelim. Ağaç elemanımızı da ekledikten sonra bazı metodlar yazmamız gerekiyor onlara gecelim.

Bu metodları formun metodlarına ekeleyelim.

public class FormRun extends ObjectRun
{
    CCFormTreeDatasource treeDatasource;
}
public void run()
{
    FormControl hostControl;
    ;
    super();
    this.InitTree();
}
int ExpandAndSelectRec(str 25  ChildId)
{
    int                 node;
    ETGItemGroupTable   TreeItemGroupTable;
    str                 IdTree;
    ;
    select firstonly TreeItemGroupTable
    where TreeItemGroupTable.ItemGroupID == ChildId;
    if (TreeItemGroupTable)
    {
node = this.ExpandAndSelectRec(TreeItemGroupTable.ItemGroupIDParent);
        tree.expand(node, FormTreeExpand::EXPAND);
        IdTree   = tree.getItem(node).data();
        while (ChildId != IdTree)
        {
            node    = tree.getNextVisible(node);
            IdTree  = tree.getItem(node).data();
        }
    }
    else
    {
        node = tree.getRoot();
    }
    tree.select(node);
    return node;
}
void ExpandAndSelect(str ChildId)
{
     tree.lockWindowUpdate(true);
     this.ExpandAndSelectRec(ChildId);
     tree.lockWindowUpdate(false);
}
void exit()
{
;
    element.closeSelect(treedatasource.selectedData());
}
void InitTree()
{
treeDatasource = new CCFormTreeDatasource(ETGItemGroupTable_DS,
    tree,          fieldnum(ETGItemGroupTable,ItemGroupID),
                    fieldnum(ETGItemGroupTable,ItemGroupIDParent),
                    fieldnum(ETGItemGroupTable,ItemGroupName),
                    true, false
                    );
    // İlk kaydı Oluştur
    treeDatasource.initRoot("Grup",'',0);
}

Şimdi Ağaçımızın bazı metodlarını güncelleyelim:

boolean expanding(int idx, FormTreeExpand action, anytype data)
{
    boolean ret;
    ;
    ret = super(idx, action, data);
    treeDatasource.expanding(idx, action, data); // expand node
    Return ret;
}
void selectionChanged(FormTreeItem oldItem,
            FormTreeItem newItem, FormTreeSelect how)
{
    ;
    super(oldItem, newItem, how);
    treeDatasource.selectionChanged(oldItem,newItem);
    if(!ETGItemGroupTable.ItemGroupId)
    {
        GroupMainAdd.visible(true);
        GroupLineAdd.visible(false);
    }
    else
    {
        GroupMainAdd.visible(false);
        GroupLineAdd.visible(true);
    }
}
public int mouseDblClick(int _x, int _y,
              int _button, boolean _Ctrl, boolean _Shift)
{
    int ret;
    ;
    ret = super(_x, _y, _button, _Ctrl, _Shift);
    element.exit();
    return ret;
}
int mouseUp(int x, int y,
           int button, boolean ctrl, boolean shift)
{
    super(x, y, button, ctrl, shift);
    return 1;
}

Bu eklemelerle ağaç yapısını çalışır hale getirdik. Burdan sonra ağaça eleman ekleme silme ve güncelleme işlemlerini nasıl yapacağımıza bakalım. Öncelikle tasarım öğelerini hazırlayalım. Gerekli butonları ve veri alanlarını hazırladıktan sonra düğmelerin click metodlarından şu metodları çağıralım.
void deleteETGItemGroupTable()
{
ETGItemGroupTable  insItemGroupTable;
DTItemGroupId      ItemGroup;
;
ItemGroup = ETGItemGroupTable.ItemGroupIdParent;
/* alt elemanlarıda silmek isterseniz
ttsbegin;
delete_from insItemGroupTable
where insItemGroupTable.ItemGroupIdParent == ETGItemGroupTable.ItemGroupId;
ttscommit;
*/
ttsbegin;
delete_from insItemGroupTable
where insItemGroupTable.ItemGroupId == ETGItemGroupTable.ItemGroupId;
ttscommit;
element.refreshTree(ItemGroup);
}
void InsertETGItemGroupTableLine()
{
ETGItemGroupTable  insItemGroupTable;
int i;
;
insItemGroupTable.clear();
insItemGroupTable.ItemGroupId       = StringItemGroupId2.valueStr();
insItemGroupTable.ItemGroupName     = StringItemGroupName2.valueStr();
insItemGroupTable.ItemGroupLevel    = ETGItemGroupTable.ItemGroupLevel;
insItemGroupTable.ItemGroupIdParent = ETGItemGroupTable.ItemGroupId;
insItemGroupTable.insert();
element.refreshTree(insItemGroupTable.ItemGroupId  );
}
void InsertETGItemGroupTable()
{
ETGItemGroupTable  insItemGroupTable;
;
insItemGroupTable.clear();
insItemGroupTable.ItemGroupId = StringItemGroupId.valueStr();
insItemGroupTable.ItemGroupName = StringItemGroupName.valueStr();
insItemGroupTable.ItemGroupLevel = str2int(StringItemGroupLevel.valueStr());
insItemGroupTable.insert();
element.refreshTree( insItemGroupTable.ItemGroupId  );
}
void updateETGItemGroupTable()
{
ETGItemGroupTable  insItemGroupTable;
DTItemGroupId      ItemGroup;
;
ItemGroup = ETGItemGroupTable.ItemGroupIdParent;
ETGItemGroupTable_ds.write(); // update için koyduğum alanlar verikaynağında
direk alınmış alanlar olduğu için write komutu update işimi görmeye yetiyor.
element.refreshTree( insItemGroupTable.ItemGroup  );
}
refreshTree  metodunada bakalım
void refreshTree(DTItemGroupId  _ItemGroupId)
{
ETGItemGroupTable_ds.query().dataSourceName(“ETGItemGroupTable”).clearRanges();
// Ben bunu yaparken ağaçı tekrar yüklemede başarısız  oldum.
// Daha sonra  gördümkü o anda üzerinde bulunduğum elemanı veri kaynağına kriter olarak ekliyor.
// Bu eklenen  kriterleri boşaltıp inittree metodunu çalıştırıyoruz.
element.InitTree();
element.ExpandAndSelect( _ItemGroupId  );
// bu kod sayesinde üzerinde işlem yaptığımız elemana tekrar gidiyoruz.
}
Bu yazımda size kısaca ağaç yapısını nasıl kullanabileceğinizi anlatmaya çalıştım. Umarım faydalı olmuştur.
Selamlar.

0 thoughts on “Axaptada hiyerarşık bir tabloyu ağaç yapısıyla yönetmek

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Dijital Dönüşümünüzü AI İle Hızlandırın

Dynamics 365 ve AI destekli çözümlerle iş süreçlerinizi optimize edin, verinizi anlamlı içgörülere dönüştürün ve büyümenizi sürdürülebilir hale getirin.

AI-Ready Enterprise Partner

Microsoft Dynamics 365 ve yapay zekâ çözümleriyle kurumsal sistemlerinizi güçlendirir, operasyonel karmaşıklığı azaltır ve geleceğe hazır bir mimari tasarlarız.

DMR Göztepe Merkez Ofis

Eğitim Mah. Hızırbey Cad. No:118/5 D:1 Kadıköy İstanbul

Marmara Üniversitesi Göztepe Kampüsü Teknopark

Tel: +90 216 470 79 49

E-posta: info@dmrbt.com

DMR Başıbüyük Ofis

Başıbüyük Mahallesi Süreyyapaşa Başıbüyük Yolu Sk. No: 4/7 Maltepe İstanbul

Marmara Üniversitesi Başıbüyük Kampüsü Teknopark

Tel: +90 216 470 79 49

E-posta: info@dmrbt.com