select node_id, parent_id, root_id, descrip, sort_order from ItemTree order by sort_order -- table has more fields, of courseSort_Order is relevant to the parent_id.
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 nChangesI 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.