*&---------------------------------------------------------------------*
*& Report ZME12_BDC1.
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZME12_BDC1.
TABLES: makt,dd02t,marc.
TYPE-POOLS : abap.
DATA where_tab(80) OCCURS 10 WITH HEADER LINE.
DATA where_tab2(80) OCCURS 10 WITH HEADER LINE.
DATA : wa_itab LIKE makt OCCURS 10 WITH HEADER LINE.
DATA : idetails TYPE abap_compdescr_tab,
       xdetails TYPE abap_compdescr.
DATA:wa LIKE idetails WITH HEADER LINE.

DATA:BEGIN OF get_table OCCURS 0 ,
       tabname   TYPE string, "表名
       tabddtext TYPE string, "表格名称
       fieldname LIKE dd03l-fieldname, "字段名称
       rollname  LIKE dd03l-rollname, "资料元素
       inttype   LIKE dd03l-inttype, "类型
     END OF get_table.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS:p_field TYPE string OBLIGATORY.
PARAMETERS: s_trx  TYPE string LOWER CASE." LOWER CASE 大小写不转换
SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.

START-OF-SELECTION.
*--->去掉前导 0
*  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
*    EXPORTING
*      input  = s_trx
*    IMPORTING
*      output = s_trx.
*IF cl_abap_matcher=>matches(
*    pattern = '^(-?[1-9]\d*(\.\d*[1-9])?)|(-?0\.\d*[1-9])$'
*    text = s_trx ) = abap_true.
*
**  WRITE '数字'.
*  CONCATENATE   p_field ' EQ ''' s_trx '''' INTO where_tab.
*ELSE.
*
**  WRITE '非数字'.
*  CONCATENATE   p_field ' LIKE ''%' s_trx '%''' INTO where_tab.
*ENDIF.
*  CONCATENATE   p_field ' LIKE ''%' s_trx '%''' INTO where_tab.
*  APPEND where_tab.

