Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Need some help with the algorithm
Message
From
07/10/2010 13:45:45
 
General information
Forum:
Visual FoxPro
Category:
Coding, syntax & commands
Environment versions
Visual FoxPro:
VFP 9 SP2
OS:
Windows 7
Network:
Windows 2003 Server
Database:
MS SQL Server
Miscellaneous
Thread ID:
01484275
Message ID:
01484365
Views:
35
Sorry, my VFP is too rusty to just grok that without stepping it :-{

>May be you can spot a problem in the SaveChild method:
>
>BTW, the first problem I see here - why did I declare iNodeIndex local if I pass it as a parameter - may be I introduced this bug.
>
>
>LPARAMETER iNodeIndex
>LOCAL iNodeIndex, i, iTempIndex, nChanges, lnLast_Mod, lnSeekVal, oTree
>
>with Thisform
>  nChanges   = 0
>  oTree      = .TList2
>  iTempIndex = oTree.Nodes(iNodeIndex).Child.FirstSibling.Index
>  
>  *Loop through all Parent's Child Nodes
>  FOR i = 1 to oTree.Nodes(iNodeIndex).Children
>      select itemtree
>      lnSeekVal = val(substr(oTree.Nodes(iTempIndex).Key, 3))
>      set order to node_id
>      Seek lnSeekVal
>      if node_id == lnSeekVal
>         if sort_order <> i
>            replace sort_order with i && re-orders
>            nChanges = nChanges + 1
>            .lUpdateItemTree = .T.
>         endif
>      else
>         .Log("Seek failed on node id:" + oTree.Nodes(iTempIndex).Key, program(), 1)
>      endif
>      * If the Node we are on has a child call the Sub again
>  	IF oTree.Nodes(iTempIndex).Children > 0
>  		nChanges = nChanges + .SaveChild(iTempIndex)
>  	ENDIF
>      * If we are not on the last child move to the next child Node
>  	IF i <> oTree.Nodes(iNodeIndex).Children
>  		iTempIndex = oTree.Nodes(iTempIndex).Next.Index
>  	ENDIF
>  ENDFOR
>
>ENDWITH
>
>return nChanges
>
>>Maybe I'm missing something but why do all this.
>>If a node in the treeview changes just find the relevant record and update it accordingly ?
>>
>>>I have a tree view structure, which is stored in this table
>>>
>>>select node_id, parent_id, root_id, descrip, sort_order  from ItemTree order by sort_order -- table has more fields, of course
>>>
>>>Sort_Order is relevant to the parent_id.
>>>
>>>I have the following procedure which is called every time the changes of any type are made to the tree view:
>>>
>>>with thisform
>>>	nChanges   = 0
>>>	nSortOrder = 1
>>>* Find a root node in the TreeView
>>>	oTree = .TList2
>>>	if oTree.Nodes.count > 0
>>>		for i = 1 to oTree.Nodes.count
>>>			oTmp = oTree.Nodes(i).parent
>>>			if isnull(oTmp) then
>>>				iTmpIndex = i
>>>				exit
>>>			endif
>>>		next i
>>>* Get the index of the root node that is at the top of the TreeView
>>>		iIndex = oTree.Nodes(iTmpIndex).FirstSibling.index
>>>		iTmpIndex = iIndex
>>>
>>>		lnSeekVal = val(substr(oTree.Nodes(iIndex).key, 3))
>>>		select itemtree
>>>		set order to node_id
>>>		seek lnSeekVal
>>>		if node_id == lnSeekVal and lnSeekVal <> 0
>>>			if thisform.nBaseRoot_id >= 0
>>>				nSortOrder = sort_order
>>>			else
>>>				if sort_order <> nSortOrder
>>>					replace sort_order with nSortOrder
>>>					nChanges = nChanges + 1
>>>					.lUpdateItemTree = .t.
>>>				endif
>>>			endif
>>>		else
>>>			.log("Seek Failed on node id:" + oTree.Nodes(iIndex).key, program(), 1)
>>>		endif
>>>
>>>* If the Node has Children call the sub that writes the children
>>>		if oTree.Nodes(iIndex).Children > 0
>>>			nChanges = nChanges + .SaveChild(iIndex)
>>>		endif
>>>
>>>		do while iIndex <> oTree.Nodes(iTmpIndex).LastSibling.index
>>>*Loop through all the root nodes
>>>			nSortOrder = nSortOrder + 1
>>>			lnSeekVal  = val(substr(oTree.Nodes(iIndex).next.key, 3))
>>>			select itemtree
>>>			seek lnSeekVal
>>>			if node_id == lnSeekVal and lnSeekVal <> 0
>>>				if sort_order <> nSortOrder
>>>					replace sort_order with nSortOrder
>>>					nChanges = nChanges + 1
>>>					.lUpdateItemTree = .t.
>>>				endif
>>>			else
>>>				.log("Seek Failed on node id:" + oTree.Nodes(iIndex).next.key, program(), 1)
>>>			endif
>>>			if oTree.Nodes(iIndex).next.Children > 0
>>>				nChange = nChanges + .SaveChild(oTree.Nodes(iIndex).next.index)
>>>			endif
>>>			iIndex = oTree.Nodes(iIndex).next.index
>>>		enddo
>>>	endif
>>>	.log("Total number of changed records in the Item tree: " + alltrim(transform(m.nChanges,'@999,999,999')), program(), 1)
>>>endwith
>>>
>>>return nChanges
>>>
>>>
>>>I found that even if I add a new item to the very bottom of one of the subtrees (and so I should not change more than 1 item), I still end up with the lots of changes.
>>>
>>>I'm wondering if this algorithm can be improved to minimize number of changes written in the database?
>>>
>>>Thanks a lot in advance for the suggestions.
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform