Nodo abuelo

Buenas a todos:

En un nodo VTreeItem:
padre = item.parentItem();

como hago para referenciar al padre del padre (abuelo)?

pues hago que:
var abuelo = padre.parentItem()

y rompe el vClient

Gracias adelantadas

Pues me he dado cuenta que cuando no existe el nodo abuelo rompe, pero cuando si existe lo toma.

Como hacer para evitar esto?

¿Te rompe nada más usar la función o cuando intentas operar con la variable abuelo?

En teoría con la documentación en mano, debería devolver nulo cuando no exista. Si te rompe directamente envíalo a soporte para que tomen nota.

Tienes razón amigo wikan lo enviaré a soporte aunque en una anterior consulta sobre otro asunto de javascript me dijeron: “Aunque el soporte de JavaScript queda fuera del ámbito del servicio de soporte… informarte de que podremos ofrecerte un servicio de consultoría.”

Lo que no podrás preguntar a soporte es que te resuelvan un script o te hagan una determinada tarea pero si es un error en la API los han habido y los habrán, hay que comunicarlo para que lo solucionen y funcione como debe ser.

Por lo pronto, intenta ponerlo dentro de un try-catch para si consigues capturar la excepción y evitar la ruptura.

Le puse el siguiente código pero cuando pasa por var abuelo = padre.parentItem(); el vClient rompe

var padre= item.parentItem();
try {
-----var abuelo = padre.parentItem();
} catch(err){
-----alert(err)
}

Nada, mándalo a soporte para que lo investiguen.

Ya lo envié informaré lo que me respondan

Hola runasoft.

Desde luego es un error grave y otro despiste del equipo de desarrollo.
Si falla parentItem() ya no hay forma de saber si una rama del TreeWidget es TopLevel.

De momento te propongo una solución:

Rellena las ramas TopLevel con la función: oItemTopOpciones.setWhatsThis(0, “TopLevel”)
Y de esta forma puedes saber si una rama es TopLevel.

var oPadre = (oItemTopOpciones.whatsThis(0) ? null : oItemTopOpciones.parentItem())
if (oPadre == null) {alert (“Es padre”)}

Con esto puedes manejar la función parentItem() hasta la próxima Release de Velneo.

Saludos
Paco Satué

Disculpa amigo Paco pero no entiendo como implementarlo esa solución que me indicas

Hola runasoft.

Quizás no está bien explicado, mejor un ejemplo:

Rama Top Level
–Rama Nivel 1
----Rama Nivel 2

El Item RamaTopLevel se crea de la siguiente manera:


var oItemTopLevel = oArbol.addTopLevelItem()
oItemTopLevel.setText(0, "Rama Top Level")
oItemTopLevel.setWhatsThis(0, "TopLevel")

Las otras ramas se crean de la forma habitual.

Para detectar el abuelo del Item seleccionado:


var oArbol = theRoot.dataView().control("ARBOL")
var oItem = oArbol.currentItem()
var oPadre = null, oAbuelo = null
if (oItem) {
   // oPadre será null cuando oItem es una rama Top Level
   oPadre = oItem.whatsThis(0) ? null : oItem.parentItem()
   if (oPadre) {
      // oAbuelo será null cuando oPadre es una rama Top Level
      oAbuelo = oPadre.whatsThis(0) ? null : oPadre.parentItem()
   }
}
if (oAbuelo) alert( "El abuelo es: " + oAbuelo.text(0) )
else alert( "No existe abuelo" )

O más genérico, para comprobar cualquier ascendencia:


var oArbol = theRoot.dataView().control("ARBOL")
var oItemTest = oArbol.currentItem()
var nNivelAsc = 2
for (i=0; i<nNivelAsc && oItemTest!=null; i++) {
	oItemTest = ItemPadre(oItemTest)
}
if (oItemTest) alert( "El abuelo es: " + oItemTest.text(0) )
else alert( "No existe abuelo" )

function ItemPadre(oItem) {
	return oItem.whatsThis(0) ? null : oItem.parentItem()
}

Saludos
Paco Satué

Gracias Paco ahora si se entiende muy bien

El código dado en su conjunto funciona muy bien, muchas gracias amigo Paco.

Esta es la respuesta de soporte:

Lo que has de hacer es comprobar el padre. Cuando se usan punteros, se han de proteger mediante if previo.
En Javascript, si creamos una variable que apunta a algo que no existe, genera un error.
Por lo tanto, la asignación del abuelo debe ir precedida de una comprobación de que padre no esté vacío.

Hola foro:

Desde soporte me informan que: “esta incidencia ha sido incluida en nuestro sistema de gestión de incidencias con el código de referencia: VELNEO-4521”.

yo uso esto, a ver si os vale.

function isTopLevelItem(treeW, item){
var num_ramas_princ = treeW.topLevelItemCount;
var principal = false;
for( var i = 0; (i < num_ramas_princ) && (principal==false); i++){
item_prin = treeW.topLevelItem(i);
if(item_prin == item){
principal = true;
}
}
return principal
}