*  CONCATENATE   p_field ' NE ''''' INTO where_tab2.
*  APPEND where_tab2.
*  CLEAR where_tab2.

  TYPE-POOLS : abap.
  FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
                 <dyn_wa>,
                 <dyn_field>.
  DATA: dy_table TYPE REF TO data,
        dy_line  TYPE REF TO data,
        xfc      TYPE lvc_s_fcat,
        ifc      TYPE lvc_t_fcat.

  DATA:wa_structure  TYPE lvc_s_fcat,
       wa_structure1 TYPE lvc_s_fcat,
       gt_structure  TYPE lvc_t_fcat.

  DATA: gs_layout   TYPE slis_layout_alv,
        gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
        wa_fieldcat TYPE slis_fieldcat_alv.

START-OF-SELECTION.
  PERFORM data_table.
  PERFORM get_col.
  PERFORM alv_show.

END-OF-SELECTION.

FORM data_table.
  DATA: l_count TYPE i.

  DATA : ref_table_des TYPE REF TO cl_abap_structdescr.
  DATA : ef_is_unicode LIKE  /bdl/tasks-status.
  DATA:l_value TYPE string.
  DATA: l_index TYPE sy-tabix,
        lv_comt TYPE i,
        l_num   TYPE i,
        p_len   TYPE n.

  gs_layout-colwidth_optimize = 'X'.
  p_len = strlen( s_trx ).
*     p_len = strlen( '40998' ).
  "查询ABAP 所有table表格
  SELECT dd02vv~tabname
              dd03l~fieldname
              dd03l~rollname
              dd03l~inttype
    COUNT(*) FROM dd02vv
    INNER JOIN dd02l ON  dd02l~tabname EQ dd02vv~tabname
    INNER JOIN dd03l ON dd03l~tabname EQ dd02vv~tabname
*        UP TO 10 ROWS
    INTO CORRESPONDING FIELDS OF TABLE get_table
    WHERE dd02vv~tabclass IN ('TRANSP','CLUSTER','POOL') AND " 透明表
                dd02vv~contflag NE 'L' AND " 存储时资料的表格,空传送
                dd02vv~as4local NOT IN (  'N','T' ) AND " 未启用,临时版本
                ( dd03l~fieldname EQ p_field OR
                 dd03l~rollname EQ p_field ) AND
*                    dd02vv~tabname NOT IN (  'DF50D' ,'DF40D' ) AND
                dd03l~leng >= p_len AND
                is_gtt NE 'X' " X全局临时表 N 没有全局临时表
        GROUP BY dd02vv~tabname dd03l~fieldname
  dd03l~rollname dd03l~inttype.

  "字符小写转换大写
  TRANSLATE p_field TO UPPER CASE.
  "创建内表结构
  PERFORM new_teble.
  " 创建内表
  PERFORM create_dynamic_itab.

  LOOP AT get_table.
    l_index = sy-tabix.

    SELECT SINGLE ddtext INTO get_table-tabddtext
      FROM dd02t
      WHERE tabname = get_table-tabname
          AND ddlanguage = sy-langu.
    IF sy-subrc = 0.
      SELECT SINGLE ddtext INTO get_table-tabddtext
    FROM dd02t
    WHERE tabname = get_table-tabname.
    ENDIF.


    CLEAR: l_num.
    "查询表格内容是否有值
    SELECT COUNT(*) INTO l_num
        UP TO 2 ROWS
    FROM (get_table-tabname).
    IF sy-subrc <> 0.
      DELETE get_table INDEX l_index.
      CONTINUE.
    ENDIF.
**      DESCRIBE TABLE get_table-tabname LINES index_z
**      n = lines(get_table-tabname).
*
*      "***获取表结构
*      CLEAR:ef_is_unicode,idetails[],xdetails,
*                ref_table_des.
*      " check the system is unicode or nonunicode
*      CALL FUNCTION '/BDL/CHECK_UNICODE'
*        IMPORTING
*          ef_is_unicode = ef_is_unicode.
**      get the structure of the table.
*      ref_table_des ?=
*      cl_abap_typedescr=>describe_by_name( get_table-tabname ).
*      idetails[] = ref_table_des->components[].
*
*      "先获取每个table字段 与查找的table是否相同
*    READ TABLE idetails INTO wa WITH KEY name = p_field BINARY SEARCH.
*         IF sy-subrc = 0 .
    "--->1.abap 字典类型为 p x i f 8 字段调用动态 sql会down
    "--->2.为知 b s g y u v h V r l a e j k z 类型 调用动态 sql是否会down
    CLEAR:l_value.
    IF get_table-inttype EQ 'P' OR
       get_table-inttype EQ 'X' OR
       get_table-inttype EQ 'I' OR
       get_table-inttype EQ 'F' OR
       get_table-inttype EQ '8'.

*             SELECT (p_field)
*                  FROM (get_table-tabname)
*                  INTO @l_value.

      ASSIGN COMPONENT 'TABLE_NAME' OF
                  STRUCTURE <dyn_wa> TO <dyn_field>.

      <dyn_field> = get_table-tabname.

      ASSIGN COMPONENT 'TABLE_DDTEXT' OF
      STRUCTURE <dyn_wa> TO <dyn_field>.

      <dyn_field> = get_table-tabddtext.

      ASSIGN COMPONENT 'FIELD' OF
                  STRUCTURE <dyn_wa> TO <dyn_field>.

      <dyn_field> = get_table-fieldname.

      ASSIGN COMPONENT 'VALUE' OF
                  STRUCTURE <dyn_wa> TO <dyn_field>.

      <dyn_field> = l_value .

      ASSIGN COMPONENT 'ACCURACY' OF
                  STRUCTURE <dyn_wa> TO <dyn_field>.
      IF l_value EQ s_trx.
        <dyn_field> = 1.
      ELSE.
        <dyn_field> = 0.
      ENDIF.

      APPEND <dyn_wa> TO <dyn_table>. CLEAR <dyn_wa>.
    ELSE.
      CLEAR:where_tab[].
      CONCATENATE get_table-fieldname ' LIKE ''%' s_trx '%'''
                              INTO where_tab.
      APPEND where_tab.

      SELECT SINGLE (get_table-fieldname)
         FROM (get_table-tabname)
         INTO @l_value
      WHERE (where_tab).
      IF sy-subrc = 0.
        ASSIGN COMPONENT 'TABLE_NAME' OF
                    STRUCTURE <dyn_wa> TO <dyn_field>.

        <dyn_field> = get_table-tabname.

        ASSIGN COMPONENT 'TABLE_DDTEXT' OF
        STRUCTURE <dyn_wa> TO <dyn_field>.

        <dyn_field> = get_table-tabddtext.

        ASSIGN COMPONENT 'FIELD' OF
                    STRUCTURE <dyn_wa> TO <dyn_field>.

        <dyn_field> = get_table-fieldname.

        ASSIGN COMPONENT 'VALUE' OF
                    STRUCTURE <dyn_wa> TO <dyn_field>.

        <dyn_field> = l_value .

        ASSIGN COMPONENT 'ACCURACY' OF
                    STRUCTURE <dyn_wa> TO <dyn_field>.
        IF l_value EQ s_trx.
          <dyn_field> = 1.
        ELSE.
          <dyn_field> = 0.
        ENDIF.

        APPEND <dyn_wa> TO <dyn_table>. CLEAR <dyn_wa>.
      ENDIF.
    ENDIF.

