• ABAP 用指针的方式


    首先要定义指针

    FIELD-SYMBOLS: <fs_out> LIKE gt_tab_out.

    然后在循环赋值时使用ASSIGNING关键字对指针初始化。

    LOOP AT lt_tab_out ASSIGNING <fs_out> WHERE aufnr NE space.
            READ TABLE lt_afko WITH KEY aufnr = <fs_out>-aufnr.
            IF sy-subrc EQ 0.
              MOVE lt_afko-fevor TO <fs_out>-fevor.
              MOVE lt_afko-txt TO <fs_out>-fevortxt.
              CLEAR lt_afko.
            ENDIF.
          ENDLOOP.

    2、指针的定义和赋值:(这部分网上参考一部分,后续自己有遇到继续补充)

    1、定义指针:
        指针的定义主要有以下语句
        定义任意类型的指针,但是不具备栏位结构(仅仅是一个地址)
          FIELD-SYMBOLS <carrid> TYPE ANY.
      参考数据库表定义(这种指针是含有栏位结构的,参考内表同理)
        
          FIELD-SYMBOLS <sflight> TYPE sflight.
          FIELD-SYMBOLS <sflight> LIKE sflight.
          FIELD-SYMBOLS <sflight> LIKE LINE OF sflight.
      动态定义具有栏位结构的指针类型
        
           DATA: tabname TYPE tabname VALUE 'SFLIGHT' ,   
           dref TYPE REF TO data.
            FIELD-SYMBOLS: <itab> TYPE ANY TABLE.    
            CREATE DATA dref TYPE TABLE OF (tabname).
            ASSIGN dref->* TO <itab>.
        2、指针的分配(常用句法)
        分配某个变量给指针
           ASSIGN var TO <field-symbols>
      分配结构中的某个字段的地址给指针
        
          ASSIGN COMPONENT pos OF STRUCTURE struc TO <field-symbols>.
      分配整个内表行给指针(指针必须定义为有栏位结构的类型)   
          READ TABLE itab INDEX/WITH KEY ASSIGNING <field-symbols>.
          LOOP AT itab
          ASSIGNING  <field-symbols>.
           ENDLOOP.
        分配类的方法或借口给指针
          ASSIGN dref->* TO <field-symbols>.

    赋值:
    FIELD-SYMBOLS: <fs1>.   "定义一个指针
    DATA: num0     TYPE i VALUE 10,
          num1(10) TYPE c VALUE '巴拉巴拉'.
    ASSIGN num0 TO <fs1>.
    
    WRITE:/ '<FS1>:',<fs1>.     "输出结果:10
    WRITE:/ 'num0:',num0.       "输出结果:10
    
    IF <fs1> IS ASSIGNED.       "一定要进行判断
      <FS1> = 21.
    ENDIF.
    WRITE:/ 'num0:',num0.       "输出结果:21 ;当指针的值变化时,赋值给指针的变量的值也将改变

    1, 创建动态内表: 
    a,动态内表的结构的定义. 
       动态内表表结构的定义必须使用表结构与 table type: lvc_t_fcat一样的内表. 
       一般情况下,我们都内表的所有列定义成字符型. 
    b,根据表结构生成内表. 
       系统提供了一个标准的method来产生动态表,使用方法如下: 
    2, 动态内表的赋值: 
    a,获取指定的字段 
    b,给指定的字段赋值 
    3, 读取动态内表的值: 
    a,获取指定的字段 
    b,读取指定的字段值 

    REPORT  zdyn_test.
    FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
    <dyn_wa>,
    <dyn_field>.
    DATA: dy_table TYPE REF TO data,
         dy_line  TYPE REF TO data,
         it_structure TYPE lvc_t_fcat,
         wa_structure TYPE lvc_s_fcat.
    START-OF-SELECTION.
    PERFORM create_structure.  " 定义内表的结构
    PERFORM create_dynamic_table.  " 按照定义的内表结构,产生一个内表
    PERFORM write_data_to_dyntable.  " 向动态内表中写数
    PERFORM output_dyntable_data.   " 从动态内表中取数,并写到屏幕
    *&---------------------------------------------------------------------*
    *&      Form  create_structure
    *&---------------------------------------------------------------------*
    FORM create_structure .
    wa_structure-fieldname = 'COL1'.  " 第一列列名
    wa_structure-col_pos   = 1.       " 表示第一列 --- 可心省略,默认情况下,第一行对应到生产内表的第一列,如果指定,则按指定的列顺序生成内表
    wa_structure-inttype = 'C'.       " 数据类型
    wa_structure-intlen = 6.          " 长度
    APPEND wa_structure TO it_structure.
    wa_structure-fieldname = 'COL2'.  " 第二列列名
    wa_structure-col_pos   = 2.       " 表示第二列--- 可心省略,默认情况下,第一行对应到生产内表的第一列,如果指定,则按指定的列顺序生成内表
    wa_structure-inttype = 'C'.       " 数据类型
    wa_structure-intlen = 6.          " 长度
    APPEND wa_structure TO it_structure.
    wa_structure-fieldname = 'COL3'.  " 第三列名
    wa_structure-col_pos   = 3.       " 表示第三列 --- 可心省略,默认情况下,第一行对应到生产内表的第一列,如果指定,则按指定的列顺序生成内表
    wa_structure-inttype = 'C'.       " 数据类型
    wa_structure-intlen = 6.          " 长度
    APPEND wa_structure TO it_structure.
    ENDFORM.                    " create_structure
    *&---------------------------------------------------------------------*
    *&      Form  create_dynamic_table
    *&---------------------------------------------------------------------*
    FORM create_dynamic_table .
    CALL METHOD cl_alv_table_create=>create_dynamic_table
       EXPORTING
    it_fieldcatalog = it_structure
       IMPORTING
    ep_table        = dy_table.
    ASSIGN dy_table->* TO <dyn_table>.    " 用表类型指针 <dyn_table> 指向 数据对象的内容.
    ENDFORM.                    " create_dynamic_table
    *&---------------------------------------------------------------------*
    *&      Form  write_data_to_dyntable
    *&---------------------------------------------------------------------*
    FORM write_data_to_dyntable .
    DATA:wa_new_line TYPE REF TO data.
    DATA:i TYPE n.
    DATA:j TYPE n.
    CREATE DATA wa_new_line LIKE LINE OF <dyn_table>.  " 建立一个与动态内表结构相同的数据对象,且数据对象为是一个结构
    ASSIGN wa_new_line->* TO <dyn_wa>.
    " 用<dyn_wa>指针指向该结构
    DO 3 TIMES.
    i = i + 1.
       CLEAR j.
       LOOP AT it_structure INTO wa_structure.
    j = j + 1.
         ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE <dyn_wa> TO <dyn_field>.  " 用指针 <dyn_field>指向工作区<dyn_wa>中的一个字段,字段名为wa_structure-fieldname.
         CONCATENATE i j INTO <dyn_field>.                                              " 给指针指向的字段赋值
       ENDLOOP.
       APPEND <dyn_wa> TO <dyn_table>.
    ENDDO.
    ENDFORM.                    " write_data_to_dyntable
    *&---------------------------------------------------------------------*
    *&      Form  output_dyntable_data
    *&---------------------------------------------------------------------*
    FORM output_dyntable_data .
    LOOP AT it_structure INTO wa_structure.
       WRITE: wa_structure-fieldname(5).
    ENDLOOP.
    LOOP AT <dyn_table> INTO <dyn_wa>.
       WRITE: / .
       LOOP AT it_structure INTO wa_structure.
         ASSIGN COMPONENT wa_structure-fieldname OF STRUCTURE <dyn_wa> TO <dyn_field>.  " 用指针 <dyn_field>指向工作区<dyn_wa>中的一个字段,字段名为wa_structure-fieldname.
         WRITE: <dyn_field>.
       ENDLOOP.
    ENDLOOP.
    ENDFORM.                    " output_dyntable_data
  • 相关阅读:
    OpenStack 发行版本
    刷新linux硬盘存储接口
    LVM实践
    LVM man帮助
    ansible --help 文档
    nmcli connection modify eth1 ipv4.addr "192.168.31.23" ipv4.method manual
    自己动手使用, MetaWeblog 发布博客(cnblogs)
    测试图片上传 on Markdown editor
    大批量更新数据mysql批量更新的四种方法
    PHP print_r 转换/还原为数组
  • 原文地址:https://www.cnblogs.com/BruceKing/p/14510580.html
Copyright © 2020-2023  润新知