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 de Antonio Garcia
1
1
Antonio Garcia, clipper todas sus versiones (manejo total) power builder todas...
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