Nodo abuelo


([N1] runasoft) #1

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


([N1] runasoft) #2

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

Como hacer para evitar esto?


([N1] wikan) #3

¿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.


([N1] runasoft) #4

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.”


([N1] wikan) #5

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.


([N1] runasoft) #6

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)
}


([N1] wikan) #7

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


([N1] runasoft) #8

Ya lo envié informaré lo que me respondan


([N3] pacosatu) #9

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é


([N1] runasoft) #10

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


([N3] pacosatu) #11

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é


([N1] runasoft) #12

Gracias Paco ahora si se entiende muy bien


([N1] runasoft) #13

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


([N1] runasoft) #14

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.


([N1] runasoft) #15

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”.


([N1] angelcastillo) #16

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
}