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.

 
  1. Güzel çalışma eline sağlık.

  1. No trackbacks yet.