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.
Güzel çalışma eline sağlık.
Permalink