*        ENDIF.
  ENDLOOP.
ENDFORM.

*&---------------------------------------------------------------------*
*&      form  create_dynamic_itab
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_dynamic_itab.
* create dynamic internal table and assign to fs
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      i_length_in_byte = 'x'
      it_fieldcatalog  = ifc
    IMPORTING
      ep_table         = dy_table.
  ASSIGN dy_table->* TO <dyn_table>.
* create dynamic work area and assign to fs
  CREATE DATA dy_line LIKE LINE OF <dyn_table>.
  ASSIGN dy_line->* TO <dyn_wa>.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form NEW_TEBLE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM new_teble .
  CLEAR xfc.
*      xfc-tabname = 'TABLE_NAME'.
  xfc-fieldname = 'TABLE_NAME' .
  xfc-datatype = 'C'.
  xfc-inttype = 'C'.
  xfc-intlen = 30.
  "小数点
*      xfc-decimals = xdetails-decimals.
  APPEND  xfc TO ifc.

  CLEAR xfc..
  xfc-fieldname = 'TABLE_DDTEXT' .
  xfc-datatype = 'C'.
  xfc-inttype = 'C'.
  xfc-intlen = 60.
  "小数点
*      xfc-decimals = xdetails-decimals.
  APPEND  xfc TO ifc.

  CLEAR xfc.
*   xfc-tabname = 'TABLE_FIELD'.
  xfc-fieldname = 'FIELD'."p_field .
  xfc-datatype = 'C'.
  xfc-inttype = 'C'.
  xfc-intlen = 30.
  "小数点
*   xfc-decimals = xdetails-decimals.
  APPEND  xfc TO ifc.

  CLEAR xfc.
*   xfc-tabname = 'TABLE_FIELD'.
  xfc-fieldname = 'VALUE'.
  xfc-datatype = 'C'.
  xfc-inttype = 'C'.
  xfc-intlen = 50.
  "小数点
*   xfc-decimals = xdetails-decimals.
  APPEND  xfc TO ifc.

  CLEAR xfc.
*   xfc-tabname = 'TABLE_FIELD'.
  xfc-fieldname = 'ACCURACY'.
  xfc-datatype = 'P'.
  xfc-inttype = 'P'.
  xfc-intlen = 5.
  "小数点
  xfc-decimals = 2.
  APPEND  xfc TO ifc.
ENDFORM.

FORM get_col.
  DEFINE filedcat.
    gt_fieldcat-fieldname = &1.   "对应内表的字段名
    gt_fieldcat-seltext_l = &2.    "输出列文本
    gt_fieldcat-outputlen = &3.   "長度
    APPEND gt_fieldcat.
  END-OF-DEFINITION.

  filedcat 'TABLE_NAME'    '表格'  20.
  filedcat 'TABLE_DDTEXT'    '表格名称'  20.
  filedcat 'FIELD'                '表格字段'  20.
  filedcat 'VALUE'              ''  20.
  filedcat 'ACCURACY'        '值的精确度'  20.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form ALV_SHOW
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM alv_show .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      is_layout          = gs_layout
      it_fieldcat        = gt_fieldcat[]
      i_save             = 'A'
    TABLES
      t_outtab           = <dyn_table>
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
ENDFORM.
View Code

 

 

 

posted on 2019-10-14 11:12  淡淡-祥  阅读(246)  评论(0编辑  收藏  举报