当前位置: 首页 > news >正文

ABAP 创建动态内表查询任意透明表并进行ALV展示

该功能可以根据用户在选择屏幕输入的表名、行数,动态创建内表、动态查询,然后根据获取到的数据进行ALV展示。

代码如下:

REPORT ZMYDEMO001. DATA: GV_TABNAME TYPE TABNAME, GR_DATA_TABLE TYPE REF TO DATA, LO_TYPEDESCR TYPE REF TO CL_ABAP_TYPEDESCR, GO_STRUCT_DESCR TYPE REF TO CL_ABAP_STRUCTDESCR, GO_TABLE_DESCR TYPE REF TO CL_ABAP_TABLEDESCR, LV_LINE_COUNT TYPE I, LV_TABCLASS TYPE TABCLASS, LV_DOMNAME TYPE DOMNAME, LV_SCRTEXT_S TYPE SCRTEXT_S. * 字段描述存储(全版本兼容结构) DATA: LT_DDFIELD TYPE STANDARD TABLE OF DFIES, LS_DDFIELD TYPE DFIES. DATA: LV_JSON_STRING TYPE STRING. *----------------------------------------------------------------------* * 字段符号声明 *----------------------------------------------------------------------* FIELD-SYMBOLS: <FT_DATA> TYPE ANY TABLE, <FS_LINE> TYPE ANY, <FS_FIELD> TYPE ANY. *----------------------------------------------------------------------* * 选择屏幕 *----------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK B1. PARAMETERS: P_NAME TYPE TABNAME OBLIGATORY, P_MAX TYPE I DEFAULT 500. SELECTION-SCREEN END OF BLOCK B1. *----------------------------------------------------------------------* * 主程序 *----------------------------------------------------------------------* START-OF-SELECTION. " 1. 表名转大写 GV_TABNAME = P_NAME. TRANSLATE GV_TABNAME TO UPPER CASE. " 2. 验证表存在性和类型 SELECT SINGLE TABCLASS INTO LV_TABCLASS FROM DD02L WHERE TABNAME = GV_TABNAME AND AS4LOCAL = 'A' AND AS4VERS = '0000'. IF SY-SUBRC <> 0. MESSAGE '错误:表不存在或未激活' TYPE 'E'. ENDIF. IF LV_TABCLASS <> 'TRANSP' AND LV_TABCLASS <> 'VIEW'. MESSAGE '错误:只支持查询透明表和视图' TYPE 'E'. ENDIF. " 3. 读取字段描述(内置类型+数据元素双保险)(重要步骤) PERFORM GET_FIELD_DESC_ULTIMATE USING GV_TABNAME CHANGING LT_DDFIELD. " 4. 动态创建内表(核心步骤) TRY. LO_TYPEDESCR = CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_NAME( GV_TABNAME ). GO_STRUCT_DESCR ?= LO_TYPEDESCR. GO_TABLE_DESCR = CL_ABAP_TABLEDESCR=>CREATE( P_LINE_TYPE = GO_STRUCT_DESCR P_TABLE_KIND = CL_ABAP_TABLEDESCR=>TABLEKIND_STD ). CREATE DATA GR_DATA_TABLE TYPE HANDLE GO_TABLE_DESCR. CATCH CX_ROOT INTO DATA(LX_CREATE). MESSAGE '动态创建内表失败: ' && LX_CREATE->GET_TEXT( ) TYPE 'E'. ENDTRY. " 5. 分配字段符号 ASSIGN GR_DATA_TABLE->* TO <FT_DATA>. IF <FT_DATA> IS NOT ASSIGNED. MESSAGE '错误:无法分配内表字段符号' TYPE 'E'. ENDIF. " 6. 动态查询数据 IF P_MAX <= 0 OR P_MAX > 2000. P_MAX = 500. ENDIF. TRY. SELECT * UP TO P_MAX ROWS INTO TABLE <FT_DATA> FROM (GV_TABNAME). IF SY-SUBRC <> 0. MESSAGE 'SQL查询失败: 没有找到数据' TYPE 'I'. ENDIF. CATCH CX_ROOT INTO DATA(LX_SELECT). MESSAGE 'SQL查询失败: ' && LX_SELECT->GET_TEXT( ) TYPE 'E'. ENDTRY. "ALV展示 PERFORM SHOW_DATA_ALV. *----------------------------------------------------------------------* * 子例程1:读取字段描述(内置类型+数据元素全支持) *----------------------------------------------------------------------* FORM GET_FIELD_DESC_ULTIMATE USING IV_TAB TYPE TABNAME CHANGING CT_FLD TYPE DFIES_TAB. CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING TABNAME = IV_TAB LANGU = SY-LANGU ALL_TYPES = 'X' TABLES DFIES_TAB = CT_FLD EXCEPTIONS OTHERS = 1. IF SY-SUBRC <> 0. MESSAGE '获取字段信息失败' TYPE 'E'. ENDIF. " 为内置类型字段补全描述 LOOP AT CT_FLD INTO LS_DDFIELD. IF LS_DDFIELD-ROLLNAME IS INITIAL. " 尝试1:从DD03T获取表字段专属文本 SELECT SINGLE DDTEXT INTO LS_DDFIELD-SCRTEXT_S FROM DD03T WHERE TABNAME = IV_TAB AND FIELDNAME = LS_DDFIELD-FIELDNAME AND DDLANGUAGE = SY-LANGU. " 尝试2:从域文本表获取描述 IF LS_DDFIELD-SCRTEXT_S IS INITIAL AND LS_DDFIELD-DOMNAME IS NOT INITIAL. SELECT SINGLE DDTEXT INTO LS_DDFIELD-SCRTEXT_S FROM DD07T WHERE DOMNAME = LS_DDFIELD-DOMNAME AND DDLANGUAGE = SY-LANGU. ENDIF. " 尝试3:兜底方案 IF LS_DDFIELD-SCRTEXT_S IS INITIAL. CONCATENATE LS_DDFIELD-FIELDNAME '(' LS_DDFIELD-INTTYPE ')' INTO LS_DDFIELD-SCRTEXT_S. ENDIF. MODIFY CT_FLD FROM LS_DDFIELD. ENDIF. ENDLOOP. ENDFORM. *----------------------------------------------------------------------* * 子例程2:ALV显示 *----------------------------------------------------------------------* FORM SHOW_DATA_ALV. DATA: LO_ALV TYPE REF TO CL_SALV_TABLE, LO_COLS TYPE REF TO CL_SALV_COLUMNS_TABLE, LO_COL TYPE REF TO CL_SALV_COLUMN_TABLE, LV_TEXT TYPE SCRTEXT_S. TRY. CL_SALV_TABLE=>FACTORY( IMPORTING R_SALV_TABLE = LO_ALV CHANGING T_TABLE = <FT_DATA> ). LO_COLS = LO_ALV->GET_COLUMNS( ). LO_COLS->SET_OPTIMIZE( ABAP_TRUE ). LOOP AT LT_DDFIELD INTO LS_DDFIELD. TRY. LO_COL ?= LO_COLS->GET_COLUMN( LS_DDFIELD-FIELDNAME ). IF LS_DDFIELD-SCRTEXT_S IS NOT INITIAL. LV_TEXT = LS_DDFIELD-SCRTEXT_S. ELSE. LV_TEXT = LS_DDFIELD-FIELDNAME. ENDIF. LO_COL->SET_SHORT_TEXT( LV_TEXT ). CATCH CX_ROOT. CONTINUE. ENDTRY. ENDLOOP. LO_ALV->DISPLAY( ). CATCH CX_ROOT. " ALV异常时降级输出 LOOP AT <FT_DATA> ASSIGNING <FS_LINE>. WRITE: / <FS_LINE>. ENDLOOP. ENDTRY. ENDFORM.
http://www.jsqmd.com/news/1041431/

相关文章:

  • 2026新乡黄金回收白银回收铂金回收门店实测|本地正规实体老店无套路门店推荐 - 中安检金银铂钻回收
  • 从Simulink到Modelica:利用FMU实现跨平台模型迁移与协同仿真
  • 2026佳木斯黄金回收白银回收铂金回收门店+工商公安双备案+中检认证商家推荐 - 诚金汇钻回收公司
  • 丹东市奢侈品手表包包回收回收门店权威测评:综合实力最强的五家店铺推荐 - 谊识预商务
  • 2026晋中黄金回收白银回收铂金回收门店+工商公安双备案+中检认证商家推荐 - 诚金汇钻回收公司
  • 2026梧州黄金回收白银回收铂金回收门店实测|本地正规实体老店无套路门店推荐 - 中安检金银铂钻回收
  • 2026厦门黄金回收白银回收铂金回收门店+工商公安双备案+中检认证商家推荐 - 诚金汇钻回收公司
  • 粽香迎佳节,鑫云技术支持全程在线
  • 2026合肥理工校园参观预约咨询电话完整版 - 我叫小周
  • 2026合肥本地中职择校:合肥理工官方招生老师联系号码 - 我叫小周
  • Segger Embedded Studio实战:深入剖析链接脚本与内存布局的定制策略
  • 微信小程序UV预测:用场景值和历史数据预判流量
  • 3个简单步骤解决小爱音箱音乐服务DID配置难题,让你的音箱立即播放音乐
  • UTS 隔离(主机名隔离)
  • 嘉兴秀洲区商圈实测:黄金回收价差有多大 - 专业黄金回收
  • 2026绥化黄金回收白银回收铂金回收门店实测|本地正规实体老店无套路门店推荐 - 中安检金银铂钻回收
  • 绍兴嵊州市市民须知:黄金回收只看三个硬指标,这样卖才不亏 - 上门黄金回收
  • RFID微型标签制作厂家的发展现状与未来前景深度分析
  • 宁波海曙区黄金回收行情与正规机构选择指南 - 专业黄金回收
  • 2026重庆黄金回收优选榜单|收的顶综合指数领跑全城 - 奢侈品回收测评
  • 【HA】巧用Passive BLE Monitor,无感接入小米温湿度计2代数据
  • 从零到一:基于xinetd与Docker的CTF Pwn靶场稳定部署指南
  • 深入解析UDS 0x85服务:精准掌控DTC诊断开关的艺术
  • 平顶山汝州市幕墙工程专业施工队|铝板幕墙施工外墙铝板装修现场装配|铝板设计安装铝单板加工安装代工 - 天堂海洋
  • 2026荆门黄金回收白银回收铂金回收门店+工商公安双备案+中检认证商家推荐 - 诚金汇钻回收公司
  • 绍兴上虞区黄金回收五维测评与机构亮点解析 - 上门黄金回收
  • 2026文山黄金回收白银回收铂金回收门店实测|本地正规实体老店无套路门店推荐 - 中安检金银铂钻回收
  • 绍兴诸暨黄金回收指南:抓住919元 克高价时机 - 上门黄金回收
  • 2026北京本地人必选防水补漏检测维修公司靠谱服务商TOP5推荐:房屋渗漏水检测维修/卫生间/厨房/天花板/阳台/外墙渗漏水检测补漏维修-暗管漏水检测专业仪器精准定位漏水点 - 即刻修防水
  • 网上登报挂失流程是什么?网上登报挂失费用是多少?