ABAP 获取屏幕字段值,field-symbols,assign..TO.. 相关知识实例
以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."restrictedlv_value = <fs>.endif.if <fs_f> is assigned."unrestrictedlv_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_falsemetadata = abap_falsedata = abap_true ).field-symbols:<fs_table> type any table,<fs_any> type any. "LIKE LINE OF IT_TABdata:gr_data type ref to data.clear gr_data.unassign <fs_table>.submit zqmr_003 "LX02with pa_charg eq new_insplot-chargand 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 TASKexportingis_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 taskexportingis_insplot = new_insplot.endform.