hjbhhj 发表于 2015-9-17 12:01:29

SAP 客户主数据销售视图(KNVV)数据动态更新

  闲来无事,瞎搞一下。好久没有更新过了,其实也不是比较忙,只是慢慢地不知道该写些什么了。总觉得自己知道的那点东西
  大家都知道了,已经没有写出来的必要了。 今天搞一个弱智的程序,放着供自己查阅查阅,呵呵
  新的一年了,其实已经不算新了,过去好几个月了,祝大家工作越来越Happy吧
  SAP客户主数据销售视图(KNVV)字段动态更新程序:



*&---------------------------------------------------------------------*
*& ReportZSD_KNVV
*&
*&---------------------------------------------------------------------*
*&Title:客户主数据销售视图(KNVV)数据动态更新
*&---------------------------------------------------------------------*




REPORT zsd_knvv MESSAGE-ID zf.
TYPE-POOLS: slis.
TABLES: knvv,likp,vbrp,vbak,dd03l,dd04t.
SELECTION-SCREEN BEGIN OF BLOCK b WITH FRAME TITLE text-004.
SELECT-OPTIONS: s_field FOR dd03l-fieldname VISIBLE LENGTH 15 NO INTERVALS.
SELECTION-SCREEN END OF BLOCK b .

SELECTION-SCREEN BEGIN OF BLOCK a WITH FRAME TITLE text-001.
SELECTION-SCREEN SKIP.
PARAMETERS p_file LIKE rlgrap-filename MODIF ID upd.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN COMMENT /1(50) text-002 .
SELECTION-SCREEN COMMENT /4(68) text-003 .
SELECTION-SCREEN COMMENT /4(79) text-005 .
SELECTION-SCREEN END OF BLOCK a .
DATA: BEGIN OF wa_field,
      fieldname LIKE dd03l-fieldname,
      ddtextLIKE dd04t-ddtext,
      datatype LIKE dd03l-datatype,
      leng LIKE dd03l-leng,
      END OF wa_field.
DATA: it_field LIKE TABLE OF wa_field.

DATA: d_ref TYPE REF TO data,
      lt_alv_cat TYPE TABLE OF lvc_s_fcat,
      ls_alv_cat LIKE LINE OF lt_alv_cat.
DATA: lt_table LIKE TABLE OF dntab.
DATA: ls_table TYPE dntab.
FIELD-SYMBOLS : <dyn_table> TYPE table,
                <dyn_wa> TYPE ANY.

INITIALIZATION.
PERFORM sub_get_field USING it_field.

* 定义参数 p_file 的值选择事件,调用打开文件对话框
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_field-low.
PERFORM sub_field_f4.

* 定义参数 p_file 的值选择事件,调用打开文件对话框
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
* 选择文件
PERFORM sub_get_file USING p_file.

AT SELECTION-SCREEN OUTPUT.

AT SELECTION-SCREEN.

START-OF-SELECTION.
PERFORM sub_progress_indicator.
PERFORM sub_tab_create.
PERFORM sub_data_upload.
PERFORM sub_data_display.

*&---------------------------------------------------------------------*
*&      Formsub_get_field
*&---------------------------------------------------------------------*
*-->p1      text
*----------------------------------------------------------------------*
FORM sub_get_field USING p_it_field TYPE table.
SELECT a~fieldname a~datatype a~leng a~position b~ddtext
    FROM dd03l AS aINNER JOIN dd04t AS b
    ON a~rollname = b~rollname
    INTO CORRESPONDING FIELDS OF TABLEp_it_field
    WHERE a~tabname = 'KNVV' AND
          a~position NOT IN (1,2,3,4,5,75,76,77,78,79) AND
          b~ddlanguage = '1'
    ORDER BY a~position.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Formsub_get_file
*&---------------------------------------------------------------------*
*-->p1      text
*----------------------------------------------------------------------*
FORM sub_get_file USING pr_file.
CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mask             = ',文本文件 (*.txt),*.txt,所有文件 (*.*),*.*.'
      mode             = 'O'
      title            = text-001
    IMPORTING
      filename         = pr_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error= 4
      OTHERS         = 5.
CASE sy-subrc.
    WHEN 0.
    WHEN OTHERS.
ENDCASE.
ENDFORM. "sub_GET_FILE

*&---------------------------------------------------------------------*
*&      Formsub_data_upload
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sub_data_upload.
CALL FUNCTION 'WS_UPLOAD'
    EXPORTING
      filename                = p_file
      filetype                = 'DAT'
    TABLES
      data_tab                = <dyn_table>
    EXCEPTIONS
      conversion_error      = 1
      file_open_error         = 2
      file_read_error         = 3
      invalid_type            = 4
      no_batch                = 5
      unknown_error         = 6
      invalid_table_width   = 7
      gui_refuse_filetransfer = 8
      customer_error          = 9.
IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "sub_data_upload
*&---------------------------------------------------------------------*
*&      FormSUB_FIELD_F4
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM sub_field_f4 .
DATA: it_return LIKE TABLE OF ddshretval WITH HEADER LINE.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
   retfield               = 'FIELDNAME'
   dynpprog               = sy-repid
   dynpnr               = sy-dynnr
   dynprofield            = 'S_FIELD-LOW'
   window_title         = '可选择字段'
   value_org            = 'S'
    TABLES
      value_tab            = it_field
*   FIELD_TAB            =
   return_tab             = it_return
*   DYNPFLD_MAPPING      =
    EXCEPTIONS
   parameter_error      = 1
   no_values_found      = 2
   OTHERS               = 3
            .
IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT it_return.
    DELETE it_field WHERE fieldname = it_return-fieldval.
