Using Tree in Form

1. Firstly, create three tables with the following requirements.

1.1 Create a table (parent table) name: Medicine

Fields type Edt
MedName str
MedDesc str

1.2. Create a table (reference table) name: MedReferencehrr

Fields type Edt
MedRef int64 Medref = reference table: Medicines
DtOwn int64

Relation:
1. ownrelation : MedReferencehrr i.e, DtOwn == recid
2. Foreign key rel : Medicines MedRef = MedReferencehrr .recid

1.3 Create a table( child table ) name : MedDetails

Fields type Edt

MedRef int64 Medref = reference table: Medicines
Name1 str
Desc1 str

Relation: Normal: MedDetails .MedRef = Medicines .recid

1.4 Create a new Form named SampleTree2 and drag 3 tables in the form DS. The following code
must written as it is.

Medicines no relation
MedDetails join source: Medicines type: active
MedReferencehrr
In design: add group in group add a Tree name it as: SampleTree2

Public class FormRun extends ObjectRun
{

boolean isCreatedNew;
boolean isModified;
TreeItemIdx newItemIdx;
TreeItemIdx lastRecordIdx;
int64 lastRecordRecId;
String10 billingGroupRecid;

//
String10 billingeGroupHierarchyRecid;
int64 billingGroupHierarchyParentRecid;

//
QueryBuildRange qbrMedecines;

QueryBuildRange qbrMedReferencehrr;

//
List delRecList;
//

ImageListAppl_HISServices imageAppl;
#define.Root(3)
}
1. Init method :

