ABAP 自建透明表维护

Posted 衣斜川

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABAP 自建透明表维护相关的知识,希望对你有一定的参考价值。

技术分享

 

 

 

 

*&---------------------------------------------------------------------*
*& Report  ZMMR011
*&
*&---------------------------------------------------------------------*
*&程序名称:供应商、工厂对应公里数维护
*&事物代码:ZMM031
*&导入模板:无
*&作者:董冬
*&时间:2016/3/2
*&更新时间:2016/3/3
*&---------------------------------------------------------------------*
REPORT zmmr011.

TABLES: tvbvk ,cskt ,ztmm002.


TYPES:ty_xs LIKE  v_tvbur.
DATA:gt_xs LIKE TABLE OF v_tvbur.
DATA:wa_xs TYPE v_tvbur.
DATA:edit(1VALUE ‘‘."ALV是否处于可编辑状态

DATA:lt_lfa1 TYPE lfa1 OCCURS WITH HEADER LINE"供应商内表
DATA:lt_t001w TYPE  t001w OCCURS WITH HEADER LINE."工厂内表


FIELD-SYMBOLS: <f1>, <f2>, <f3>.

TYPES:BEGIN OF ty_tab.

        INCLUDE TYPE ztmm002.
TYPES: lifnr_name LIKE lfa1-name1,
       werks_name LIKE t001w-name1.

TYPES:END OF ty_tab.

DATA :gt_zz TYPE STANDARD  TABLE OF ty_tab  .
DATA:wa_zz TYPE ty_tab.

FORM get_data.
*  CALL FUNCTION ‘VIEW_GET_DATA‘
*    EXPORTING
*      view_name = ‘V_TVBUR‘
*    TABLES
*      data      = gt_xs.
  SELECT *
    FROM lfa1
    INTO CORRESPONDING FIELDS OF TABLE lt_lfa1.

  SELECT *
    FROM t001w
    INTO CORRESPONDING FIELDS OF TABLE lt_t001w.

  SELECT *
    FROM ztmm002
    INTO CORRESPONDING FIELDS OF TABLE gt_zz.

  LOOP AT gt_zz INTO wa_zz.
    READ TABLE lt_lfa1 WITH  KEY lifnr = wa_zz-lifnr.
    wa_zz-lifnr_name = lt_lfa1-name1.
    READ TABLE lt_t001w WITH  KEY werks = wa_zz-werks.
    wa_zz-werks_name = lt_t001w-name1.
    MODIFY  gt_zz FROM wa_zz.
  ENDLOOP.

ENDFORM.

DATA: gs_fcat TYPE lvc_s_fcat,
      gt_fcat TYPE lvc_t_fcat,
      gs_layo TYPE lvc_s_layo,
      gs_grid TYPE lvc_s_glay.
DATA: gt_event      TYPE slis_t_event WITH HEADER LINE,
      gt_event_exit TYPE slis_t_event_exit WITH HEADER LINE.

DATA:  ref_grid TYPE REF TO cl_gui_alv_grid .

"parameters: p_ds type c as checkbox.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM show_data_to_alv.

CLASS lcl_event_receiver DEFINITION.
  PUBLIC SECTION.
    METHODS handle_modify
                  FOR EVENT data_changed_finished OF cl_gui_alv_grid
      IMPORTING e_modified et_good_cells.

    METHODS data_changed
                  FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING er_data_changed.
ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.
  METHOD handle_modify.
*    PERFORM refresh.

    DATA stbl TYPE lvc_s_stbl.

    stbl-row ‘X‘." 基于行的稳定刷新
    stbl-col ‘X‘." 基于列稳定刷新
    CALL METHOD ref_grid->refresh_table_display
      EXPORTING
        is_stable = stbl.

  ENDMETHOD.
  METHOD data_changed.

    DATA: ls_mod_cells TYPE lvc_s_modi,
          tvalue       TYPE string.
    DATA: ls_stable TYPE lvc_s_stbl.
    DATA: l_message TYPE string.
*
    DATA:wa_lfa1 TYPE lfa1.
    DATA:wa_t001w TYPE t001w.
    DATA:row_no TYPE i.

    CHECK er_data_changed->mt_inserted_rows[] IS INITIAL.

    LOOP AT  er_data_changed->mt_good_cells INTO ls_mod_cells.

      CLEAR tvalue.
      CALL METHOD er_data_changed->get_cell_value
        EXPORTING
          i_row_id    = ls_mod_cells-row_id
          i_fieldname = ls_mod_cells-fieldname
        IMPORTING
          e_value     = tvalue.



      IF ls_mod_cells-fieldname EQ ‘LIFNR‘.


        LOOP AT lt_lfa1 INTO wa_lfa1 .
          IF wa_lfa1-lifnr EQ tvalue.
            CALL METHOD er_data_changed->modify_cell
              EXPORTING
                i_row_id    = ls_mod_cells-row_id
                i_fieldname ‘LIFNR_NAME‘
                i_value     = wa_lfa1-name1.
            EXIT.
          ENDIF.
          CLEAR lt_lfa1.
        ENDLOOP.
      ENDIF.


      IF ls_mod_cells-fieldname EQ ‘WERKS‘.

        LOOP AT lt_t001w INTO wa_t001w.
          IF wa_t001w-werks EQ tvalue.
            CALL METHOD er_data_changed->modify_cell
              EXPORTING
                i_row_id    = ls_mod_cells-row_id
                i_fieldname ‘WERKS_NAME‘
                i_value     = wa_t001w-name1.
            EXIT.
          ENDIF.
          CLEAR wa_t001w.
        ENDLOOP.
      ENDIF.
*        DATA:blank_zz TYPE ztmm002.
*
*
*
*        LOOP AT tab_tvgrt INTO wa_tvgrt .
*          IF wa_tvgrt-vkgrp EQ tvalue.
*            CLEAR wa_zz.
*            LOOP AT gt_zz INTO wa_zz.
*              IF wa_zz-vkgrp EQ tvalue  AND tvalue NE ‘‘.
*                MESSAGE i001(00) WITH ‘已有相同的销售组!‘.
*
*                "MODIFY  gt_zz INDEX ls_mod_cells-row_id FROM blank_zz .
*                CLEAR wa_tvgrt.
*                "如果有重复的销售组,那么将输入的销售组清空
*                CALL METHOD er_data_changed->modify_cell
*                  EXPORTING
*                    i_row_id    = ls_mod_cells-row_id
*                    i_fieldname = ‘VKGRP‘
*                    i_value     = ‘‘.
*              ENDIF.
*
*              CONTINUE.
*            ENDLOOP.
*
*            CALL METHOD er_data_changed->modify_cell
*              EXPORTING
*                i_row_id    = ls_mod_cells-row_id
*                i_fieldname = ‘VKGRPTEXT‘
*                i_value     = wa_tvgrt-bezei.
*          ENDIF.
*          CLEAR wa_tvgrt.
*        ENDLOOP.



*
*      IF strlen( tvalue ) GT 4.
*
*
*        LOOP AT tab_cskt INTO wa_cskt .
*          IF wa_cskt-kostl EQ tvalue.
*            CALL METHOD er_data_changed->modify_cell
*              EXPORTING
*                i_row_id    = ls_mod_cells-row_id
*                i_fieldname = ‘LTEXT‘
*                i_value     = wa_cskt-ltext.
*            EXIT.
*          ENDIF.
*          CLEAR wa_cskt.
*        ENDLOOP.
*      ENDIF.



    ENDLOOP.

  ENDMETHOD.                    "HANDLE_MODIFY
ENDCLASS.                    "LCL_EVENT_RECEIVER IMPLEMENTATION
DATA gt_event_receiver TYPE REF TO lcl_event_receiver .

FORM show_data_to_alv.

  CLEAR gt_fcat[].
  PERFORM set_fcat USING edit.
  PERFORM set_layout.

  PERFORM show_alv  TABLES gt_fcat  gt_zz[]
                     USING  gs_layo.

ENDFORM.

FORM frm_edit_alv." TABLES GT.
*DATA:   ls_row      TYPE lvc_s_cell,
*       lt_rows     TYPE lvc_t_cell.
*  "CLEAR GT_HEADER.
*  "CLEAR GT_ITEMS.
*  CALL METHOD ref_grid->GET_SELECTED_CELLS
*    IMPORTING
*      et_index_cells = lt_rows

ENDFORM.


FORM show_changed_alv.

  CLEAR gt_fcat[].

*  IF edit EQ ‘‘ .
*    edit = ‘X‘.
*  ELSE.
*    edit = ‘‘.
*  ENDIF.

  PERFORM set_fcat USING edit.
  PERFORM set_layout.

  PERFORM show_alv  TABLES gt_fcat  gt_zz[]
                 USING  gs_layo.
  PERFORM frm_edit_alv.
ENDFORM.

FORM set_fcat USING edit.
  PERFORM csalv_set_fcat USING :

" ‘Field‘ ‘Text‘ ‘Edit‘ ‘Zero‘ ‘Type‘ ‘Qfieldname‘ ‘Key‘ ‘Hostspot‘ ‘Emphasize‘ ‘Checkbox‘
             ‘LIFNR‘  ‘供应商或债权人账号‘ edit  ‘‘  ‘‘  ‘‘  ‘‘   ‘‘  ‘‘  ‘‘ ‘‘ ‘‘ ‘‘ ‘X‘ ‘ZTMM002‘ ‘LIFNR‘,
             ‘LIFNR_NAME‘  ‘供应商名称‘ ‘‘ ‘‘  ‘‘  ‘‘  ‘‘   ‘‘  ‘‘  ‘‘ ‘‘ ‘‘ ‘‘ ‘‘ ‘‘ ‘‘,             
‘WERKS‘ ‘工厂‘ edit  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘  ‘‘ ‘‘ ‘X‘ ‘ZTMM002‘ ‘WERKS‘,             
‘WERKS_NAME‘  ‘工厂名称‘ ‘‘ ‘‘  ‘‘  ‘‘  ‘‘   ‘‘  ‘‘  ‘‘ ‘‘ ‘‘ ‘‘ ‘‘ ‘‘ ‘‘,             
‘MENGE‘ ‘数量‘     edit  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘  ‘‘ ‘‘ ‘X‘ ‘‘ ‘‘,             
‘MEINS‘ ‘单位‘   edit  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘  ‘‘ ‘‘ ‘X‘ ‘‘ ‘‘.   
"‘KOSTL‘ ‘成本中心‘    edit ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘   ‘‘ ‘‘ ‘X‘ ‘CSKS‘ ‘KOSTL‘ ,   
"‘LTEXT‘  ‘成本中心描述‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘  ‘‘ ‘‘ ‘‘ ‘‘ ‘‘ .
*            ‘ADD01‘  ‘车主‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘  ‘‘ ‘‘,
*            ‘EXTI1‘  ‘卸货点‘      ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘  ‘‘ ‘‘,
*            ‘ADD02‘   ‘司机‘     ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘  ‘‘ ‘‘,
*            ‘BFART‘     ‘车厢类型‘     ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘  ‘0‘ ‘‘,
*
*            ‘BEIZHU‘  ‘备注‘     ‘X‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘ ‘‘ ‘‘ ‘X‘.   


" ‘zsel‘   ‘是否打印 ‘ ‘X‘ ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘‘  ‘X‘ ‘‘.

ENDFORM.                    " SET_FCAT

FORM set_layout .   gs_layo
-zebra             ‘X‘.
*  gs_layout-stylefname     = ‘FIELD_STYLE‘.   gs_layo
-cwidth_opt        =  ‘X‘.
ENDFORM.                    " SET_LAYOUT
*&---------------------------------------------------------------------*
FORM csalv_set_fcat USING       p_name       p_text       p_edit       p_zero       p_type       p_qfieldname       p_key       p_hotspot       p_emphasize       p_checkbox       p_do_sum       p_decimals_out       p_no_out       p_f4availabl       p_ref_table       p_ref_field















.   gs_fcat
-fieldname   =  p_name.
*  gs_fcat-reptext_l   =
*  gs_fcat-selddictxt   =   gs_fcat
-reptext     =  p_text.   gs_fcat
-edit        =  p_edit.   gs_fcat
-no_zero     =  p_zero.   gs_fcat
-datatype    =  p_type.   gs_fcat
-qfieldname  =  p_qfieldname.   gs_fcat
-key         =  p_key.   gs_fcat
-hotspot     =  p_hotspot.   gs_fcat
-emphasize   =  p_emphasize.   gs_fcat
-checkbox    =   p_checkbox.   gs_fcat
-do_sum      =  p_do_sum.   gs_fcat
-decimals_o  =  p_decimals_out.   gs_fcat
-no_out      =  p_no_out.   gs_fcat
-f4availabl  =  p_f4availabl.   gs_fcat
-ref_table   =  p_ref_table.   gs_fcat
-ref_field   =  p_ref_field.   

APPEND gs_fcat TO  gt_fcat.
ENDFORM.                    "csalv_set_fcat

FORM show_alv TABLES  pt_fcat                       pt_tab               

USING   ps_layout.   gs_grid


-edt_cll_cb ‘X‘."当屏幕失去焦点时,自动刷新   gt_event

-name ‘CALLER_EXIT‘.   "slis_ev_caller_exit_at_start事件   gt_event
-form ‘FM_BUTTON‘.   
APPEND gt_event .   

CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY_LVC‘     
EXPORTING       i_callback_program       
= sy-repid       i_callback_user_command  
‘USER_COMMAND‘       i_grid_settings          
= gs_grid       i_callback_pf_status_set 
‘SET_PF_STATUS‘       is_layout_lvc            
= ps_layout       it_fieldcat_lvc          
= pt_fcat[]       it_events                
= gt_event[]
*     it_event_exit            = gt_event_exit[]     
TABLES       t_outtab                 
= pt_tab     
EXCEPTIONS       program_error            
1       
OTHERS                   2.
ENDFORM.                    "csalv_set_fcat

FORM user_command USING r_ucomm LIKE sy-ucomm       rs_selfield 
TYPE slis_selfield.   


CASE r_ucomm.     

WHEN ‘&CHANGE‘.       
IF edit EQ ‘‘ .         
edit ‘X‘.       
ELSE.         
edit ‘‘.       
ENDIF.       
PERFORM show_changed_alv.     
WHEN ‘&BACK‘.       
LEAVE PROGRAM.     
WHEN ‘&ADD_ROW‘.
*      CLEAR wa_zz.
*      DATA:end TYPE i.
*      DESCRIBE TABLE gt_zz LINES end.
*
*          READ TABLE gt_zz  INDEX  end  INTO wa_zz.
*          IF wa_zz-vkbur IS INITIAL AND gt_zz is NOT INITIAL  .
*            MESSAGE i001(00) WITH ‘不能继续添加行!‘.
*            exit.
*            ENDIF.       


"edit = ‘‘.       
CLEAR wa_zz.       
IF edit EQ ‘X‘.         
APPEND wa_zz TO gt_zz.         
"PERFORM show_changed_alv.         
PERFORM show_data_to_alv.       
ENDIF.     






WHEN ‘&SAVE_DATA‘.       
DATA:lt_ztmm002 TYPE TABLE OF ztmm002.       
DATA:wa_ztmm002 TYPE ztmm002.       

CLEAR wa_ztmm002.       
DELETE FROM ztmm002 .       
MOVE-CORRESPONDING gt_zz  TO lt_ztmm002.       
IF lt_ztmm002 IS NOT INITIAL.         
LOOP AT lt_ztmm002  INTO wa_ztmm002 .           
IF wa_ztmm002-lifnr IS NOT INITIAL AND wa_ztmm002-werks IS NOT INITIAL.               
INSERT INTO  ztmm002 VALUES wa_ztmm002 .           
ENDIF.         

ENDLOOP.       
ENDIF.       

IF sy-subrc EQ 0.         
MESSAGE i001(00WITH ‘保存成功!‘.       


ELSE.         
MESSAGE i001(00WITH ‘保存失败!‘.       
ENDIF.     

WHEN ‘&DELE_ROW‘.       
DATA:ls_row  TYPE lvc_s_row,            lt_rows 
TYPE lvc_t_row.       

DATA:del_rows TYPE  STANDARD  TABLE OF ty_tab.       

CALL METHOD ref_grid->get_selected_rows         
IMPORTING           et_index_rows 
= lt_rows
*         et_row_no     =         
.       
CLEAR wa_zz.       

LOOP AT lt_rows INTO ls_row.         

READ TABLE gt_zz INTO wa_zz INDEX ls_row-index.         
"delete  gt_zz INDEX ls_row-index.         
"DELETE ztmm002 FROM wa_zz.         
APPEND wa_zz  TO del_rows.       

ENDLOOP.       
LOOP AT del_rows INTO wa_zz.         
DELETE TABLE gt_zz FROM wa_zz.       
ENDLOOP.       

CLEAR del_rows.       
CLEAR ls_row.       
CLEAR lt_rows.       
PERFORM show_changed_alv.   


ENDCASE.

ENDFORM.

FORM set_pf_status USING rt_extab TYPE slis_t_extab..   
SET PF-STATUS ‘STANDARD‘.
ENDFORM.                    "SET_PF_STATUS

FORM fm_button USING e_grid TYPE slis_data_caller_exit.   
DATA:   lt_f4 TYPE lvc_t_f4,           ls_f4 
TYPE lvc_s_f4.   
CALL FUNCTION ‘GET_GLOBALS_FROM_SLVC_FULLSCR‘
*   EXPORTING
*     IR_SALV_FULLSCREEN_ADAPTER       =     
IMPORTING
*     ET_EXCLUDING                     =
*     E_REPID                          =
*     E_CALLBACK_PROGRAM               =
*     E_CALLBACK_ROUTINE               =       e_grid 
= ref_grid
*     ET_FIELDCAT_LVC                  =
*     ER_TRACE                         =
*     E_FLG_NO_html                    =
*     ES_LAYOUT_KKBLO                  =
*     ES_SEL_HIDE                      =
*     ET_EVENT_EXIT                    =
*     ER_FORM_TOL                      =
*     ER_FORM_EOL                      =     
.

*   CALL METHOD ref_grid->check_changed_data.
* 设置enter事件   
CALL METHOD ref_grid->register_edit_event     
EXPORTING       i_event_id 
= cl_gui_alv_grid=>mc_evt_enter     
EXCEPTIONS       error      
1       
OTHERS     2.   


CREATE OBJECT gt_event_receiver.   
SET HANDLER   gt_event_receiver->handle_modify FOR ref_grid.   
SET HANDLER   gt_event_receiver->data_changed FOR ref_grid.


ENDFORM.

以上是关于ABAP 自建透明表维护的主要内容,如果未能解决你的问题,请参考以下文章

abap 开发之创建表维护生成器

◆◆0BDC-Call transaction

通过ABAP程序创建透明表

SAP ABAP。取一个透明表数据放到另外一个透明表。并保持数据同步

abap 维护表的时候怎么让他自己带出字段

ABAP SM30视图 添加描述文本字段