Macrosustitución

Estoy llevando a terreno lo de las claves de acceso que me enseñaste, tengo las tablas y el análisis casi listo, pero tengo un problema de sintaxis.
En una variable tengo así :
OPCION="m_opcion"
y quiero habilitar esto :
m_principal.m_existencias.m_opcion.enable()
¿Cómo hago para sustituir "m_opcion" por el contenido de la variable?

1 respuesta

Respuesta
1
Entiendo tu duda, pero te invito a que cambies el paradigma.
En lugar de buscar utilizar el nombre "m_opcion" puedes utiliza la lectura de tus objetos de tu menu.
Esto lo haces utilizando la técnica de lectura
recursiva, ya sabes una llamada sobre el mismo procedimiento o función.
Cada objeto de power builder cuenta con una función que te devuelve el nombre del objeto, classname(), con esta función puedes descubrir el nombre del objeto, si el nombre coincide con el que tienes definido como restringido, simplemente al propio objeto le colocas la propiedad visible en FALSE,
Ej.
STRING ls_nom_menu
STRING ls_opcion
ls_opcion = 'm_opcion'
ls_nom_menu = m_principal.m_existencias.m_opcion.classname()
IF (LOWER(ls_nom_menu) = LOWER(ls_opcion)) THEN
m_principal.m_existencias.m_opcion.visible = FALSE
END IF
Claro esto funciona para una situación constante, pero te preguntaras y como hago para todos sin tener que colocar el nombre de la opción.
Simple.
Primero creas un procedimiento en el cual leas todos los objetos principales del menu.
Luego creas un segundo procedimiento al cual le envías un objeto de tipo menu.
La idea en el segundo procedimiento es que pregunte si el objeto recibido tiene hijos o no, si los tiene entonces hace una llamada así mismo, enviando como parámetro el submenú, y así sucesivamente hasta llegar al ultimo hijo.
Y así hasta leer todo el menu.
De esta forma cuando añadas una opción en tu menu, inmediatamente vas a poder integrarla a tus restricciones.
Claro,
El primer evento le voy a llamar principal
Puede quedar una cosa así.
MENU lm_item
INTEGER li_for
FOR li_for = 1 TO UPPERBOUND(main_menu.item[])
lm_item = main_menu.item[li_for]
f_eval_item(lm_item)
IF (UPPERBOUND(lm_item.item[]) > 0) THEN
f_eval_sub_menu(lm_item)
END IF
NEXT
ahora la funcion eval_item( menu: am_menu)
STRING ls_classname
STRING ls_status
ls_classname = am_menu.classname()
SELECT opc_grupo_detalle.status
FROM opc_grupo_detalle
WHERE (opc_grupo_detalle.classname = :ls_clasename)
USING SQLCA;
IF ((SQLCA.SQLCode = 0) AND (SQLCA.SQLDBCode = 0)) THEN
am_menu.visible = (LOWER(ls_status) = 'activo')
ELSE
am_menu.visible = FALSE
END IF
En el script anterior que corresponde a la función eval_item,
la cual recibe un argumento en la variable am_menu del tipo MENU,
encontraras la búsqueda de la opción del menu en una tabla la cual he
llamado opc_grupo_detalle, esta es la que corresponde a el detalle del menu
relacionado con el grupo que definas.
La columna status define si esta activo o no dicha opción para ese grupo
por lo que si el valor es activo entonces la opción del menu queda encendida
de lo contrario no o en otra situación, no exista en la tabla.
la funcion f_eval_sub_menu(menu: am_item)
queda mas o menos asi
INTEGER li_for
MENU lm_item
FOR li_for = 1 TO UPPERBOUND(am_item.item[])
lm_item = main_menu.item[li_for]
f_eval_item(lm_item)
IF (UPPERBOUND(lm_item.item[]) > 0) THEN
f_eval_sub_menu(lm_item)
END IF
NEXT
El anterior proceso lo que hace es utilizar la búsqueda con técnica recursiva
esto significa que hace una llamada sobre si misma, hasta que encuentra
el ultimo item de la escalera.
Todo lo que anteriormente te expongo es muy simple, y puede extenderse y
complicarse tanto como tu imaginación y tus necesidades aumenten.
agdsys
Con lo del classname me queda claro que recupero el nombre de la opción, ¿pero me darías un ejemplo de como serian los procedimientos que mencionas más abajopor favor?
De antemano muchas gracias
Gracias, te pasaste, voy a estudiar estos procedimientos, y en cuanto tenga dudas te sigo molestando.
Chao
Agdsys

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas