ABAP 获取屏幕字段值,field-symbols,assign..TO.. 相关知识实例

ABAP  获取屏幕字段值,field-symbols,assign..TO.. 相关知识实例

屏幕上所有的值,在执行过程中都是可以取到的,只要在一个session里。
这种取值也就是直接去取的内存变量。
可以去取一个字段,一个结构,甚至一个表,比如table control,比如alv等等

所有的都可以归结为如下:
"定义一个内存变量
field-symbols  《fs_data》 type any."这里定义为any即可
然后
assign ('(SAPLMIGO)GODYNPRO-ACTION') to 《fs_data》 
这里 SAPLMIGO,是这个变量所在是程序名称。
GODYNPRO-ACTION,这个是个屏幕的变量值,可以直接F1看到,可以不具体到值,
比如直接写成某个结构,比如 GODYNPRO,
也可以找这个屏幕上table对应的表, assign ('(SAPLMIGO)内表[]') to 《fs_data》 
然后,你定义一个对应的字段变量,或者结构,或者内表,去接收这个内存就可以了,
比如data lt_data  tyep table of OOXX,
然后
lt_data = 《fs_data》
只要lt_data和 fs_data对应的 变量,结构,内表类型一样就可以了。
理论上,只是读取这个值来用,不应该修改这个内存的值,可能会dump。

以QA32质量放行程序为例子:

由于这个两个值都在结构RQEVA中,为了方便这里获取整个结构值,最后利用指针指向这个程序的这个结构即可获取当前值,具体写法如下:

program zqme_check_at_qa11.
form check_ud using new_insplot type qals ud_data type qave.
  data: lv_aufnr type qals-aufnr.
  data: lt_status type table of jstat.
  data: ls_status type jstat.
  data: lv_objnr type jsto-objnr.
  data: lt_mseg type table of mseg.

  data: lt_mch1   type table of mch1,
        ls_mch1   type mch1,
        lv_value  type c,
        lv_valuef type c.
"获取屏幕字段值     
  data lc_string(25) value '(SAPMQEVA)RQEVA-ZUS_NEU_N'.
  data lc_string_f(25) value '(SAPMQEVA)RQEVA-US_NEU_F'.
  data lc_string_d(25) value '(SAPMQEVA)RQEVA-MHD_01'.
  data lc_string_e(25) value '(SAPMQEVA)RQEVA-VCODE'.
  data lc_string_g(25) value '(SAPMQEVA)QALS-MATNR'. "程序+表+字段

  data: lv_auth type rqeva-zus_neu_n.
  data: lt_qmel type table of qmel.
  data: ls_qmel type qmel.
  data: lv_charg type qals-charg.
  data: lt_tj02t type table of tj02t,
        ls_tj02t type tj02t.

"获取屏幕字段值,类1. FIELD-SYMBOLS:FIELD-SYMBOLS 是一个关键字,用于声明一个指针变量,允许在运行时指向内存中的"某个数据对象。通过 FIELD-SYMBOLS,可以在不提前指定具体变量名的情况下,将一个"变量看作指针,并在运行时动态绑定到数据对象。
  field-symbols: <fs> type any.
  field-symbols: <fs_f> type any.
  field-symbols: <fs_date> type any.
  field-symbols: <fs_vcode> type any.
  field-symbols: <fs_matnr> type any.  
"通过变量名动态访问变量2. ASSIGN:
ASSIGN 是一个指令语句,用于将一个数据对象的引用分配给 FIELD-SYMBOLS 变量。在运行时,使用 ASSIGN 将数据对象分配给 FIELD-SYMBOLS 变量后,就可以通过 FIELD-SYMBOLS 变量直接访问和操作数据对象。示例:
  assign (lc_string) to <fs> .
  assign (lc_string_f) to <fs_f> .
  assign (lc_string_d) to <fs_date>.
  assign (lc_string_e) to <fs_vcode>.
  assign (lc_string_g) to <fs_matnr>.   

  clear:lv_auth,
        lv_value,
        lv_valuef.

  if <fs> is assigned."restricted
    lv_value = <fs>.
  endif.

  if <fs_f> is assigned."unrestricted
    lv_valuef = <fs_f>.
  endif.

data ls_mara type mara.
data ls_zmmt002 type zmmt002.
  clear ls_mara.
 clear  ls_zmmt002.

  check new_insplot-charg is not initial.

  if <fs_f> is assigned and <fs_f> = 'X'. "非限制状态
    if ud_data-vcode = 'X'."vcode = 'X' 表示限制放行
      message e009(zqm01).
    endif.
  endif.

  if <fs> is assigned and <fs> = 'X'."限制状态

    if ud_data-vcode = 'A'."表示非限制放行
      message e001(zqm01).
    endif.
  endif.


  clear ls_mara.
  select single * from mara into ls_mara where matnr = new_insplot-matnr.
  if ls_mara-mtart = 'ZXXX'and ud_data-vcode is initial ."
    message e002(zqm01).
  endif.

  check ud_data-vcode = 'A'.

  cl_salv_bs_runtime_info=>set( exporting display  = abap_false
                                            metadata = abap_false
                                            data     = abap_true ).
  field-symbols:<fs_table> type any table,
                <fs_any>   type any. "LIKE LINE OF  IT_TAB
  data:gr_data type ref to data.
  clear gr_data.
  unassign <fs_table>.

  submit zqmr_003                                         "LX02
    with pa_charg eq new_insplot-charg
    and return.

  try.
      cl_salv_bs_runtime_info=>get_data_ref( importing r_data = gr_data ).

      assign gr_data->* to <fs_table>.
    catch cx_salv_bs_sc_runtime_info.
  endtry.

  cl_salv_bs_runtime_info=>clear_all( ).

  data: lt_data type table of zqms_batchtrace,
        ls_data type zqms_batchtrace.

  refresh: lt_data.

  if <fs_table> is assigned.
    unassign <fs_any>.
    loop at <fs_table> assigning <fs_any>.
      clear ls_data.
      ls_data = <fs_any>.
      if ( ls_data-zustd = '批量限制' 
or ls_data-zustd = 'Batch limit' )

          and ls_data-charg ne new_insplot-charg.
        message e010(zqm01) with ls_data-charg .
        exit.
      endif.
      if ls_data-qmnum ne '' and ls_data-zflag = 'X'
          and ls_data-charg ne ''.

        message e005(zqm01) with ls_data-qmnum .
        exit.
      endif.
    endloop.
    unassign <fs_any>.
  endif.

  check ud_data-vcode = 'A'.
  call function 'ZQM_ECC_UPDATE_BATCH' " IN UPDATE TASK
    exporting
      is_insplot = new_insplot.

endform.

 form update_batch using new_insplot type qals .
  check new_insplot-charg is not initial.
  set update task local .
  call function 'ZQM_ECC_UPDATE_BATCH' in update task
    exporting
      is_insplot = new_insplot.

endform.

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值