Sy-tabix

Sy-tabix与Sy-index详解


Sy-tabix is related to internal table which provides index number of current line in loop enloop.

Sy-index is related to loops (while/endwhile, do/enddo). It provides number of current pass.

REPORT zfind_edit_update. TABLES: zmard_copy. DATA: ok_code LIKE sy-ucomm, save_ok LIKE sy-ucomm, g_container TYPE scrfname VALUE 'ALV_CONTAINER', g_grid TYPE REF TO cl_gui_alv_grid, g_custom_container TYPE REF TO cl_gui_custom_container, gs_layout TYPE lvc_s_layo, gt_outtab TYPE TABLE OF zmard_copy, gt_original TYPE TABLE OF zmard_copy. " 用于保存原始数据副本 " 删除选择屏幕定义 *SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN. *SELECTION-SCREEN END OF SCREEN 100. " 直接调用屏幕100 CALL SCREEN 100 STARTING AT 1 1. MODULE pbo OUTPUT. SET PF-STATUS 'MAIN100' EXCLUDING ''. SET TITLEBAR 'MAIN100'. IF g_custom_container IS INITIAL. CREATE OBJECT g_custom_container EXPORTING container_name = g_container. CREATE OBJECT g_grid EXPORTING i_parent = g_custom_container. gs_layout-edit = 'X'. " 启用编辑模式 gs_layout-sel_mode = 'A'. " 允许选择行 SELECT * FROM zmard_copy INTO TABLE gt_outtab UP TO 1000 ROWS. gt_original = gt_outtab. " 保存原始数据副本 CALL METHOD g_grid->set_table_for_first_display EXPORTING i_structure_name = 'zmard_copy' is_layout = gs_layout CHANGING it_outtab = gt_outtab. CALL METHOD g_grid->set_ready_for_input EXPORTING i_ready_for_input = 1. ENDIF. ENDMODULE. MODULE pai INPUT. save_ok = ok_code. CLEAR ok_code. CASE save_ok. WHEN 'EXIT'. LEAVE PROGRAM. WHEN 'SWITCH'. PERFORM switch_edit_mode. WHEN 'SAVE'. " 新增保存按钮处理 PERFORM save_data. ENDCASE. ENDMODULE. FORM switch_edit_mode. IF g_grid->is_ready_for_input( ) EQ 0. CALL METHOD g_grid->set_ready_for_input( 1 ). ELSE. CALL METHOD g_grid->set_ready_for_input( 0 ). ENDIF. ENDFORM. FORM save_data. DATA: lv_tabix TYPE sy-tabix. " 确保界面数据同步到内表 CALL METHOD g_grid->check_changed_data. " 比较当前数据与原始数据 LOOP AT gt_outtab ASSIGNING FIELD-SYMBOL(<fs_line>). lv_tabix = sy-tabix. " 检查当前行是否有修改 READ TABLE gt_original INDEX lv_tabix ASSIGNING FIELD-SYMBOL(<fs_orig>). IF <fs_line> <> <fs_orig>. " 更新数据库 UPDATE zmard_copy FROM <fs_line>. IF sy-subrc = 0. " 更新原始数据副本 <fs_orig> = <fs_line>. ELSE. MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDIF. ENDLOOP. COMMIT WORK AND WAIT. IF sy-subrc = 0. MESSAGE '数据保存成功' TYPE 'S'. " 刷新ALV显示 CALL METHOD g_grid->refresh_table_display. ENDIF. ENDFORM. 基于此代码,增加功能:默认状态下禁止编辑,编辑状态下只有lgpbe可以编辑,其他字段(mandt,matnr,werks,lgort)均为主键且不可编辑
08-06
以下程式兩組radion 只能兩擇一,請修正。report zt . type-pools: vrm, slis, soi,ole2. *--------------------------------------------------------------------- * 1. 內表結構 *--------------------------------------------------------------------- TYPES: BEGIN OF ty_data,          lifnr       TYPE char10,   " 供應商編號          check1(1)   TYPE c,          bank1_text  TYPE char40,          check2(1)   TYPE c,          bank2_text  TYPE char40,        END OF ty_data. DATA: gt_data     TYPE STANDARD TABLE OF ty_data,       gs_data     TYPE ty_data. *--------------------------------------------------------------------- * 2. LVC 欄位目錄 / Layout *--------------------------------------------------------------------- DATA: gt_fieldcat TYPE lvc_t_fcat,       gs_fieldcat TYPE lvc_s_fcat,       gs_layout   TYPE lvc_s_layo. DATA: gt_dropdown TYPE lvc_t_drop,       gs_drop     TYPE lvc_s_drop. *--------------------------------------------------------------------- * 3. 從 ZVBANK 撈資料並組合 BANK TEXT *--------------------------------------------------------------------- FORM get_data_from_zvbank.   DATA: lt_zvbank TYPE TABLE OF zvbank,         ls_zvbank TYPE zvbank.   " 直接抓 ZVBANK   SELECT * FROM zvbank INTO TABLE lt_zvbank UP TO 50 ROWS.   LOOP AT lt_zvbank INTO ls_zvbank.     CLEAR gs_data.     " LIFNR 用 BANKL 當範例顯示     gs_data-lifnr = ls_zvbank-bankl.     " BANK1_TEXT / BANK2_TEXT 都用 BANKL + BANKN 組合     CONCATENATE ls_zvbank-bankl ls_zvbank-bankn                 INTO gs_data-bank1_text SEPARATED BY space.     CONCATENATE ls_zvbank-bankl ls_zvbank-bankn                 INTO gs_data-bank2_text SEPARATED BY space.     APPEND gs_data TO gt_data.   ENDLOOP. ENDFORM. *--------------------------------------------------------------------- * 4. 建立欄位目錄 *--------------------------------------------------------------------- FORM build_fieldcat.   CLEAR gt_fieldcat.   CLEAR gs_fieldcat.   gs_fieldcat-fieldname = 'LIFNR'.   gs_fieldcat-scrtext_m = '供應商'.   APPEND gs_fieldcat TO gt_fieldcat.   CLEAR gs_fieldcat.   gs_fieldcat-fieldname = 'CHECK1'.   gs_fieldcat-checkbox  = 'X'.   gs_fieldcat-edit      = 'X'.   gs_fieldcat-scrtext_m = '選項 1'.   APPEND gs_fieldcat TO gt_fieldcat.   CLEAR gs_fieldcat.   gs_fieldcat-fieldname = 'BANK1_TEXT'.   gs_fieldcat-scrtext_m = '銀行1說明'.   APPEND gs_fieldcat TO gt_fieldcat.   CLEAR gs_fieldcat.   gs_fieldcat-fieldname = 'CHECK2'.   gs_fieldcat-checkbox  = 'X'.   gs_fieldcat-edit      = 'X'.   gs_fieldcat-scrtext_m = '選項 2'.   APPEND gs_fieldcat TO gt_fieldcat.   CLEAR gs_fieldcat.   gs_fieldcat-fieldname = 'BANK2_TEXT'.   gs_fieldcat-scrtext_m = '銀行2說明'.   APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. *--------------------------------------------------------------------- * 5. Layout 設定 *--------------------------------------------------------------------- FORM set_layout.   CLEAR gs_layout.   gs_layout-zebra = 'X'.         " 交錯底色   gs_layout-cwidth_opt = 'X'.    " 欄寬最佳化 ENDFORM. *--------------------------------------------------------------------- * 7. USER_COMMAND:兩組互斥 *--------------------------------------------------------------------- FORM user_command USING r_ucomm LIKE sy-ucomm                       rs_selfield TYPE slis_selfield.   DATA lv_index TYPE sy-tabix.   IF r_ucomm = 'ENTER' OR r_ucomm = '&IC1'.     " --- CHECK1 互斥     CLEAR lv_index.     LOOP AT gt_data INTO gs_data.       IF gs_data-check1 = 'X' AND lv_index IS INITIAL.         lv_index = sy-tabix.       ELSEIF gs_data-check1 = 'X' AND NOT lv_index IS  INITIAL.         gs_data-check1 = space.         MODIFY gt_data FROM gs_data INDEX sy-tabix.       ENDIF.     ENDLOOP.     " --- CHECK2 互斥     CLEAR lv_index.     LOOP AT gt_data INTO gs_data.       IF gs_data-check2 = 'X' AND lv_index IS INITIAL.         lv_index = sy-tabix.       ELSEIF gs_data-check2 = 'X' AND NOT lv_index IS INITIAL.         gs_data-check2 = space.         MODIFY gt_data FROM gs_data INDEX sy-tabix.       ENDIF.     ENDLOOP.     " --- 同列不能雙選     LOOP AT gt_data INTO gs_data.       IF gs_data-check1 = 'X' AND gs_data-check2 = 'X'.         " 清掉另一個         gs_data-check2 = space.         MODIFY gt_data FROM gs_data INDEX sy-tabix.       ENDIF.     ENDLOOP.     rs_selfield-refresh = 'X'.   ENDIF. ENDFORM. *--------------------------------------------------------------------- * 8. 主程式 *--------------------------------------------------------------------- START-OF-SELECTION.   PERFORM get_data_from_zvbank.   PERFORM build_fieldcat.   PERFORM set_layout.   data : gd_repid like sy-repid. gd_repid = sy-repid.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'     EXPORTING       i_callback_program       = gd_repid       i_callback_user_command  = 'USER_COMMAND'       i_callback_pf_status_set = 'FRM_SET_STATUS'       is_layout_lvc            = gs_layout       it_fieldcat_lvc          = gt_fieldcat       it_drop_down_list        = gt_dropdown     TABLES       t_outtab                 = gt_data. if sy-subrc <> 0.   message id sy-msgid type sy-msgty number sy-msgno           with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif. *&---------------------------------------------------------------------* *&       Form  frm_set_status *&---------------------------------------------------------------------* form frm_set_status using rt_extab type slis_t_extab.   clear: rt_extab.   refresh: rt_extab.   set pf-status 'ALV_STATUS'. endform.
08-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值