ENDLOOP.
ENDFORM. " SUB_FIELD_F4
*&---------------------------------------------------------------------*
*&      FormSUB_TAB_CREATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM sub_tab_create .
*取出表结构的字段目录
CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      langu          = sy-langu
      tabname      = 'KNVV'
    TABLES
      nametab      = lt_table
    EXCEPTIONS
      no_texts_found = 1.
*根据取出的字段目录生成参考字段目录
LOOP AT lt_table INTO ls_table.
    READ TABLE s_field WITH KEY low = ls_table-fieldname.
    IF sy-subrc EQ 0 OR ls_table-fieldname = 'VKORG' OR ls_table-fieldname = 'KUNNR'.
      ls_alv_cat-fieldname = ls_table-fieldname.
      ls_alv_cat-ref_table = 'KNVV'.
      ls_alv_cat-ref_field = ls_table-fieldname.
      APPEND ls_alv_cat TO lt_alv_cat.
    ENDIF.
    CLEAR ls_alv_cat.
ENDLOOP.
*内表创建
CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_alv_cat
    IMPORTING
      ep_table      = d_ref.
*指定生成的内表到字段符号
ASSIGN d_ref->* TO <dyn_table>.
ENDFORM. " SUB_TAB_CREATE
*&---------------------------------------------------------------------*
*&      FormSUB_DATA_UPDATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM sub_data_update .
DATA: setv(255) TYPE c,
      midd(255) TYPE c,
      cond(255) TYPE c.
DATA: tab TYPE sy-tabix.
LOOP AT s_field.
    CONCATENATE '<DYN_WA>-' s_field-low INTO midd.
    CONCATENATE setv s_field-low '=' midd INTO setv SEPARATED BY space.
ENDLOOP.
CONCATENATE'KUNNR' '=' '<DYN_WA>-KUNNR' 'AND' 'VKORG' '=' '<DYN_WA>-VKORG'
               'AND' 'VTWEG' '=' `'00'` 'AND' 'SPART' '=' `'00'`
               INTO cond SEPARATED BY space.
LOOP AT <dyn_table> ASSIGNING <dyn_wa>.
    tab = sy-tabix.
    UPDATE knvv SET (setv) WHERE (cond).
    IF sy-subrc = 0.
      DELETE <dyn_table> INDEX tab.
    ENDIF.
ENDLOOP.
COMMIT WORK.
IF <dyn_table> IS INITIAL.
    MESSAGE i000 WITH '数据更新完成!'.
    LEAVE TO SCREEN 0.
ELSE.
    MESSAGE s000 DISPLAY LIKE 'E' WITH '以下数据未正确更新,请检查数据是否在表KNVV中存在!'.
ENDIF.
ENDFORM. " SUB_DATA_UPDATE
*&---------------------------------------------------------------------*
*&      FormSUB_DATA_DISPLAY
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM sub_data_display .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
    i_callback_program                = sy-cprog
    i_callback_user_command         = 'USER_COMMAND'
    i_callback_pf_status_set          = 'SET_STATUS'
    it_fieldcat_lvc                   = lt_alv_cat
    i_grid_title                      = text-tit
    i_save                            = 'U'
   TABLES
   t_outtab                        = <dyn_table>
EXCEPTIONS
    program_error                     = 1
    OTHERS                            = 2
         .
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " SUB_DATA_DISPLAY
*&---------------------------------------------------------------------*
*&      Formuser_command
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELDtext
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                  rs_selfield TYPE slis_selfield.
CASE r_ucomm.
    WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
      SET SCREEN 0.
    WHEN 'SAVE' OR 'EXCUTE'.
      PERFORM sub_progress_indicator.
      PERFORM sub_data_update.
ENDCASE.
PERFORM sub_data_refresh USING rs_selfield.
ENDFORM. "user_command
*&---------------------------------------------------------------------*
*&      FormSUB_DATA_REFRESH
*&---------------------------------------------------------------------*
*       ALV 动态刷新子例程 处理ALV数据更新
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM sub_data_refresh USING in_selfield TYPE slis_selfield.
in_selfield-col_stable = 'X'.
in_selfield-row_stable = 'X'.
in_selfield-refresh = 'X'.

ENDFORM. " SUB_DATA_REFRESH
*&---------------------------------------------------------------------*
*&      Formset_status
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RT_EXTAB   text
*----------------------------------------------------------------------*
FORM set_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZSD_KNVV' EXCLUDING rt_extab.
ENDFORM. "set_status
*&---------------------------------------------------------------------*
*&      FormSUB_PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*-->p1      text
*<--p2      text
*----------------------------------------------------------------------*
FORM sub_progress_indicator.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
   EXPORTING
   percentage       = 20
   text             = '数据处理中,请稍后…… ' .
ENDFORM. " SUB_PROGRESS_INDICATOR

*Text elements
*----------------------------------------------------------
* 001 选择文件
* 002 注:上传文件前两个字段为:客户编号 销售组织
* 003 其它字段数据应与选择字段时的顺序一致,否则将造成数据更新错误!
* 004选择字段
* 005 更新数据时首先会把上载的数据显示出来,请先核对上载到系统中的数据是否正确,再进行数据更新!
* TIT 请检查数据是否正确,点击“执行”或者“保存”按钮进行数据更新

*Selection texts
*----------------------------------------------------------
* P_FILE D       文件名 
* S_FIELD D       字段名

*Messages
*----------------------------------------------------------
*
* Message class: ZF
*000   & & & & &  
页: [1]
查看完整版本: SAP 客户主数据销售视图(KNVV)数据动态更新