Problema con treeview

Hola agdsys.
La idea es que tengo 2 tablas. Una de departamentos con 2 campos.
COD_DEP DESCRIPCION
1 dept_1
2 dept_2 , etc...
Y otra tabla de empleados con 3 campos.
COD_EMP COD_DEP NOMBRE
1 1 nombre1
2 1 nombre2
3 2 nombre3
Según esta estructura en el treeview cargo en root los departamentos y en los nodos los empleados correspondientes.
El problema esta en que necesito que se muestre el nombre del departamento y el nombre de usuario pero necesito los valores numéricos para almacenarlos en variables.
Por esto era lo del array pero no se si voy bien.
Por otro lado tienes algún ejemplo de uso de variables any. No he trabajado con ellas.
Gracias de antemano
Saludos
Respuesta
1
Antes que todo me da mucho gusto que estés apunto de solucionar este inconveniente,
como ya te habrás dado cuenta, power builder es un lenguaje orientado a eventos, por lo que cualquier cosa que hagas, power builder dispara un evento, y el hacer un click sobre un node de un treeview no es la excepción, cuando esto sucede, es disparado entre otros, el evento click, este contiene un argumento que posee el handle, en otras palabras el numero de secuencia del nodo, esto como tu imagino lo estarás haciendo, lo traduces al nodo en cuestión.
Por ejemplo: si hago click en el treeview y me ubico en el evento click, traduciendo el valor del handle al nodo quedaría una cosa más o menos así.
TreeViewItem ltvi_nodo
(THIS. GetItem(handle, ltvi_nodo)
A partir de aquí, ya puedes interrogar el nodo, el cual es depositado en forma de instancia en la variable tipo treeviewitem ltvi_nodo,
Como te comente en las sesiones anteriores, la propiedad data puede contener cualquier tipo de dato, entonces para poder obtener dicho dato lo harías exactamente como si estuvieras interrogando cualquier otra propiedad del nodo.
Por ejemplo para obtener la etiqueta que es presentada en la pantalla interrogas la propiedad label
showmessage('etiqueta del nodo', ltvi_nodo.label)
Retraer el valor de data:
En el caso que sea numérico.
integer li_data
li_data = INTEGER(ltvi_nodo.data)
Y así consecutivamente con las demás propiedades, funciones, etc., siempre relacionadas con el nodo, y con el nodo específicamente instanciado en la variable ltvi_nodo.
Para la asignación de la propiedad data, simplemente lo haces en el momento que estas asignando el nodo o insertando el nodo, en el treeview, las funciones que permiten insertar un nodo, devuelven el numero del handle que fue añadido, esto lo puedes aprovechar de la misma manera que en el evento click, creando una instancia, y asignando en ella la propiedad data, luevo esta misma instancia la asignas de nuevo al nodo del treeview utilizando la función SETITEM(), y así hasta finalizar la carga del treeview, cuando esto suceda, los valores que necesitas estarán indicados en la propiedad data,
un ejemplo
TreeViewItem ltvi_nodo
integer li_handle
li_handle = THIS.InsertItemLast(<nivel>, <etiqueta>, 1)
this.GetItem( li_handle, ltvi_nodo)
ltvi_nodo.data = 1
this.SetItem(li_handle, ltvi_nodo)
Espero que esto puueda ser de utilidad para resolver tu problema
saludos
agdsys
Una respuesta perfecta. Es interesante el uso de variables any.
Gracias por la respuesta.
Saludos
Eso es lo que necesito, entiendo lo que me propones pero no se como plasmarlo, te pongo la estructura del treeview a ver si me ayudas.(Entre paréntesis los datos que quiero almacenar pero no mostrar)
Dept_1 (1)
Usuario_1 (1)
Usuario_2 (2)
Dept_2 (2)
Usuario_3 (3)
Usuario_4 (4)
Como te comente estos datos venían de una sentencia sql sobre 2 tablas.
No se como utilizar la propiedad data, he estado revisando la ayuda pero no hay ejemplos.
Un ejemplo, si pulsamos sobre Usuario_3, consigo obtener el valor (Usuario_3) pero no el (3).
Espero que me ayudes ya que estoy bloqueado con esto.
Saludos
Creo ver que la situación es por un lado la imagen visual, y por otro el manejo de los datos, por lo que estas auxiliando dicho propsito con el array,
Sin embargo mi propuesta es simplemente utilizar la propiedad DATA que esta integrada en el nodo, esta propiedad de es tipo ANY, en otras palabras este tipo de dato no tiene definición, significa que en el puedes guardar cualquier cosa, un valor numérico, string, boolean, un objeto, una clase, una estructura, en fin, cualquier cosa
Aunque suena muy simple, el problema esta en el momento de recuperar el valor integrado en DATA, para eso simplemente lo asignas a una variable que contenga el tipo original con el que fue asignado, auxiliandote de una función que lo transforme,
veamos un ejemplo.
Asignando un valor numérico a una variable tipo any
ANY la_any
la_any = 5
lo anterior declara la variable y le asigna el valor numerico 5
Sin embargo, para poder reutilizar este valor debo o asignar el valor a una variable tipo numérico, y ademas convertir el valor por medio de una función
por ejemplo.
integer li_valor
any la_any
la_any = 5
li_valor = integer(la_any)
El caso del objeto o clase es muy parecido, sin embargo no necesitas de utilizar una función.
Mi propuesta como ves, es evitar el array, puesto que utilizando la propiedad DATA, directamente tienes el valor buscado, sin embargo si necesitas de asignar más de un valor y al mismo tiempo tipo, te recomiendo que utilices una estructura o record, asignando los valores a la estructura y luego a la propiedad DATA
O en ultima instancia si quieres pasar de la estructura, ordena una cadena tipo string, y por ejemplo divide los valores por punto y coma ; y al recuperar el valor de DATA divide tus valores encontrando siempre la división descrita.
Por ejemplo
carlos fernandez;35;2800
En el orden esta cadena provee
El nombre
La edad
El salario
Recuerda que cuentas con una variable de tipo ANY esto significa que dicha variable puede contener en ella cualquier cosa, de cualquier tipo, pero cuidado, porque para recuperar el valor tienes que utilizar una función relacionada

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas