zoukankan      html  css  js  c++  java
  • ABAP-如何读取内表的字段名称

    *&---------------------------------------------------------------------*
    *& Report  ZTRAINING29 如何得到内表的字段名称与字段类型                *
    *& T-code                                                              *
    *&---------------------------------------------------------------------*
    *& Created by Xavery hsueh(薛现军) on 2011-06-08                       *
    *& Last edited date:                                                   *
    *&---------------------------------------------------------------------*
    REPORT  ztraining29 NO STANDARD PAGE HEADING .
    
    
    ************************************************************************
    **  声明数据库表 Declaration of database                              **
    ************************************************************************
    TABLES:mara,
           makt.    "
    ************************************************************************
    **  定义结构类型 Define the structure's type                          **
    ************************************************************************
    *     物料编号的内表
    TYPES:BEGIN OF typ_mara,
            matnr TYPE matnr,
            meins TYPE meins,
            maktx TYPE maktx,
          END OF typ_mara.
    *     保存内表的字段名称
    TYPES:BEGIN OF typ_field,
            fieldnm TYPE txt30,
          END OF typ_field.
    ************************************************************************
    **  定义变量与内表 Define the variants and Internal tables            **
    ************************************************************************
    DATA:gt_mara TYPE TABLE OF typ_mara WITH HEADER LINE.
    DATA:gt_field TYPE TABLE OF typ_field WITH HEADER LINE.
    
    DATA:cl_descr TYPE REF TO cl_abap_structdescr.
    
    FIELD-SYMBOLS:<fs_comp> TYPE abap_compdescr.
    FIELD-SYMBOLS <fs_name> TYPE ANY.
    ************************************************************************
    **  宏定义 Define the macro                                           **
    ************************************************************************
    DEFINE mcr_range.
      clear &1.
      &1-sign = 'I'.
      &1-option = &2.
      &1-low = &3.
      &1-high = &4.
      append &1.
    END-OF-DEFINITION.
    ************************************************************************
    **  选择屏幕 Customize the selection-screen                           **
    ************************************************************************
    SELECTION-SCREEN BEGIN OF BLOCK xavery WITH FRAME TITLE text_001.
    PARAMETERS: p_erdat TYPE erdat DEFAULT sy-datum.      "统计日期
    SELECT-OPTIONS s_matnr FOR mara-matnr.                "物料编号
    SELECTION-SCREEN END OF BLOCK xavery.
    ************************************************************************
    **  执行程序事件 Executing the program's events                       **
    ************************************************************************
    INITIALIZATION.
      PERFORM sub_init_cond.
    
    START-OF-SELECTION.
      PERFORM sub_process_fieldname.
    
    END-OF-SELECTION.
    *@---------------------------------------------------------------------*
    *@      Form  SUB_INIT_COND
    *@---------------------------------------------------------------------*
    *       初始化选择条件
    *----------------------------------------------------------------------*
    FORM sub_init_cond .
      text_001 = '选择屏幕'.
    ENDFORM.                    " SUB_INIT_COND
    *&---------------------------------------------------------------------*
    *&      Form  sub_process_fieldname
    *&---------------------------------------------------------------------*
    *       取得内表字段名称与类型
    *----------------------------------------------------------------------*
    FORM sub_process_fieldname .
      DATA:g_fieldnm TYPE txt30.
      cl_descr ?= cl_abap_typedescr=>describe_by_data( gt_mara ).
      LOOP AT cl_descr->components ASSIGNING <fs_comp>.
        WRITE: / <fs_comp>-name,             "字段名称
                 <fs_comp>-type_kind,        "字段类型
                 <fs_comp>-length,           "字段长度
                 <fs_comp>-decimals.         "字段小数位
        APPEND <fs_comp>-name TO gt_field.
      ENDLOOP.
    
      LOOP AT gt_field.
        CONCATENATE 'GT_MARA-' gt_field-fieldnm INTO gt_field.
        MODIFY gt_field.
      ENDLOOP.
    
      SELECT * FROM mara
          INTO CORRESPONDING FIELDS OF TABLE gt_mara
          WHERE matnr IN s_matnr.
    * 使用得到的字段名称,输出字段结果
      LOOP AT gt_mara.
        WRITE /.
        LOOP AT gt_field.
          ASSIGN (gt_field-fieldnm) TO <fs_name>.
          WRITE: <fs_name>.
        ENDLOOP.
      ENDLOOP.
    ENDFORM.                    " sub_process_fieldname
     
     
     
     
     
    http://www.itpub.net/thread-1039193-1-1.html
     
    rockwl2001:获得内表中的字段名,然后取VKORG、VTWEG、SPART三个字段的值,再做些操作,所有过程都是动态的。
     
     
     
     
     
    *&---------------------------------------------------------------------*
    *&      Form  sd_itab_check_vkorg
    *&---------------------------------------------------------------------*
    *       根据销售范围的权限删去内表中没有权限的值
    *----------------------------------------------------------------------*
    *      -->I_ITAB     text
    *----------------------------------------------------------------------*
    FORM sd_itab_check_vkorg CHANGING i_itab TYPE INDEX TABLE.
      DATA: l_tabcount TYPE i,
            l_tabledescr_ref TYPE REF TO cl_abap_tabledescr,
            l_descr_ref      TYPE REF TO cl_abap_structdescr,
      l_indexof_vkorg TYPE i,
      l_indexof_vtweg TYPE i,
      l_indexof_spart TYPE i.
      FIELD-SYMBOLS: <fs_wa> TYPE ANY,
                     <fs_comp_wa> TYPE abap_compdescr,
                     <fs_vkorg> TYPE ANY,
                     <fs_vtweg> TYPE ANY,
                     <fs_spart> TYPE ANY.
    
      DESCRIBE TABLE i_itab LINES l_tabcount.
      IF l_tabcount <= 0.
        EXIT.
      ENDIF.
      l_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( i_itab ).
      l_descr_ref ?= l_tabledescr_ref->get_table_line_type( ).
      LOOP AT l_descr_ref->components ASSIGNING <fs_comp_wa>.
        IF <fs_comp_wa>-name = 'VKORG'.
          l_indexof_vkorg = sy-tabix.
        ELSEIF <fs_comp_wa>-name = 'VTWEG'.
          l_indexof_vtweg = sy-tabix.
        ELSEIF <fs_comp_wa>-name = 'SPART'.
          l_indexof_spart = sy-tabix.
        ENDIF.
        IF l_indexof_vkorg IS NOT INITIAL AND l_indexof_vtweg IS NOT INITIAL AND
           l_indexof_spart IS NOT INITIAL.
          EXIT.
        ENDIF.
      ENDLOOP.
      IF l_indexof_vkorg IS INITIAL OR l_indexof_vtweg IS INITIAL OR
         l_indexof_spart IS INITIAL.
        RAISE EXCEPTION TYPE cx_sy_table_attributes.
      ENDIF.
      LOOP AT i_itab ASSIGNING <fs_wa>.
        ASSIGN COMPONENT l_indexof_vkorg OF STRUCTURE <fs_wa> TO <fs_vkorg>.
        ASSIGN COMPONENT l_indexof_vtweg OF STRUCTURE <fs_wa> TO <fs_vtweg>.
        ASSIGN COMPONENT l_indexof_spart OF STRUCTURE <fs_wa> TO <fs_spart>.
        AUTHORITY-CHECK OBJECT 'V_VBAK_VKO'
                 ID 'VKORG' FIELD <fs_vkorg>
                 ID 'VTWEG' FIELD <fs_vtweg>
                 ID 'SPART' FIELD <fs_spart>
                 ID 'ACTVT' FIELD '03'.
        IF sy-subrc NE 0.
          DELETE i_itab INDEX sy-tabix.
        ENDIF.
      ENDLOOP.
    ENDFORM.                    "sd_itab_check_vkorg
     
     
     
    dreamgift:在做ALV中有个  REUSE_ALV_FIELDCATALOG_MERGE    可以得到内表中的项目名.
     
    xiner418:简单的说就是在传进来的参数外面加括号,就可以了
  • 相关阅读:
    js截取字符串区分汉字字母代码
    List 去处自定义重复对象方法
    63. Unique Paths II
    62. Unique Paths
    388. Longest Absolute File Path
    41. First Missing Positive
    140. Word Break II
    139. Word Break
    239. Sliding Window Maximum
    5. Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/Nirvanacafe/p/4449649.html
Copyright © 2011-2022 走看看