public void init()
{
super();
imageAppl = new ImageListAppl_HISServices();
imageAppl.addImage(resourceStr(SampleTree),#Root);
SampleTree.setImagelist(imageAppl.imageList());
}

2. Run method :
public void run()
{
super();
if( Medecines.RecId == 0)
{
AddNewService.enabled(true);
}
element.loadTree();

}
3. Loadtree method:

public void loadTree()
{
TreeItemIdx parentItemIdx;

SampleTree2.deleteAll();

parentItemIdx = this.createRootNode();

this.createChildNodes(parentItemIdx,0);

SampleTree2.select(SampleTree2.getRoot());
SampleTree2.expand(SampleTree2.getRoot());
}

4. createRootNode method :

public TreeItemIdx createRootNode()
{
FormTreeItem parentItem;

parentItem = new FormTreeItem(“Medicines”);
parentItem.data(0);

//parentitem.image(imageAppl.image(#Root));
// parentitem.selectedImage(imageAppl.image(#Root));

returnSampleTree2.addItem(FormTreeAdd::Root,FormTreeAdd::First,parentItem);
}

5. createChildNodes method :

public void createChildNodes(TreeItemIdx _parentIdx, int64 _serviceGroupHierarchyParentRecid)
{
MedReferencehrr MedReferencehrrLocal;
MedReferencehrr MedReferencehrrChild;
Medecines medecines1;
FormTreeItem parentItem;
TreeItemIdx newParentIdx;

while select * from MedReferencehrrLocal
join * from medecines1
where MedReferencehrrLocal.DtOwn == _serviceGroupHierarchyParentRecid
&& MedReferencehrrLocal.MedRef == medecines1.RecId
{

select count(recId) from MedReferencehrrChild
where MedReferencehrrChild.DtOwn == MedReferencehrrLocal.RecId;

if(MedReferencehrrChild.RecId > 0)
{
parentItem = new FormTreeItem();
parentItem.data(MedReferencehrrLocal.RecId);
parentItem.text(medecines1.MedDesc);

newParentIdx = SampleTree2.addItem(_parentIdx,FormTreeAdd::Sort,parentItem);
if(MedReferencehrrLocal.RecId == lastRecordRecId)
{
lastRecordIdx = newParentIdx;
}
element.createChildNodes(newParentIdx,MedReferencehrrLocal.RecId);
}
else
{
parentItem = new FormTreeItem();
parentItem.data(MedReferencehrrLocal.RecId);
parentItem.text(medecines1.MedDesc);

newParentIdx = SampleTree2.addItem(_parentIdx,FormTreeAdd::Sort,parentItem);
if(MedReferencehrrLocal.RecId == lastRecordRecId)
{
lastRecordIdx = newParentIdx;
}
}

}

}

Now add action panel to this tree group . in button group add two buttons type : button name :AddBelow and delete .
In AddBelow button : clicked method :
void clicked()
{
super();
element.addNode(SampleTree2.getSelection());
}
In form Methods : add the method:
addNode method :

public void addNode(TreeItemIdx _parentIdx)
{
FormTreeItem newItem;
FormTreeItem parentItem;

newItem = new FormTreeItem(“”);
newItem.data(0);
//newItem.image(imageAppl.image(#NormalGroup));
//newItem.selectedImage(imageAppl.image(#NormalGroup));

newItemIdx = SampleTree2.addItem(_parentIdx, FormTreeAdd::Sort,newItem);

SampleTree2.select(newItemIdx);

Medecines_ds.create();

parentItem = SampleTree2.getItem(_parentIdx);
billingGroupHierarchyParentRecid = parentItem.data();
isCreatedNew = true;

AddBelow.enabled(false);
}

In Delete button : clicked method :
void clicked()
{
//super();
FormTreeItem treeItem;

treeItem = BillingTree.getItem(BillingTree.getSelection());

if(element.deleteBillingGroup(treeItem.data()))
{
element.loadTree();
}

}

In form Methods : add the method:
deleteBillingGroup method :
ignore error and cont
public boolean deleteBillingGroup(recId _recId)
{
Medecines medecines2;
MedReferencehrr medReferencehrrlocal;

DialogButton dialogButton;
ListEnumerator enumer;
boolean allDeleted = true;

if(_recId)
{
medReferencehrrlocal = MedReferencehrr::find(_recId);

dialogButton = Box::yesNo(‘Selected billing group and its subsidary group will be deleted’, DialogButton::No);
if( dialogButton == DialogButton::Yes )
{
try
{
delRecList = new List(Types::Int64);

delRecList.addStart(medReferencehrrlocal.MedRef);

element.deleteGroupCode(_recId);

enumer = delRecList.getEnumerator();

ttsBegin;

while(enumer.moveNext())
{
select forupdate medecines2
where medecines2.RecId == enumer.current();

if(medecines2.validateDelete())
{
medecines2.delete();
}
else
{
allDeleted = false;
break;
}
}

if(allDeleted)
{
ttsCommit;
return true;
}
else
{
ttsAbort;
return false;
}

}
catch
{
return false;
}
}
else
{
return false;
}
}

else
{
return false;
}
}

In Table MedReferencehrr(In Table not in Form) Create a new method ,write the following code :

public static MedReferencehrr find(
RecId _recid,
boolean _forUpdate = false,
ConcurrencyModel _concurrencyModel = ConcurrencyModel::Auto)
{
MedReferencehrr medReferencehrr ;
medReferencehrr.selectForUpdate(_forUpdate);

if(_forUpdate && _concurrencyModel != ConcurrencyModel::Auto)
{
medReferencehrr.concurrencyModel(_concurrencyModel);
}

select firstonly * from medReferencehrr where medReferencehrr.RecId == _recid;

return medReferencehrr;
}

——
Come Back to Form and Create a New Method In form name : deleteGroupCode

public void deleteGroupCode(recId _parentrecId)
{
MedReferencehrr medReferencehrrChild;
MedReferencehrr medReferencehrrTraverse;

while select * from medReferencehrrTraverse
where medReferencehrrTraverse.DtOwn == _parentrecId

{

select count(recId) from medReferencehrrChild
where medReferencehrrChild.DtOwn == medReferencehrrTraverse.RecId;

if(medReferencehrrChild.RecId > 0)
{
delRecList.addEnd(medReferencehrrTraverse.MedRef);
element.deleteGroupCode(medReferencehrrTraverse.RecId);

}
else
{
delRecList.addEnd(medReferencehrrTraverse.MedRef);
}

}
}

In Form DesignDesigngroupTree SampleTree2 –right click – override method – SelectionChanged :

public void selectionChanged(FormTreeItem _OldItem, FormTreeItem _NewItem, FormTreeSelect _how)
{
super(_OldItem, _NewItem, _how);

if(SampleTree2.getRoot() == SampleTree2.getSelection())
{
AddNewService.enabled(false);
}
else
{
AddNewService.enabled(true);
}

if(isCreatedNew)
{
if(isModified)
{
if(SampleTree2.getSelection() != newItemIdx)
{
//if(HMServiceCatalog_ds.validateWrite())
//{
//HMServiceCatalog_ds.write();
//}
//else
//{
SampleTree2.select(newItemIdx);
//}
}

}
else
{
SampleTree2.delete(newItemIdx);
newItemIdx = 0;
if(Medecines_ds.validateWrite())
{
Medecines_ds.write();
}
isCreatedNew = false;
isModified = false;
AddBelow.enabled(true);
billingeGroupHierarchyRecid = element.getCurrentSelectedItemRecid();
MedReferencehrr_ds.executeQuery();
billingGroupRecid = int642str(MedReferencehrr.MedRef);
Medecines_ds.executeQuery();

}
}
else
{
billingeGroupHierarchyRecid = element.getCurrentSelectedItemRecid();
MedReferencehrr_ds.executeQuery();
billingGroupRecid = int642str(MedReferencehrr.MedRef);
Medecines_ds.executeQuery();

}
}

Now design the form. Take another Group , take action panel with two method,
Name Prop
AddNewService command : New
DeleteNewService command : DeleteRecord

Select a new grid and drag some fields from the Table : MedDetails

In Form DataSource :
1. Medecines

public void init()
{
super();

qbrMedecines = this.query().dataSourceTable(tableNum(Medecines)).addRange(fieldNum(Medecines,recId));
}
public void write()
{
MedReferencehrr MedReferencehrrLocal;

super();

if(isCreatedNew == true)
{
MedReferencehrrLocal.MedRef = Medecines.RecId;
MedReferencehrrLocal.DtOwn = billingGroupHierarchyParentRecid;
MedReferencehrrLocal.insert();

newItemIdx = 0;
billingGroupHierarchyParentRecid = 0;
isCreatedNew = false;
isModified = false;
AddBelow.enabled(true);

element.refresh(MedReferencehrrLocal.RecId);
}
else
{
element.refresh(MedReferencehrr.RecId);
}
}
public void executeQuery()
{
qbrMedecines.value(billingGroupRecid);

super();
}

2. MedReferencehrr

public void init()
{
super();

qbrMedReferencehrr = this.query().dataSourceTable(tableNum(MedReferencehrr)).addRange(fieldNum(MedReferencehrr,recId));
}

public void executeQuery()
{
qbrMedReferencehrr.value(billingeGroupHierarchyRecid);

super();
}

Lastly Create a new method in Form Method :

public void refresh(recId _lastRecid)
{
lastRecordRecId = _lastRecid;

element.loadTree();

SampleTree2.select(lastRecordIdx);
}

Now : In order to Sort the Tree Based on the following upper grid then :

1. Create a new Table MainTableMed
Add few fields
In Table Medecines :
Add relation  new relation give table : MainTableMed;
Right click foreign key PrimaryKey
A field will be generated .

2. In the Form Drag Table : MainTableMed into Datasource ..
InDatasourceTable: Medecines Properities
Join Source = MainTableMed
Link Type = active

In Form DataSource Table MainTableMed  override methods :

public void create(boolean _append = false)
{
super(_append);

SampleTree2.deleteAll();
AddBelow.enabled(false);
}

public void delete()
{
super();

if(MainTableMed.RecId == 0)
{
SampleTree2.deleteAll();
AddBelow.enabled(false);
}

}
public int active()
{
int ret;

ret = super();

if(ret)
{
if(MainTableMed.RecId)
{
element.loadTree();
AddBelow.enabled(true);
}
else
{
SampleTree2.deleteAll();
AddBelow.enabled(false);
}
}

return ret;
}
2

To work this Moddify the form method : CreateChildNodes

Now design the Form  take Group , add action panel contains New and Delete record Methods and a Grid : pro -datasource : MainTableMed , add few fields
1

Advertisements

2 responses

  1. Hi,
    can you please explain more about the Tables (What is MedRefrencehrr and MedDetails?) and the relation between them. It is not clear for me what these table are. Are they empty at the beginning? Maybe a short Description of Methods.

    Like

  2. Does this principal work if i am using two tree view list boxes and if i want to drag and drop child nodes from one table to another ?

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: