Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

Atualizando todos os itens de um ramo de hierarquia

Quando você tem uma aplicação em que os itens devem ser apresentados em uma árvore e guardam entre si relações hierárquicas, pode ocorrer de a propriedade de um subitem ser a fração do valor da mesma propriedade dos itens que lhe são superiores na hierarquia. Isto é comum em grades de produtos, quando a adição de um subitem ao estoque deve causar a adição de 1, não apenas ao saldo daquele subitem, mas também ao saldo dos itens que lhe são superiores na hierarquia. Ex: o item sapato feminino tem como subitens sapato feminino social e sapato feminino esportivo. Ao acrescentar 1 ao saldo do item feminino social, também devemos acrescentar 1 ao saldo de sapato feminino.  Se sua grade for finita, você pode criar um campo texto para identificação dos itens onde cada nível da hierarquia consome um certo número de caracteres em posição bem determinada dentro do campo. Ex: o primeiro nível pode consumir as três primeiras posições, o segundo as três posições seguintes e assim por diante. Quando você tiver um item do segundo nível para ser identificado, pode identificá-lo informando o código do nível que lhe é superior nas três primeiras posições e o seu código próprio nas três posições seguintes. Se quiser pode separar por pontos, assim 002.003 para o terceiro subitem do segundo elemento do primeiro nível. Tendo esta forma de identificação, fica fácil atualizar de uma só vez todos os itens que fazem parte de um ramo.  Supondo que tenhamos uma tabela de produtos onde o campo  CodProduto (código de produto) seja o identificador de cada produto e o campo Saldo deva ser atualizado somando-se 10 para o produto de código 002.003.005. Para conseguirmos que os produtos 002 e 002.003 também tenham o seu saldo atualizado, fazemos uma consulta SQL da seguinte forma:

UPDATE Produtos SET Saldo = Saldo + 10 WHERE  '002.003.005' LIKE CodProduto & '*'

Examinando caso a caso podemos ver que a relação '002.003.005 LIKE '002*' é verdadeira para o produto '002' , que será atualizado. '002.003.005' LIKE '002.003*' também é verdadeira e faz com que o saldo do produto 002.003 seja atualizado. E, finalmente, '002.003.005' LIKE '002.003.005*' também é verdadeira e atualiza o saldo do produto '002.003.005'. Todos os elementos da hierarquia acima de 002.003.005 e inclusive ele tiveram seus saldos atualizados.

Usando a mesma técnica, podemos obter todos os elementos que estejam abaixo de um item da hierarquia:

SELECT * From Produtos WHERE CodProduto LIKE '002*'

A consulta acima nos retorna todos os produtos que sejam subitens do produto 002 e inclusive ele próprio. Se quiser excluí-lo do retorno, basta acrescentar ao critério a expressão " And CodProduto <> '002' ".