ABAP 树型菜单程序
教你如何使用Java8实现菜单树形数据
教你如何使⽤Java8实现菜单树形数据Java8实现菜单树形数据当我们打开京东商城时,左侧的菜单依次分为三级展⽰,这是如何实现的呢?本篇暂不讲述前端,只讲述如何使⽤java8 的lamada表达式实现树形数据的拼装1.创建菜单表CREATE TABLE `pms_category` (`cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id',`name` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '分类名称',`parent_cid` bigint(20) NULL DEFAULT NULL COMMENT '⽗分类id',`cat_level` int(11) NULL DEFAULT NULL COMMENT '层级',`show_status` tinyint(4) NULL DEFAULT NULL COMMENT '是否显⽰[0-不显⽰,1显⽰]',`sort` int(11) NULL DEFAULT NULL COMMENT '排序',`icon` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '图标地址',`product_unit` char(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '计量单位',`product_count` int(11) NULL DEFAULT NULL COMMENT '商品数量',PRIMARY KEY (`cat_id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 1433 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '商品三级分类' ROW_FORMAT = Dynamic;2.创建实体类其中children⽤来存放⼦类@Data@TableName("pms_category")public class CategoryEntity implements Serializable {private static final long serialVersionUID = 1L;/*** 分类id*/@TableIdprivate Long catId;/*** 分类名称*/private String name;/*** ⽗分类id*/private Long parentCid;/*** 层级*/private Integer catLevel;/*** 是否显⽰[0-不显⽰,1显⽰]*/private Integer showStatus;/*** 排序*/private Integer sort;/*** 图标地址*/private String icon;/*** 计量单位*/private String productUnit;/*** 商品数量*/private Integer productCount;/*** ⼦分类*/@TableField(exist = false)private List<CategoryEntity> children;}3.实现⼀级分类3.1)⾸先要查询出所有的分类信息entities3.2)然后对entities过滤查找⼀级分类,其中⼀级分的parentId == 03.3)设置当前⼀级分类的⼦分类3.4)对⼀级分类进⾏排序代码如下:public List<CategoryEntity> listWithTree() {//1.查询所有分类List<CategoryEntity> entities = baseMapper.selectList(null);//2.组装//2.1) 所到所有的⼀级类别 ,parentId = 0List<CategoryEntity> levelOneMenus = entities.stream().filter(item -> item.getParentCid() == 0).map(item -> {item.setChildren(this.getChildrens(item, entities));return item;}).sorted((item1, item2) -> {return (item1.getSort() == null ? 0 : item1.getSort()) - (item2.getSort() == null ? 0 : item2.getSort());}).collect(Collectors.toList());return levelOneMenus;}4.使⽤递归对⼦分类再进⾏树形组装4.1)⾸先判断当前的id是否有等于集合中的元素的parentId4.2)再对当前⼦分类使⽤递归设置⼦分类4.3)对当前⼦分类排序4.4)返回⼦分类集合详细代码实现如下:private List<CategoryEntity> getChildrens(CategoryEntity root, List<CategoryEntity> all){List<CategoryEntity> treeMenus = all.stream()//如果菜单中的⽗菜单Id == 当前菜单的id,则说明是⼦菜单.filter(item -> Objects.equals(item.getParentCid(), root.getCatId())).map(item -> {//递归添加⼦菜单List<CategoryEntity> childrens = getChildrens(item, all);item.setChildren(childrens);return item;})//排序.sorted((item1, item2) -> {return (item1.getSort() == null ? 0 : item1.getSort()) - (item2.getSort() == null ? 0 : item2.getSort());}).collect(Collectors.toList());return treeMenus;}到此这篇关于教你如何使⽤Java8实现菜单树形数据的⽂章就介绍到这了,更多相关Java8实现菜单树形数据内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
树形菜单-递归实现逻辑
树形菜单-递归实现逻辑全文共四篇示例,供读者参考第一篇示例:树形菜单是一种常见的界面设计元素,通过树形结构展示信息,使用户能够轻松浏览和选择。
在Web开发中,树形菜单通常用于显示网站的导航菜单、项目结构、文件夹结构等。
实现树形菜单的方法有多种,其中递归是一种常用且有效的实现逻辑。
在本文中,我们将介绍树形菜单的递归实现逻辑,并通过示例代码演示如何使用递归来构建一个动态的树形菜单。
一、什么是递归?在程序设计中,递归是一种解决问题的方法,通过将问题分解成规模较小的子问题来解决整体问题。
递归函数会反复调用自身,直到满足某个终止条件才停止递归。
递归在数据结构和算法中有着广泛的应用,如树形结构的遍历、图的搜索等。
二、树形菜单的数据结构在实现树形菜单之前,首先要明确树形结构的数据表示方法。
通常树形菜单的数据结构可以用对象或数组来表示,每个节点包含一些基本信息和子节点信息。
一个简单的树形菜单数据结构如下所示:```javascript{id: 1,name: 'Root',children: [{ id: 2, name: 'Node 1', children: [] },{ id: 3, name: 'Node 2', children: [{ id: 4, name: 'Node 2-1', children: [] },{ id: 5, name: 'Node 2-2', children: [] }] },{ id: 6, name: 'Node 3', children: [] },]}```在上面的示例中,树形菜单包含了一个根节点和三个子节点,每个节点都包含了id、name和children属性,其中children是一个数组,用于存储子节点信息。
三、递归构建树形菜单接下来,我们将演示如何使用递归来构建一个树形菜单。
移动端实现树级菜单的方法
移动端实现树级菜单的方法全文共四篇示例,供读者参考第一篇示例:在移动端开发中,实现树级菜单是一项常见且重要的任务。
在移动设备上,由于屏幕空间有限,设计和实现树级菜单需要考虑到用户体验和界面布局的限制。
本文将介绍一些常见的方法和技巧来实现移动端的树级菜单。
一、使用折叠菜单折叠菜单是一种常见的树级菜单设计模式,适用于移动设备上的界面。
在折叠菜单中,每个父级菜单项下面可以展开或折叠多个子级菜单项,用户可以点击父级菜单项来展开或折叠子级菜单项。
这种设计模式节省了屏幕空间,并且用户可以方便地浏览和操作树状结构的数据。
在实现折叠菜单时,可以使用HTML、CSS和JavaScript来构建。
可以使用HTML的ul和li标签来表示菜单的层级结构,使用CSS样式来控制菜单的外观和布局,使用JavaScript来添加交互效果和实现菜单的展开和折叠功能。
通过合理的布局和样式设计,可以在移动设备上呈现出清晰、易用的树级菜单。
二、利用滑动菜单在实现滑动菜单时,可以利用现有的移动端UI框架或库来快速实现。
一些流行的移动端UI框架,如jQuery Mobile、Ionic等,提供了丰富的界面组件和交互效果,可以帮助开发人员快速构建滑动菜单。
通过合理的布局和交互设计,可以让滑动菜单在移动设备上呈现出流畅、直观的用户体验。
三、响应式设计在设计移动端树级菜单时,需要考虑到不同设备屏幕大小和分辨率的差异。
为了适应不同尺寸的移动设备,可以使用响应式设计的技术来实现自适应的界面布局。
通过使用CSS媒体查询和弹性布局等技术,可以让树级菜单在不同尺寸的屏幕上自动调整布局和样式,确保用户在任何设备上都能够方便地访问和操作菜单。
在移动端实现树级菜单时,需要综合考虑用户体验、界面设计和技术实现等多方面因素。
通过选择合适的设计模式、利用现有的UI框架和工具、采用响应式设计等方法,可以实现一个优秀的移动端树级菜单,为用户提供更好的导航和操作体验。
希望本文介绍的方法和技巧能够帮助开发人员更好地实现移动端树级菜单。
abap递归算法
abap递归算法ABAP递归算法是一种在ABAP编程中常用的算法,它通过在程序中调用自身来解决问题。
本文将介绍ABAP递归算法的基本概念、应用场景和实现步骤。
一、基本概念递归算法是一种将问题分解为更小的同类问题来解决的方法。
在ABAP中,递归算法通常用于处理树形结构或者需要多次迭代的情况。
二、应用场景ABAP递归算法可以应用于许多实际问题的解决,例如树的遍历、查找和排序等。
下面将以树的遍历为例,介绍ABAP递归算法的实现步骤。
三、实现步骤1. 定义递归函数在ABAP中,我们可以使用FUNCTION模块或者方法来定义递归函数。
递归函数应该具有停止条件和递归调用两个关键部分。
停止条件是递归的终止条件,当满足停止条件时,递归将停止。
递归调用是指在函数中调用自身来解决更小的同类问题。
2. 处理递归函数参数递归函数通常需要传入参数来控制递归的过程。
这些参数可以是需要处理的数据结构或者其他控制信息。
在递归调用时,需要将参数传递给下一次递归。
3. 处理递归函数返回值递归函数可以有返回值,用于将递归结果传递给上一级调用。
在递归调用结束后,需要将返回值返回给上一级。
4. 调用递归函数在主程序中调用递归函数,并处理返回值。
可以使用循环来处理多次递归调用的结果。
四、总结ABAP递归算法是一种常用的算法,可以应用于树的遍历、查找和排序等问题的解决。
在实现递归算法时,需要定义递归函数、处理参数和返回值,并在主程序中调用递归函数。
通过合理地应用递归算法,可以提高程序的效率和可读性。
以上就是关于ABAP递归算法的基本概念、应用场景和实现步骤的介绍。
希望对读者理解和运用ABAP递归算法有所帮助。
abap 主要知识点
abap 主要知识点ABAP(Advanced Business Application Programming)是一种用于开发企业级业务应用程序的编程语言,主要应用于SAP业务软件系统中。
ABAP主要用于实现和定制SAP ERP、SAP S/4HANA等企业资源规划系统。
以下是ABAP主要知识点:1.基本语法:ABAP的基本语法包括数据类型、变量、常量、运算符、流程控制、函数、过程、模块等。
2.数据结构:ABAP中常用的数据结构有数组、表格、链表、树形结构等。
3.界面设计:ABAP可用于设计用户界面,包括对话框、菜单、报表等。
4.数据库操作:ABAP支持对数据库的CRUD(创建、读取、更新、删除)操作,主要包括SQL语句、数据定义、数据存取等。
5.报表设计:ABAP具有强大的报表设计功能,可以创建各种复杂程度的报表,如分组报表、多级报表、交叉报表等。
6.常用ABAP组件:ABAP中有一些常用的组件,如逻辑块(ALV)、数据字典(DDIC)、报表框架(BDC)、界面事件(BEL)、用户自定义函数(FC)等。
7.企业对象组件(EPC):EPC是ABAP的一种企业级组件,用于实现业务过程的自动化。
8.工作流:ABAP支持工作流编程,可以实现业务流程的建模、调度和监控。
9.对象化编程:ABAP支持面向对象的编程,可以实现代码的复用和模块化。
10.接口技术:ABAP接口用于实现与其他系统(如HR、CRM等)的集成。
主要包括BAPI、BDC、IDoc等。
11.性能优化:ABAP程序的性能优化是开发者关注的重要议题,包括SQL优化、代码优化、内存管理等。
12.ABAP开发工具:常用的ABAP开发工具包括ABAP Workbench、SE80/SE81、SAP NetWeaver Developer Studio 等。
13.脚本语言:ABAP脚本语言(Scripting)用于实现与ABAP程序的交互和自动化。
基于Web标准的UI组件—树状菜单(1)...
基于Web标准的UI组件—树状菜单(1)...基于Web标准的UI组件—树状菜单(1)UI Components Based on Web Standards - TreeView (1) 树状菜单(Tree View)在普通的Web设计中不常用到,但是在一些B/S结构的系统(如OA系统)中是不可缺少的一种UI组件。
树状结构不仅是一种有效的信息组织方式,它同时建立了一种索引方式,帮助人类更快地在查找机器中的信息。
现代操作系统基本上都使用树状结构来管理磁盘文件,所以大多数人对树状菜单的逻辑模型和操作方式都非常熟悉,对于UI设计师来说就成了一种很好的选择。
基本的XHTML结构先来看看只有一层的树状菜单,你会选什么标签?ul!没错,还有比ul更合适的吗?<ul><li>树枝1号</li><li>树枝2号</li></ul>再把它们都加到一个“树根”上:<ul><li>树根<ul><li>树枝1号</li><li>树枝2号</li></ul></li></ul>请注意观察一下两个ul之间的嵌套关系。
查看效果(例1)再加一些“叶子”上去:<ul><li>树根<li>树枝1号<ul><li>叶子11号</li><li>叶子12号</li></ul></li><li>树枝2号<ul><li>叶子21号</li><li>叶子22号</li><li>叶子23号</li></ul></li></ul></li></ul>查看效果(例2)“一棵树”可以拥有任意多个“树根”、“树枝”和“树叶”。
用ABAP实现下拉菜单
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
ID = NAME
VALUES = LIST
EXCEPTIONS
REPORT Z_TESTYM01 .
CALL SCREEN 1000.
*&---------------------------------------------------------------------*
*& Module STATUS_1000 OUTPUT
*& Report Z_TESTYM01 *
*& *
*&---------------------------------------------------------------------*
*& Module CANCEL INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDMODULE. " LSTBOX_DISPLAY OUTPUT
*&---------------------------------------------------------------------*
移动端实现树级菜单的方法
移动端实现树级菜单的方法
在移动端实现树级菜单的方法有很多种,这里我会列举几种常见的方法:
1. 嵌套列表(Nested List):这是最简单的方式,每个节点可以是一个列
表或者一个子菜单。
然而,这种方法可能会在移动设备上显得过于复杂和混乱,因为需要滚动和缩放才能查看所有的菜单项。
2. 展开/折叠菜单(Accordion Menu):这是另一种常见的方法,每个节
点都有一个展开和折叠的按钮。
当用户点击一个节点时,该节点及其所有子节点会展开或折叠。
这种方法的好处是用户可以一次查看所有的菜单项,但是它可能会在层次很深的菜单上显得很混乱。
3. 侧边抽屉菜单(Side Drawer Menu):这是一种常见的移动端导航模式,用户可以从屏幕的一侧滑动打开一个包含所有菜单项的列表。
这种方法的优点是用户可以快速访问任何菜单项,但是如果菜单项太多,用户可能需要多次滑动才能找到他们想要的。
4. 面包屑菜单(Breadcrumb Menu):这种菜单通过显示当前节点的父节点来提供一种导航的方式。
虽然它不适合所有的应用,但是对于那些需要用户知道他们当前位置的应用来说,这是一个很好的选择。
5. 卡片式菜单(Card Menu):在这种方法中,每个节点都显示为一个卡片,用户可以点击卡片来打开或关闭它。
这种方法的优点是用户可以清楚地看到哪些节点是开放的,但是它可能会在层次很深的菜单上显得很混乱。
以上就是一些常见的实现树级菜单的方法,具体使用哪种方法取决于你的应用的需求和用户的习惯。
单片机多级菜单编程实现(ZT)建立一个树状的菜单结构,用链表实现
单片机多级菜单编程实现(ZT) 建立一个树状的菜单结构,用链表实现链表中包含:1、指向同级左右菜单和指向父菜单、子菜单的四个菜单结构体指针;2、进入该菜单时需要执行的初始化函数指针3、退出该菜单时需要执行的结束函数指针4、该菜单内的按键处理函数指针数组的指针操作菜单模块需要的按键操作有:左、右、确认、退出。
采用这种办法,可以方便的添加或删减菜单。
并且只需要在其头文件中修改初始变量就可以实现,完全无须修改C文件中的任何函数。
具体结构定义我的定义,做个参考:#define MENU_HLP_EN 菜单帮助信息使能typedef struct{void (pMenuTaskInit)(void); 指向菜单任务初始化函数的指针void (pMenuTaskEnd)(void); 指向菜单任务结束函数的指针}MENU_TASK_TYP;typedef struct MenuTyp{INT8U MenuName; 菜单名称字符串WORK_MOD WorkMod; 工作状态编号MENU_TASK_TYP pMenuTask; 指向菜单任务的指针void (pTaskKeyDeal)(void); 指向菜单任务按键处理函数数组的指针#ifdef MENU_HLP_ENINT8U MenuHlp; 菜单帮助字符串#endifstruct MenuTyp pParent; 指向上层菜单的指针struct MenuTyp pChild; 指向子菜单的指针struct MenuTyp pRight; 指向右菜单的指针struct MenuTyp pLeft; 指向左菜单的指针}MENU_TYP;我根据网上的资料做的一个菜单:菜单数据结构struct KeyTabStruct{uint8 MenuIndex; 当前状态索引号uint8 MaxItems; 本级菜单最大条目数uint8 ShowLevel; 菜单显示内容uint8 PressOk; 按下回车键时转向的状态索引号uint8 PressEsc; 按下返回键时转向的状态索引号uint8 PressDown; 按下向下键时转向的状态索引号uint8 PressUp; 按下向上键时转向的状态索引号void (CurrentOperate)(); 当前状态应该执行的功能操作};uint8 MenuID; 菜单ID号uint8 MenuNextID; 下级菜单ID号CurMenuID=本菜单IDMaxMenuItem=同级菜单最大项数OkMenuID=子菜单层所对应的菜单ID,ID=999为菜单已经到底了EscMenuID=父菜单层所对应的菜单ID,ID=999为菜单已经到顶了DownMenuID=弟菜单层所对应的菜单ID,ID=999为菜单是独生子UpMenuID=兄菜单层所对应的菜单ID,ID=999为菜单是独生子CurFunction=本菜单所对应的菜单函数指针const struct KeyTabStruct KeyTab[MAX_KEYTABSTRUCT_NUM]={CurMenuID, axMenuItem, MenuShowLevel, OkMenuID, EscMenuID, DownMenuID, UpMenuID, CurFunction{MENU_EDIT, 0, 0, MENU_DA TA_VIEW, MENU_NO, MENU_NO, MENU_NO, MenuEdit}, {MENU_DA TA_VIEW, 3, 1, MENU_DA TA_VIEW_FIRE, MENU_EDIT, MENU_SYS_EDIT, MENU_PRINT_DA TA,MenuEdit},{MENU_DA TA_VIEW_FIRE, 5, MENU_NO, MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_TROUBLE, MENU_STEP_FOLLOW, MenuDataViewIn},{MENU_DA TA_VIEW_TROUBLE, 5, MENU_NO, MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_REPEA T, MENU_DA TA_VIEW_FIRE, MenuDataViewIn},{MENU_DA TA_VIEW_REPEA T, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_FACE_CHECK, MENU_DA TA_VIEW_TROUBLE, MenuDataV iewIn},{MENU_FACE_CHECK, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_STEP_FOLLOW,MENU_DA TA_VIEW_REPEA T, MenuFaceCheck},{MENU_STEP_FOLLOW, 5, MENU_NO,MENU_NO, MENU_DA TA_VIEW, MENU_DA TA_VIEW_FIRE, MENU_FACE_CHECK,MenuStepFollow},{MENU_SYS_EDIT, 3,2, MENU_SUM_SET, MENU_EDIT,MENU_PRINT_DA TA, MENU_DA TA_VIEW, MenuEdit}, {MENU_SUM_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_INSULA TE,MENU_TIME_SET, MenuSumSet},{MENU_EDIT_INSULA TE, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_EDIT_HZ, MENU_SUM_SET,MenuEditInsulate},{MENU_EDIT_HZ, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_LD_CONTROL,MENU_EDIT_INSULA TE, MenuEditHZ},{MENU_LD_CONTROL, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_LD_DELAY,MENU_EDIT_HZ, MenuLDControl},{MENU_LD_DELAY, 6,MENU_NO, MENU_NO, MENU_SYS_EDIT, MENU_TIME_SET,MENU_LD_CONTROL, MenuLDDelay},{MENU_TIME_SET, 6, MENU_NO,MENU_NO, MENU_SYS_EDIT, MENU_SUM_SET, MENU_LD_DELAY,MenuTimeSet},{MENU_PRINT_DA TA, 3, 3,MENU_PRINT_DA TA_FIRE, MENU_EDIT, MENU_DA TA_VIEW, MENU_SYS_EDIT, MenuEdit},{MENU_PRINT_DA TA_FIRE, 4,MENU_NO, MENU_NO, MENU_PRINT_DA TA,MENU_PRINT_DA TA_TROUBLE, MENU_PRINT_SET, MenuPrintDataIn}, {MENU_PRINT_DA TA_TROUBLE, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINTER_CHECK,MENU_PRINT_DA TA_FIRE, MenuPrintDataIn},{MENU_PRINTER_CHECK, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINT_SET,MENU_PRINT_DA TA_TROUBLE, MenuPrintDataIn},{MENU_PRINT_SET, 4, MENU_NO,MENU_NO, MENU_PRINT_DA TA, MENU_PRINT_DA TA_FIRE, MENU_PRINTER_CHECK, MenuPrintSet},};编程菜单显示数据const struct MenuDispData MenuEditShow[][MENU_MAX] = {{{MENU_NO , 0, 0, 选择消音→退出}, 主菜单{MENU_DA TA_VIEW , 1, 6, ⒈数据查看},{MENU_SYS_EDIT , 2, 6, ⒉系统编程},{MENU_PRINT_DA TA, 3, 6, ⒊数据打印}},{{MENU_NO , 0, 0, 数据查看消音→退出}, 数据查看{MENU_DA TA_VIEW_FIRE , 1, 4, ⒈火警},{MENU_DA TA_VIEW_TROUBLE, 2, 4, ⒉故障},{MENU_DA TA_VIEW_REPEA T , 3, 4, ⒊重码},{MENU_FACE_CHECK , 1,12, ⒋面板检测},{MENU_STEP_FOLLOW , 2,12, ⒌单步跟踪}},{{MENU_NO , 0, 0, 系统编程消音→退出}, 系统编程{MENU_SUM_SET , 1, 0, ⒈容量设置},{MENU_EDIT_INSULA TE , 2, 0, ⒉隔离点},{MENU_EDIT_HZ , 3, 0, ⒊汉字描述},{MENU_LD_CONTROL , 1,12, ⒋联动控制},{MENU_LD_DELAY, 2,12, ⒌模块延时},{MENU_TIME_SET , 3,12, ⒍时钟调整}},{{MENU_NO , 0, 0, 数据打印消音→退出}, 数据打印{MENU_PRINT_DA TA_FIRE , 1, 0, ⒈火警数据},{MENU_PRINT_DA TA_TROUBLE,2, 0, ⒉故障数据},{MENU_PRINTER_CHECK , 3, 0, ⒊打印机自检},{MENU_PRINT_SET , 1,12, ⒋打印设置}},};等待按键void WaitKey(void){uint32 time;time = RTCFlag;WhichKey = KEY_NONE;while(!EscFlag){if(RTCFlag - time = EDIT_TIME)EscFlag = TRUE;if(WhichKey != KEY_NONE){KeySound(300); 按键音return;}}}显示多级菜单void MenuEdit(){uint32 i,j=0;uint32 oldid;j = KeyTab[MenuID].ShowLevel;if(WhichKey == KEY_ESC WhichKey == KEY_OK){ClearScreen();for(i=0;iKeyTab[MenuNextID].MaxItems+1;i++)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j] [i].Column,MenuEditShow[j][i].Pdata,0); 初始化显示oldid =0;没有原先选择的项}else{if(WhichKey == KEY_UP)oldid = KeyTab[MenuNextID].PressDown;elseoldid = KeyTab[MenuNextID].PressUp;指示原先的项}for(i=1;iKeyTab[MenuNextID].MaxItems+1;i++){if(MenuEditShow[j][i].Id == oldid)ShowString(MenuEditShow[j][i].Lin,MenuEditShow[j] [i].Column,MenuEditShow[j][i].Pdata,0); 正常显示原先的项else{if(MenuEditShow[j][i].Id == MenuNextID)ShowString(MenuEditShow[j][i].Lin,MenuEditShow [j][i].Column,MenuEditShow[j][i].Pdata,1); 反显当前选择的项}}WhichKey = KEY_NONE;}系统编程uint32 Edit(void){struct KeyTabStruct NowKeyTab; 指示当前的菜单值uint32 escflag = FALSE;ResetFlag = FALSE;ChangeFlag = FALSE;EscFlag = FALSE;MenuID = MENU_EDIT;NowKeyTab = KeyTab[MenuID];MenuNextID = NowKeyTab.PressOk;(NowKeyTab.CurrentOperate)(); 显示主菜单do{if(WhichKey == KEY_NONE)WaitKey(); 等待按键switch(WhichKey){case KEY_ESC if(NowKeyTab.PressEsc != MENU_NO) {MenuID =NowKeyTab.PressEsc;MenuNextID =NowKeyTab.MenuIndex;NowKeyTab = KeyTab[MenuID];NowKeyTab.PressOk =MenuNextID;(NowKeyTab.CurrentOperate) (); 显示当前菜单}elseescflag =TRUE; 退出编程状态break;case KEY_OK if(NowKeyTab.PressOk != MENU_NO){MenuID =NowKeyTab.PressOk;NowKeyTab = KeyTab[MenuID];MenuNextID =NowKeyTab.PressOk;}(NowKeyTab.CurrentOperate)(); 执行当前按键的操作break;case KEY_UP if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressUp != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressUp;MenuNextID = KeyTab[MenuNextID].PressUp;(NowKeyTab.CurrentOperate)(); 执行当前按键的操作}break;case KEY_DOWN if((MenuNextID != MENU_NO) && (KeyTab[MenuNextID].PressDown != MENU_NO)){NowKeyTab.PressOk =KeyTab[MenuNextID].PressDown;MenuNextID = KeyTab[MenuNextID].PressDown;(NowKeyTab.CurrentOperate)(); 执行当前按键的操作}break;case KEY_RESET ResetFlag = TRUE;break;default break;}}while(!ResetFlag && !EscFlag && !escflag);if(ChangeFlag && !EscFlag && !ResetFlag)EditDataChange();if(ResetFlag)return SYS_RESET;else{return 0;}}关于这个菜单的说明:1.我用的是ARM处理器,所以51的时候把const改成code,uint32改成unsigned char。
移动端实现树级菜单的方法
移动端实现树级菜单的方法全文共四篇示例,供读者参考第一篇示例:移动端实现树级菜单的方法随着移动设备的普及和移动应用的流行,越来越多的网站和应用开始重视移动端的用户体验。
在移动端,屏幕空间有限,如何有效地展示复杂的菜单结构成为了一个挑战。
树级菜单是一种常见的菜单结构,通过多层次的嵌套展示不同级别的菜单选项。
本文将介绍在移动端实现树级菜单的方法,以提升用户体验和提高网站或应用的可用性。
一、响应式设计在移动端实现树级菜单时,首先要考虑的是使用响应式设计。
响应式设计可以根据设备的屏幕大小和分辨率自动调整页面布局,以适配不同的设备。
在移动端,可以通过媒体查询和弹性布局来实现响应式设计,保证菜单能够在不同屏幕尺寸下正常显示。
二、折叠菜单折叠菜单是在移动端常用的菜单形式之一,通过折叠和展开的方式来展示不同级别的菜单选项。
在树级菜单中,可以将子菜单折叠起来,只显示父菜单和展开箭头,用户点击展开箭头后,可以展开子菜单,直到最底层菜单选项。
三、滑动菜单滑动菜单是另一种常见的移动端菜单形式,用户可以通过滑动手势来查看菜单选项。
在树级菜单中,可以利用滑动菜单来展示多层次的菜单结构,用户可以通过左右滑动来浏览不同级别的菜单选项。
四、手势操作在移动端实现树级菜单时,要考虑到用户的手势操作习惯。
在触摸屏设备上,用户习惯使用手指滑动和点击来进行操作,因此菜单的设计应该考虑到这些手势操作。
可以通过滑动展开子菜单、点击选择菜单选项等方式来提升用户体验。
五、动画效果动画效果可以提升用户体验,并增加菜单的交互性。
在移动端实现树级菜单时,可以使用一些简单的动画效果,比如展开和折叠菜单时的过渡动画、菜单选项的渐变效果等。
这些动画效果可以使菜单更生动,吸引用户的注意力。
六、适配不同屏幕大小七、测试优化在移动端实现树级菜单后,需要进行测试和优化,确保菜单在不同设备和浏览器上都能正常显示和使用。
可以通过模拟不同设备、不同网络速度来测试菜单的性能和兼容性,及时修复可能存在的问题,提升用户体验。
ABAP学习(21):OOSALV学习TreeALV
ABAP学习(21):OOSALV学习TreeALV5. OO SALV tree 利⽤函数和GRID的功能发布的SALV包程序(SALV也称为New ALV)。
通过类cl_salv_tree,实现tree类型ALV的输出。
5.1显⽰tree ALV通过cl_salv_tree类对象lo_tree,显⽰tree ALV。
代码实例: 全局变量定义,使⽤icon需要引⼊type-pools:icon;gt_spfli显⽰的内表结构,是⼀个空内表;lo_tree为cl_salv_tree类对象;lo_error为异常类对象;lo_container为容器类对象。
"使⽤icontype-pools: icon."这个内表创建alv时,没有数据DATA:gt_spfli TYPE STANDARD TABLE OF spfli."cl_salv_tree类对象DATA:lo_tree TYPE REF TO cl_salv_tree."异常类对象DATA:lo_error TYPE REF TO CX_SALV_ERROR."屏幕容器类对象DATA:lo_container TYPE REF TO cl_gui_custom_container.创建cl_salv_tree类对象,设置显⽰tree结构"创建tree alv,全屏显⽰FORM creat_alv_fullscreen.TRY ."获取cl_salv_tree类对象cl_salv_tree=>factory(importingr_salv_tree = lo_treechangingt_table = gt_spfli )."设置全局PERFORM set_tree_settings."获取数据,设置tree结构PERFORM set_tree."显⽰alvlo_tree->display( ).CATCH CX_SALV_NO_NEW_DATA_ALLOWED CX_SALV_ERROR INTO lo_error.DATA:result TYPE string.result = lo_error->IF_MESSAGE~GET_TEXT( ).MESSAGE result TYPE'E'.ENDTRY.ENDFORM.设置tree的树形结构,数据是在这个阶段获取的,⽽⽣成cl_salv_tree类对象lo_tree时传⼊的table为空。
alv tree用法
alv tree用法ALV树(ABAP List Viewer Tree)是一种在ABAP程序中使用的报表显示方式,它以树形结构展示数据,方便用户浏览和操作。
下面是ALV树的基本用法:创建ALV树报表:在ABAP程序中,使用REPORT语句创建一个新的报表。
使用ALV关键字指定报表类型为ALV树。
使用TREE关键字指定报表的显示方式为树形结构。
在SELECT-OPTIONS语句中指定用于过滤数据的选项。
在START-OF-SELECTION事件中编写代码处理数据的逻辑。
在AT-LINE-SELECTION事件中编写代码响应行的选择操作。
配置ALV树报表:使用ALV命令进入ALV树报表的配置界面。
在“列”选项卡中,配置要显示在树形结构中的列。
在“排序”选项卡中,指定按照哪个列进行排序。
在“过滤”选项卡中,设置数据的过滤条件。
在“外观”选项卡中,调整报表的外观样式。
显示ALV树报表:在ABAP程序中,使用REPORT语句调用已创建的ALV树报表。
在程序的相应事件中编写代码,处理数据和执行其他操作。
操作ALV树报表:使用鼠标点击树形结构中的节点来选择该节点。
使用上下箭头键在节点之间进行导航。
使用左右箭头键展开或折叠节点的子节点。
在节点的右键菜单中选择相应选项进行操作,如编辑、删除等。
获取ALV树报表的数据:在ABAP程序中,可以使用相应的API函数获取ALV树报表中的数据。
可以使用CL_ALV_BROWSER类的相关方法获取报表的配置信息和数据。
可以使用CL_ALV_TABLE类的相关方法获取报表的列信息和数据。
这些是ALV树的基本用法和常见操作。
你可以参考ABAP编程手册和ALV相关的文档,了解更多关于ALV树的详细信息和高级用法。
ABAP_培训教程
ABAP_培训教程ABAP 培训教程1. ABAP 简介ABAP(Advanced Business Application Programming)是一种高级业务应用程序编程语言,由德国软件公司 SAP 开发。
ABAP 是SAP R/3 系统的核心编程语言,用于开发 SAP 的自定义应用程序。
ABAP 不仅可以用于开发传统的客户端/服务器应用程序,还可以用于开发基于 Web 的应用程序。
2. ABAP 编程环境ABAP Workbench:是 ABAP 编程的主要工具,包括字典、SE38 事务码编辑器、SE80 对象浏览器等。
Dictionary:用于定义和修改数据字典对象,如数据元素、结构、表、视图等。
ABAP Editor:用于编写和编辑 ABAP 程序。
ABAP Debugger:用于调试 ABAP 程序。
3. ABAP 程序结构ABAP 程序由一个或多个程序单元组成,每个程序单元包含一个或多个功能模块。
ABAP 程序的结构如下:Report:是 ABAP 程序的基本单元,用于处理输入、处理数据和输出。
Function Module:是一组相关功能的集合,用于实现特定的业务功能。
Module Pool:是一组用于处理屏幕的逻辑单元,用于创建基于屏幕的应用程序。
Class:是一组相关属性和方法的集合,用于实现面向对象编程。
4. ABAP 语法关键字:ABAP 中的关键字是预定义的,用于表示特定的编程构造,如 IF、ENDIF、LOOP、ENDLOOP 等。
数据定义:ABAP 中的数据定义用于定义程序中的数据类型和数据结构,如 TYPES、DATA、STRUCTURES 等。
控制结构:ABAP 中的控制结构用于控制程序的执行流程,如IF、CASE、LOOP 等。
函数调用:ABAP 中的函数调用用于调用 ABAP 标准函数或自定义函数,如 CALL FUNCTION、PERFORM 等。
5. ABAP 编程示例REPORT z_example.DATA: a TYPE i, b TYPE i, c TYPE i.START-OF-SELECTION.a = 5.b = 3.c = a + b.WRITE: / 'The sum of', a, 'and', b, 'is', c.6. ABAP 开发最佳实践遵循编码规范:遵循 SAP 的编码规范,确保代码的可读性和可维护性。
ABAP tree的使用
METHODS:
HANDLE_NODE_CONTEXT_MENU_REQ
FOR EVENT NODE_CONTEXT_MENU_REQUEST
OF CL_GUI_SIMPLE_TREE
ELSE.
DATA MAXKEY LIKE ZUSERMENU-NODE_KEY.
DATA TMP_INT TYPE I.
SELECT MAX( NODENO ) FROM ZUSERMENU INTO TMP_INT WHERE ISFOLDER <> 'F'.
TEXT = '修改当前节点'
FCODE = 'CODE5'.
CALL METHOD MENU->ADD_FUNCTION
EXPORTING
TEXT = '删除当前节点'
FCODE = 'CODE6'.
CLASS LCL_APPLICATION DEFINITION.
PUBLIC SECTION.
METHODS: HANDLE_NODE_DOUBLE_CLICK
FOR EVENT NODE_DOUBLE_CLICK
OF CL_GUI_SIMPLE_TREE
* text
*----------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'STANDARD'.
SET TITLEBAR 'STANDARD'.
在PHP中树状导航菜单
在PHP中树状导航菜单实例说明树形结构能够以层次形式展示信息,用它来描述具有上下级关系的内容再恰当不过。
本实例利用菜单的树形结构来描述企业的人事组织结构。
关键技术本实例中实现菜单的树形显示是通过<table>标签结合DIV实现的。
父节点利用表格来显示,子节点利用DIV嵌套表格来实现。
这样做的目的是容易对子节点的显示和隐蔽进行控制。
例如,当用户单击父节点时,如果子节点没有展开,将DIV设置为可见就显示子节点;如果子节点可见,将DIV设置为不可见就可以隐蔽子节点。
设计过程(1)使用Dreamweaver创建一个PHP动态页,保存为index.php文件。
(2)创建一个表单,在表单中添加一个2行1列的表格,在表格的第2行再添加一个2行2列的表格。
表格的第1列用于显示节点前的图标,第2列描述节点文本,主要代码如下:<form id="form1"name="form1"method="post"action=""> <tablewidth="372" border="1"align="center"bgcolor="#E6F2F2"bord ercolor="#478D8D"style="border-style:none"cellspacing="0"><tr><td scope="col"align="center"style="border-bottom-style:none">人事组织架构</td></tr><tr><td><tablewidth="100%" border="0"cellpadding="0"cellspacing="0"align ="left"><?php //嵌入PHP脚本$xml_file=simplexm1_load_file("org.xm1"); //从XML文件中加载节点foreach($xm1_file->children() as $node){ //遍历根节点><tr><tdwidth="38%"align="right"> //设置节点图标<imgsrc="images/rootnode.gif"width="15"height="15"border="0"> </img></td><td width="62%" left="0px"align="left"><a href="#"onclick="ShowNode(<?php echo $node?>)"> <?php echo $node?></a></td></tr><tr><td width="38%"align="center"></td><td width="62%"><div id=<?php echo $node?>style="display:none"class="HideDiv"> //定义DIV<tablewidth="100%"border="0"cellpadding="0"cellspacing="0"align= "left"><?phpforeach($node->chidren() as $value){ //遍历字节点><tr><td width="10%" align="right"><imgsrc="images/childnode.gif"width="15"height="15"border="0"> </img></td><td width="90%" align="left" ><a href="#"> <?php echo $value?></a></td></tr><?php}></table></div></td></tr><?php}></table></td></tr></table><script language="javascript"> //隐蔽或显示字节点function ShowNode(ParentID){var Div=ParentID;if(Div.style.display=="none"){Div.style.display="block"; //显示DIV,以此来显示字节点}else.if(Div.style.display=="block"){ //隐蔽DIV,间接隐蔽字节点Div.style.display="none";}}</script></form>(3)人事组织的架构存储于XML文件org.xml中。
树状结构的select选择栏
树状结构的select选择栏
树状结构的select选择栏是一种具有层次关系的下拉菜单,可以用
于选择嵌套的选项。
一般来说,它在界面上呈现为一个可展开的树状结构,点击某个节点后会展开下一级节点,如此类推,直到最终选项被选择为止。
这种选择栏常用于需要用户对大量数据进行选择的场景,如组织机构
管理、地区选择等。
它可以将选择项以一定的层次结构组织起来,使用户
更容易找到自己需要的选项。
除了基本的展开、折叠和选中操作外,树状结构的select选择栏还
可以支持搜索和过滤功能,帮助用户快速定位和选择所需选项。
因此,它
是一种通用的选择控件,可以在各种应用场景中使用。
程序-基于节点编号的通用树状菜单设计方法与实现
附录:基于节点编号的通用树状菜单设计源代码 说明: 本例实现了 TC20 的界面菜单,代码开发实现环境为 TC20。共 2 个文件: 1:memu.c-代码文件; 2:menu.h -菜单节点定义的头文件 1:memu.c -C 代码文件 /* This menu select demo programing, It define menu as binary tree, * Menu data is from TC20 software'menu. * By Peng liangqing * data:2001-9-26 */ #include<stdio.h> #include<graphics.h> #include<conio.h> #include<process.h> #include<stdlib.h> #include<menu.h> void initmenutree(void); MENU *getpmenumfromID(int id); void menuwindisplay(MENU *pmenu); MENU *menuselect(MENU *pmenu,int key); void delmenuwin(MENU *pmenu); void menucurdisplay(MENU *pmenu, int i); void delmenucur(MENU *pmenu, int i); /* 以下为功能菜单节点函数原型定义 */ void fmenu111(void); void fmenu112(void); void fmenu114(void); void fmenu115(void); void fmenu117(void); void fmenu118(void); void fmenu12(void); void fmenu14(void); void fmenu16(void); void fmenu17(void); void fmenu131(void); void fmenu132(void); void fmenu134(void); void fmenu135(void); void fmenu141(void); void fmenu142(void); void fmenu144(void); void fmenu145(void); void fmenu151(void); void fmenu152(void); void fmenu154(void); void fmenu155(void); void fmenuprocess(void);
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ABAP 树型菜单程序Jerry 项目中树型菜单很少用到,但是学会了,也是一种好事。
最近,客户方就有一个要求,能够实现特殊的文档管理,包括动态的树型菜单。
此文档中,我就介绍如何用ABAP创建一个简单的树型菜单!下面几个步骤只讲创建树型菜单几个重要的地方,最后面是详细的实现代码。
建议学者粗略看看步骤,重点看最后的代码,然后自己学着按下面的DEMO写测试程序,直到成功为止,如有不懂的地方,可以到群内留言。
或者文档有写得不好的地方,也可以提出来,我们一起加以改善!一. 创建一个DIALOG屏幕(0900),创建一个定制控制: TREE_CONTAINER,作为一个容器来存放程序创建的树型菜单,如下图所示:二. 在屏幕PBO事件中,创建一个MOUDLE: m_init_tree,然后创建一个Subroutine: frm_init_tree。
在Subroutine中创建一个Object: g_application,g_application指向自己创建的一个Class:lcl_application。
这个Class主要定义了一些事件,比如单击,双击,展开,链接单击等事件,用来注册及捕获树型菜单的父节点,子节点单击,双击,展开,链接单击等事件,然后在自己Class :lcl_application中相应自定义的Method中写相应的Code,实现特殊的操作。
三. 用程序创建一个容器类cl_gui_custom_container的实例g_custom_container,代码如下CREATE OBJECT g_custom_containerEXPORTINGcontainer_name = 'TREE_CONTAINER'EXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.从上面的代码可以看出,程序创建了一个指向步骤一创建的定制控制: TREE_CONTAINER一个自定义容器类.四. 设置树型菜单名称,宽度,菜单列数,并创建树型菜单Class:cl_gui_column_tree实例:g_tree,并和屏幕容器相关联hierarchy_header-heading = '资源管理'. "树型菜单名称hierarchy_header-width = 50. "宽度CREATE OBJECT g_treeEXPORTINGparent = g_custom_container "将创建的树型菜单和屏幕容器相关联 node_selection_mode = cl_gui_column_tree=>node_sel_mode_single "模式 item_selection = 'X'hierarchy_column_name = c_column-column1 "列数hierarchy_header = hierarchy_headerEXCEPTIONScntl_system_error = 1create_error = 2failed = 3illegal_node_selection_mode = 4illegal_column_name = 5lifetime_error = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.五. 定义树型菜单的一些事件,比如单击,双击等" node double click根节点双击event-eventid = cl_gui_column_tree=>eventid_node_double_click.event-appl_event = 'X'. " process PAI if event occursAPPEND event TO events." item double click子节点双击event-eventid = cl_gui_column_tree=>eventid_item_double_click.event-appl_event = 'X'.APPEND event TO events." expand no children展开文件event-eventid = cl_gui_column_tree=>eventid_expand_no_children.event-appl_event = 'X'.APPEND event TO events." link click链接单击,我认为是最后的子节点单击event-eventid = cl_gui_column_tree=>eventid_link_click.event-appl_event = 'X'.APPEND event TO events." button clickevent-eventid = cl_gui_column_tree=>eventid_button_click.event-appl_event = 'X'.APPEND event TO events." checkbox changeevent-eventid = cl_gui_column_tree=>eventid_checkbox_change.event-appl_event = 'X'.APPEND event TO events." header clickevent-eventid = cl_gui_column_tree=>eventid_header_click.event-appl_event = 'X'.APPEND event TO events.设置类实例g_tree的相关事件,因为类g_tree的属性event默认为空,所以在这里要调用set_registered_events设置事件CALL METHOD g_tree->set_registered_eventsEXPORTINGevents = eventsEXCEPTIONScntl_error = 1cntl_system_error = 2illegal_event_combination = 3.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.六. 注册树型菜单事件到第二步中创建的类lcl_application的实例g_application,然后我们就可以在g_application中相关的方法中捕获树型菜单的相关事件,写自己的程序作特殊的处理。
比如SET HANDLER g_application->handle_node_double_click FOR g_tree.注册树型菜单双击事件句柄七. 添加树型菜单子节点主要用到树型菜单的g_tree的treev_ntab属性treev_ntab的四个属性非常重要,一个是node_key,就是为此节点起命名,树型菜单中的每一个节点都必须有一个命名,并且必须唯一。
第二个属性是relatkey,就是指定本节点从属于那一个节点之下,也就是指定它的上级节点,如果是根节点,就无需指定。
第三个属性isfolder,就是说指定节点是否允许有子节点。
第四个expander就是节点是否可以展开。
节点的属性设置好后,就可以调用g_tree的method: add_nodes_and_items来添加树型菜单节点,以下的DEMO就刚开始就添加了”业扩工程”,“在建工程”,”改造工程”三个根节点。
八. 展示根节点,调用g_tree的expand_node方法将第七步的三个根节点进行展示.启动程序,将会看到屏幕上就有了一个简单的树型菜单,至于怎么在这三个根节点下再加子节点,读者就自己看OK_CODE:ADD事件里的代码,道理是一样的。
完整的程序代码*&---------------------------------------------------------------------**& Report YTEST2*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT y_tree_test.TYPES: item_table_type LIKE STANDARD TABLE OF mtreeitmWITH DEFAULT KEY.DATA: it_pic_data TYPE TABLE OF /sc1/pic_data,it_data_output TYPE TABLE OF /sc1/pic_data,wa_pic_data TYPE /sc1/pic_data,it_data_collect TYPE TABLE OF /sc1/pic_data,wa_data_collect TYPE /sc1/pic_data.DATA: it_data TYPE TABLE OF bapiconten WITH HEADER LINE.DATA: v_url(255) TYPE c,v_index TYPE i.DATA: g_event(30),g_node_key TYPE tv_nodekey,g_item_name TYPE tv_itmname,g_header_name TYPE tv_hdrname.DATA: o_container TYPE REF TO cl_gui_custom_container,o_container1 TYPE REF TO cl_gui_custom_container,o_container2 TYPE REF TO cl_gui_custom_container,o_container3 TYPE REF TO cl_gui_custom_container,o_container4 TYPE REF TO cl_gui_custom_container,o_container5 TYPE REF TO cl_gui_custom_container,o_container6 TYPE REF TO cl_gui_custom_container,o_picture TYPE REF TO cl_gui_picture,o_picture1 TYPE REF TO cl_gui_picture,o_picture2 TYPE REF TO cl_gui_picture,o_picture3 TYPE REF TO cl_gui_picture,o_picture4 TYPE REF TO cl_gui_picture,o_picture5 TYPE REF TO cl_gui_picture,o_picture6 TYPE REF TO cl_gui_picture.DATA: total_page(255) TYPE c VALUE '第3页/共5页'.DATA: g_tc_pic_upload_lines LIKE sy-loopc.DATA p_comp_code LIKE t001-bukrs.DATA p_prctr TYPE /dsd/sl_bso.DATA p_kunnr TYPE kna1-kunnr.DATA pic_name(30) TYPE c..DATA p_pic_type TYPE /sc1/e_pic_type.DATA pic_name1 TYPE name1.DATA pic_num TYPE /sc1/pic_num.DATA g_1st_time TYPE xflag.DATA: node_table TYPE treev_ntab,node TYPE treev_node,item_table TYPE item_table_type,item TYPE mtreeitm,lv_nodekey TYPE tv_nodekey.DATA: ok_code TYPE sy-ucomm.CONSTANTS:BEGIN OF c_nodekey,root TYPE tv_nodekey VALUE 'root',root2 TYPE tv_nodekey VALUE 'root2',root3 TYPE tv_nodekey VALUE 'root3', "#EC NOTEXT child1 TYPE tv_nodekey VALUE 'Child1', "#EC NOTEXT child2 TYPE tv_nodekey VALUE 'Child2', "#EC NOTEXT new1 TYPE tv_nodekey VALUE 'New1', "#EC NOTEXT new2 TYPE tv_nodekey VALUE 'New2', "#EC NOTEXT * new3 type tv_nodekey value 'New3', "#EC NOTEXT * new4 type tv_nodekey value 'New4', "#EC NOTEXT END OF c_nodekey,BEGIN OF c_column,column1 TYPE tv_itmname VALUE 'column1', "#EC NOTEXT column2 TYPE tv_itmname VALUE 'column2', "#EC NOTEXTcolumn3 TYPE tv_itmname VALUE 'column3', "#EC NOTEXT column4 TYPE tv_itmname VALUE 'column4',column5 TYPE tv_itmname VALUE 'column5',column6 TYPE tv_itmname VALUE 'column6',column7 TYPE tv_itmname VALUE 'column7',column8 TYPE tv_itmname VALUE 'column8',END OF c_column.*----------------------------------------------------------------------* * CLASS lcl_application DEFINITION*----------------------------------------------------------------------* **----------------------------------------------------------------------* CLASS lcl_application DEFINITION.PUBLIC SECTION.METHODS:handle_node_double_clickFOR EVENT node_double_clickOF cl_gui_column_treeIMPORTING node_key,handle_header_clickFOR EVENT header_clickOF cl_gui_column_treeIMPORTING header_name,handle_expand_no_childrenFOR EVENT expand_no_childrenOF cl_gui_column_treeIMPORTING node_key,handle_item_double_clickFOR EVENT item_double_clickOF cl_gui_column_treeIMPORTING node_key item_name,handle_button_clickFOR EVENT button_clickOF cl_gui_column_treeIMPORTING node_key item_name,handle_link_clickFOR EVENT link_clickOF cl_gui_column_treeIMPORTING node_key item_name,handle_checkbox_changeFOR EVENT checkbox_changeOF cl_gui_column_treeIMPORTING node_key item_name checked.ENDCLASS. "LCL_APPLICATION DEFINITION*----------------------------------------------------------------------* * CLASS LCL_APPLICATION IMPLEMENTATION*----------------------------------------------------------------------* **----------------------------------------------------------------------* CLASS lcl_application IMPLEMENTATION.METHOD handle_node_double_click." this method handles the node double click event of the tree" control instance" show the key of the double clicked node in a dynpro field* g_event = 'NODE_DOUBLE_CLICK'.* g_node_key = node_key.CLEAR wa_pic_data.CLEAR it_data[].ENDMETHOD. "HANDLE_NODE_DOUBLE_CLICKMETHOD handle_header_click." this method handles header click event of the tree" control instance" show the name of the clicked header in a dynpro fieldg_event = 'HEADER_CLICK'.g_header_name = header_name.CLEAR: g_node_key, g_item_name.ENDMETHOD. "HANDLE_HEADER_CLICKMETHOD handle_item_double_click." this method handles the item double click event of the tree" control instanceDATA lwa_bds TYPE bds_conn00.DATA: bdcdata_wa TYPE bdcdata,bdcdata_tab TYPE TABLE OF bdcdata.DATA opt TYPE ctu_params.opt-dismode = 'E'.opt-defsize = 'X'." show the key of the node and the name of the item" of the double clicked item in a dynpro fieldg_event = 'ITEM_DOUBLE_CLICK'.g_node_key = node_key.g_item_name = item_name.CLEAR wa_pic_data.CLEAR it_data[].SELECT SINGLE * INTO CORRESPONDING FIELDS OF wa_pic_data FROM /sc1/pic_data WHERE /sc1/pic_data~pic_num = g_node_key.IF sy-subrc EQ 0.IF o_picture1 IS INITIAL.CREATE OBJECT: o_container1 EXPORTING container_name = 'PIC_CONTAINER1', o_picture1 EXPORTING parent = o_container1.CLEAR v_url.* READ TABLE it_pic_data INTO wa_pic_data INDEX v_index.* pic_name = wa_pic_data-pic_nam.CALL FUNCTION '/SC1/TIN_BD_GET_TO_TAB'EXPORTINGdoc_id = wa_pic_data-loio_idTABLESet_file_content = it_data.CALL FUNCTION 'DP_CREATE_URL'EXPORTINGtype = 'IMAGE'subtype = 'X-UNKNOWN'TABLESdata = it_dataCHANGINGurl = v_url.CALL METHOD o_picture1->load_picture_from_urlEXPORTINGurl = v_url.CALL METHOD o_picture1->set_display_modeEXPORTINGdisplay_mode = o_picture1->display_mode.ELSE.CLEAR v_url.* READ TABLE it_pic_data INTO wa_pic_data INDEX v_index.* pic_name = wa_pic_data-pic_nam.CALL FUNCTION '/SC1/TIN_BD_GET_TO_TAB'EXPORTINGdoc_id = wa_pic_data-loio_idTABLESet_file_content = it_data.CALL FUNCTION 'DP_CREATE_URL'EXPORTINGtype = 'IMAGE'subtype = 'X-UNKNOWN'TABLESdata = it_dataCHANGINGurl = v_url.CALL METHOD o_picture1->clear_picture.CALL METHOD o_picture1->load_picture_from_urlEXPORTINGurl = v_url.CALL METHOD cl_gui_cfw=>flush.IF sy-subrc EQ 0.CALL METHOD o_picture1->set_display_modeEXPORTINGdisplay_mode = o_picture1->display_mode.ENDIF.ENDIF.pic_name1 = wa_pic_data-pic_nam.pic_num = wa_pic_data-pic_num.ENDIF.ENDMETHOD. "HANDLE_ITEM_DOUBLE_CLICKMETHOD handle_link_click." this method handles the link click event of the tree " control instance" show the key of the node and the name of the item" of the clicked link in a dynpro fieldg_event = 'LINK_CLICK'.g_node_key = node_key.g_item_name = item_name.CLEAR g_header_name.ENDMETHOD. "HANDLE_LINK_CLICKMETHOD handle_button_click." this method handles the button click event of the tree" control instance" show the key of the node and the name of the item" of the clicked button in a dynpro fieldg_event = 'BUTTON_CLICK'.g_node_key = node_key.g_item_name = item_name.CLEAR g_header_name.ENDMETHOD. "HANDLE_BUTTON_CLICKMETHOD handle_checkbox_change ." this method handles the checkbox_change event of the tree " control instance* DATA checked TYPE as4flag." show the key of the node and the name of the item" of the clicked checkbox in a dynpro fieldg_event = 'CHECKBOX_CHANGE'.g_node_key = node_key.g_item_name = item_name.CLEAR g_header_name.CASE node-relatkey .WHEN 'root'.WHEN 'root3'.ENDCASE.ENDMETHOD. "HANDLE_CHECKBOX_CHANGEMETHOD handle_expand_no_children.ENDMETHOD. "HANDLE_EXPAND_NO_CHILDREN ENDCLASS. "LCL_APPLICATION IMPLEMENTATIONDATA: g_application TYPE REF TO lcl_application,g_custom_container TYPE REF TO cl_gui_custom_container,g_tree TYPE REF TO cl_gui_column_tree,g_ok_code TYPE sy-ucomm.START-OF-SELECTION.CALL SCREEN 0900.*&---------------------------------------------------------------------* *& Module STATUS_0900 OUTPUT*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* MODULE status_0900 OUTPUT.SET PF-STATUS 'STATUS_0900'.* SET TITLEBAR 'xxx'.ENDMODULE. " STATUS_0900 OUTPUT*&---------------------------------------------------------------------* *& Module M_INIT_TREE OUTPUT*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* MODULE m_init_tree OUTPUT.PERFORM frm_init_tree.ENDMODULE. " M_INIT_TREE OUTPUT*&---------------------------------------------------------------------* *& Form FRM_INIT_TREE*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * --> p1 text* <-- p2 text*----------------------------------------------------------------------* FORM frm_init_tree .DATA: node_table TYPE treev_ntab,item_table TYPE item_table_type,event TYPE cntl_simple_event,events TYPE cntl_simple_events,hierarchy_header TYPE treev_hhdr.IF g_tree IS INITIAL.CREATE OBJECT g_application.* create a container for the tree controlCREATE OBJECT g_custom_containerEXPORTING " the container is linked to the custom control with the " name 'TREE_CONTAINER' on the dynprocontainer_name = 'TREE_CONTAINER'EXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* setup the hierarchy headerhierarchy_header-heading = '资源管理'." headinghierarchy_header-width = 50. " width: 30 charactersCREATE OBJECT g_treeEXPORTINGparent = g_custom_containernode_selection_mode = cl_gui_column_tree=>node_sel_mode_single item_selection = 'X'hierarchy_column_name = c_column-column1hierarchy_header = hierarchy_headerEXCEPTIONScntl_system_error = 1create_error = 2failed = 3illegal_node_selection_mode = 4illegal_column_name = 5lifetime_error = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* define the events which will be passed to the backend" node double clickevent-eventid = cl_gui_column_tree=>eventid_node_double_click. event-appl_event = 'X'. " process PAI if event occursAPPEND event TO events." item double clickevent-eventid = cl_gui_column_tree=>eventid_item_double_click. event-appl_event = 'X'.APPEND event TO events." expand no childrenevent-eventid = cl_gui_column_tree=>eventid_expand_no_children. event-appl_event = 'X'.APPEND event TO events." link clickevent-eventid = cl_gui_column_tree=>eventid_link_click.event-appl_event = 'X'.APPEND event TO events." button clickevent-eventid = cl_gui_column_tree=>eventid_button_click.event-appl_event = 'X'.APPEND event TO events." checkbox changeevent-eventid = cl_gui_column_tree=>eventid_checkbox_change.event-appl_event = 'X'.APPEND event TO events." header clickevent-eventid = cl_gui_column_tree=>eventid_header_click.event-appl_event = 'X'.APPEND event TO events.CALL METHOD g_tree->set_registered_eventsEXPORTINGevents = eventsEXCEPTIONScntl_error = 1cntl_system_error = 2illegal_event_combination = 3.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* assign event handlers in the application class to each desired event SET HANDLER g_application->handle_node_double_click FOR g_tree.SET HANDLER g_application->handle_item_double_click FOR g_tree.SET HANDLER g_application->handle_expand_no_children FOR g_tree.SET HANDLER g_application->handle_link_click FOR g_tree.SET HANDLER g_application->handle_button_click FOR g_tree.SET HANDLER g_application->handle_checkbox_change FOR g_tree.SET HANDLER g_application->handle_header_click FOR g_tree.PERFORM build_node_and_item_table USING node_table item_table.CALL METHOD g_tree->add_nodes_and_itemsEXPORTINGnode_table = node_tableitem_table = item_tableitem_table_structure_name = 'MTREEITM'EXCEPTIONSfailed = 1cntl_system_error = 3error_in_tables = 4dp_error = 5table_structure_name_not_found = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* expand the node with key 'Root'CALL METHOD g_tree->expand_nodeEXPORTINGnode_key = c_nodekey-rootEXCEPTIONSfailed = 1illegal_level_count = 2cntl_system_error = 3node_not_found = 4cannot_expand_leaf = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.ENDIF.ENDFORM. " FRM_INIT_TREE*&---------------------------------------------------------------------* *& Form BUILD_NODE_AND_ITEM_TABLE*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * -->P_NODE_TABLE text* -->P_ITEM_TABLE text*----------------------------------------------------------------------* FORM build_node_and_item_table USING node_table TYPE treev_ntabitem_table TYPE item_table_type. DATA: node TYPE treev_node,item TYPE mtreeitm.* Build the node table.* Caution: The nodes are inserted into the tree according to the order * in which they occur in the table. In consequence, a node must not* must not occur in the node table before its parent node.* Node with key 'Root'node-node_key = c_nodekey-root." Key of the nodeCLEAR node-relatkey. " Special case: A root node has no parent CLEAR node-relatship. " node.CLEAR node-n_image. " Folder-/ Leaf-Symbol in state "closed": " use default.CLEAR node-exp_image. " Folder-/ Leaf-Symbol in state "open":" use defaultCLEAR node-expander. " see below.* node-relatship = cl_gui_column_tree=>relat_last_child.node-hidden = ' '. " The node is visible,node-disabled = ' '. " selectable,node-isfolder = 'X'. " a folder.node-expander = 'X'.APPEND node TO node_table.node-node_key = c_nodekey-root2." Key of the nodeCLEAR node-relatkey. " Special case: A root node has no parent CLEAR node-relatship. " node.CLEAR node-n_image. " Folder-/ Leaf-Symbol in state "closed": " use default.CLEAR node-exp_image. " Folder-/ Leaf-Symbol in state "open":" use defaultCLEAR node-expander. " see below.* node-relatship = cl_gui_column_tree=>relat_last_child.node-hidden = ' '. " The node is visible,node-disabled = ' '. " selectable,node-isfolder = 'X'. " a folder.node-expander = 'X'.APPEND node TO node_table.node-node_key = c_nodekey-root3." Key of the nodeCLEAR node-relatkey. " Special case: A root node has no parent CLEAR node-relatship. " node.CLEAR node-n_image. " Folder-/ Leaf-Symbol in state "closed": " use default.CLEAR node-exp_image. " Folder-/ Leaf-Symbol in state "open": " use defaultCLEAR node-expander. " see below.* node-relatship = cl_gui_column_tree=>relat_last_child.node-hidden = ' '. " The node is visible,node-disabled = ' '. " selectable,node-isfolder = 'X'. " a folder.node-expander = 'X'.APPEND node TO node_table.* Node with key 'Root'CLEAR item.item-node_key = c_nodekey-root.item-item_name = c_column-column1. " Item of Column 'Column1' item-class = cl_gui_column_tree=>item_class_text. " Text Itemitem-text = '业扩工程'.APPEND item TO item_table.CLEAR item.item-node_key = c_nodekey-root3.item-item_name = c_column-column1. " Item of Column 'Column1' item-class = cl_gui_column_tree=>item_class_text. " Text Itemitem-text = '在建工程'.APPEND item TO item_table.*CLEAR item.item-node_key = c_nodekey-root2.item-item_name = c_column-column1. " Item of Column 'Column1'item-class = cl_gui_column_tree=>item_class_text. " Text Itemitem-text = '改造工程'.APPEND item TO item_table.ENDFORM. " BUILD_NODE_AND_ITEM_TABLE*&---------------------------------------------------------------------**& Module CANCEL_9000 INPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------* MODULE cancel_9000 INPUT.CASE ok_code .WHEN 'BACK' OR 'EXIT'.LEAVE PROGRAM.WHEN 'CANCY'.LEAVE PROGRAM.ENDCASE.ENDMODULE. " CANCEL_9000 INPUT*&---------------------------------------------------------------------**& Module USER_COMMAND_0900 INPUT*&---------------------------------------------------------------------** text*----------------------------------------------------------------------* MODULE user_command_0900 INPUT.DATA: node_delete TYPE treev_upno.DATA lv_vbeln TYPE vbeln_vl.DATA: it_delete_nodes TYPE treev_nks.DATA: wa_delete_nodes TYPE tv_nodekey.CLEAR: it_data_collect[].CASE ok_code.WHEN 'ADD'.CLEAR: it_data_collect[].CALL METHOD g_tree->delete_all_nodes.CLEAR: node_table[], item_table[].PERFORM build_node_and_item_table USING node_table item_table.* 业扩工程下面添加一个节点分城镇和居民PERFORM frm_node_item_create USING 'COMP1' c_nodekey-root '城镇居民' ''. PERFORM frm_node_item_create USING 'PRCTR1' 'COMP1' 'AAAA' ''.PERFORM frm_node_item_create USING 'COMP2' c_nodekey-root '农村居民' ''. PERFORM frm_node_item_create USING 'PRCTR2' 'COMP2' 'BBBB' ''.CALL METHOD g_tree->add_nodes_and_itemsEXPORTINGnode_table = node_table item_table = item_table item_table_structure_name = 'MTREEITM' EXCEPTIONSfailed = 1cntl_system_error = 3error_in_tables = 4dp_error = 5table_structure_name_not_found = 6.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.* expand the node with key 'Root'CALL METHOD g_tree->expand_nodeEXPORTINGnode_key = c_nodekey-rootEXCEPTIONSfailed = 1illegal_level_count = 2cntl_system_error = 3node_not_found = 4cannot_expand_leaf = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.CALL METHOD g_tree->expand_nodeEXPORTINGnode_key = c_nodekey-root2EXCEPTIONSfailed = 1illegal_level_count = 2cntl_system_error = 3node_not_found = 4cannot_expand_leaf = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.CALL METHOD g_tree->expand_nodeEXPORTINGnode_key = c_nodekey-root3EXCEPTIONSfailed = 1illegal_level_count = 2cntl_system_error = 3node_not_found = 4cannot_expand_leaf = 5.IF sy-subrc <> 0.* MESSAGE a000.ENDIF.IF p_kunnr IS NOT INITIAL.CALL METHOD g_tree->expand_root_nodesEXPORTINGlevel_count = 4.ENDIF.ENDCASE.ENDMODULE. " USER_COMMAND_0900 INPUT*&---------------------------------------------------------------------* *& Form FRM_NODE_ITEM_CREATE*&---------------------------------------------------------------------* * text*----------------------------------------------------------------------* * -->P_1221 text* -->P_C_NODEKEY_ROOT text* -->P_1223 text* -->P_1224 text*----------------------------------------------------------------------* FORM frm_node_item_create USING p_p_nodekeyp_p_relatkeyp_p_item_textp_p_last_child.node-node_key = p_p_nodekey." Key of the node* CLEAR node.CLEAR node-relatkey. " Special case: A root node has no parent CLEAR node-relatship. " node.CLEAR node-n_image. " Folder-/ Leaf-Symbol in state "closed": " use default.CLEAR node-exp_image. " Folder-/ Leaf-Symbol in state "open":" use defaultCLEAR node-expander. " see below.IF p_p_last_child = 'X'.node-relatship = cl_gui_column_tree=>relat_last_child.node-isfolder = ''.node-expander = ''.node-last_hitem = p_p_nodekey.ELSE.node-isfolder = 'X'. " a folder.node-expander = 'X'.ENDIF.node-relatkey = p_p_relatkey.node-hidden = ' '. " The node is visible,node-disabled = ' '. " selectable,APPEND node TO node_table.CLEAR item.item-node_key = p_p_nodekey .item-item_name = c_column-column1. " Item of Column 'Column1' item-class = cl_gui_column_tree=>item_class_text. " Text Itemitem-text = p_p_item_text.APPEND item TO item_table.ENDFORM. " FRM_NODE_ITEM_CREATE。