Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Need some help with the algorithm
Message
 
 
À
07/10/2010 13:06:08
Information générale
Forum:
Visual FoxPro
Catégorie:
Codage, syntaxe et commandes
Versions des environnements
Visual FoxPro:
VFP 9 SP2
OS:
Windows 7
Network:
Windows 2003 Server
Database:
MS SQL Server
Divers
Thread ID:
01484275
Message ID:
01484356
Vues:
38
Viv,

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.
If it's not broken, fix it until it is.


My Blog
Précédent
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform