尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

128、面向对象ALV深入

128、面向对象ALV深入 128、面向对象ALV深入那是一个周五的下午,生产系统报了个单子,用户说某个报表点“导出”按钮,Excel里前两行数据是空的,再往下翻又有内容。我第一反应是ALV的FIELDCAT或者数据内表有问题,结果查了半天发现都不是。最后跟踪到是ALV的SORT机制和用户点列标题排序时,数据被重新排了,而我的输出内表在SORT之后没有同步刷新到ALV,导致界面显示的是旧的排序状态,导出时却取了新排序后的数据,两个状态错位了。那一刻我意识到,光会用ALV是不够的,面向对象ALV的“深入”不是把网格拖到屏幕上就完事,而是要理解ALV内部维护的那一套视图状态机。很多人从函数式ALV(REUSE_ALV_GRID_DISPLAY)转到面向对象ALV,觉得区别只是多写几行代码,实则不然。函数式ALV像一个自动挡汽车,你给内表它给你画表格,事件注册也简单。而面向对象ALV更像手动挡,变速箱、离合器、油门全都暴露给你,但如果你不懂原理,反而容易熄火。最经典的就是“数据改了页面没动”的问题。你用一个内表做显示源,后来往里APPEND了一行,以为ALV会自己刷新,结果界面纹丝不动。这不是ALV笨,是你没有调用REFRESH_TABLE_DISPLAY方法。ALV持有的是你传进去的内表引用,或者是它内部拷贝的一份数据?这里是个关键坑。在类CL_GUI_ALV_GRID的构造函数里,如果你传的是I_STRUCTURE_NAME,那数据由ALV自己管理;如果你像大多数场景那样传IT_OUTTAB,它实际存的是内表的引用(除非你用了I_INTERNAL_TABNAME),所以理论上你直接改原内表,ALV应该能看到。但问题是,ALV内部的显示缓冲和排序、过滤、列隐藏等状态不会自动响应内表变化。你必须显式调用
返回列表